sqlite_magic 0.0.2 → 0.0.3
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.
- data/.travis.yml +2 -2
- data/README.md +4 -0
- data/lib/sqlite_magic.rb +17 -9
- data/lib/sqlite_magic/version.rb +1 -1
- data/spec/lib/sqlite_magic_spec.rb +48 -20
- metadata +82 -80
data/.travis.yml
CHANGED
@@ -3,8 +3,8 @@ rvm:
|
|
3
3
|
# - "1.8.7"
|
4
4
|
- "1.9.2"
|
5
5
|
- "1.9.3"
|
6
|
-
- jruby-18mode # JRuby in 1.8 mode
|
7
|
-
- jruby-19mode # JRuby in 1.9 mode
|
6
|
+
# - jruby-18mode # JRuby in 1.8 mode
|
7
|
+
# - jruby-19mode # JRuby in 1.9 mode
|
8
8
|
# - rbx-18mode
|
9
9
|
- rbx-19mode
|
10
10
|
# uncomment this line if your project needs to run something other than `rake`:
|
data/README.md
CHANGED
@@ -23,6 +23,10 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
TODO: Write usage instructions here
|
25
25
|
|
26
|
+
## Changes
|
27
|
+
Allow options to be passed when initializing connection (which will be passed to Sqlite)
|
28
|
+
insert\_or\_update no defers to #save\_data when hitting error (which caused a problem when missing field)
|
29
|
+
|
26
30
|
## Contributing
|
27
31
|
|
28
32
|
1. Fork it
|
data/lib/sqlite_magic.rb
CHANGED
@@ -11,8 +11,8 @@ module SqliteMagic
|
|
11
11
|
|
12
12
|
class Connection
|
13
13
|
attr_reader :database
|
14
|
-
def initialize(db_loc='sqlite.db')
|
15
|
-
@database = SQLite3::Database.new(db_loc)
|
14
|
+
def initialize(db_loc='sqlite.db', options={})
|
15
|
+
@database = SQLite3::Database.new(db_loc, options)
|
16
16
|
end
|
17
17
|
|
18
18
|
def add_columns(tbl_name, col_names)
|
@@ -54,10 +54,10 @@ module SqliteMagic
|
|
54
54
|
|
55
55
|
# This is an (expensive) convenience method to insert a row (for given unique keys), or if the row already exists
|
56
56
|
#
|
57
|
-
def insert_or_update(uniq_keys, values_hash, tbl_name='
|
58
|
-
|
59
|
-
|
60
|
-
sql_statement = "INSERT INTO #{tbl_name} (#{
|
57
|
+
def insert_or_update(uniq_keys, values_hash, tbl_name='main_table')
|
58
|
+
all_field_names = values_hash.keys
|
59
|
+
field_names_as_symbol_string = all_field_names.map{ |k| ":#{k}" }.join(',') # need to appear as symbols
|
60
|
+
sql_statement = "INSERT INTO #{tbl_name} (#{all_field_names.join(',')}) VALUES (#{field_names_as_symbol_string})"
|
61
61
|
database.execute(sql_statement, values_hash)
|
62
62
|
rescue SQLite3::ConstraintException => e
|
63
63
|
unique_key_constraint = uniq_keys.map { |k| "#{k}=:#{k}" }.join(' AND ')
|
@@ -65,9 +65,17 @@ module SqliteMagic
|
|
65
65
|
sql_statement = "UPDATE #{tbl_name} SET #{update_keys} WHERE #{unique_key_constraint}"
|
66
66
|
database.execute sql_statement, values_hash
|
67
67
|
rescue SQLite3::SQLException => e
|
68
|
-
puts "Exception (#{e.inspect}) raised
|
69
|
-
|
70
|
-
|
68
|
+
puts "Exception (#{e.inspect}) raised" if verbose?
|
69
|
+
case e.message
|
70
|
+
when /no such table/
|
71
|
+
create_table(tbl_name, all_field_names, uniq_keys)
|
72
|
+
retry
|
73
|
+
when /has no column/
|
74
|
+
add_columns(tbl_name, all_field_names)
|
75
|
+
retry
|
76
|
+
else
|
77
|
+
raise e
|
78
|
+
end
|
71
79
|
end
|
72
80
|
|
73
81
|
# #save data into the database
|
data/lib/sqlite_magic/version.rb
CHANGED
@@ -16,7 +16,7 @@ describe SqliteMagic do
|
|
16
16
|
|
17
17
|
describe SqliteMagic::Connection do
|
18
18
|
before do
|
19
|
-
@dummy_db =
|
19
|
+
@dummy_db = double('dummy_sqlite3_database')
|
20
20
|
SQLite3::Database.stub(:new).and_return(@dummy_db)
|
21
21
|
@connection = SqliteMagic::Connection.new
|
22
22
|
end
|
@@ -28,15 +28,20 @@ describe SqliteMagic do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should open up a Sqlite3 database with default name" do
|
31
|
-
SQLite3::Database.should_receive(:new).with('sqlite.db').and_return(@dummy_db)
|
31
|
+
SQLite3::Database.should_receive(:new).with('sqlite.db',{}).and_return(@dummy_db)
|
32
32
|
connection = SqliteMagic::Connection.new
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should use given db_name when setting up Sqlite3" do
|
36
|
-
SQLite3::Database.should_receive(:new).with('path/to/mynew.db').and_return(@dummy_db)
|
36
|
+
SQLite3::Database.should_receive(:new).with('path/to/mynew.db',{}).and_return(@dummy_db)
|
37
37
|
connection = SqliteMagic::Connection.new('path/to/mynew.db')
|
38
38
|
end
|
39
39
|
|
40
|
+
it "should pass options when opening Sqlite3 db" do
|
41
|
+
SQLite3::Database.should_receive(:new).with('path/to/mynew.db', :foo => 'bar').and_return(@dummy_db)
|
42
|
+
connection = SqliteMagic::Connection.new('path/to/mynew.db', :foo => 'bar')
|
43
|
+
end
|
44
|
+
|
40
45
|
it "should store Sqlite3 database in @database instance variable" do
|
41
46
|
connection = SqliteMagic::Connection.new
|
42
47
|
connection.instance_variable_get(:@database).should == @dummy_db
|
@@ -256,10 +261,10 @@ describe SqliteMagic do
|
|
256
261
|
|
257
262
|
context 'and no table name given' do
|
258
263
|
before do
|
259
|
-
@expected_query = "INSERT INTO
|
264
|
+
@expected_query = "INSERT INTO main_table (foo,foo2,foo3,foo4) VALUES (:foo,:foo2,:foo3,:foo4)"
|
260
265
|
end
|
261
266
|
|
262
|
-
it 'should use
|
267
|
+
it 'should use main_table table by default' do
|
263
268
|
@dummy_db.should_receive(:execute).with(@expected_query, @datum)
|
264
269
|
@connection.insert_or_update(@unique_keys, @datum)
|
265
270
|
end
|
@@ -267,7 +272,7 @@ describe SqliteMagic do
|
|
267
272
|
|
268
273
|
context 'and data already exists' do
|
269
274
|
before do
|
270
|
-
@dummy_db.
|
275
|
+
@dummy_db.stub(:execute).with(/INSERT/, anything).and_raise(SQLite3::ConstraintException.new('constraint failed'))
|
271
276
|
@expected_update_query = "UPDATE foo_table SET foo=:foo, foo4=:foo4 WHERE foo2=:foo2 AND foo3=:foo3"
|
272
277
|
end
|
273
278
|
|
@@ -275,34 +280,57 @@ describe SqliteMagic do
|
|
275
280
|
@dummy_db.should_receive(:execute).with(@expected_update_query, @datum)
|
276
281
|
@connection.insert_or_update(@unique_keys, @datum, 'foo_table')
|
277
282
|
end
|
283
|
+
|
278
284
|
context 'and no table name given' do
|
279
285
|
before do
|
280
|
-
@expected_update_query = "UPDATE
|
286
|
+
@expected_update_query = "UPDATE main_table SET foo=:foo, foo4=:foo4 WHERE foo2=:foo2 AND foo3=:foo3"
|
281
287
|
end
|
282
288
|
|
283
|
-
it 'should use
|
289
|
+
it 'should use main_table table by default' do
|
284
290
|
@dummy_db.should_receive(:execute).with(@expected_update_query, @datum)
|
285
291
|
@connection.insert_or_update(@unique_keys, @datum)
|
286
292
|
end
|
287
293
|
end
|
288
294
|
|
289
|
-
|
295
|
+
context 'and some columns do not exist' do
|
296
|
+
before do
|
297
|
+
@dummy_db.should_receive(:execute).with(@expected_query, @datum).
|
298
|
+
and_raise(SQLite3::SQLException.new("table mynewtable has no column named foo") )
|
299
|
+
@expected_update_query = "UPDATE foo_table SET foo=:foo, foo4=:foo4 WHERE foo2=:foo2 AND foo3=:foo3"
|
300
|
+
end
|
290
301
|
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
# raise just once
|
295
|
-
@dummy_db.should_receive(:execute).
|
296
|
-
and_raise(SQLite3::SQLException )
|
297
|
-
end
|
302
|
+
it 'should create missing fields using all field names and unique keys' do
|
303
|
+
@connection.should_receive(:add_columns).with('foo_table', [:foo,:foo2,:foo3, :foo4])
|
304
|
+
@dummy_db.stub(:execute).with(@expected_update_query, @datum)
|
298
305
|
|
299
|
-
|
300
|
-
|
301
|
-
@connection.should_receive(:save_data).with(@unique_keys, @datum, 'foo_table')
|
306
|
+
@connection.insert_or_update(@unique_keys, @datum, 'foo_table')
|
307
|
+
end
|
302
308
|
|
303
|
-
|
309
|
+
it 'should update data' do
|
310
|
+
@connection.stub(:add_columns)
|
311
|
+
@dummy_db.should_receive(:execute).with(@expected_update_query, @datum)
|
312
|
+
|
313
|
+
@connection.insert_or_update(@unique_keys, @datum, 'foo_table')
|
314
|
+
end
|
304
315
|
end
|
316
|
+
|
305
317
|
end
|
318
|
+
|
319
|
+
# context 'and SQLite3::SQLException raised' do
|
320
|
+
# before do
|
321
|
+
# @dummy_db.stub(:execute) # default
|
322
|
+
# # raise just once
|
323
|
+
# @dummy_db.should_receive(:execute).
|
324
|
+
# and_raise(SQLite3::SQLException )
|
325
|
+
# end
|
326
|
+
#
|
327
|
+
# it 'should defer to save_data' do
|
328
|
+
# @connection.stub(:create_table)
|
329
|
+
# @connection.should_receive(:save_data).with(@unique_keys, @datum, 'foo_table')
|
330
|
+
#
|
331
|
+
# @connection.insert_or_update(@unique_keys, @datum, 'foo_table')
|
332
|
+
# end
|
333
|
+
# end
|
306
334
|
end
|
307
335
|
|
308
336
|
describe '#verbose?' do
|
metadata
CHANGED
@@ -1,81 +1,88 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlite_magic
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Chris Taggart
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-11-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: sqlite3
|
22
|
-
|
23
|
-
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 0
|
29
|
-
version: "0"
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
30
22
|
type: :runtime
|
31
|
-
version_requirements: *id001
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: bundler
|
34
23
|
prerelease: false
|
35
|
-
|
36
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
37
35
|
- - ~>
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
|
40
|
-
- 1
|
41
|
-
- 3
|
42
|
-
version: "1.3"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
43
38
|
type: :development
|
44
|
-
version_requirements: *id002
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: rake
|
47
39
|
prerelease: false
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
55
54
|
type: :development
|
56
|
-
version_requirements: *id003
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: rspec
|
59
55
|
prerelease: false
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
67
70
|
type: :development
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: Sprinkles some magic onto Sqlite3 gem. Sort of extracted from Scraperwiki
|
79
|
+
gem
|
80
|
+
email:
|
71
81
|
- info@opencorporates.com
|
72
82
|
executables: []
|
73
|
-
|
74
83
|
extensions: []
|
75
|
-
|
76
84
|
extra_rdoc_files: []
|
77
|
-
|
78
|
-
files:
|
85
|
+
files:
|
79
86
|
- .gitignore
|
80
87
|
- .travis.yml
|
81
88
|
- Gemfile
|
@@ -88,37 +95,32 @@ files:
|
|
88
95
|
- spec/lib/sqlite_magic_spec.rb
|
89
96
|
- spec/spec_helper.rb
|
90
97
|
- sqlite_magic.gemspec
|
91
|
-
has_rdoc: true
|
92
98
|
homepage: https://github.com/openc/sqlite_magic
|
93
|
-
licenses:
|
99
|
+
licenses:
|
94
100
|
- MIT
|
95
101
|
post_install_message:
|
96
102
|
rdoc_options: []
|
97
|
-
|
98
|
-
require_paths:
|
103
|
+
require_paths:
|
99
104
|
- lib
|
100
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
requirements:
|
109
|
-
- -
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
|
112
|
-
- 0
|
113
|
-
version: "0"
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
114
117
|
requirements: []
|
115
|
-
|
116
118
|
rubyforge_project:
|
117
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.8.25
|
118
120
|
signing_key:
|
119
121
|
specification_version: 3
|
120
122
|
summary: Sprinkles some magic onto Sqlite3 gem
|
121
|
-
test_files:
|
123
|
+
test_files:
|
122
124
|
- spec/.DS_Store
|
123
125
|
- spec/lib/sqlite_magic_spec.rb
|
124
126
|
- spec/spec_helper.rb
|