Class: ActiveRecord::Tasks::ClickHouseDatabaseTasks
- Inherits:
-
AbstractTasks
- Object
- AbstractTasks
- ActiveRecord::Tasks::ClickHouseDatabaseTasks
- Defined in:
- lib/active_record/tasks/clickhouse_database_tasks.rb
Overview
db:create/db:drop/db:purge and structure dump/load for ClickHouse. Database-level DDL runs over a raw HTTP connection without a database selected, since the configured database may not exist yet.
Constant Summary collapse
- DATABASE_ALREADY_EXISTS_CODE =
82- UNKNOWN_DATABASE_CODE =
81
Instance Method Summary collapse
- #create ⇒ Object
- #drop ⇒ Object
- #purge ⇒ Object
- #structure_dump(filename, _flags) ⇒ Object
-
#structure_load(filename, _flags) ⇒ Object
Statements are separated by ";\n\n" exactly as structure_dump writes them — ClickHouse HTTP accepts one statement per request, so the file is replayed.
Instance Method Details
#create ⇒ Object
14 15 16 17 18 19 20 |
# File 'lib/active_record/tasks/clickhouse_database_tasks.rb', line 14 def create server_execute("CREATE DATABASE #{quoted_database}") rescue ConnectionAdapters::ClickHouse::HTTPConnection::ExecutionError => e raise DatabaseAlreadyExists if e.code == DATABASE_ALREADY_EXISTS_CODE raise end |
#drop ⇒ Object
22 23 24 25 26 27 28 |
# File 'lib/active_record/tasks/clickhouse_database_tasks.rb', line 22 def drop server_execute("DROP DATABASE #{quoted_database}") rescue ConnectionAdapters::ClickHouse::HTTPConnection::ExecutionError => e raise NoDatabaseError, e. if e.code == UNKNOWN_DATABASE_CODE raise end |
#purge ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/active_record/tasks/clickhouse_database_tasks.rb', line 30 def purge drop rescue NoDatabaseError nil ensure create end |
#structure_dump(filename, _flags) ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/active_record/tasks/clickhouse_database_tasks.rb', line 38 def structure_dump(filename, _flags) establish_connection statements = dumpable_data_sources.map do |name| connection.select_value("SHOW CREATE TABLE #{connection.quote_table_name(name)}") end File.write(filename, statements.map { |statement| "#{statement};\n\n" }.join) end |
#structure_load(filename, _flags) ⇒ Object
Statements are separated by ";\n\n" exactly as structure_dump writes them — ClickHouse HTTP accepts one statement per request, so the file is replayed.
48 49 50 51 52 53 54 |
# File 'lib/active_record/tasks/clickhouse_database_tasks.rb', line 48 def structure_load(filename, _flags) establish_connection File.read(filename).split(";\n\n").each do |statement| statement = statement.strip connection.execute(reinject_dictionary_credentials(statement)) unless statement.empty? end end |