myreplicator 1.1.7 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -45,8 +45,6 @@ module Myreplicator
45
45
  @dbs = get_dbs
46
46
  @tables = db_metadata
47
47
  @edit = true
48
-
49
- Myreplicator::Export.schedule_in_resque # schedule in resque
50
48
  end
51
49
 
52
50
  # POST /exports
@@ -70,14 +68,13 @@ module Myreplicator
70
68
  # PUT /exports/1.json
71
69
  def update
72
70
  @export = Export.find(params[:id])
73
- Myreplicator::Export.schedule_in_resque # schedule in resque
74
-
75
71
  @dbs = get_dbs
76
72
 
77
73
  respond_to do |format|
78
74
  if @export.update_attributes(params[:export])
79
75
  format.html { redirect_to @export, notice: 'Export was successfully updated.' }
80
76
  format.json { head :no_content }
77
+ Myreplicator::Export.schedule_in_resque # schedule in resque
81
78
  else
82
79
  format.html { render action: "edit" }
83
80
  format.json { render json: @export.errors, status: :unprocessable_entity }
@@ -81,7 +81,7 @@ module Myreplicator
81
81
  logs.each do |log|
82
82
  begin
83
83
  Process.getpgid(log.pid)
84
- puts "still running #{filepath}"
84
+ puts "still running #{log.file}"
85
85
  return true
86
86
  rescue Errno::ESRCH
87
87
  log.mark_dead
@@ -39,6 +39,16 @@ module Myreplicator
39
39
  name = zipped ? "#{name}.gz" : name
40
40
  return name
41
41
  end
42
+
43
+ def metadata_filename
44
+ name = filepath.split("/").last
45
+ name += ".json"
46
+ return name
47
+ end
48
+
49
+ def metadata_filepath tmp_dir
50
+ File.join(tmp_dir, metadata_filename)
51
+ end
42
52
 
43
53
  def destination_filepath tmp_dir
44
54
  File.join(tmp_dir, filename)
@@ -27,7 +27,7 @@ module Myreplicator
27
27
  on_failure_state_trans(metadata, "new") # If failed, go back to new
28
28
  on_export_success(metadata)
29
29
  initial_export metadata
30
- elsif @export_obj.export_type? == :incremental or load_to == "vertica"
30
+ elsif @export_obj.export_type? == :incremental || load_to == "vertica"
31
31
  on_failure_state_trans(metadata, "failed") # Set state trans on failure
32
32
  on_export_success(metadata)
33
33
  incremental_export_into_outfile metadata
@@ -100,43 +100,6 @@ module Myreplicator
100
100
  return cmd
101
101
  end
102
102
 
103
- ##
104
- # Exports table incrementally, using the incremental column specified
105
- # If column is not specified, it will export the entire table
106
- # Maximum value of the incremental column is recorded BEFORE export starts
107
- ##
108
-
109
- def incremental_export metadata
110
- unless @export_obj.is_running?
111
- max_value = @export_obj.max_value
112
- metadata.export_type = "incremental"
113
- @export_obj.update_max_val if @export_obj.max_incremental_value.blank?
114
-
115
- cmd = incremental_export_cmd
116
- exporting_state_trans # mark exporting
117
- puts "Exporting..."
118
- result = execute_export(cmd, metadata)
119
- check_result(result, 0)
120
- metadata.incremental_val = max_value # store max val in metadata
121
- @export_obj.update_max_val(max_value) # update max value if export was successful
122
- end
123
- return false
124
- end
125
-
126
- def incremental_export_cmd
127
- sql = SqlCommands.export_sql(:db => @export_obj.source_schema,
128
- :table => @export_obj.table_name,
129
- :incremental_col => @export_obj.incremental_column,
130
- :incremental_col_type => @export_obj.incremental_column_type,
131
- :incremental_val => @export_obj.max_incremental_value)
132
-
133
- cmd = SqlCommands.mysql_export(:db => @export_obj.source_schema,
134
- :filepath => filepath,
135
- :sql => sql)
136
-
137
- return cmd
138
- end
139
-
140
103
  ##
141
104
  # Exports table incrementally, similar to incremental_export method
142
105
  # Dumps file in tmp directory specified in myreplicator.yml
@@ -146,25 +109,33 @@ module Myreplicator
146
109
 
147
110
  def incremental_export_into_outfile metadata
148
111
  unless @export_obj.is_running?
149
-
112
+
150
113
  if @export_obj.export_type == "incremental"
151
114
  max_value = @export_obj.max_value
152
- metadata.export_type = "incremental_outfile"
115
+ metadata.export_type = "incremental"
153
116
  @export_obj.update_max_val if @export_obj.max_incremental_value.blank?
154
117
  end
155
118
 
156
119
  options = {
157
120
  :db => @export_obj.source_schema,
121
+ :source_schema => @export_obj.source_schema,
158
122
  :table => @export_obj.table_name,
159
123
  :filepath => filepath,
160
124
  :destination_schema => @export_obj.destination_schema}
161
125
 
162
- unless MysqlExporter.schema_changed?(options)[:changed]
126
+ schema_status = MysqlExporter.schema_changed?(options)
127
+ Kernel.p "===== schema_status ====="
128
+ Kernel.p schema_status
129
+ if schema_status[:changed] # && new?
130
+ metadata.export_type = "initial"
131
+ else
163
132
  options[:incremental_col] = @export_obj.incremental_column
164
133
  options[:incremental_col_type] = @export_obj.incremental_column_type
165
134
  options[:incremental_val] = @export_obj.max_incremental_value
166
135
  end
167
136
 
137
+ Kernel.p "===== incremental_export_into_outfile OPTIONS ====="
138
+ Kernel.p options
168
139
  cmd = SqlCommands.mysql_export_outfile(options)
169
140
  exporting_state_trans
170
141
  puts "Exporting..."
@@ -181,11 +152,10 @@ module Myreplicator
181
152
  end
182
153
 
183
154
  def self.compare_schemas vertica_schema, mysql_schema
155
+ Kernel.p vertica_schema
156
+ Kernel.p mysql_schema
184
157
  if vertica_schema.size != mysql_schema.size
185
- return {:changed => true,
186
- :mysql_schema => mysql_schema,
187
- :vertica_schema => vertica_schema,
188
- :new => false}
158
+ return true
189
159
  else
190
160
  index = 0
191
161
  while index < vertica_schema.size
@@ -195,7 +165,7 @@ module Myreplicator
195
165
  end
196
166
 
197
167
  # check for column's data type
198
- if (vertica_schema.rows[index][:data_type] != VerticaTypes.convert(mysql_schema[index]["data_type"],mysql_schema[index]["column_type"]) and vertica_schema.rows[index][:data_type] != "timestamp")
168
+ if compare_datatypes index, vertica_schema, mysql_schema
199
169
  return true
200
170
  end
201
171
  # and others ?? (PRIMARY, DEFAULT NULL, etc.)
@@ -205,7 +175,28 @@ module Myreplicator
205
175
  return false
206
176
  end
207
177
 
178
+ def self.compare_datatypes index, vertica_schema, mysql_schema
179
+ type = VerticaTypes.convert mysql_schema[index]["data_type"], mysql_schema[index]["column_type"]
180
+ if vertica_schema.rows[index][:data_type] != type
181
+ if vertica_schema.rows[index][:data_type] != "timestamp"
182
+ return true
183
+ end
184
+ return false
185
+ end
186
+ return false
187
+ end
188
+
189
+ def self.get_mysql_schema_rows mysql_schema
190
+ mysql_schema_simple_form = []
191
+ mysql_schema.each(:as => :hash) do |row|
192
+ puts row
193
+ mysql_schema_simple_form << row
194
+ end
195
+ return mysql_schema_simple_form
196
+ end
197
+
208
198
  def self.schema_changed? options
199
+ Kernel.p "===== schema_changed? ====="
209
200
  puts options
210
201
  mysql_schema = Loader.mysql_table_definition(options)
211
202
  vertica_schema = VerticaLoader.destination_table_vertica(options)
@@ -214,19 +205,19 @@ module Myreplicator
214
205
  unless vertica_schema.size > 0
215
206
  return {:changed => true, :mysql_schema => mysql_schema, :new => true}
216
207
  end
217
-
208
+ Kernel.p "***** 1 *****"
218
209
  # compare two schemas
219
- mysql_schema_simple_form = []
220
- mysql_schema.each(:as => :hash) do |row|
221
- mysql_schema_simple_form << row
222
- end
223
210
 
224
- mysql_schema_2 = mysql_schema_simple_form
211
+
212
+ mysql_schema_2 = get_mysql_schema_rows mysql_schema
225
213
  if compare_schemas(vertica_schema, mysql_schema_2)
214
+ Kernel.p "***** 2 *****"
226
215
  result = {:changed => true, :mysql_schema => mysql_schema, :vertica_schema => vertica_schema,:new => false}
227
216
  else
228
- result = {:changed => false}
217
+ Kernel.p "***** 3 *****"
218
+ result = {:changed => false, :mysql_schema => mysql_schema}
229
219
  end
220
+ Kernel.p result
230
221
  return result
231
222
  end
232
223
 
@@ -119,6 +119,8 @@ module Myreplicator
119
119
  ##
120
120
 
121
121
  def self.get_outfile_sql options
122
+ Kernel.p "===== SELECT * INTO OUTFILE OPTIONS====="
123
+ Kernel.p options
122
124
  sql = "SELECT * INTO OUTFILE '#{options[:filepath]}' "
123
125
 
124
126
  sql += " FIELDS TERMINATED BY '\\0' ESCAPED BY '' OPTIONALLY ENCLOSED BY '\\\"' LINES TERMINATED BY '\\n'"
@@ -143,13 +145,17 @@ module Myreplicator
143
145
  # Location of the output file needs to have 777 perms
144
146
  ##
145
147
  def self.mysql_export_outfile *args
148
+ Kernel.p "===== mysql_export_outfile OPTIONS ====="
149
+
146
150
  options = args.extract_options!
151
+ Kernel.p options
147
152
  options.reverse_merge! :flags => []
148
- db = options[:db]
153
+ db = options[:source_schema]
149
154
 
150
155
  # Database host when ssh'ed into the db server
151
156
  db_host = "127.0.0.1"
152
-
157
+ Kernel.p "===== mysql_export_outfile ssh_configs ====="
158
+ Kernel.p ssh_configs(db)
153
159
  if !ssh_configs(db)["ssh_db_host"].blank?
154
160
  db_host = ssh_configs(db)["ssh_db_host"]
155
161
  elsif !db_configs(db)["host"].blank?
data/lib/loader/loader.rb CHANGED
@@ -31,7 +31,7 @@ module Myreplicator
31
31
  def self.load
32
32
  initials = []
33
33
  incrementals = []
34
- all_files = Loader.metadata_files
34
+ all_files = Myreplicator::Loader.metadata_files
35
35
 
36
36
  all_files.each do |m|
37
37
  if m.export_type == "initial"
@@ -80,7 +80,11 @@ module Myreplicator
80
80
  :export_id => metadata.export_id) do |log|
81
81
 
82
82
  if Loader.transfer_completed? metadata
83
- Loader.initial_load metadata
83
+ if metadata.export_to == "vertica"
84
+ Loader.incremental_load metadata
85
+ else
86
+ Loader.initial_load metadata
87
+ end
84
88
  Loader.cleanup metadata
85
89
  end
86
90
 
@@ -107,7 +111,7 @@ module Myreplicator
107
111
  :file => metadata.filename,
108
112
  :export_id => metadata.export_id) do |log|
109
113
 
110
- if Loader.transfer_completed? metadata
114
+ if Loader.transfer_completed? metadata
111
115
  Loader.incremental_load metadata
112
116
  Loader.cleanup metadata
113
117
  end
@@ -152,6 +156,7 @@ module Myreplicator
152
156
  ##
153
157
  def self.initial_load metadata
154
158
  exp = Export.find(metadata.export_id)
159
+ Kernel.p "===== unzip ====="
155
160
  Loader.unzip(metadata.filename)
156
161
  metadata.zipped = false
157
162
 
@@ -176,22 +181,16 @@ module Myreplicator
176
181
  Loader.unzip(metadata.filename)
177
182
  metadata.zipped = false
178
183
 
179
- options = {:table_name => exp.table_name, :db => exp.destination_schema,
180
- :filepath => metadata.destination_filepath(tmp_dir), :source_schema => exp.source_schema}
181
-
182
- if metadata.export_type == "incremental_outfile"
183
- options[:fields_terminated_by] = "\\0"
184
- options[:lines_terminated_by] = "\\n"
185
- end
184
+ options = {:table_name => exp.table_name,
185
+ :db => exp.destination_schema,
186
+ :filepath => metadata.destination_filepath(tmp_dir),
187
+ :source_schema => exp.source_schema,
188
+ :fields_terminated_by => "\\0",
189
+ :lines_terminated_by => "\\n"}
186
190
 
187
191
  case metadata.export_to
188
192
  when "vertica"
189
- options = {:table_name => exp.table_name, :db => ActiveRecord::Base.configurations["vertica"]["database"],
190
- :filepath => metadata.destination_filepath(tmp_dir), :source_schema => exp.source_schema, :export_id => metadata.export_id}
191
- options[:destination_schema] = exp.destination_schema
192
- Kernel.p "===== LOAD TO VERTICA ====="
193
- Kernel.p options
194
- Myreplicator::VerticaLoader.load options
193
+ Loader.load_to_vertica options, metadata, exp
195
194
  when "mysql"
196
195
  cmd = ImportSql.load_data_infile(options)
197
196
  puts cmd
@@ -204,6 +203,25 @@ module Myreplicator
204
203
  end #case
205
204
  end
206
205
 
206
+ ##
207
+ # Load to Vertica
208
+ ##
209
+ def self.load_to_vertica options, metadata, exp
210
+ options = {:table_name => exp.table_name,
211
+ :db => ActiveRecord::Base.configurations["vertica"]["database"],
212
+ :filepath => metadata.destination_filepath(tmp_dir),
213
+ :source_schema => exp.source_schema, :export_id => metadata.export_id,
214
+ :metadata => metadata
215
+ }
216
+
217
+ options[:destination_schema] = exp.destination_schema
218
+
219
+ result = Myreplicator::VerticaLoader.load options
220
+
221
+ ##TO DO: Handle unsuccessful vertica loads here
222
+
223
+ end
224
+
207
225
  ##
208
226
  # Returns true if the transfer of the file
209
227
  # being loaded is completed
@@ -222,7 +240,7 @@ module Myreplicator
222
240
  ##
223
241
  def self.cleanup metadata
224
242
  puts "Cleaning up..."
225
- FileUtils.rm "#{metadata.destination_filepath(tmp_dir)}.json" # json file
243
+ FileUtils.rm metadata.metadata_filepath(tmp_dir) # json file
226
244
  FileUtils.rm metadata.destination_filepath(tmp_dir) # dump file
227
245
  end
228
246
 
@@ -259,8 +277,27 @@ module Myreplicator
259
277
  return files
260
278
  end
261
279
 
280
+ ##
281
+ # Clears files that are older than the passed metadata file.
282
+ # Note: This methoded is provided to ensure no old incremental files
283
+ # ever get loaded after the schema change algorithm has been applied
284
+ ##
285
+ def self.clear_older_files metadata
286
+ files = Loader.metadata_files
287
+ Kernel.p "===== clear old files ====="
288
+ Kernel.p metadata
289
+ Kernel.p files
290
+ max_date = DateTime.strptime metadata.export_time
291
+ files.each do |m|
292
+ if metadata.export_id == m.export_id
293
+ if max_date > DateTime.strptime(m.export_time)
294
+ Loader.cleanup m if metadata.filepath != m.filepath
295
+ end
296
+ end
297
+ end
298
+ end
299
+
262
300
  def self.mysql_table_definition options
263
- Kernel.p options
264
301
  sql = "SELECT table_schema, table_name, column_name, is_nullable, data_type, column_type, column_key "
265
302
  sql += "FROM INFORMATION_SCHEMA.COLUMNS where table_name = '#{options[:table]}' "
266
303
  sql += "and table_schema = '#{options[:source_schema]}';"
@@ -4,6 +4,8 @@ module Myreplicator
4
4
 
5
5
  def create_table *args
6
6
  options = args.extract_options!
7
+ Kernel.p "===== OPTION ====="
8
+ puts options
7
9
  columns = []
8
10
  options[:mysql_schema].each(:as => :hash) do |row|
9
11
  columns << row
@@ -32,124 +34,124 @@ module Myreplicator
32
34
  ##
33
35
  # rasing a concern: using the same schema or the tmp schema for the tmp table? Vertica doesn't lock the schema
34
36
  def apply_schema_change options, temp_table
35
- Myreplicator::VerticaLoader.create_table({:mysql_schema => options[:mysql_schema],
36
- :vertica_db => options[:vertica_db],
37
- :vertica_schema => options[:vertica_schema],
38
- :table => temp_table,
39
- :mysql_table => options[:table]
40
- })
41
- end
37
+ Kernel.p "+++++++++++++++++ options "
38
+ puts options
39
+ VerticaLoader.create_table({:mysql_schema => options[:mysql_schema],
40
+ :vertica_db => options[:vertica_db],
41
+ :vertica_schema => options[:vertica_schema],
42
+ :table => temp_table,
43
+ :mysql_table => options[:table]})
42
44
 
43
- def full_load options, temp_table
44
45
  export_id = options[:export_id]
45
46
  new_options = prepare_options options
46
- begin
47
- a = Myreplicator::Export.find(export_id)
48
- a.max_incremental_value = "0"
49
- a.save!
50
- a.export
51
- b = Myreplicator::Transporter
52
- b.perform
53
- file = File.join(Myreplicator.app_root,"tmp", "myreplicator", "#{a.filename}")
54
- `gunzip #{file}.gz`
55
- new_options[:file] = file
56
- new_options[:table] = temp_table
57
- new_options[:schema] = options[:vertica_schema]
58
-
59
- vertica_copy new_options
60
-
61
- #drop
62
- FileUtils.rm file
63
- FileUtils.rm "#{file}.json"
64
- sql = "DROP TABLE #{options[:vertica_db]}.#{options[:vertica_schema]}.#{options[:table]} CASCADE;"
65
- VerticaDb::Base.connection.execute sql
66
- #rename
67
- sql = "ALTER TABLE #{options[:vertica_db]}.#{options[:vertica_schema]}.#{temp_table} RENAME TO #{options[:table]};"
68
- VerticaDb::Base.connection.execute sql
69
- rescue Exception => e
70
- raise e.message
71
- ensure
72
-
73
- end
47
+ new_options[:file] = options[:filepath]
48
+ new_options[:table] = temp_table
49
+ new_options[:schema] = options[:vertica_schema]
50
+
51
+
52
+ vertica_copy new_options
53
+ Kernel.p "+++++++++++++++++ new_options "
54
+ puts new_options
55
+ puts options
56
+
57
+ sql = "DROP TABLE IF EXISTS #{options[:vertica_db]}.#{options[:vertica_schema]}.#{options[:table]} CASCADE;"
58
+ VerticaDb::Base.connection.execute sql
59
+ #rename
60
+ sql = "ALTER TABLE #{options[:vertica_db]}.#{options[:vertica_schema]}.#{temp_table} RENAME TO #{options[:table]};"
61
+ VerticaDb::Base.connection.execute sql
62
+
74
63
  end
64
+
65
+ def create_temp_table *args
66
+ options = args.extract_options!
67
+ temp_table_name = "temp_" + options[:table] + DateTime.now.strftime('%Y%m%d_%H%M%S').to_s
75
68
 
76
- # def create_all_tables db
77
- # tables = Loader::SourceDb.get_tables(db)
78
- # sqls = {}
79
- # tables.each do |table|
80
- # puts "Creating #{db}.#{table}"
81
- # sql = "DROP TABLE IF EXISTS #{db}.#{table} CASCADE;"
82
- # VerticaDb::Base.connection.execute sql
83
- # sql = Loader::VerticaLoader.create_table(:vertica_db => "bidw",
84
- # :vertica_table => table,
85
- # :vertica_schema => db,
86
- # :table => table,
87
- # :db => db)
88
- # sqls["#{table}"] = sql
89
- # VerticaDb::Base.connection.execute sql
90
- # end
91
- # end
92
-
69
+ VerticaLoader.create_table({:mysql_schema => options[:mysql_schema],
70
+ :vertica_db => options[:vertica_db],
71
+ :vertica_schema => options[:vertica_schema],
72
+ :table => temp_table_name,
73
+ :mysql_table => options[:table]})
74
+ return temp_table_name
75
+ end
76
+
93
77
  def prepare_options *args
94
- options = args.extract_options!
95
- vertica_options =ActiveRecord::Base.configurations["vertica"]
96
-
97
- result = options.clone
98
- result.reverse_merge!(
99
- :host => vertica_options["host"],
100
- :user => vertica_options["username"],
101
- :pass => vertica_options["password"],
102
- :db => vertica_options["database"],
103
- :schema => options[:destination_schema],
104
- :table => options[:table_name],
105
- :file => options[:filepath],
106
- :delimiter => "\\0",
107
- :null_value => "NULL",
108
- :enclosed => ""
109
- )
78
+ options = args.extract_options!.clone
79
+ Kernel.p "===== OPTION [options[:db]] ====="
80
+ puts options
81
+ # How not to hard code the vertica connection config ?
82
+ vertica_options = ActiveRecord::Base.configurations["vertica"]
83
+
84
+ options.reverse_merge!(:host => vertica_options["host"],
85
+ :user => vertica_options["username"],
86
+ :pass => vertica_options["password"],
87
+ :db => vertica_options["database"],
88
+ :schema => options[:destination_schema],
89
+ :table => options[:table_name],
90
+ :file => options[:filepath],
91
+ :delimiter => "\\0",
92
+ :null_value => "NULL",
93
+ :enclosed => "")
94
+ # working now but should fix this
110
95
  if !vertica_options["vsql"].blank?
111
- result.reverse_merge!(
112
- :vsql => vertica_options["vsql"]
113
- )
96
+ options.reverse_merge!(:vsql => vertica_options["vsql"])
114
97
  else
115
- result.reverse_merge!(
116
- :vsql => "/opt/vertica/bin/vsql"
117
- )
98
+ options.reverse_merge!(:vsql => "/opt/vertica/bin/vsql")
118
99
  end
119
100
 
120
- return result
101
+ return options
121
102
  end
122
103
 
123
104
  # Loader::VerticaLoader.load({:schema => "king", :table => "category_overview_data", :file => "tmp/vertica/category_overview_data.tsv", :null_value => "NULL"})
105
+ # check for export_type!
124
106
  def load *args
125
107
  options = args.extract_options!
126
- #options = {:table => "app_csvs", :db => "public", :source_schema => "okl_dev"}
108
+ metadata = options[:metadata]
109
+ Kernel.p "===== metadata ====="
110
+ Kernel.p metadata
111
+ Kernel.p options
112
+ #options = {:table => "app_csvs", :destination_schema => "public", :source_schema => "okl_dev"}
113
+ #options = {:table => "actucast_appeal", :destination_schema => "public", :source_schema => "raw_sources"}
127
114
  schema_check = Myreplicator::MysqlExporter.schema_changed?(:table => options[:table_name],
128
115
  :destination_schema => options[:destination_schema],
129
116
  :source_schema => options[:source_schema])
130
-
117
+ Kernel.p "===== schema_check ====="
118
+ Kernel.p schema_check
119
+ Kernel.p schema_check[:mysql_schema]
131
120
  #create a temp table
132
121
  temp_table = "temp_" + options[:table_name] + DateTime.now.strftime('%Y%m%d_%H%M%S').to_s
133
122
  ops = {:mysql_schema => schema_check[:mysql_schema],
134
- :vertica_db => options[:db],
135
- :vertica_schema => options[:destination_schema],
136
- :table => options[:table_name],
137
- :export_id => options[:export_id]
123
+ :vertica_db => options[:db],
124
+ :vertica_schema => options[:destination_schema],
125
+ :table => options[:table_name],
126
+ :export_id => options[:export_id],
127
+ :filepath => options[:filepath]
138
128
  }
139
- begin
140
- if schema_check[:new]
141
- create_table(ops)
129
+ Kernel.p "===== schema_check[:mysql_schema] ====="
130
+ Kernel.p ops
131
+ if schema_check[:new]
132
+ create_table(ops)
133
+ #LOAD DATA IN
134
+ vertica_copy options
135
+ elsif schema_check[:changed]
136
+ if metadata.export_type == 'initial'
137
+ Loader.clear_older_files metadata # clear old incremental files
142
138
  apply_schema_change(ops, temp_table)
143
- #vertica_copy options
144
- full_load(ops, temp_table)
145
- elsif schema_check[:changed]
146
- apply_schema_change(ops, temp_table)
147
- full_load(ops, temp_table)
148
139
  else
149
- vertica_copy options
140
+ Loader.cleanup metadata #Remove incremental file
150
141
  end
151
- rescue Exception => e
152
- raise e.message
142
+ else
143
+ temp_table = create_temp_table ops
144
+ options[:table] = temp_table
145
+ Kernel.p "===== COPY TO TEMP TABLE #{temp_table} ====="
146
+ vertica_copy options
147
+ options.reverse_merge!(:temp_table => "#{temp_table}")
148
+ options[:table] = options[:table_name]
149
+ Kernel.p "===== MERGE ====="
150
+ vertica_merge options
151
+ #drop the temp table
152
+ Kernel.p "===== DROP TEMP TABLE ====="
153
+ sql = "DROP TABLE IF EXISTS #{options[:db]}.#{options[:destination_schema]}.#{temp_table} CASCADE;"
154
+ VerticaDb::Base.connection.execute sql
153
155
  end
154
156
  end
155
157
 
@@ -161,17 +163,16 @@ module Myreplicator
161
163
  raise "No input file"
162
164
  end
163
165
 
164
- begin
165
- process_file(:file => prepared_options[:file], :list_of_nulls => list_of_nulls, :null_value => prepared_options[:null_value])
166
- cmd = get_vsql_command(prepared_options)
167
- Kernel.p cmd
168
- system(cmd)
169
- rescue Exception => e
170
- raise e.message
171
- end
166
+ process_file(:file => prepared_options[:file],
167
+ :list_of_nulls => list_of_nulls,
168
+ :null_value => prepared_options[:null_value])
169
+
170
+ cmd = get_vsql_copy_command(prepared_options)
171
+ puts cmd
172
+ system(cmd)
172
173
  end
173
174
 
174
- def get_vsql_command prepared_options
175
+ def get_vsql_copy_command prepared_options
175
176
  file_extension = prepared_options[:file].split('.').last
176
177
  file_handler = ""
177
178
  file_handler = "GZIP" if file_extension == "gz"
@@ -229,6 +230,145 @@ module Myreplicator
229
230
  system(cmd2)
230
231
  end
231
232
 
233
+ def get_mysql_keys mysql_schema_simple_form
234
+ result = []
235
+ mysql_schema_simple_form.each do |col|
236
+ if col["column_key"] == "PRI"
237
+ result << col["column_name"]
238
+ end
239
+ end
240
+ return result
241
+ end
242
+
243
+ def get_mysql_none_keys mysql_schema_simple_form
244
+ result = []
245
+ mysql_schema_simple_form.each do |col|
246
+ if col["column_key"].blank?
247
+ result << col["column_name"]
248
+ end
249
+ end
250
+ return result
251
+ end
252
+
253
+ def get_mysql_inserted_columns mysql_schema_simple_form
254
+ result = []
255
+ mysql_schema_simple_form.each do |col|
256
+ result << col["column_name"]
257
+ end
258
+ return result
259
+ end
260
+
261
+ def get_vsql_merge_command options, keys, none_keys, inserted_columns
262
+ Kernel.p "===== Merge Options ====="
263
+ Kernel.p options
264
+ a = prepare_options options
265
+ Kernel.p a
266
+ prepared_options = options
267
+ sql = "MERGE INTO "
268
+ sql+= "#{prepared_options[:db]}.#{prepared_options[:schema]}.#{prepared_options[:table]} target "
269
+ sql+= "USING #{prepared_options[:db]}.#{prepared_options[:schema]}.#{prepared_options[:temp_table]} source "
270
+ sql+= "ON "
271
+ count = 0
272
+ keys.each do |k|
273
+ if count < 1
274
+ sql += "source.#{k} = target.#{k} "
275
+ else
276
+ sql += "AND source.#{k} = target.#{k} "
277
+ end
278
+ count += 1
279
+ end
280
+ sql+= "WHEN MATCHED THEN "
281
+ sql+= "UPDATE SET "
282
+ count = 1
283
+ none_keys.each do |nk|
284
+ if count < none_keys.size
285
+ sql+= "#{nk} = source.#{nk}, "
286
+ else
287
+ sql+= "#{nk} = source.#{nk} "
288
+ end
289
+ count += 1
290
+ end
291
+ sql+= "WHEN NOT MATCHED THEN "
292
+ sql+= "INSERT "
293
+ #count = 1
294
+ #inserted_columns.each do |col|
295
+ # if count < inserted_columns.size
296
+ # sql+= "#{col}, "
297
+ # else
298
+ # sql+= "#{col} "
299
+ # end
300
+ # count += 1
301
+ #end
302
+ count = 1
303
+ sql+= " VALUES ("
304
+ inserted_columns.each do |col|
305
+ if count < inserted_columns.size
306
+ sql+= "source.#{col}, "
307
+ else
308
+ sql+= "source.#{col}) "
309
+ end
310
+ count += 1
311
+ end
312
+ sql+= ";"
313
+ cmd = "#{prepared_options[:vsql]} -h #{prepared_options[:host]} -U #{prepared_options[:user]} -w #{prepared_options[:pass]} -d #{prepared_options[:db]} -c \"#{sql}\""
314
+ return cmd
315
+ end
316
+
317
+ def vertica_merge *args
318
+ options = args.extract_options!
319
+ metadata = options[:metadata]
320
+ Kernel.p "===== MERGE metadata ====="
321
+ Kernel.p metadata
322
+ ops = {:table => options[:table_name],
323
+ :destination_schema => options[:destination_schema],
324
+ :source_schema => options[:source_schema]}
325
+ mysql_schema = Loader.mysql_table_definition(options)
326
+ vertica_schema = VerticaLoader.destination_table_vertica(options)
327
+ mysql_schema_simple_form = MysqlExporter.get_mysql_schema_rows mysql_schema
328
+ # get the column(s) that is(are) used as the primary key
329
+ keys = get_mysql_keys mysql_schema_simple_form
330
+ # get the non key coluns
331
+ none_keys = get_mysql_none_keys mysql_schema_simple_form
332
+ # get the column to put in the insert part
333
+ inserted_columns = get_mysql_inserted_columns mysql_schema_simple_form
334
+ #get the vsql merge command
335
+ cmd = get_vsql_merge_command options, keys, none_keys, inserted_columns
336
+ #execute
337
+ puts cmd
338
+ begin
339
+ result = `#{cmd} 2>&1`
340
+ if result[0..4] == "ERROR"
341
+ Loader.cleanup metadata
342
+ sql = "DROP TABLE IF EXISTS #{options[:db]}.#{options[:destination_schema]}.#{options[:temp_table]} CASCADE;"
343
+ Kernel.p "===== DROP CMD ====="
344
+ Kernel.p sql
345
+ VerticaDb::Base.connection.execute sql
346
+ raise result
347
+ end
348
+ rescue Exception => e
349
+ raise e.message
350
+ ensure
351
+ # place holder
352
+ end
353
+ end
354
+
355
+ # def create_all_tables db
356
+ # tables = Loader::SourceDb.get_tables(db)
357
+ # sqls = {}
358
+ # tables.each do |table|
359
+ # puts "Creating #{db}.#{table}"
360
+ # sql = "DROP TABLE IF EXISTS #{db}.#{table} CASCADE;"
361
+ # VerticaDb::Base.connection.execute sql
362
+ # sql = Loader::VerticaLoader.create_table(:vertica_db => "bidw",
363
+ # :vertica_table => table,
364
+ # :vertica_schema => db,
365
+ # :table => table,
366
+ # :db => db)
367
+ # sqls["#{table}"] = sql
368
+ # VerticaDb::Base.connection.execute sql
369
+ # end
370
+ # end
371
+
232
372
  end
233
373
  end
234
374
  end
@@ -1,3 +1,3 @@
1
1
  module Myreplicator
2
- VERSION = "1.1.7"
2
+ VERSION = "1.1.9"
3
3
  end
@@ -4086,3 +4086,275 @@ Connecting to database specified by database.yml
4086
4086
  Connecting to database specified by database.yml
4087
4087
  Connecting to database specified by database.yml
4088
4088
  Connecting to database specified by database.yml
4089
+ Connecting to database specified by database.yml
4090
+
4091
+
4092
+ Started GET "/myreplicator/exports" for 127.0.0.1 at 2013-03-08 14:24:06 -0800
4093
+ Processing by Myreplicator::ExportsController#index as HTML
4094
+  (0.3ms) SELECT COUNT(*) FROM `myreplicator_exports` 
4095
+ Myreplicator::Export Load (0.5ms) SELECT `myreplicator_exports`.* FROM `myreplicator_exports` ORDER BY source_schema asc LIMIT 30 OFFSET 0
4096
+ Rendered /home/sasan/workspace/myreplicator/app/views/myreplicator/exports/index.html.erb within layouts/myreplicator/application (73.0ms)
4097
+ Completed 200 OK in 361ms (Views: 356.6ms | ActiveRecord: 2.0ms)
4098
+
4099
+
4100
+ Started GET "/assets/myreplicator/application.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4101
+ Served asset /myreplicator/application.css - 304 Not Modified (32ms)
4102
+
4103
+
4104
+ Started GET "/assets/myreplicator/chosen.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4105
+ Served asset /myreplicator/chosen.css - 304 Not Modified (3ms)
4106
+
4107
+
4108
+ Started GET "/assets/myreplicator/exports.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4109
+ Served asset /myreplicator/exports.css - 304 Not Modified (2ms)
4110
+
4111
+
4112
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4113
+ Served asset /jquery.js - 304 Not Modified (3ms)
4114
+
4115
+
4116
+ Started GET "/assets/myreplicator/tipTip.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4117
+ Served asset /myreplicator/tipTip.css - 304 Not Modified (1ms)
4118
+
4119
+
4120
+ Started GET "/assets/myreplicator/select2.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4121
+ Served asset /myreplicator/select2.css - 304 Not Modified (2ms)
4122
+
4123
+
4124
+ Started GET "/assets/jquery-ui.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4125
+ Served asset /jquery-ui.js - 304 Not Modified (3ms)
4126
+
4127
+
4128
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4129
+ Served asset /jquery_ujs.js - 304 Not Modified (2ms)
4130
+
4131
+
4132
+ Started GET "/assets/myreplicator/chosen.jquery.min.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4133
+ Served asset /myreplicator/chosen.jquery.min.js - 304 Not Modified (1ms)
4134
+
4135
+
4136
+ Started GET "/assets/myreplicator/cronwtf.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4137
+ Served asset /myreplicator/cronwtf.js - 304 Not Modified (1ms)
4138
+
4139
+
4140
+ Started GET "/assets/myreplicator/exports.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4141
+ Served asset /myreplicator/exports.js - 304 Not Modified (1ms)
4142
+
4143
+
4144
+ Started GET "/assets/myreplicator/jquery.tipTip.minified.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4145
+ Served asset /myreplicator/jquery.tipTip.minified.js - 304 Not Modified (1ms)
4146
+
4147
+
4148
+ Started GET "/assets/myreplicator/select2.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4149
+ Served asset /myreplicator/select2.js - 304 Not Modified (29ms)
4150
+
4151
+
4152
+ Started GET "/assets/myreplicator/application.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4153
+ Served asset /myreplicator/application.js - 304 Not Modified (8ms)
4154
+
4155
+
4156
+ Started GET "/assets/myreplicator/plus.png" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4157
+ Served asset /myreplicator/plus.png - 304 Not Modified (31ms)
4158
+
4159
+
4160
+ Started GET "/assets/myreplicator/desc-white.gif" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4161
+ Served asset /myreplicator/desc-white.gif - 304 Not Modified (7ms)
4162
+
4163
+
4164
+ Started GET "/assets/myreplicator/bg.gif" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4165
+ Served asset /myreplicator/bg.gif - 304 Not Modified (56ms)
4166
+
4167
+
4168
+ Started GET "/assets/myreplicator/clipboard-list.png" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4169
+ Served asset /myreplicator/clipboard-list.png - 304 Not Modified (3ms)
4170
+
4171
+
4172
+ Started GET "/assets/myreplicator/gear.png" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4173
+ Served asset /myreplicator/gear.png - 304 Not Modified (7ms)
4174
+
4175
+
4176
+ Started GET "/assets/myreplicator/status.png" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4177
+ Served asset /myreplicator/status.png - 304 Not Modified (10ms)
4178
+
4179
+
4180
+ Started GET "/assets/myreplicator/FrancoisOne.ttf" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4181
+ Served asset /myreplicator/FrancoisOne.ttf - 304 Not Modified (13ms)
4182
+
4183
+
4184
+ Started GET "/assets/myreplicator/websymbols-regular-webfont.woff" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4185
+ Served asset /myreplicator/websymbols-regular-webfont.woff - 304 Not Modified (55ms)
4186
+
4187
+
4188
+ Started GET "/assets/myreplicator/cross.png" for 127.0.0.1 at 2013-03-08 14:24:07 -0800
4189
+ Served asset /myreplicator/cross.png - 304 Not Modified (11ms)
4190
+
4191
+
4192
+ Started GET "/myreplicator/exports/new" for 127.0.0.1 at 2013-03-08 14:24:09 -0800
4193
+ Processing by Myreplicator::ExportsController#new as HTML
4194
+ Rendered /home/sasan/workspace/myreplicator/app/views/myreplicator/exports/_form.html.erb (68.7ms)
4195
+ Rendered /home/sasan/workspace/myreplicator/app/views/myreplicator/exports/new.html.erb within layouts/myreplicator/application (76.6ms)
4196
+ Completed 200 OK in 553ms (Views: 102.5ms | ActiveRecord: 76.8ms)
4197
+
4198
+
4199
+ Started GET "/assets/myreplicator/application.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4200
+ Served asset /myreplicator/application.css - 304 Not Modified (4ms)
4201
+
4202
+
4203
+ Started GET "/assets/myreplicator/exports.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4204
+ Served asset /myreplicator/exports.css - 304 Not Modified (0ms)
4205
+
4206
+
4207
+ Started GET "/assets/myreplicator/chosen.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4208
+ Served asset /myreplicator/chosen.css - 304 Not Modified (0ms)
4209
+
4210
+
4211
+ Started GET "/assets/myreplicator/select2.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4212
+ Served asset /myreplicator/select2.css - 304 Not Modified (0ms)
4213
+
4214
+
4215
+ Started GET "/assets/myreplicator/tipTip.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4216
+ Served asset /myreplicator/tipTip.css - 304 Not Modified (0ms)
4217
+
4218
+
4219
+ Started GET "/assets/myreplicator/cronwtf.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4220
+ Served asset /myreplicator/cronwtf.js - 304 Not Modified (0ms)
4221
+
4222
+
4223
+ Started GET "/assets/jquery-ui.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4224
+ Served asset /jquery-ui.js - 304 Not Modified (2ms)
4225
+
4226
+
4227
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4228
+ Served asset /jquery_ujs.js - 304 Not Modified (0ms)
4229
+
4230
+
4231
+ Started GET "/assets/myreplicator/chosen.jquery.min.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4232
+ Served asset /myreplicator/chosen.jquery.min.js - 304 Not Modified (0ms)
4233
+
4234
+
4235
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4236
+ Served asset /jquery.js - 304 Not Modified (0ms)
4237
+
4238
+
4239
+ Started GET "/assets/myreplicator/exports.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4240
+ Served asset /myreplicator/exports.js - 304 Not Modified (0ms)
4241
+
4242
+
4243
+ Started GET "/assets/myreplicator/jquery.tipTip.minified.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4244
+ Served asset /myreplicator/jquery.tipTip.minified.js - 304 Not Modified (0ms)
4245
+
4246
+
4247
+ Started GET "/assets/myreplicator/select2.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4248
+ Served asset /myreplicator/select2.js - 304 Not Modified (0ms)
4249
+
4250
+
4251
+ Started GET "/assets/myreplicator/application.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4252
+ Served asset /myreplicator/application.js - 304 Not Modified (2ms)
4253
+
4254
+
4255
+ Started GET "/assets/myreplicator/cross.png" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4256
+ Served asset /myreplicator/cross.png - 304 Not Modified (0ms)
4257
+
4258
+
4259
+ Started GET "/assets/myreplicator/FrancoisOne.ttf" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4260
+ Served asset /myreplicator/FrancoisOne.ttf - 304 Not Modified (0ms)
4261
+
4262
+
4263
+ Started GET "/assets/myreplicator/websymbols-regular-webfont.woff" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4264
+ Served asset /myreplicator/websymbols-regular-webfont.woff - 304 Not Modified (0ms)
4265
+
4266
+
4267
+ Started GET "/assets/myreplicator/select2.png" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4268
+ Served asset /myreplicator/select2.png - 304 Not Modified (21ms)
4269
+
4270
+
4271
+ Started GET "/assets/myreplicator/slider_handle.png" for 127.0.0.1 at 2013-03-08 14:24:10 -0800
4272
+ Served asset /myreplicator/slider_handle.png - 304 Not Modified (11ms)
4273
+
4274
+
4275
+ Started POST "/myreplicator/exports" for 127.0.0.1 at 2013-03-08 14:24:33 -0800
4276
+ Processing by Myreplicator::ExportsController#create as HTML
4277
+ Parameters: {"utf8"=>"✓", "authenticity_token"=>"QmN8JvOm6ve0DKeySyGW8m4j4mX7L4aFx3WoUG5Iguk=", "export"=>{"export_to"=>"vertica", "export_type"=>"incremental", "source_schema"=>"okl_dev", "destination_schema"=>"public", "table_name"=>"activation_cohorts", "incremental_column"=>"modified_date", "incremental_column_type"=>"", "max_incremental_value"=>"", "s3_path"=>"", "active"=>"true", "cron"=>"*/23 * * * *"}, "commit"=>"Create Export"}
4278
+  (0.1ms) BEGIN
4279
+ SQL (0.4ms) INSERT INTO `myreplicator_exports` (`active`, `created_at`, `cron`, `destination_schema`, `error`, `export_finished_at`, `export_started_at`, `export_to`, `export_type`, `exporter_pid`, `incremental_column`, `incremental_column_type`, `max_incremental_value`, `s3_path`, `source_schema`, `state`, `table_name`, `updated_at`) VALUES (1, '2013-03-08 22:24:34', '*/23 * * * *', 'public', NULL, NULL, NULL, 'vertica', 'incremental', NULL, 'modified_date', '', '', '', 'okl_dev', 'new', 'activation_cohorts', '2013-03-08 22:24:34')
4280
+  (42.3ms) COMMIT
4281
+ Myreplicator::Export Load (0.3ms) SELECT `myreplicator_exports`.* FROM `myreplicator_exports`
4282
+ Redirected to http://localhost:3000/myreplicator/exports/4
4283
+ Completed 302 Found in 561ms (ActiveRecord: 120.4ms)
4284
+
4285
+
4286
+ Started GET "/myreplicator/exports/4" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4287
+ Processing by Myreplicator::ExportsController#show as HTML
4288
+ Parameters: {"id"=>"4"}
4289
+ Myreplicator::Export Load (0.3ms) SELECT `myreplicator_exports`.* FROM `myreplicator_exports` WHERE `myreplicator_exports`.`id` = 4 LIMIT 1
4290
+ Rendered /home/sasan/workspace/myreplicator/app/views/myreplicator/exports/show.html.erb within layouts/myreplicator/application (1.5ms)
4291
+ Completed 200 OK in 23ms (Views: 20.7ms | ActiveRecord: 0.3ms)
4292
+
4293
+
4294
+ Started GET "/assets/myreplicator/application.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4295
+ Served asset /myreplicator/application.css - 304 Not Modified (5ms)
4296
+
4297
+
4298
+ Started GET "/assets/myreplicator/tipTip.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4299
+ Served asset /myreplicator/tipTip.css - 304 Not Modified (0ms)
4300
+
4301
+
4302
+ Started GET "/assets/myreplicator/chosen.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4303
+ Served asset /myreplicator/chosen.css - 304 Not Modified (1ms)
4304
+
4305
+
4306
+ Started GET "/assets/myreplicator/exports.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4307
+ Served asset /myreplicator/exports.css - 304 Not Modified (0ms)
4308
+
4309
+
4310
+ Started GET "/assets/myreplicator/select2.css?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4311
+ Served asset /myreplicator/select2.css - 304 Not Modified (0ms)
4312
+
4313
+
4314
+ Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4315
+ Served asset /jquery.js - 304 Not Modified (1ms)
4316
+
4317
+
4318
+ Started GET "/assets/jquery-ui.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4319
+ Served asset /jquery-ui.js - 304 Not Modified (1ms)
4320
+
4321
+
4322
+ Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4323
+ Served asset /jquery_ujs.js - 304 Not Modified (0ms)
4324
+
4325
+
4326
+ Started GET "/assets/myreplicator/cronwtf.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4327
+ Served asset /myreplicator/cronwtf.js - 304 Not Modified (0ms)
4328
+
4329
+
4330
+ Started GET "/assets/myreplicator/chosen.jquery.min.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4331
+ Served asset /myreplicator/chosen.jquery.min.js - 304 Not Modified (2ms)
4332
+
4333
+
4334
+ Started GET "/assets/myreplicator/exports.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4335
+ Served asset /myreplicator/exports.js - 304 Not Modified (0ms)
4336
+
4337
+
4338
+ Started GET "/assets/myreplicator/jquery.tipTip.minified.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4339
+ Served asset /myreplicator/jquery.tipTip.minified.js - 304 Not Modified (0ms)
4340
+
4341
+
4342
+ Started GET "/assets/myreplicator/select2.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4343
+ Served asset /myreplicator/select2.js - 304 Not Modified (0ms)
4344
+
4345
+
4346
+ Started GET "/assets/myreplicator/application.js?body=1" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4347
+ Served asset /myreplicator/application.js - 304 Not Modified (2ms)
4348
+
4349
+
4350
+ Started GET "/assets/myreplicator/FrancoisOne.ttf" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4351
+ Served asset /myreplicator/FrancoisOne.ttf - 304 Not Modified (0ms)
4352
+
4353
+
4354
+ Started GET "/assets/myreplicator/websymbols-regular-webfont.woff" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4355
+ Served asset /myreplicator/websymbols-regular-webfont.woff - 304 Not Modified (0ms)
4356
+
4357
+
4358
+ Started GET "/assets/myreplicator/gear.png" for 127.0.0.1 at 2013-03-08 14:24:34 -0800
4359
+ Served asset /myreplicator/gear.png - 304 Not Modified (0ms)
4360
+ Connecting to database specified by database.yml
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: myreplicator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.1.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-07 00:00:00.000000000 Z
12
+ date: 2013-03-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -370,7 +370,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
370
370
  version: '0'
371
371
  segments:
372
372
  - 0
373
- hash: 45298977780065472
373
+ hash: -3137880076696344108
374
374
  required_rubygems_version: !ruby/object:Gem::Requirement
375
375
  none: false
376
376
  requirements:
@@ -379,7 +379,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
379
379
  version: '0'
380
380
  segments:
381
381
  - 0
382
- hash: 45298977780065472
382
+ hash: -3137880076696344108
383
383
  requirements: []
384
384
  rubyforge_project:
385
385
  rubygems_version: 1.8.23