Class: ActiveRecord::Tasks::SQLServerDatabaseTasks

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/tasks/sqlserver_database_tasks.rb

Constant Summary collapse

DEFAULT_COLLATION =
"SQL_Latin1_General_CP1_CI_AS"

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ SQLServerDatabaseTasks

Returns a new instance of SQLServerDatabaseTasks.



16
17
18
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 16

def initialize(configuration)
  @configuration = configuration
end

Instance Method Details

#charsetObject



37
38
39
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 37

def charset
  connection.charset
end

#collationObject



41
42
43
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 41

def collation
  connection.collation
end

#create(master_established = false) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 20

def create(master_established = false)
  establish_master_connection unless master_established
  connection.create_database configuration["database"], configuration.merge("collation" => default_collation)
  establish_connection configuration
rescue ActiveRecord::StatementInvalid => e
  if /database .* already exists/i === e.message
    raise DatabaseAlreadyExists
  else
    raise
  end
end

#dropObject



32
33
34
35
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 32

def drop
  establish_master_connection
  connection.drop_database configuration["database"]
end

#purgeObject



45
46
47
48
49
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 45

def purge
  clear_active_connections!
  drop
  create true
end

#structure_dump(filename, extra_flags) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 51

def structure_dump(filename, extra_flags)
  server_arg = "-S #{Shellwords.escape(configuration['host'])}"
  server_arg += ":#{Shellwords.escape(configuration['port'])}" if configuration["port"]
  command = [
    "defncopy-ttds",
    server_arg,
    "-D #{Shellwords.escape(configuration['database'])}",
    "-U #{Shellwords.escape(configuration['username'])}",
    "-P #{Shellwords.escape(configuration['password'])}",
    "-o #{Shellwords.escape(filename)}",
  ]
  table_args = connection.tables.map { |t| Shellwords.escape(t) }
  command.concat(table_args)
  view_args = connection.views.map { |v| Shellwords.escape(v) }
  command.concat(view_args)
  raise "Error dumping database" unless Kernel.system(command.join(" "))

  dump = File.read(filename)
  dump.gsub!(/^USE .*$\nGO\n/, "")                      # Strip db USE statements
  dump.gsub!(/^GO\n/, "")                               # Strip db GO statements
  dump.gsub!(/nvarchar\(8000\)/, "nvarchar(4000)")      # Fix nvarchar(8000) column defs
  dump.gsub!(/nvarchar\(-1\)/, "nvarchar(max)")         # Fix nvarchar(-1) column defs
  dump.gsub!(/text\(\d+\)/, "text")                     # Fix text(16) column defs
  File.open(filename, "w") { |file| file.puts dump }
end

#structure_load(filename, extra_flags) ⇒ Object



77
78
79
# File 'lib/active_record/tasks/sqlserver_database_tasks.rb', line 77

def structure_load(filename, extra_flags)
  connection.execute File.read(filename)
end