flydata 0.2.17 → 0.2.18

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/flydata-core/.gitignore +16 -0
  4. data/flydata-core/.rspec +1 -0
  5. data/flydata-core/.travis.yml +6 -0
  6. data/flydata-core/Gemfile +11 -0
  7. data/flydata-core/Gemfile.lock +51 -0
  8. data/flydata-core/lib/flydata-core/core_ext/module/include.rb +5 -0
  9. data/flydata-core/lib/flydata-core/core_ext/module.rb +1 -0
  10. data/flydata-core/lib/flydata-core/core_ext/object/prepend.rb +17 -0
  11. data/flydata-core/lib/flydata-core/core_ext/object.rb +1 -0
  12. data/flydata-core/lib/flydata-core/core_ext.rb +3 -0
  13. data/flydata-core/lib/flydata-core/errors.rb +334 -0
  14. data/flydata-core/lib/flydata-core/logger.rb +205 -0
  15. data/{lib/flydata → flydata-core/lib/flydata-core}/table_def/mysql_table_def.rb +6 -8
  16. data/{lib/flydata → flydata-core/lib/flydata-core}/table_def/redshift_table_def.rb +17 -2
  17. data/flydata-core/lib/flydata-core/table_def.rb +2 -0
  18. data/flydata-core/lib/flydata-core/thread_context.rb +31 -0
  19. data/flydata-core/lib/flydata-core.rb +1 -0
  20. data/flydata-core/spec/spec_helper.rb +2 -0
  21. data/{spec/flydata → flydata-core/spec}/table_def/mysql_table_def_spec.rb +22 -8
  22. data/flydata-core/spec/table_def/mysql_to_redshift_table_def_spec.rb +428 -0
  23. data/flydata-core/spec/table_def/mysqldump_test_bit_table.dump +51 -0
  24. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_foreign_key.dump +0 -0
  25. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_table_all.dump +0 -0
  26. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_table_column_comment.dump +0 -0
  27. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_table_enum.dump +0 -0
  28. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_table_multi_pk.dump +0 -0
  29. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_table_no_pk.dump +0 -0
  30. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_unique_key.dump +0 -0
  31. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_unique_key2.dump +0 -0
  32. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_unique_key3.dump +0 -0
  33. data/{spec/flydata → flydata-core/spec}/table_def/mysqldump_test_unsigned.dump +0 -0
  34. data/{spec/flydata → flydata-core/spec}/table_def/redshift_table_def_spec.rb +63 -16
  35. data/flydata.gemspec +34 -18
  36. data/lib/flydata/command/sync.rb +11 -8
  37. data/lib/flydata/parser/mysql/mysql_alter_table.treetop +128 -18
  38. data/lib/flydata/parser_provider.rb +1 -1
  39. data/lib/flydata.rb +11 -1
  40. data/spec/flydata/parser/mysql/alter_table_parser_spec.rb +173 -2
  41. data/spec/spec_helper.rb +3 -1
  42. metadata +34 -18
  43. data/.gitignore +0 -49
  44. data/lib/flydata/table_def.rb +0 -2
@@ -1,4 +1,4 @@
1
- module Flydata
1
+ module FlydataCore
2
2
  module TableDef
3
3
 
4
4
  class MysqlTableDef
@@ -78,8 +78,8 @@ class MysqlTableDef
78
78
  nil
79
79
  end
80
80
 
81
- def self.create(io)
82
- params = _create(io)
81
+ def self.create(io, options = {})
82
+ params = _create(io, options)
83
83
  params ? self.new(*params) : nil
84
84
  end
85
85
 
@@ -91,7 +91,7 @@ class MysqlTableDef
91
91
  @comment = comment
92
92
  end
93
93
 
94
- def self._create(io)
94
+ def self._create(io, options)
95
95
  table_def = ''
96
96
  table_name = nil
97
97
  columns = []
@@ -136,7 +136,7 @@ class MysqlTableDef
136
136
  end
137
137
 
138
138
  when :after_create_table
139
- unless columns.any? {|column| column[:primary_key]}
139
+ unless columns.any? {|column| column[:primary_key]} or options[:skip_primary_key_check]
140
140
  raise TableDefError, {error: "no primary key defined", table: table_name}
141
141
  end
142
142
  break
@@ -196,10 +196,8 @@ class MysqlTableDef
196
196
  column[:auto_increment] = true if line =~ /AUTO_INCREMENT/i
197
197
  column[:not_null] = true if line =~ /NOT NULL/i
198
198
  column[:unique] = true if line =~ /UNIQUE/i
199
- if /DEFAULT\s+((?:[^'\s]+\b)|(?:'(?:\\'|[^'])*'))/i.match(line)
199
+ if /DEFAULT\s+((?:[bx]?'(?:\\'|[^'])*')|(?:[^'\s]+\b))/i.match(line)
200
200
  val = $1
201
- val = val.slice(1..-1) if val.start_with?("'")
202
- val = val.slice(0..-2) if val.end_with?("'")
203
201
  column[:default] = val == "NULL" ? nil : val
204
202
  end
205
203
  if /COMMENT\s+'(((?:\\'|[^'])*))'/i.match(line)
@@ -1,4 +1,7 @@
1
- module Flydata
1
+ require 'date'
2
+ require 'flydata-core/errors'
3
+
4
+ module FlydataCore
2
5
  module TableDef
3
6
 
4
7
  class RedshiftTableDef
@@ -140,7 +143,19 @@ EOS
140
143
  when 'date'
141
144
  "'#{self.parse_date(default_value)}'"
142
145
  else
143
- "'#{default_value}'"
146
+ if !default_value.kind_of?(String)
147
+ "'#{default_value}'"
148
+ elsif /^b'.+'$/.match(default_value)
149
+ "0b#{default_value[2..-2]}".oct
150
+ elsif /^[xX]'.+'$/.match(default_value)
151
+ "0x#{default_value[2..-2]}".oct
152
+ elsif /^0[bx].+/.match(default_value)
153
+ default_value.oct
154
+ elsif /^'.*'$/.match(default_value)
155
+ default_value
156
+ else
157
+ "'#{default_value}'"
158
+ end
144
159
  end
145
160
  end
146
161
 
@@ -0,0 +1,2 @@
1
+ require 'flydata-core/table_def/redshift_table_def'
2
+ require 'flydata-core/table_def/mysql_table_def'
@@ -0,0 +1,31 @@
1
+ module FlydataCore
2
+ class ThreadContext
3
+ THREAD_LOCAL_KEY = 'flydata_thread_context'
4
+
5
+ def self.initialize(params = {})
6
+ Thread.current[THREAD_LOCAL_KEY] = params
7
+ end
8
+
9
+ def self.initialized?
10
+ !!(Thread.current[THREAD_LOCAL_KEY])
11
+ end
12
+
13
+ def self.parameters
14
+ Thread.current[THREAD_LOCAL_KEY]
15
+ end
16
+
17
+ def self.[](k)
18
+ h = Thread.current[THREAD_LOCAL_KEY]
19
+ h[k]
20
+ end
21
+
22
+ def self.[]=(k, v)
23
+ h = Thread.current[THREAD_LOCAL_KEY]
24
+ h[k] = v
25
+ end
26
+
27
+ def self.reset
28
+ Thread.current[THREAD_LOCAL_KEY] = nil
29
+ end
30
+ end
31
+ end
@@ -0,0 +1 @@
1
+ # Add require here
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require 'flydata-core'
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'flydata/table_def'
2
+ require 'flydata-core/table_def'
3
3
 
4
- module Flydata
4
+ module FlydataCore
5
5
  module TableDef
6
6
 
7
7
 
@@ -33,7 +33,7 @@ describe MysqlTableDef do
33
33
  {:column=>"id", :type=>"int8(20)", :auto_increment=>true, :not_null=>true, :primary_key=>true},
34
34
  {:column=>"col_binary", :type=>"binary(202)", :default=>nil},
35
35
  {:column=>"col_blob", :type=>"varbinary(65535)"},
36
- {:column=>"col_bool", :type=>"int1(1)", :default=>"0"},
36
+ {:column=>"col_bool", :type=>"int1(1)", :default=>"'0'"},
37
37
  {:column=>"col_char", :type=>"varchar(18)", :default=>nil},
38
38
  {:column=>"col_date", :type=>"date", :default=>nil},
39
39
  {:column=>"col_datetime", :type=>"datetime", :default=>nil},
@@ -73,7 +73,7 @@ describe MysqlTableDef do
73
73
  context 'when table does not have primary key' do
74
74
  let(:dump_file_io) { file_io('mysqldump_test_table_no_pk.dump') }
75
75
  it 'should raise an error' do
76
- expect{subject}.to raise_error(Flydata::TableDefError)
76
+ expect{subject}.to raise_error(FlydataCore::TableDefError)
77
77
  end
78
78
  end
79
79
 
@@ -82,7 +82,7 @@ describe MysqlTableDef do
82
82
  it 'comment should be set' do
83
83
  expect(subject[:columns]).to eq(
84
84
  [
85
- {:column=>"id", :type=>"int4(11)", :not_null=>true, :default=>"0",
85
+ {:column=>"id", :type=>"int4(11)", :not_null=>true, :default=>"'0'",
86
86
  :comment=>"this is primary key", :primary_key=>true},
87
87
  {:column=>"value", :type=>"text"}
88
88
  ]
@@ -95,8 +95,8 @@ describe MysqlTableDef do
95
95
  it 'multi pk should be set' do
96
96
  expect(subject[:columns]).to eq(
97
97
  [
98
- {:column=>"id1", :type=>"int4(11)", :not_null=>true, :default=>"0", :primary_key=>true},
99
- {:column=>"id2", :type=>"int4(11)", :not_null=>true, :default=>"0", :primary_key=>true},
98
+ {:column=>"id1", :type=>"int4(11)", :not_null=>true, :default=>"'0'", :primary_key=>true},
99
+ {:column=>"id2", :type=>"int4(11)", :not_null=>true, :default=>"'0'", :primary_key=>true},
100
100
  {:column=>"value", :type=>"text"}
101
101
  ]
102
102
  )
@@ -110,7 +110,7 @@ describe MysqlTableDef do
110
110
  [
111
111
  {:column=>"id", :type=>"int4(11)", :not_null=>true, :primary_key=>true},
112
112
  {:column=>"enum_1", :type=>"enum('apple','orange','banana')", :default=>nil},
113
- {:column=>"enum_2", :type=>"enum('a','b','c')", :default=>"a"},
113
+ {:column=>"enum_2", :type=>"enum('a','b','c')", :default=>"'a'"},
114
114
  {:column=>"enum_3", :type=>"enum('e','f','g')", :not_null=>true},
115
115
  ]
116
116
  )
@@ -184,6 +184,20 @@ describe MysqlTableDef do
184
184
  }
185
185
  end
186
186
  end
187
+
188
+ context 'when table has bit with 0b default value' do
189
+ let(:dump_file_io) { file_io('mysqldump_test_bit_table.dump')}
190
+ it 'should extract default bit value appropriately' do
191
+ expect(subject[:columns][1][:default]).to eq("b'1'")
192
+ end
193
+ end
194
+
195
+ context 'when table has int with 0x default value' do
196
+ let(:dump_file_io) { file_io('mysqldump_test_bit_table.dump')}
197
+ it 'should extract default int value appropriately' do
198
+ expect(subject[:columns][2][:default]).to eq("x'10'")
199
+ end
200
+ end
187
201
  end
188
202
  end
189
203
 
@@ -0,0 +1,428 @@
1
+ require 'spec_helper'
2
+ require 'flydata-core/table_def'
3
+
4
+ module FlydataCore
5
+ module TableDef
6
+ describe 'generate redshift table ddl from mysqldump' do
7
+
8
+ # file full path which exists in same directory.
9
+ def full_path(file_name)
10
+ File.join(File.dirname(__FILE__), file_name)
11
+ end
12
+
13
+ def file_io(file_name)
14
+ File.new(full_path(file_name))
15
+ end
16
+
17
+ let(:dump_file_name) { raise "file_name must be override on context." }
18
+ let(:dump_file_io) { file_io(dump_file_name) }
19
+
20
+ subject {
21
+ RedshiftTableDef.from_flydata_tabledef(
22
+ MysqlTableDef.create(dump_file_io).to_flydata_tabledef)
23
+ }
24
+
25
+ context 'with mysqldump_test_table_all' do
26
+ let(:dump_file_name) { 'mysqldump_test_table_all.dump' }
27
+
28
+ it 'should return ddl' do
29
+ expect(subject).to eq( <<EOT.strip )
30
+ CREATE TABLE "flydata_ctl_columns"(
31
+ id integer NOT NULL IDENTITY(1,1),
32
+ table_name varchar(128) NOT NULL,
33
+ column_name varchar(128) NOT NULL,
34
+ src_data_type varchar(1024) NOT NULL,
35
+ revision int NOT NULL DEFAULT 1,
36
+ ordinal_position int NOT NULL,
37
+ PRIMARY KEY(id)
38
+ ) DISTKEY(table_name) SORTKEY(table_name);
39
+ DROP TABLE "test_table_all";
40
+ CREATE TABLE "test_table_all" (
41
+ "id" int8 NOT NULL,
42
+ "col_binary" varchar(202) DEFAULT NULL,
43
+ "col_blob" varchar(65535),
44
+ "col_bool" int2 DEFAULT '0',
45
+ "col_char" varchar(18) DEFAULT NULL,
46
+ "col_date" date DEFAULT NULL,
47
+ "col_datetime" timestamp DEFAULT NULL,
48
+ "col_decimal" numeric(5,2) DEFAULT NULL,
49
+ "col_double" float8 DEFAULT NULL,
50
+ "col_float" float4 DEFAULT NULL,
51
+ "col_float_4_2" float4 DEFAULT NULL,
52
+ "col_int" int4 DEFAULT NULL,
53
+ "col_int_6" int4 DEFAULT NULL,
54
+ "col_longblob" varchar(65535),
55
+ "col_longtext" varchar(max),
56
+ "col_mediumblob" varchar(65535),
57
+ "col_mediumint" int4 DEFAULT NULL,
58
+ "col_mediumtext" varchar(max),
59
+ "col_smallint" int2 DEFAULT NULL,
60
+ "col_text" varchar(max),
61
+ "col_time" timestamp DEFAULT NULL,
62
+ "col_timestamp" timestamp NOT NULL DEFAULT SYSDATE,
63
+ "col_tinyblob" varchar(255),
64
+ "col_tinyint" int2 DEFAULT NULL,
65
+ "col_tinytext" varchar(max),
66
+ "col_varbinary" varchar(512) DEFAULT NULL,
67
+ "col_varchar" varchar(372) DEFAULT NULL,
68
+ PRIMARY KEY (id)
69
+ );
70
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'test_table_all';
71
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
72
+ ('test_table_all', 'id', 'int8(20)', 1),
73
+ ('test_table_all', 'col_binary', 'binary(202)', 2),
74
+ ('test_table_all', 'col_blob', 'varbinary(65535)', 3),
75
+ ('test_table_all', 'col_bool', 'int1(1)', 4),
76
+ ('test_table_all', 'col_char', 'varchar(18)', 5),
77
+ ('test_table_all', 'col_date', 'date', 6),
78
+ ('test_table_all', 'col_datetime', 'datetime', 7),
79
+ ('test_table_all', 'col_decimal', 'numeric(5,2)', 8),
80
+ ('test_table_all', 'col_double', 'float8', 9),
81
+ ('test_table_all', 'col_float', 'float4', 10),
82
+ ('test_table_all', 'col_float_4_2', 'float4(4,2)', 11),
83
+ ('test_table_all', 'col_int', 'int4(11)', 12),
84
+ ('test_table_all', 'col_int_6', 'int4(6)', 13),
85
+ ('test_table_all', 'col_longblob', 'varbinary(4294967295)', 14),
86
+ ('test_table_all', 'col_longtext', 'text', 15),
87
+ ('test_table_all', 'col_mediumblob', 'varbinary(16777215)', 16),
88
+ ('test_table_all', 'col_mediumint', 'int3(9)', 17),
89
+ ('test_table_all', 'col_mediumtext', 'text', 18),
90
+ ('test_table_all', 'col_smallint', 'int2(6)', 19),
91
+ ('test_table_all', 'col_text', 'text', 20),
92
+ ('test_table_all', 'col_time', 'time', 21),
93
+ ('test_table_all', 'col_timestamp', 'datetime', 22),
94
+ ('test_table_all', 'col_tinyblob', 'varbinary(255)', 23),
95
+ ('test_table_all', 'col_tinyint', 'int1(4)', 24),
96
+ ('test_table_all', 'col_tinytext', 'text', 25),
97
+ ('test_table_all', 'col_varbinary', 'varbinary(512)', 26),
98
+ ('test_table_all', 'col_varchar', 'varchar(372)', 27);
99
+ EOT
100
+ end
101
+ end
102
+
103
+ context 'with mysqldump_test_bit_table.dump' do
104
+ let(:dump_file_name) { 'mysqldump_test_bit_table.dump' }
105
+
106
+ it 'should return ddl' do
107
+ expect(subject).to eq( <<EOT.strip )
108
+ CREATE TABLE "flydata_ctl_columns"(
109
+ id integer NOT NULL IDENTITY(1,1),
110
+ table_name varchar(128) NOT NULL,
111
+ column_name varchar(128) NOT NULL,
112
+ src_data_type varchar(1024) NOT NULL,
113
+ revision int NOT NULL DEFAULT 1,
114
+ ordinal_position int NOT NULL,
115
+ PRIMARY KEY(id)
116
+ ) DISTKEY(table_name) SORTKEY(table_name);
117
+ DROP TABLE "bit_test_def_1";
118
+ CREATE TABLE "bit_test_def_1" (
119
+ "id" int4 NOT NULL,
120
+ "bit_value" bigint DEFAULT 1,
121
+ "int_value" int4 DEFAULT 16,
122
+ PRIMARY KEY (id)
123
+ );
124
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'bit_test_def_1';
125
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
126
+ ('bit_test_def_1', 'id', 'int4(11)', 1),
127
+ ('bit_test_def_1', 'bit_value', 'bit(1)', 2),
128
+ ('bit_test_def_1', 'int_value', 'int4(11)', 3);
129
+ EOT
130
+ end
131
+ end
132
+
133
+ context 'with mysqldump_test_foreign_key.dump' do
134
+ let(:dump_file_name) { 'mysqldump_test_foreign_key.dump' }
135
+
136
+ it 'should return ddl' do
137
+ expect(subject).to eq( <<EOT.strip )
138
+ CREATE TABLE "flydata_ctl_columns"(
139
+ id integer NOT NULL IDENTITY(1,1),
140
+ table_name varchar(128) NOT NULL,
141
+ column_name varchar(128) NOT NULL,
142
+ src_data_type varchar(1024) NOT NULL,
143
+ revision int NOT NULL DEFAULT 1,
144
+ ordinal_position int NOT NULL,
145
+ PRIMARY KEY(id)
146
+ ) DISTKEY(table_name) SORTKEY(table_name);
147
+ DROP TABLE "product_order";
148
+ CREATE TABLE "product_order" (
149
+ "no" int4 NOT NULL,
150
+ "product_category" int4 NOT NULL,
151
+ "product_id" int4 NOT NULL,
152
+ "customer_id" int4 NOT NULL,
153
+ PRIMARY KEY (no)
154
+ );
155
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'product_order';
156
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
157
+ ('product_order', 'no', 'int4(11)', 1),
158
+ ('product_order', 'product_category', 'int4(11)', 2),
159
+ ('product_order', 'product_id', 'int4(11)', 3),
160
+ ('product_order', 'customer_id', 'int4(11)', 4);
161
+ EOT
162
+ end
163
+ end
164
+
165
+ context 'with mysqldump_test_table_column_comment.dump' do
166
+ let(:dump_file_name) { 'mysqldump_test_table_column_comment.dump' }
167
+
168
+ it 'should return ddl' do
169
+ expect(subject).to eq( <<EOT.strip )
170
+ CREATE TABLE "flydata_ctl_columns"(
171
+ id integer NOT NULL IDENTITY(1,1),
172
+ table_name varchar(128) NOT NULL,
173
+ column_name varchar(128) NOT NULL,
174
+ src_data_type varchar(1024) NOT NULL,
175
+ revision int NOT NULL DEFAULT 1,
176
+ ordinal_position int NOT NULL,
177
+ PRIMARY KEY(id)
178
+ ) DISTKEY(table_name) SORTKEY(table_name);
179
+ DROP TABLE "test_table_column_comment";
180
+ CREATE TABLE "test_table_column_comment" (
181
+ "id" int4 NOT NULL DEFAULT '0',
182
+ "value" varchar(max),
183
+ PRIMARY KEY (id)
184
+ );
185
+ COMMENT ON COLUMN "test_table_column_comment"."id"
186
+ IS 'this is primary key';
187
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'test_table_column_comment';
188
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
189
+ ('test_table_column_comment', 'id', 'int4(11)', 1),
190
+ ('test_table_column_comment', 'value', 'text', 2);
191
+ EOT
192
+ end
193
+ end
194
+
195
+ context 'with mysqldump_test_table_enum.dump' do
196
+ let(:dump_file_name) { 'mysqldump_test_table_enum.dump' }
197
+
198
+ it 'should return ddl' do
199
+ expect(subject).to eq( <<EOT.strip )
200
+ CREATE TABLE "flydata_ctl_columns"(
201
+ id integer NOT NULL IDENTITY(1,1),
202
+ table_name varchar(128) NOT NULL,
203
+ column_name varchar(128) NOT NULL,
204
+ src_data_type varchar(1024) NOT NULL,
205
+ revision int NOT NULL DEFAULT 1,
206
+ ordinal_position int NOT NULL,
207
+ PRIMARY KEY(id)
208
+ ) DISTKEY(table_name) SORTKEY(table_name);
209
+ DROP TABLE "test_table_enum";
210
+ CREATE TABLE "test_table_enum" (
211
+ "id" int4 NOT NULL,
212
+ "enum_1" varchar encode bytedict DEFAULT NULL,
213
+ "enum_2" varchar encode bytedict DEFAULT 'a',
214
+ "enum_3" varchar encode bytedict NOT NULL,
215
+ PRIMARY KEY (id)
216
+ );
217
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'test_table_enum';
218
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
219
+ ('test_table_enum', 'id', 'int4(11)', 1),
220
+ ('test_table_enum', 'enum_1', 'enum(\\'apple\\',\\'orange\\',\\'banana\\')', 2),
221
+ ('test_table_enum', 'enum_2', 'enum(\\'a\\',\\'b\\',\\'c\\')', 3),
222
+ ('test_table_enum', 'enum_3', 'enum(\\'e\\',\\'f\\',\\'g\\')', 4);
223
+ EOT
224
+ end
225
+ end
226
+
227
+ context 'with mysqldump_test_table_multi_pk.dump' do
228
+ let(:dump_file_name) { 'mysqldump_test_table_multi_pk.dump' }
229
+
230
+ it 'should return ddl' do
231
+ expect(subject).to eq( <<EOT.strip )
232
+ CREATE TABLE "flydata_ctl_columns"(
233
+ id integer NOT NULL IDENTITY(1,1),
234
+ table_name varchar(128) NOT NULL,
235
+ column_name varchar(128) NOT NULL,
236
+ src_data_type varchar(1024) NOT NULL,
237
+ revision int NOT NULL DEFAULT 1,
238
+ ordinal_position int NOT NULL,
239
+ PRIMARY KEY(id)
240
+ ) DISTKEY(table_name) SORTKEY(table_name);
241
+ DROP TABLE "test_table_multi_pk";
242
+ CREATE TABLE "test_table_multi_pk" (
243
+ "id1" int4 NOT NULL DEFAULT '0',
244
+ "id2" int4 NOT NULL DEFAULT '0',
245
+ "value" varchar(max),
246
+ PRIMARY KEY (id1,id2)
247
+ );
248
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'test_table_multi_pk';
249
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
250
+ ('test_table_multi_pk', 'id1', 'int4(11)', 1),
251
+ ('test_table_multi_pk', 'id2', 'int4(11)', 2),
252
+ ('test_table_multi_pk', 'value', 'text', 3);
253
+ EOT
254
+ end
255
+ end
256
+
257
+ context 'with mysqldump_test_table_no_pk.dump' do
258
+ let(:dump_file_name) { 'mysqldump_test_table_no_pk.dump' }
259
+
260
+ it 'should return ddl' do
261
+ expect{subject}.to raise_error(FlydataCore::TableDefError)
262
+ end
263
+ end
264
+
265
+ context 'with mysqldump_test_unique_key.dump' do
266
+ let(:dump_file_name) { 'mysqldump_test_unique_key.dump' }
267
+
268
+ it 'should return ddl' do
269
+ expect(subject).to eq( <<EOT.strip )
270
+ CREATE TABLE "flydata_ctl_columns"(
271
+ id integer NOT NULL IDENTITY(1,1),
272
+ table_name varchar(128) NOT NULL,
273
+ column_name varchar(128) NOT NULL,
274
+ src_data_type varchar(1024) NOT NULL,
275
+ revision int NOT NULL DEFAULT 1,
276
+ ordinal_position int NOT NULL,
277
+ PRIMARY KEY(id)
278
+ ) DISTKEY(table_name) SORTKEY(table_name);
279
+ DROP TABLE "sample1";
280
+ CREATE TABLE "sample1" (
281
+ "id" int4 NOT NULL,
282
+ "title" varchar(768) DEFAULT NULL,
283
+ "name" varchar(max),
284
+ "num" int4 DEFAULT NULL,
285
+ PRIMARY KEY (id)
286
+ );
287
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'sample1';
288
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
289
+ ('sample1', 'id', 'int4(11)', 1),
290
+ ('sample1', 'title', 'varchar(768)', 2),
291
+ ('sample1', 'name', 'text', 3),
292
+ ('sample1', 'num', 'int4(11)', 4);
293
+ EOT
294
+ end
295
+ end
296
+
297
+ context 'with mysqldump_test_unique_key2.dump' do
298
+ let(:dump_file_name) { 'mysqldump_test_unique_key2.dump' }
299
+
300
+ it 'should return ddl' do
301
+ expect(subject).to eq( <<EOT.strip )
302
+ CREATE TABLE "flydata_ctl_columns"(
303
+ id integer NOT NULL IDENTITY(1,1),
304
+ table_name varchar(128) NOT NULL,
305
+ column_name varchar(128) NOT NULL,
306
+ src_data_type varchar(1024) NOT NULL,
307
+ revision int NOT NULL DEFAULT 1,
308
+ ordinal_position int NOT NULL,
309
+ PRIMARY KEY(id)
310
+ ) DISTKEY(table_name) SORTKEY(table_name);
311
+ DROP TABLE "sample1";
312
+ CREATE TABLE "sample1" (
313
+ "id" int4 NOT NULL,
314
+ "title" varchar(768) DEFAULT NULL,
315
+ "name" varchar(max),
316
+ "num" int4 DEFAULT NULL,
317
+ PRIMARY KEY (id)
318
+ );
319
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'sample1';
320
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
321
+ ('sample1', 'id', 'int4(11)', 1),
322
+ ('sample1', 'title', 'varchar(768)', 2),
323
+ ('sample1', 'name', 'text', 3),
324
+ ('sample1', 'num', 'int4(11)', 4);
325
+ EOT
326
+ end
327
+ end
328
+
329
+ context 'with mysqldump_test_unique_key3.dump' do
330
+ let(:dump_file_name) { 'mysqldump_test_unique_key3.dump' }
331
+
332
+ it 'should return ddl' do
333
+ expect(subject).to eq( <<EOT.strip )
334
+ CREATE TABLE "flydata_ctl_columns"(
335
+ id integer NOT NULL IDENTITY(1,1),
336
+ table_name varchar(128) NOT NULL,
337
+ column_name varchar(128) NOT NULL,
338
+ src_data_type varchar(1024) NOT NULL,
339
+ revision int NOT NULL DEFAULT 1,
340
+ ordinal_position int NOT NULL,
341
+ PRIMARY KEY(id)
342
+ ) DISTKEY(table_name) SORTKEY(table_name);
343
+ DROP TABLE "invoice_items";
344
+ CREATE TABLE "invoice_items" (
345
+ "id" int4 NOT NULL,
346
+ "app_id" int4 NOT NULL,
347
+ "subscription_id" int4 NOT NULL,
348
+ "overage_id" varchar(765) NOT NULL,
349
+ "stripe_invoice_item_id" varchar(765) DEFAULT NULL,
350
+ "stripe_error" varchar(765) DEFAULT NULL,
351
+ "synced_to_stripe" int2 NOT NULL DEFAULT '0',
352
+ "description" varchar(max),
353
+ "item_name" varchar(765) NOT NULL,
354
+ "item_cost" int4 NOT NULL,
355
+ "item_count" int4 NOT NULL,
356
+ "total_cost" int4 NOT NULL,
357
+ "created_at" timestamp DEFAULT NULL,
358
+ "updated_at" timestamp DEFAULT NULL,
359
+ "bill_ahead" int2 DEFAULT '0',
360
+ "bill_ahead_resolved_at" timestamp DEFAULT NULL,
361
+ "stripe_invoice_id" varchar(765) DEFAULT NULL,
362
+ "is_vat" int2 NOT NULL DEFAULT '0',
363
+ PRIMARY KEY (id)
364
+ );
365
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'invoice_items';
366
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
367
+ ('invoice_items', 'id', 'int4(11)', 1),
368
+ ('invoice_items', 'app_id', 'int4(11)', 2),
369
+ ('invoice_items', 'subscription_id', 'int4(11)', 3),
370
+ ('invoice_items', 'overage_id', 'varchar(765)', 4),
371
+ ('invoice_items', 'stripe_invoice_item_id', 'varchar(765)', 5),
372
+ ('invoice_items', 'stripe_error', 'varchar(765)', 6),
373
+ ('invoice_items', 'synced_to_stripe', 'int1(1)', 7),
374
+ ('invoice_items', 'description', 'text', 8),
375
+ ('invoice_items', 'item_name', 'varchar(765)', 9),
376
+ ('invoice_items', 'item_cost', 'int4(11)', 10),
377
+ ('invoice_items', 'item_count', 'int4(11)', 11),
378
+ ('invoice_items', 'total_cost', 'int4(11)', 12),
379
+ ('invoice_items', 'created_at', 'datetime', 13),
380
+ ('invoice_items', 'updated_at', 'datetime', 14),
381
+ ('invoice_items', 'bill_ahead', 'int1(1)', 15),
382
+ ('invoice_items', 'bill_ahead_resolved_at', 'datetime', 16),
383
+ ('invoice_items', 'stripe_invoice_id', 'varchar(765)', 17),
384
+ ('invoice_items', 'is_vat', 'int1(1)', 18);
385
+ EOT
386
+ end
387
+ end
388
+
389
+ context 'with mysqldump_test_unsigned.dump' do
390
+ let(:dump_file_name) { 'mysqldump_test_unsigned.dump' }
391
+
392
+ it 'should return ddl' do
393
+ expect(subject).to eq( <<EOT.strip )
394
+ CREATE TABLE "flydata_ctl_columns"(
395
+ id integer NOT NULL IDENTITY(1,1),
396
+ table_name varchar(128) NOT NULL,
397
+ column_name varchar(128) NOT NULL,
398
+ src_data_type varchar(1024) NOT NULL,
399
+ revision int NOT NULL DEFAULT 1,
400
+ ordinal_position int NOT NULL,
401
+ PRIMARY KEY(id)
402
+ ) DISTKEY(table_name) SORTKEY(table_name);
403
+ DROP TABLE "zerofill_table";
404
+ CREATE TABLE "zerofill_table" (
405
+ "id" int4 NOT NULL,
406
+ "value_int" int8 DEFAULT NULL,
407
+ "value_float" float4 DEFAULT NULL,
408
+ "value_dec" numeric(10,2) DEFAULT NULL,
409
+ "value_double" float8 DEFAULT NULL,
410
+ "name" varchar(768) DEFAULT NULL,
411
+ "value_small_int" int4 DEFAULT NULL,
412
+ PRIMARY KEY (id)
413
+ );
414
+ DELETE FROM "flydata_ctl_columns" WHERE table_name = 'zerofill_table';
415
+ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordinal_position) VALUES
416
+ ('zerofill_table', 'id', 'int4(11)', 1),
417
+ ('zerofill_table', 'value_int', 'int4(10) unsigned', 2),
418
+ ('zerofill_table', 'value_float', 'float4 unsigned', 3),
419
+ ('zerofill_table', 'value_dec', 'numeric(10,2) unsigned', 4),
420
+ ('zerofill_table', 'value_double', 'float8 unsigned', 5),
421
+ ('zerofill_table', 'name', 'varchar(768)', 6),
422
+ ('zerofill_table', 'value_small_int', 'int2(5) unsigned', 7);
423
+ EOT
424
+ end
425
+ end
426
+ end
427
+ end
428
+ end
@@ -0,0 +1,51 @@
1
+ -- MySQL dump 10.13 Distrib 5.6.19, for osx10.9 (x86_64)
2
+ --
3
+ -- Host: localhost Database: sync_test
4
+ -- ------------------------------------------------------
5
+ -- Server version 5.6.19-log
6
+
7
+ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8
+ /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9
+ /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10
+ /*!40101 SET NAMES utf8 */;
11
+ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12
+ /*!40103 SET TIME_ZONE='+00:00' */;
13
+ /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14
+ /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15
+ /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16
+ /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17
+
18
+ --
19
+ -- Table structure for table `bit_test_def_1`
20
+ --
21
+
22
+ DROP TABLE IF EXISTS `bit_test_def_1`;
23
+ /*!40101 SET @saved_cs_client = @@character_set_client */;
24
+ /*!40101 SET character_set_client = utf8 */;
25
+ CREATE TABLE `bit_test_def_1` (
26
+ `id` int(11) NOT NULL,
27
+ `bit_value` bit(1) DEFAULT b'1',
28
+ `int_value` int(11) DEFAULT x'10',
29
+ PRIMARY KEY (`id`)
30
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
31
+ /*!40101 SET character_set_client = @saved_cs_client */;
32
+
33
+ --
34
+ -- Dumping data for table `bit_test_def_1`
35
+ --
36
+
37
+ LOCK TABLES `bit_test_def_1` WRITE;
38
+ /*!40000 ALTER TABLE `bit_test_def_1` DISABLE KEYS */;
39
+ /*!40000 ALTER TABLE `bit_test_def_1` ENABLE KEYS */;
40
+ UNLOCK TABLES;
41
+ /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
42
+
43
+ /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
44
+ /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
45
+ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
46
+ /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
47
+ /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
48
+ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
49
+ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
50
+
51
+ -- Dump completed on 2014-11-24 13:14:45