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 +4 -4
- data/lib/database_sanitizer/version.rb +1 -1
- data/lib/database_sanitizer.rb +35 -14
- data/spec/database_exporter_spec.rb +50 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 816ccf39b00e6e58b01d27e9641101df1be308d9
|
4
|
+
data.tar.gz: 8527b8bb3d4ae9939e97004d7c11d5c4df953076
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5e5a21fd47e697898a02b865d252c838119ddaec369e541ed17a25ac4695ddddb5f4b8554a589ef9141e41b21fb67012b2fd9fbeda4d9da469daa6077220641
|
7
|
+
data.tar.gz: 9110e79e2c1bf8251f6ba44665c622391a1aef4443e1a20c5bcdc26ef9ee98558147976cb2140c468f8e2d16bb9c77cd5c643d9dce979f342ed5186ae8ebb1a9
|
data/lib/database_sanitizer.rb
CHANGED
@@ -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
|
-
|
69
|
+
|
68
70
|
get_chunks(table).times_with_progress(table.rjust max_tbl_name_len) do |chunk_i|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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.
|
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-
|
11
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|