myreplicator 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/models/myreplicator/export.rb +9 -4
- data/lib/myreplicator/version.rb +1 -1
- data/test/dummy/config/database.yml +13 -13
- data/test/dummy/config/database.yml.sample +2 -0
- data/test/dummy/config/myreplicator.yml +9 -13
- data/test/dummy/load_exceptions.log +1 -0
- data/test/dummy/log/development.log +3279 -1644
- data/test/dummy/tmp/cache/assets/BE9/F00/sprockets%2F71b85f682226652265224563a92d012c +0 -0
- data/test/dummy/tmp/cache/assets/{DF8/5D0/sprockets%2Fb815ed34d61cfed96222daa3bfd1d84d → C36/4A0/sprockets%2F545908d60919384cf74dd2658832a349} +0 -0
- data/test/dummy/tmp/cache/assets/{D69/6F0/sprockets%2F94fff7f55bc4c300b25f3f9361ac1a52 → C53/E40/sprockets%2Ff3eadad8548570531548a50069659241} +0 -0
- data/test/dummy/tmp/cache/assets/C55/470/sprockets%2F7493d2001e124f4fa090fb8664898327 +0 -0
- data/test/dummy/tmp/cache/assets/{D46/AA0/sprockets%2Ffcd7c5d9d04071ee45fe6a4865d53621 → C6A/110/sprockets%2F8578e16b59362054b8e3f580e45b7589} +0 -0
- data/test/dummy/tmp/cache/assets/C92/350/sprockets%2F147976739b994ea0e5833048aebc5447 +0 -0
- data/test/dummy/tmp/cache/assets/{D74/DF0/sprockets%2F2db9c6478b8a29583ad20780ebeb4e4d → CA5/3A0/sprockets%2F24338fe3c579f79b67d198549674d48a} +0 -0
- data/test/dummy/tmp/cache/assets/CB0/AD0/sprockets%2F836537535ea3b4aa2d1b6789d11d4926 +0 -0
- data/test/dummy/tmp/cache/assets/{D06/5D0/sprockets%2F91850a20c0ddfa3d8814ca91870fb715 → CBA/4C0/sprockets%2F54386f4be21f77c788524fa5b11d6850} +0 -0
- data/test/dummy/tmp/cache/assets/CC3/5C0/sprockets%2Fe1d5f04ad1787592629a99b22f8c5567 +0 -0
- data/test/dummy/tmp/cache/assets/{DAA/060/sprockets%2Facc0d22b9d28123cc1c84d0db630d0ba → CC5/C90/sprockets%2F7a318379ad738c7f47aa44862e58e339} +0 -0
- data/test/dummy/tmp/cache/assets/CCF/EA0/sprockets%2F5058706a1b7e72b34903fb00a7a0fc39 +0 -0
- data/test/dummy/tmp/cache/assets/CE1/370/sprockets%2Ff1a3b204bb618eba1846687099f640f7 +0 -0
- data/test/dummy/tmp/cache/assets/CE2/AD0/sprockets%2F51321b84e79ca92b09e4e6d0680b4f56 +0 -0
- data/test/dummy/tmp/cache/assets/CE8/5A0/sprockets%2F7367c62ac3a27578b50b924e2fe8b746 +0 -0
- data/test/dummy/tmp/cache/assets/{D8B/B60/sprockets%2Faa32227c440a378ccd21218eefeb80bf → CE8/8A0/sprockets%2F2ed5b94e22ac7a692e562c767944093a} +0 -0
- data/test/dummy/tmp/cache/assets/CFB/530/sprockets%2F14190013244760ce4b30b2dbff73a8ef +0 -0
- data/test/dummy/tmp/cache/assets/{CD7/030/sprockets%2F9ba4859590582b8b72a650b2b00b6cd2 → D06/850/sprockets%2Ff836842d203808ac78fc0cf30b4b0c72} +0 -0
- data/test/dummy/tmp/cache/assets/D13/830/sprockets%2Fe39b0c5cb9a9084e314de7ae97026562 +0 -0
- data/test/dummy/tmp/cache/assets/D1B/360/sprockets%2Fe0e9b41868bf8a806f190df71512f83e +0 -0
- data/test/dummy/tmp/cache/assets/D1B/970/sprockets%2F0e1455d479dbf72d92cd23f28ed75842 +0 -0
- data/test/dummy/tmp/cache/assets/{C7F/970/sprockets%2F03f29761343991c6cd347bbd2184d560 → D36/320/sprockets%2Fc662bfc4a04da6af6804481495bfa108} +0 -0
- data/test/dummy/tmp/cache/assets/{D50/570/sprockets%2F6c1d20a178f66e798958d1e437fdb5da → D3B/060/sprockets%2F049a04139e96acd00a20e6f88b538fbf} +0 -0
- data/test/dummy/tmp/cache/assets/{C83/BA0/sprockets%2F701a6339a558e5af28f150c161f43878 → D3C/EF0/sprockets%2F3b257fcef04542cf19da19f2f1c62761} +0 -0
- data/test/dummy/tmp/cache/assets/{E3B/400/sprockets%2F5b0ce0efc07fdef9786e786cad5b84ba → D42/4D0/sprockets%2F11ab8d065b2f678ae997dac015972d7a} +0 -0
- data/test/dummy/tmp/cache/assets/D43/100/sprockets%2Fe10493f07854d6da3a883ddd4e911c9a +0 -0
- data/test/dummy/tmp/cache/assets/D44/470/sprockets%2F9538d7d811d21efe47400772be4d4efb +0 -0
- data/test/dummy/tmp/cache/assets/{DE1/320/sprockets%2F9f44ecdec8ceeef70871e15d88a448b1 → D45/7C0/sprockets%2F7935d1666c0f916efdb4e44d10ce087c} +0 -0
- data/test/dummy/tmp/cache/assets/{CE5/670/sprockets%2Fe9e4122f1706626a21da6f8457f088ce → D4B/090/sprockets%2F3cfd81b97448f6103d74d0a7b197c7ff} +0 -0
- data/test/dummy/tmp/cache/assets/D4F/E30/sprockets%2F7d4c622d36585e70d9f4ce6d83ae4a58 +0 -0
- data/test/dummy/tmp/cache/assets/D51/2D0/sprockets%2F7457c2dac213b0415022ac55fab5cb9a +0 -0
- data/test/dummy/tmp/cache/assets/D5B/5C0/sprockets%2F4e0d53616225ee8dbd80d06d3fa20ca2 +0 -0
- data/test/dummy/tmp/cache/assets/D6B/F60/sprockets%2Ff897ac3f53a8b248abb51abb812875c1 +0 -0
- data/test/dummy/tmp/cache/assets/D6D/7A0/sprockets%2Fece60a47c5639c873cfe144140cd72eb +0 -0
- data/test/dummy/tmp/cache/assets/{E35/4F0/sprockets%2F96b1cdf8db6a1c8eb8abcce05958ae74 → D74/F80/sprockets%2F9409bb9efe926f0130490fdca7c5ea73} +0 -0
- data/test/dummy/tmp/cache/assets/{D36/4D0/sprockets%2Fc050a64b5a803a638e155d05dcfe577d → D7F/D00/sprockets%2F10b0bae19e1ece503f23252ea80b5cf1} +0 -0
- data/test/dummy/tmp/cache/assets/{CD5/B90/sprockets%2Fc999d13a6a21113981c0d820e8043bdf → D82/050/sprockets%2F3dfff61e335fbf562b9a98f8742d4b90} +0 -0
- data/test/dummy/tmp/cache/assets/D82/D30/sprockets%2Fcdd32b3338793e35a78f58efad64be96 +0 -0
- data/test/dummy/tmp/cache/assets/D91/D90/sprockets%2F60b95ba2a84d6c720cd412c9e0e44afd +0 -0
- data/test/dummy/tmp/cache/assets/{E1C/AC0/sprockets%2Faff544a3a34eb7dab7d46b0cb2cd7b70 → D95/F60/sprockets%2F83fff218aa39ccc49352ff3f2a1a06b1} +0 -0
- data/test/dummy/tmp/cache/assets/D98/360/sprockets%2Fc9bf8e838b5afed8e8479876a9419a5e +0 -0
- data/test/dummy/tmp/cache/assets/D9B/790/sprockets%2F8182e1ebcce8ca3f3d30e26bd931654f +0 -0
- data/test/dummy/tmp/cache/assets/D9C/E60/sprockets%2F788bb2bebc8ed41035ca7cc50c68e553 +0 -0
- data/test/dummy/tmp/cache/assets/{D99/6D0/sprockets%2Fa5e4558ff6808ad03b0f09e03fb4bfb3 → DA2/580/sprockets%2Fc8fe3cbc8b57ba600fe4fc3317e70875} +0 -0
- data/test/dummy/tmp/cache/assets/DBF/E30/sprockets%2Fd5e3199429abe1e1ce22c233ddbaec25 +0 -0
- data/test/dummy/tmp/cache/assets/DC5/EA0/sprockets%2Fc3821d00ce6bea8ebf265d439d14b6be +0 -0
- data/test/dummy/tmp/cache/assets/DCA/5F0/sprockets%2F15be5a98423136a3c8dcf7dff1ad45ad +0 -0
- data/test/dummy/tmp/cache/assets/{CBF/800/sprockets%2F00142a873933017aaa760316d0e2dcea → DCB/970/sprockets%2Fffc91d7a12aab685d3484b0bfd5c824e} +0 -0
- data/test/dummy/tmp/cache/assets/{D20/A20/sprockets%2Fb503e93ff1966dd94d03e79f291d75c1 → DDC/CD0/sprockets%2Fb4b0d7dc6d4a0bcc2e5600bf5b15d2a1} +0 -0
- data/test/dummy/tmp/cache/assets/{CC6/7C0/sprockets%2F881234d3e954859c46bf49bb21f72d79 → DEC/900/sprockets%2Fe8ff7b68993fbee4dc864f1d5c373fe1} +0 -0
- data/test/dummy/tmp/cache/assets/{E2E/1F0/sprockets%2Fa24e3d7bc5ae4d40adf6f1b8fe94e7c3 → DF1/DA0/sprockets%2Fa761efb1e3e1c1cadd288b51b0ad68c8} +0 -0
- data/test/dummy/tmp/cache/assets/E2D/2C0/sprockets%2Ff0c2e561abf62fabc69462c2cfeef3d8 +0 -0
- data/test/dummy/tmp/cache/assets/{C2E/D00/sprockets%2F667019818351638709494c01bddb5f68 → E76/790/sprockets%2Fdaf734b1fcabd6ca66b333ad0f0fdbf0} +0 -0
- data/test/dummy/tmp/cache/assets/{D86/D00/sprockets%2Fa4f32b4234d0d1bba272cd75e0d48e1d → F08/560/sprockets%2F5ab2cf5fb087fdef95cfe9fe6fabf9df} +0 -0
- data/test/dummy/tmp/pids/server.pid +1 -0
- metadata +233 -251
- data/db/migrate/20130213211927_create_myreplicator_vertica_exports.rb~ +0 -8
- data/lib/configuration.rb~ +0 -23
- data/lib/exporter/mysql_exporter.rb~ +0 -6
- data/lib/exporter.rb~ +0 -1
- data/lib/loader/vertica/source_db.rb~ +0 -30
- data/lib/loader/vertica/vertica_loader.rb~ +0 -175
- data/lib/loader/vertica/vertica_sql.rb~ +0 -60
- data/lib/transporter/parallelizer.rb~ +0 -5
- data/test/dummy/app/controllers/test_controller.rb~ +0 -8
- data/test/dummy/config/database.yml~ +0 -47
- data/test/dummy/config/myreplicator.yml~ +0 -23
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/tmp/cache/assets/C8B/150/sprockets%2F37163d05e55ad0b31b602ac5330412e3 +0 -0
- data/test/dummy/tmp/cache/assets/C98/250/sprockets%2F4af1200380a1a28632393d61a50f66cf +0 -0
- data/test/dummy/tmp/cache/assets/CC5/870/sprockets%2F4e91734f6f02a779d39f8272f627dd24 +0 -0
- data/test/dummy/tmp/cache/assets/CC9/1C0/sprockets%2Fa7a2b5a56180e1b21f783a9b30c03167 +0 -0
- data/test/dummy/tmp/cache/assets/CCC/A20/sprockets%2F6f3c2f4ae1f4d0219804a257410ce405 +0 -0
- data/test/dummy/tmp/cache/assets/CDE/780/sprockets%2F6982ce9303b4e69c26f2a1a246a180e7 +0 -0
- data/test/dummy/tmp/cache/assets/CE0/180/sprockets%2F8b9055a1b853d0a56ec2e94f79f37010 +0 -0
- data/test/dummy/tmp/cache/assets/D00/9B0/sprockets%2F2bc203eb4802b393a589093debb65c04 +0 -0
- data/test/dummy/tmp/cache/assets/D00/A90/sprockets%2F3fa6fcf2205c530208681446cbc36bd3 +0 -0
- data/test/dummy/tmp/cache/assets/D0B/B30/sprockets%2F55059589d999952597c5c86e5becaf4e +0 -0
- data/test/dummy/tmp/cache/assets/D0D/DA0/sprockets%2F34d6b075a16a5a58ff4050988d8bd4b0 +0 -0
- data/test/dummy/tmp/cache/assets/D14/3A0/sprockets%2Fe59a60053fada52e8185281b4ee887a5 +0 -0
- data/test/dummy/tmp/cache/assets/D1B/D40/sprockets%2F7cc2142509e95f7168a82a652d8d9dea +0 -0
- data/test/dummy/tmp/cache/assets/D1D/700/sprockets%2Ffe9cb975216709e2881c74b3d1d3e35f +0 -0
- data/test/dummy/tmp/cache/assets/D21/D40/sprockets%2Fe5a6e691816fa904f414ea89a6f0586f +0 -0
- data/test/dummy/tmp/cache/assets/D26/A70/sprockets%2F63d95ae156df465783cd78e95069b2cc +0 -0
- data/test/dummy/tmp/cache/assets/D2B/E60/sprockets%2F8615ecf645b553c959544af9ff8438da +0 -0
- data/test/dummy/tmp/cache/assets/D34/F70/sprockets%2Fb93de9992473bee94e369fe3198c529c +0 -0
- data/test/dummy/tmp/cache/assets/D3E/310/sprockets%2F333a2a7535eac766267ebb7d5c2ab489 +0 -0
- data/test/dummy/tmp/cache/assets/D3F/A00/sprockets%2F7a803404e1f60b8d672d763cb9ba8af5 +0 -0
- data/test/dummy/tmp/cache/assets/D57/420/sprockets%2F937ea7429c536578ec7b688dee0cdf41 +0 -0
- data/test/dummy/tmp/cache/assets/D7C/E30/sprockets%2F0ba91e21bddfc7e1de102b22183e1e11 +0 -0
- data/test/dummy/tmp/cache/assets/D80/780/sprockets%2Fbe257c7a5788c2dfd272922fa399d7db +0 -0
- data/test/dummy/tmp/cache/assets/D85/9C0/sprockets%2Ffd0ec212bac1538379d0cc03b1e3bb84 +0 -0
- data/test/dummy/tmp/cache/assets/D9F/0B0/sprockets%2Faf0d2e69be3a6b56a76c20bf14d9e468 +0 -0
- data/test/dummy/tmp/cache/assets/DA7/E50/sprockets%2F47bf4f2b4afeac775e6d572a83343fb8 +0 -0
- data/test/dummy/tmp/cache/assets/DA8/910/sprockets%2Fab5775c4a837bd4d97ac394d473cda9b +0 -0
- data/test/dummy/tmp/cache/assets/DB0/8E0/sprockets%2F299733fb380a50e6fccf9fb3cd666eb9 +0 -0
- data/test/dummy/tmp/cache/assets/DD2/490/sprockets%2Fa452ee92a092bc2feabc572cce49896d +0 -0
- data/test/dummy/tmp/cache/assets/E16/C70/sprockets%2F21ad93418ff75ceac86c7a85dfffe8f6 +0 -0
- data/test/dummy/tmp/cache/assets/E57/E40/sprockets%2Ff3c7dda392bb05e4ffac29c5da6ffc11 +0 -0
- data/test/fixtures/myreplicator/vertica_exports.yml +0 -11
data/lib/configuration.rb~
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module Myreplicator
|
|
2
|
-
##
|
|
3
|
-
# Configuration class for avoiding load the yml file everytime and cleaner config settings
|
|
4
|
-
##
|
|
5
|
-
class Configuration
|
|
6
|
-
class << self; attr_accessor :tmp_path, :mysqldump, :mysql end
|
|
7
|
-
|
|
8
|
-
# yml = YAML.load(File.read("#{Myreplicator.app_root}/config/myreplicator.yml"))
|
|
9
|
-
# Kernel.p yml["myreplicator"]
|
|
10
|
-
|
|
11
|
-
# @@tmp_path = yml["myreplicator"]["tmp_path"]
|
|
12
|
-
# @@mysql = yml["myreplicator"]["mysql"]
|
|
13
|
-
# @@mysqldump = yml["myreplicator"]["mysqldump"]
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def self.config(&block)
|
|
17
|
-
@@config ||= Myreplicator::Configuration.new
|
|
18
|
-
|
|
19
|
-
yield @@config if block
|
|
20
|
-
|
|
21
|
-
return @@config
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/exporter.rb~
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require ""
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module VerticaUtils
|
|
2
|
-
class SourceDb < ActiveRecord::Base
|
|
3
|
-
|
|
4
|
-
def self.connect db
|
|
5
|
-
establish_connection(ActiveRecord::Base.configurations[db])
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
##
|
|
9
|
-
# Returns tables as an Array
|
|
10
|
-
# releases the connection
|
|
11
|
-
##
|
|
12
|
-
def self.get_tables(db)
|
|
13
|
-
tables = []
|
|
14
|
-
begin
|
|
15
|
-
self.connect(db)
|
|
16
|
-
tables = self.connection.tables
|
|
17
|
-
self.connection_pool.release_connection
|
|
18
|
-
rescue Mysql2::Error => e
|
|
19
|
-
puts "Connection to #{db} Failed!"
|
|
20
|
-
puts e.message
|
|
21
|
-
end
|
|
22
|
-
return tables
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.exec_sql source_db,sql
|
|
26
|
-
SourceDb.connect(source_db)
|
|
27
|
-
return SourceDb.connection.execute(sql)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
require 'vertica_utils/types'
|
|
2
|
-
require 'vertica_utils/source_db'
|
|
3
|
-
require 'vertica_utils/vertica_sql'
|
|
4
|
-
|
|
5
|
-
module VerticaUtils
|
|
6
|
-
class VerticaLoader
|
|
7
|
-
class << self
|
|
8
|
-
def create_table *args
|
|
9
|
-
options = args.extract_options!
|
|
10
|
-
columns = []
|
|
11
|
-
table_definition(options).each(:as => :hash) do |row|
|
|
12
|
-
columns << row
|
|
13
|
-
end
|
|
14
|
-
options[:columns] = columns
|
|
15
|
-
|
|
16
|
-
sql = VerticaUtils::VerticaSql.create_table_stmt options
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def create_all_tables db
|
|
20
|
-
tables = VerticaUtils::SourceDb.get_tables(db)
|
|
21
|
-
sqls = {}
|
|
22
|
-
tables.each do |table|
|
|
23
|
-
puts "Creating #{db}.#{table}"
|
|
24
|
-
sql = "DROP TABLE IF EXISTS #{db}.#{table} CASCADE;"
|
|
25
|
-
VerticaDb::Base.connection.execute sql
|
|
26
|
-
sql = VerticaUtils::VerticaLoader.create_table(:vertica_db => "bidw",
|
|
27
|
-
:vertica_table => table,
|
|
28
|
-
:vertica_schema => db,
|
|
29
|
-
:table => table,
|
|
30
|
-
:db => db)
|
|
31
|
-
sqls["#{table}"] = sql
|
|
32
|
-
VerticaDb::Base.connection.execute sql
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def prepare_options *args
|
|
37
|
-
options = args.extract_options!
|
|
38
|
-
options.reverse_merge!(
|
|
39
|
-
:host => "sfo-load-dw-01",
|
|
40
|
-
:user => "vertica",
|
|
41
|
-
:pass => "test",
|
|
42
|
-
:db => "bidw",
|
|
43
|
-
:schema => "test",
|
|
44
|
-
:table => "",
|
|
45
|
-
:file => "",
|
|
46
|
-
:delimiter => "\t",
|
|
47
|
-
:null_value => "NULL",
|
|
48
|
-
:enclosed => ""
|
|
49
|
-
)
|
|
50
|
-
return options
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# VerticaUtils::VerticaLoader.load_to_vertica({:schema => "king", :table => "category_overview_data", :file => "tmp/vertica/category_overview_data.tsv", :null_value => "NULL"})
|
|
54
|
-
def load_to_vertica *args
|
|
55
|
-
list_of_nulls = ["0000-00-00"]
|
|
56
|
-
options = args.extract_options!
|
|
57
|
-
prepared_options = prepare_options options
|
|
58
|
-
Kernel.p prepared_options[:file]
|
|
59
|
-
if prepared_options[:file].blank?
|
|
60
|
-
raise "No input file"
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
begin
|
|
64
|
-
process_file(:file => prepared_options[:file], :list_of_nulls => list_of_nulls, :null_value => prepared_options[:null_value])
|
|
65
|
-
cmd = get_vsql_command(prepared_options)
|
|
66
|
-
Kernel.p cmd
|
|
67
|
-
system(cmd)
|
|
68
|
-
rescue Exception => e
|
|
69
|
-
raise e.message
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def get_vsql_command prepared_options
|
|
74
|
-
file_extension = prepared_options[:file].split('.').last
|
|
75
|
-
file_handler = ""
|
|
76
|
-
file_handler = "GZIP" if file_extension == "gz"
|
|
77
|
-
sql = "COPY #{prepared_options[:schema]}.#{prepared_options[:table]} FROM LOCAL \'#{prepared_options[:file]}\' #{file_handler} DELIMITER E\'#{prepared_options[:delimiter]}\' NULL as \'#{prepared_options[:null_value]}\' ENCLOSED BY \'#{prepared_options[:enclosed]}\' EXCEPTIONS 'tmp/vertica/load_exceptions.log';"
|
|
78
|
-
cmd = "/opt/vertica/bin/vsql -h #{prepared_options[:host]} -U #{prepared_options[:user]} -w #{prepared_options[:pass]} -d #{prepared_options[:db]} -c \"#{sql}\""
|
|
79
|
-
return cmd
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def process_file *args
|
|
83
|
-
### replace the null values in the input file
|
|
84
|
-
options = args.extract_options!
|
|
85
|
-
options[:file].blank? ? return : file = options[:file]
|
|
86
|
-
options[:list_of_nulls].blank? ? list_of_nulls = [] : list_of_nulls = options[:list_of_nulls]
|
|
87
|
-
options[:null_value].blank? ? null_value = "NULL" : null_value = options[:null_value]
|
|
88
|
-
|
|
89
|
-
file_extension = file.split('.').last
|
|
90
|
-
case file_extension
|
|
91
|
-
when "tsv", "csv"
|
|
92
|
-
process_flat_file(file, list_of_nulls, null_value)
|
|
93
|
-
when "gz"
|
|
94
|
-
process_gzip_file(file, list_of_nulls, null_value)
|
|
95
|
-
else
|
|
96
|
-
raise "Un supported file extension"
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def replace_null(file, list_of_nulls, null_value = "NULL")
|
|
101
|
-
list_of_nulls.each do | value|
|
|
102
|
-
# special case for NULL MySQL datetime/date type but the column is defined NOT NULL
|
|
103
|
-
if value == '0000-00-00'
|
|
104
|
-
cmd1 = "sed -i 's/#{value}/1900-01-01/g' #{file}"
|
|
105
|
-
Kernel.p cmd1
|
|
106
|
-
system(cmd1)
|
|
107
|
-
else
|
|
108
|
-
cmd1 = "sed -i 's/#{value}/#{null_value}/g' #{file}"
|
|
109
|
-
Kernel.p cmd1
|
|
110
|
-
system(cmd1)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def process_flat_file file, list_of_nulls, null_value
|
|
116
|
-
# sed
|
|
117
|
-
replace_null(file, list_of_nulls, null_value)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def process_gzip_file file, list_of_nulls, null_value
|
|
121
|
-
# unzip
|
|
122
|
-
cmd = "gunzip -f #{file} -c > tmp/temp.txt"
|
|
123
|
-
system(cmd)
|
|
124
|
-
# sed
|
|
125
|
-
replace_null(file, list_of_nulls, null_value)
|
|
126
|
-
# zip
|
|
127
|
-
cmd2 = "gzip tmp/temp.txt -c > #{file}"
|
|
128
|
-
system(cmd2)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def get_table_columns * args
|
|
132
|
-
options = args.extract_options!
|
|
133
|
-
if options[:host].blank? or options[:user].blank? or options[:pass].blank? or options[:db].blank? or options[:schema].blank? or options[:table].blank?
|
|
134
|
-
raise "Unspecified host, user, pass, db, schema or table"
|
|
135
|
-
end
|
|
136
|
-
result = {}
|
|
137
|
-
count = 0
|
|
138
|
-
begin
|
|
139
|
-
cmd = "/opt/vertica/bin/vsql -h #{options[:host]} -U #{options[:user]} -w #{options[:pass]} -d #{options[:db]} -c '\\d #{options[:schema]}.#{options[:table]}';"
|
|
140
|
-
puts cmd
|
|
141
|
-
output = `#{cmd}`
|
|
142
|
-
lines = output.split("\n")
|
|
143
|
-
data = lines[3..lines.size-2]
|
|
144
|
-
data.each do |item|
|
|
145
|
-
count += 1
|
|
146
|
-
column_name = item.split("|")[2].lstrip!.rstrip!
|
|
147
|
-
column_type = item.split("|")[3].lstrip!.rstrip!
|
|
148
|
-
puts column_name + " " + column_type
|
|
149
|
-
result[count] = {column_name => column_type}
|
|
150
|
-
end
|
|
151
|
-
rescue Exception => e
|
|
152
|
-
raise e.message
|
|
153
|
-
end
|
|
154
|
-
return result
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def ssh_connection options
|
|
158
|
-
ssh = Net::SSH.start(options[:ssh_host], options[:ssh_user], :password => options[:ssh_password])
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def table_definition options
|
|
162
|
-
sql = "SELECT table_schema, table_name, column_name, is_nullable, data_type, column_type, column_key "
|
|
163
|
-
sql += "FROM INFORMATION_SCHEMA.COLUMNS where table_name = '#{options[:table]}' "
|
|
164
|
-
sql += "and table_schema = '#{options[:db]}';"
|
|
165
|
-
|
|
166
|
-
puts sql
|
|
167
|
-
|
|
168
|
-
desc = SourceDb.exec_sql(options[:db], sql)
|
|
169
|
-
|
|
170
|
-
return desc
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
module VerticaUtils
|
|
2
|
-
class VerticaSql
|
|
3
|
-
|
|
4
|
-
def self.create_table_stmt options
|
|
5
|
-
|
|
6
|
-
sql = "CREATE TABLE IF NOT EXISTS #{options[:vertica_db]}."
|
|
7
|
-
sql += "#{options[:vertica_schema]}." if options[:vertica_schema]
|
|
8
|
-
sql += "#{options[:table]} ("
|
|
9
|
-
|
|
10
|
-
index = 1
|
|
11
|
-
primary_set = false
|
|
12
|
-
|
|
13
|
-
options[:columns].each do |column|
|
|
14
|
-
sql += "\"#{column['column_name']}\" "
|
|
15
|
-
|
|
16
|
-
sql += data_type(column['data_type'], column['column_type'])
|
|
17
|
-
sql += " "
|
|
18
|
-
|
|
19
|
-
if column['column_key'] == "PRI"
|
|
20
|
-
sql += key(column['column_key']) + " " unless primary_set # set only one primary key
|
|
21
|
-
primary_set = true
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
sql += nullable(column['is_nullable'])
|
|
25
|
-
sql += " "
|
|
26
|
-
|
|
27
|
-
if index < options[:columns].size
|
|
28
|
-
sql += ", "
|
|
29
|
-
else
|
|
30
|
-
sql += ");"
|
|
31
|
-
end
|
|
32
|
-
index += 1
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
puts sql
|
|
36
|
-
|
|
37
|
-
return sql
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def self.nullable is_nullable
|
|
41
|
-
if is_nullable == "YES"
|
|
42
|
-
return "NULL"
|
|
43
|
-
elsif is_nullable == "NO"
|
|
44
|
-
return "NOT NULL"
|
|
45
|
-
end
|
|
46
|
-
return ""
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def self.data_type type, col_type
|
|
50
|
-
type = VerticaTypes.convert type, col_type
|
|
51
|
-
result = " #{type} "
|
|
52
|
-
return result
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def self.key col_key
|
|
56
|
-
col_key = VerticaTypes.convert_key col_key
|
|
57
|
-
return "#{col_key} "
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# SQLite version 3.x
|
|
2
|
-
# gem install sqlite3
|
|
3
|
-
#
|
|
4
|
-
# Ensure the SQLite 3 gem is defined in your Gemfile
|
|
5
|
-
# gem 'sqlite3'
|
|
6
|
-
development:
|
|
7
|
-
adapter: mysql2
|
|
8
|
-
database: myreplicator
|
|
9
|
-
username: sas
|
|
10
|
-
password: sasan
|
|
11
|
-
host: 127.0.0.1
|
|
12
|
-
|
|
13
|
-
okl_dev:
|
|
14
|
-
adapter: mysql2
|
|
15
|
-
database: okl_dev
|
|
16
|
-
username: sas
|
|
17
|
-
password: sasan
|
|
18
|
-
host: 127.0.0.1
|
|
19
|
-
|
|
20
|
-
okl_test:
|
|
21
|
-
adapter: mysql2
|
|
22
|
-
database: okl_test
|
|
23
|
-
username: xbox
|
|
24
|
-
password: okl
|
|
25
|
-
host: 54.243.176.8
|
|
26
|
-
|
|
27
|
-
myreplicator:
|
|
28
|
-
adapter: mysql2
|
|
29
|
-
database: myreplicator
|
|
30
|
-
username: sas
|
|
31
|
-
password: sasan
|
|
32
|
-
host: 127.0.0.1
|
|
33
|
-
|
|
34
|
-
# Warning: The database defined as "test" will be erased and
|
|
35
|
-
# re-generated from your development database when you run "rake".
|
|
36
|
-
# Do not set this db to the same as development or production.
|
|
37
|
-
test:
|
|
38
|
-
adapter: sqlite3
|
|
39
|
-
database: db/test.sqlite3
|
|
40
|
-
pool: 5
|
|
41
|
-
timeout: 5000
|
|
42
|
-
|
|
43
|
-
production:
|
|
44
|
-
adapter: sqlite3
|
|
45
|
-
database: db/production.sqlite3
|
|
46
|
-
pool: 5
|
|
47
|
-
timeout: 5000
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
myreplicator:
|
|
2
|
-
tmp_path:
|
|
3
|
-
mysqldump: mysqldump
|
|
4
|
-
mysqlimport: mysqlimport
|
|
5
|
-
mysql: mysql
|
|
6
|
-
outfile_location: /tmp/myreplicator
|
|
7
|
-
escape_by: '"'
|
|
8
|
-
terminate_by: '\t'
|
|
9
|
-
enclosed_by: '"'
|
|
10
|
-
lines_terminate_by: '\n'
|
|
11
|
-
|
|
12
|
-
okl_dev:
|
|
13
|
-
ssh_host: localhost
|
|
14
|
-
ssh_user: guest
|
|
15
|
-
ssh_password: sasanguest
|
|
16
|
-
ssh_tmp_dir: /home/guest/tmp
|
|
17
|
-
|
|
18
|
-
okl_test:
|
|
19
|
-
ssh_host: 54.243.176.8
|
|
20
|
-
ssh_user: ubuntu
|
|
21
|
-
ssh_db_host: 127.0.0.1
|
|
22
|
-
ssh_private_key: ~/.ssh/oklbi-team.pem
|
|
23
|
-
ssh_tmp_dir: /home/ubuntu/myreplicator_tmp
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
|
|
2
|
-
|
|
3
|
-
# This model initially had no columns defined. If you add columns to the
|
|
4
|
-
# model remove the '{}' from the fixture names and add the columns immediately
|
|
5
|
-
# below each fixture, per the syntax in the comments below
|
|
6
|
-
#
|
|
7
|
-
one: {}
|
|
8
|
-
# column: value
|
|
9
|
-
#
|
|
10
|
-
two: {}
|
|
11
|
-
# column: value
|