Class: ActiveRecord::Tasks::ClickHouseDatabaseTasks

Inherits:
AbstractTasks
  • Object
show all
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

Instance Method Details

#createObject



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

#dropObject



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.message if e.code == UNKNOWN_DATABASE_CODE

  raise
end

#purgeObject



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