database_sanitizer 0.0.12 → 0.0.13

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.
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