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