database_sanitizer 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0fc14e337b32eb2d1d3d4ce3aada4e918eecf439
4
- data.tar.gz: 53eef3f8ce2e81c7f4cf9ebceaa26a641af4ae66
3
+ metadata.gz: 816ccf39b00e6e58b01d27e9641101df1be308d9
4
+ data.tar.gz: 8527b8bb3d4ae9939e97004d7c11d5c4df953076
5
5
  SHA512:
6
- metadata.gz: 98faa8701b6e71bbadc5fa64bcf65858856fe832d2f4299dabadaaca202845a4269a326b8777ad0afe25a9d8133146c2051eb214c8a06544754d52084e530ece
7
- data.tar.gz: 8ed2284d1224a3003730f6c338bb3462da957bec20be1a0bbc6266a369da978b02312e959af0a761753fd8e371664ca486da979a343c5ecd9f7865d10e281888
6
+ metadata.gz: c5e5a21fd47e697898a02b865d252c838119ddaec369e541ed17a25ac4695ddddb5f4b8554a589ef9141e41b21fb67012b2fd9fbeda4d9da469daa6077220641
7
+ data.tar.gz: 9110e79e2c1bf8251f6ba44665c622391a1aef4443e1a20c5bcdc26ef9ee98558147976cb2140c468f8e2d16bb9c77cd5c643d9dce979f342ed5186ae8ebb1a9
@@ -1,3 +1,3 @@
1
1
  module DatabaseSanitizer
2
- VERSION = '0.0.12'
2
+ VERSION = '0.0.13'
3
3
  end
@@ -14,6 +14,8 @@ module DatabaseSanitizer
14
14
  class << self
15
15
  def extract_transformer comment; comment ? comment[/sanitize: ?(\w+)/,1] : nil; end
16
16
 
17
+ def extract_order comment; comment ? comment[/order_by: ?(\w+)/,1] : nil; end
18
+
17
19
  def read_comments conn, tables
18
20
  tables.inject({}) do |transformers, table|
19
21
  transformers[table.to_sym] = conn.retrieve_column_comments(table.to_sym).inject({}) do |table_transformers, column|
@@ -64,22 +66,41 @@ module DatabaseSanitizer
64
66
  tables.with_progress('Exporting').each do |table|
65
67
  q_table = dest.quote_table_name table
66
68
  s_table = table.to_sym
67
- sel_query = "SELECT * FROM #{q_table} LIMIT #{CHUNK_SIZE} OFFSET "
69
+
68
70
  get_chunks(table).times_with_progress(table.rjust max_tbl_name_len) do |chunk_i|
69
- offset = chunk_i * CHUNK_SIZE
70
- result = src.exec_query sel_query + offset.to_s
71
- cols = result.columns.map { |col| dest.quote_column_name col }.join ','
72
- ins_query_part = "INSERT INTO #{q_table} (#{cols}) VALUES ("
73
- ins_query = StringIO.new
74
- result.rows.each_with_index do |src_row, row_i|
75
- values = result.columns.each_with_index.map do |col, col_i|
76
- transformer = transformers[s_table][col.to_sym]
77
- dest.quote transformer ? transformer.(offset + row_i, src_row[col_i]) : src_row[col_i]
78
- end
79
- ins_query << ins_query_part << values.join(',') << '); '
80
- end
81
- dest.exec_query ins_query.string
71
+ result = src.exec_query select_query q_table, s_table, (chunk_i * CHUNK_SIZE)
72
+ dest.exec_query insert_query q_table, s_table, transformers, result
73
+ end
74
+ end
75
+ end
76
+
77
+ def insert_query q_table, s_table, transformers, result
78
+ cols = result.columns.map { |col| dest.quote_column_name col }.join ','
79
+ ins_query_part = "INSERT INTO #{q_table} (#{cols}) VALUES ("
80
+ ins_query = StringIO.new
81
+ result.rows.each_with_index do |src_row, row_i|
82
+ values = result.columns.each_with_index.map do |col, col_i|
83
+ transformer = transformers[s_table][col.to_sym]
84
+ dest.quote transformer ? transformer.(offset + row_i, src_row[col_i]) : src_row[col_i]
82
85
  end
86
+ ins_query << ins_query_part << values.join(',') << '); '
87
+ end
88
+ end
89
+
90
+ def select_query q_table, s_table, offset
91
+ "SELECT * FROM #{q_table} #{order_clause_for_table(s_table)} LIMIT #{CHUNK_SIZE} OFFSET #{offset}"
92
+ end
93
+
94
+ def order_clause s_table
95
+ conn = Source.connection
96
+ order_sql = 'ORDER BY '
97
+ order_by = extract_order conn.retrieve_table_comment s_table
98
+ if order_by
99
+ order_sql + conn.quote_table_name(order_by)
100
+ elsif conn.column_exists? s_table, :id
101
+ order_sql + 'id'
102
+ else
103
+ nil
83
104
  end
84
105
  end
85
106
  end
@@ -21,6 +21,26 @@ describe DatabaseSanitizer do
21
21
  end
22
22
  end
23
23
 
24
+ describe '#extract_order', nodb: true do
25
+ context 'should return nil for no order' do
26
+ ['no order comment', nil, '', 'order_by no tag'].each do |comment|
27
+ it { expect(described_class.extract_order comment).to be_nil }
28
+ end
29
+ end
30
+
31
+ context 'should return order' do
32
+ [
33
+ 'order_by: test_col',
34
+ 'random order_by: test_col comment',
35
+ 'some order_by: test_col, order_by: other',
36
+ 'without order_by:test_col space',
37
+ 'trailing order_by: test_col'
38
+ ].each do |comment|
39
+ it { expect(described_class.extract_order comment).to eq('test_col') }
40
+ end
41
+ end
42
+ end
43
+
24
44
  describe '#read_comments' do
25
45
  before do
26
46
  ActiveRecord::Migration.suppress_messages do
@@ -56,4 +76,34 @@ describe DatabaseSanitizer do
56
76
  end
57
77
  end
58
78
  end
79
+
80
+ describe '#order_clause' do
81
+ context 'no order comment' do
82
+ context 'and no id' do
83
+ before do
84
+ ActiveRecord::Migration.suppress_messages do
85
+ ActiveRecord::Schema.define { remove_column :test, :id }
86
+ end
87
+ end
88
+
89
+ it 'should not order' do
90
+ expect(described_class.order_clause :test).to be_nil
91
+ end
92
+ end
93
+
94
+ context 'and id' do
95
+ it 'should order by id' do
96
+ expect(described_class.order_clause :test).to end_with('id')
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'order comment' do
103
+ before { ActiveRecord::Base.connection.set_table_comment :test, 'order_by: field2' }
104
+
105
+ it 'should order by comment' do
106
+ expect(described_class.order_clause :test).to end_with(ActiveRecord::Base.connection.quote_table_name 'field2')
107
+ end
108
+ end
59
109
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: database_sanitizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marton Somogyi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-07 00:00:00.000000000 Z
11
+ date: 2014-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler