dbwrapper 0.1.0
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 +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +6 -0
- data/dbwrapper.gemspec +24 -0
- data/lib/dbwrapper/version.rb +3 -0
- data/lib/dbwrapper.rb +214 -0
- data/spec/dbwrapper_spec.rb +189 -0
- data/spec/spec_helper.rb +2 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d757df52a8e915bd88e30fa5513e64d18a8c43cd
|
4
|
+
data.tar.gz: bbaf842795c328f0f588d8b16d2cbcb9940e100d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c12e74728f838767daef57db712ca9f3636a82c736b3d24ac487bf360aa4e29cb0294bebf66c5dd5f133857429afacbac71aad65823eda33b6664c1696e5b4c5
|
7
|
+
data.tar.gz: cef98eb69799cb08efb530dae8937e2bf961720e866423b8c067ab1d498bf7e102bb605607fdfcd7e3ae73932342bfe09dc8a270d9a16caf5bb0b3531232280a
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in dbwrapper.gemspec
|
4
|
+
gemspec
|
5
|
+
group :postgresql do
|
6
|
+
gem 'pg'
|
7
|
+
gem 'pg_typecast'
|
8
|
+
end
|
9
|
+
group :mysql do
|
10
|
+
gem 'mysql2'
|
11
|
+
gem 'mysql2-cs-bind'
|
12
|
+
end
|
13
|
+
group :sqlite3 do
|
14
|
+
gem 'sqlite3'
|
15
|
+
end
|
16
|
+
gem 'rspec'
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Takeshi Morita
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# Dbwrapper
|
2
|
+
|
3
|
+
This library manipulate various db(mysql2,sqlite,postgresql) in the same way.
|
4
|
+
you can use query with placeholder.
|
5
|
+
still more, multiple insert with hash array and csv backup and csv restore.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'dbwrapper'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install dbwrapper
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
``` ruby
|
24
|
+
#sqlite3
|
25
|
+
db=DBwrapper::DB.new(database: "test.sqlite3",adapter: "sqlite3")
|
26
|
+
#mysql2
|
27
|
+
db=DBwrapper::DB.new(database: "test",adapter: "mysql2")
|
28
|
+
#postgresql
|
29
|
+
db=DBwrapper::DB.new(database: "test",adapter: "postgresql")
|
30
|
+
|
31
|
+
#or merely
|
32
|
+
db=DBwrapper::DB.new(YAML::load(File.open('database.yml'))["development"])
|
33
|
+
#create table depends on db type this example is mysql2. because datetime is paticular mysql.
|
34
|
+
db.query("create table users (id integer,name text,created_at datetime)")
|
35
|
+
#insert
|
36
|
+
db.query('insert users (id,name,created_at) value(?,?,?)',1,"smith","2014-2014-06-26 00:00:00")
|
37
|
+
#last_id 1
|
38
|
+
@db.last_id
|
39
|
+
#select return array of hash [{"id"=>1, "name"=>"smith", "created_at"=>2014-06-26 00:00:00 +0900}]
|
40
|
+
db.query("select * from users")
|
41
|
+
#update
|
42
|
+
db.query("update users set name=? where id = ?","hay",1)
|
43
|
+
#affected_rows 1
|
44
|
+
db.affected_rows
|
45
|
+
#multiple insert with hash
|
46
|
+
db.xinsert("users",[{id: 2,name: "hello",created_at: "2014-2014-06-26 00:00:00"},{id: 3,name: "good",created_at: "2014-2014-06-27 00:00:00"}])
|
47
|
+
#backup_table tablename,path csv made in /var/backup/users.csv
|
48
|
+
db.backup_table("users","/var/backup")
|
49
|
+
#truncate
|
50
|
+
db.truncate("users")
|
51
|
+
#restore table
|
52
|
+
db.restore_table("users","/var/backup")
|
53
|
+
#close
|
54
|
+
db.close
|
55
|
+
```
|
56
|
+
|
57
|
+
## Contributing
|
58
|
+
|
59
|
+
1. Fork it
|
60
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
61
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
63
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/dbwrapper.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dbwrapper/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "dbwrapper"
|
8
|
+
spec.version = Dbwrapper::VERSION
|
9
|
+
spec.authors = ["Takeshi Morita"]
|
10
|
+
spec.email = ["takesy.morito@gmail.com"]
|
11
|
+
spec.description = %q{manipulatie with sqlite3,mysql,postgresql in the same way}
|
12
|
+
spec.summary = %q{you can use query with placeholder. still more, multiple insert with hash array and csv backup and csv restore.}
|
13
|
+
spec.homepage = "https://github.com/takeshy/dbwrapper"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
end
|
data/lib/dbwrapper.rb
ADDED
@@ -0,0 +1,214 @@
|
|
1
|
+
require_relative "dbwrapper/version"
|
2
|
+
require "logger"
|
3
|
+
require "csv"
|
4
|
+
|
5
|
+
module DBwrapper
|
6
|
+
class DB
|
7
|
+
attr_reader :adapter,:client,:result
|
8
|
+
def initialize(option)
|
9
|
+
setting = {}.tap{|h| option.each{|k,v| h[k.to_sym] = v}}
|
10
|
+
raise ArgumentError,"database is not specified! for sqlite3" unless setting[:database]
|
11
|
+
@adapter = setting[:adapter]
|
12
|
+
case @adapter
|
13
|
+
when "sqlite3"
|
14
|
+
require 'sqlite3'
|
15
|
+
|
16
|
+
@client = SQLite3::Database.new(setting[:database])
|
17
|
+
@client.execute("PRAGMA count_changes=ON;")
|
18
|
+
when "mysql2"
|
19
|
+
require 'mysql2-cs-bind'
|
20
|
+
db_params = {:database => setting[:database]}
|
21
|
+
if setting[:username]
|
22
|
+
db_params[:username] = setting[:username]
|
23
|
+
end
|
24
|
+
if setting[:password]
|
25
|
+
db_params[:password] = setting[:password]
|
26
|
+
end
|
27
|
+
if setting[:host]
|
28
|
+
db_params[:host] = setting[:host]
|
29
|
+
end
|
30
|
+
@client = Mysql2::Client.new(db_params)
|
31
|
+
when "postgresql"
|
32
|
+
require 'pg'
|
33
|
+
require 'pg_typecast'
|
34
|
+
db_params = {:dbname => setting[:database]}
|
35
|
+
if setting[:host]
|
36
|
+
db_params[:host] = setting[:host]
|
37
|
+
end
|
38
|
+
if setting[:username]
|
39
|
+
db_params[:user] = setting[:username]
|
40
|
+
end
|
41
|
+
if setting[:password]
|
42
|
+
db_params[:password] = setting[:password]
|
43
|
+
end
|
44
|
+
@client = PG::Connection.open(db_params)
|
45
|
+
else
|
46
|
+
raise ArgumentError,"adapter is not specified. sqlite3 or mysql2 or postgresql"
|
47
|
+
end
|
48
|
+
if setting[:log]
|
49
|
+
@log = Logger.new(setting[:log])
|
50
|
+
else
|
51
|
+
@log = Logger.new(STDOUT)
|
52
|
+
end
|
53
|
+
if setting[:log_level]
|
54
|
+
case setting[:log_level]
|
55
|
+
when "fatal"
|
56
|
+
@log.level = Logger::FATAL
|
57
|
+
when "error"
|
58
|
+
@log.level = Logger::ERROR
|
59
|
+
when "warn"
|
60
|
+
@log.level = Logger::WARN
|
61
|
+
when "info"
|
62
|
+
@log.level = Logger::INFO
|
63
|
+
when "debug"
|
64
|
+
@log.level = Logger::DEBUG
|
65
|
+
end
|
66
|
+
else
|
67
|
+
@log.level = Logger::WARN
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def xinsert(table,args)
|
72
|
+
raise ArgumentError,"args should not be empty" if args.size == 0
|
73
|
+
unless args.is_a?(Array)
|
74
|
+
args = [args]
|
75
|
+
end
|
76
|
+
key_set = args.map{|a| a.keys.join(",")}.uniq
|
77
|
+
if key_set.length != 1
|
78
|
+
raise ArgumentError,"keys of records shuoud be same."
|
79
|
+
end
|
80
|
+
keys = args[0].keys
|
81
|
+
raise ArgumentError,"key shuoud be at least one." if keys.length == 0
|
82
|
+
case @adapter
|
83
|
+
when "sqlite3"
|
84
|
+
args.each do |r|
|
85
|
+
query("insert into #{table} (#{keys.join(",")}) values (#{r.values.map{|v| "'#{v}'"}.join(",")})")
|
86
|
+
end
|
87
|
+
when "postgresql","mysql2"
|
88
|
+
vals = args.map(&:values).map{|r| "(" + r.map{|v| "'#{v}'"}.join(",") + ")"}
|
89
|
+
sql = "insert into #{table} (#{keys.join(",")}) values #{vals.join(",")}"
|
90
|
+
query(sql)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def query(*args)
|
95
|
+
@log.debug(args)
|
96
|
+
case @adapter
|
97
|
+
when "sqlite3"
|
98
|
+
m = args[0].match(/[sS][eE][lL][eE][cC][tT]\s+(.*)\s+[fF][rR][oO][mM]\s+(\S*)\s*/)
|
99
|
+
if m
|
100
|
+
rows = []
|
101
|
+
if m[1] =~ /\*/
|
102
|
+
fields = []
|
103
|
+
@client.table_info(m[2]) do |row|
|
104
|
+
fields << row["name"]
|
105
|
+
end
|
106
|
+
else
|
107
|
+
fields = m[1].split(/,/).map{|d| d.gsub(/\s/,"")}
|
108
|
+
end
|
109
|
+
@client.execute(*args.map{|f| f.kind_of?(Date) || f.kind_of?(Time) ? f.strftime("%Y-%m-%d %H:%M:%S.%N")[0..-4] : f}) do |rec|
|
110
|
+
t = {}
|
111
|
+
fields.each_with_index do |f,i|
|
112
|
+
t[f] = rec[i]
|
113
|
+
end
|
114
|
+
rows.push(t)
|
115
|
+
end
|
116
|
+
rows
|
117
|
+
else
|
118
|
+
@result = @client.execute(*args.map{|f| f.kind_of?(Date) || f.kind_of?(Time) ? f.strftime("%Y-%m-%d %H:%M:%S.%N")[0..-4] : f})
|
119
|
+
end
|
120
|
+
when "mysql2"
|
121
|
+
@result = @client.xquery(*args)
|
122
|
+
@result.to_a
|
123
|
+
when "postgresql"
|
124
|
+
cnt=0
|
125
|
+
sql = args[0].gsub("?"){|w| "$" + (cnt+=1).to_s }
|
126
|
+
m = args[0].match(/^[iI][nN][sS][eE][rR][tT]\s+/)
|
127
|
+
if m
|
128
|
+
sql += " returning *"
|
129
|
+
end
|
130
|
+
@result = @client.exec(sql,args[1 .. -1].map{|f| f.kind_of?(Date) || f.kind_of?(Time) ? f.strftime("%Y-%m-%d %H:%M:%S.%N")[0..-4] : f}.flatten)
|
131
|
+
if m
|
132
|
+
@last_id = 0
|
133
|
+
if @result.count > 0
|
134
|
+
@last_id = @result[@result.count - 1]["id"].to_i
|
135
|
+
end
|
136
|
+
res = @result
|
137
|
+
elsif args[0].match(/[sS][eE][lL][eE][cC][tT]\s+(.*)\s+[fF][rR][oO][mM]\s+(\S*)\s*/)
|
138
|
+
res = @result.map{|r| {}.tap{|h| r.each{|k,v| h[k.to_s] = v}}}
|
139
|
+
else
|
140
|
+
res = @result
|
141
|
+
end
|
142
|
+
res.to_a
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def affected_rows
|
147
|
+
case @adapter
|
148
|
+
when "sqlite3"
|
149
|
+
if @result.count > 0
|
150
|
+
@result[0][0]
|
151
|
+
else
|
152
|
+
0
|
153
|
+
end
|
154
|
+
when "mysql2"
|
155
|
+
@client.affected_rows()
|
156
|
+
when "postgresql"
|
157
|
+
@result.result_status
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def last_id
|
162
|
+
case @adapter
|
163
|
+
when "sqlite3"
|
164
|
+
@client.last_insert_row_id
|
165
|
+
when "mysql2"
|
166
|
+
@client.last_id
|
167
|
+
when "postgresql"
|
168
|
+
@last_id
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def backup_table(t,path)
|
173
|
+
FileUtils.mkdir_p(path)
|
174
|
+
results = query("SELECT * FROM #{t}")
|
175
|
+
CSV.open("#{path}/#{t}.csv", "wb") do |csv|
|
176
|
+
csv << results.first.keys if results.first
|
177
|
+
results.each do |result|
|
178
|
+
csv << result.values.map{|r| if r == nil then 'null' elsif r.is_a?(Numeric) then r elsif r.is_a?(Time) then "'#{r.strftime("%Y-%m-%d %H:%M:%S.%N")[0..-4]}'" else "'#{r}'" end }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def restore_table(t,path)
|
184
|
+
cnt = 0
|
185
|
+
fields = nil
|
186
|
+
CSV.foreach("#{path}/#{t}.csv") do |row|
|
187
|
+
if cnt == 0
|
188
|
+
fields = row.join(",")
|
189
|
+
else
|
190
|
+
query("insert into #{t} (#{fields}) values (#{row.join(",")})")
|
191
|
+
end
|
192
|
+
cnt+=1
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def truncate(t)
|
197
|
+
case @adapter
|
198
|
+
when "sqlite3"
|
199
|
+
query("delete from #{t}")
|
200
|
+
when "mysql2","postgresql"
|
201
|
+
query("TRUNCATE TABLE #{t}")
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def close
|
206
|
+
case @adapter
|
207
|
+
when "postgresql"
|
208
|
+
@client.finish
|
209
|
+
else
|
210
|
+
@client.close
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
DummyDate = Time.utc(2014,6,26,0,0).utc
|
6
|
+
describe Dbwrapper do
|
7
|
+
describe "sqlite3" do
|
8
|
+
before(:all) do
|
9
|
+
@db=DBwrapper::DB.new(database: "test.sqlite3",adapter: "sqlite3")
|
10
|
+
@db.query("create table users (id integer,name text,created_at text)")
|
11
|
+
end
|
12
|
+
before do
|
13
|
+
@db.xinsert("users",{id: 1,name: "good",created_at: DummyDate})
|
14
|
+
@db.xinsert("users",[{id: 2,name: "hello",created_at: DummyDate},{id: 3,name: "good",created_at: DummyDate}])
|
15
|
+
@last_id = @db.last_id
|
16
|
+
@db.query("update users set name=? where id = ?","hay",1)
|
17
|
+
@affected_rows = @db.affected_rows
|
18
|
+
@db.backup_table("users",File.dirname(__FILE__) + "/table/sqlite3")
|
19
|
+
end
|
20
|
+
it 'select' do
|
21
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
22
|
+
end
|
23
|
+
it 'last_id' do
|
24
|
+
@last_id.should == 3
|
25
|
+
end
|
26
|
+
it 'affected_rows' do
|
27
|
+
@affected_rows == 1
|
28
|
+
end
|
29
|
+
after do
|
30
|
+
@db.truncate("users")
|
31
|
+
end
|
32
|
+
after(:all) do
|
33
|
+
@db.close
|
34
|
+
FileUtils.rm("test.sqlite3")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
describe "psotgres" do
|
38
|
+
before(:all) do
|
39
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "postgresql")
|
40
|
+
@db.query("create table users (id int,name text,created_at timestamp)")
|
41
|
+
end
|
42
|
+
before do
|
43
|
+
@db.xinsert("users",{id: 1,name: "good",created_at: DummyDate})
|
44
|
+
@db.xinsert("users",[{id: 2,name: "hello",created_at: DummyDate},{id: 3,name: "good",created_at: DummyDate}])
|
45
|
+
@last_id = @db.last_id
|
46
|
+
@db.query("update users set name=? where id = ?","hay",1)
|
47
|
+
@affected_rows = @db.affected_rows
|
48
|
+
@db.backup_table("users",File.dirname(__FILE__) + "/table/postgresql")
|
49
|
+
end
|
50
|
+
it 'select' do
|
51
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
52
|
+
end
|
53
|
+
it 'last_id' do
|
54
|
+
@last_id.should == 3
|
55
|
+
end
|
56
|
+
it 'affected_rows' do
|
57
|
+
@affected_rows == 1
|
58
|
+
end
|
59
|
+
after do
|
60
|
+
@db.truncate("users")
|
61
|
+
end
|
62
|
+
after(:all) do
|
63
|
+
@db.query("drop table users")
|
64
|
+
@db.close
|
65
|
+
end
|
66
|
+
end
|
67
|
+
describe "mysql2" do
|
68
|
+
before(:all) do
|
69
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "mysql2")
|
70
|
+
@db.query("create table users (id int AUTO_INCREMENT,name text,created_at datetime,primary key(id))")
|
71
|
+
end
|
72
|
+
before do
|
73
|
+
@db.xinsert("users",{id: 1,name: "good",created_at: DummyDate})
|
74
|
+
@db.xinsert("users",[{id: 2,name: "hello",created_at: DummyDate},{id: 3,name: "good",created_at: DummyDate}])
|
75
|
+
@last_id = @db.last_id
|
76
|
+
@db.query("update users set name=? where id = ?","hay",1)
|
77
|
+
@affected_rows = @db.affected_rows
|
78
|
+
@db.backup_table("users",File.dirname(__FILE__) + "/table/mysql2")
|
79
|
+
end
|
80
|
+
it 'select' do
|
81
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
82
|
+
end
|
83
|
+
it 'last_id' do
|
84
|
+
@last_id.should == 3
|
85
|
+
end
|
86
|
+
it 'affected_rows' do
|
87
|
+
@affected_rows == 1
|
88
|
+
end
|
89
|
+
after do
|
90
|
+
@db.truncate("users")
|
91
|
+
end
|
92
|
+
after(:all) do
|
93
|
+
@db.query("drop table users")
|
94
|
+
@db.close
|
95
|
+
end
|
96
|
+
end
|
97
|
+
describe "restore sqlite3" do
|
98
|
+
describe "postgresql" do
|
99
|
+
before do
|
100
|
+
@db=DBwrapper::DB.new(database: "test.sqlite3",adapter: "sqlite3")
|
101
|
+
@db.query("create table users (id integer,name text,created_at text)")
|
102
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/postgresql")
|
103
|
+
end
|
104
|
+
it 'select' do
|
105
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
106
|
+
end
|
107
|
+
after do
|
108
|
+
@db.query("drop table users")
|
109
|
+
@db.close
|
110
|
+
FileUtils.rm("test.sqlite3")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
describe "mysql2" do
|
114
|
+
before do
|
115
|
+
@db=DBwrapper::DB.new(database: "test.sqlite3",adapter: "sqlite3")
|
116
|
+
@db.query("create table users (id integer,name text,created_at text)")
|
117
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/mysql2")
|
118
|
+
end
|
119
|
+
it 'select' do
|
120
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
121
|
+
end
|
122
|
+
after do
|
123
|
+
@db.query("drop table users")
|
124
|
+
@db.close
|
125
|
+
FileUtils.rm("test.sqlite3")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
describe "restore postgresql" do
|
130
|
+
describe "sqlite3" do
|
131
|
+
before do
|
132
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "postgresql")
|
133
|
+
@db.query("create table users (id integer,name text,created_at timestamp)")
|
134
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/sqlite3")
|
135
|
+
end
|
136
|
+
it 'select' do
|
137
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
138
|
+
end
|
139
|
+
after do
|
140
|
+
@db.query("drop table users")
|
141
|
+
@db.close
|
142
|
+
end
|
143
|
+
end
|
144
|
+
describe "mysql2" do
|
145
|
+
before do
|
146
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "postgresql")
|
147
|
+
@db.query("create table users (id integer,name text,created_at timestamp)")
|
148
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/mysql2")
|
149
|
+
end
|
150
|
+
it 'select' do
|
151
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
152
|
+
end
|
153
|
+
after do
|
154
|
+
@db.query("drop table users")
|
155
|
+
@db.close
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
describe "restore mysql2" do
|
160
|
+
describe "sqlite3" do
|
161
|
+
before do
|
162
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "mysql2")
|
163
|
+
@db.query("create table users (id int AUTO_INCREMENT,name text,created_at datetime,primary key(id))")
|
164
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/sqlite3")
|
165
|
+
end
|
166
|
+
it 'select' do
|
167
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
168
|
+
end
|
169
|
+
after do
|
170
|
+
@db.query("drop table users")
|
171
|
+
@db.close
|
172
|
+
end
|
173
|
+
end
|
174
|
+
describe "postgresql" do
|
175
|
+
before do
|
176
|
+
@db=DBwrapper::DB.new(database: "test",adapter: "mysql2")
|
177
|
+
@db.query("create table users (id int AUTO_INCREMENT,name text,created_at datetime,primary key(id))")
|
178
|
+
@db.restore_table("users",File.dirname(__FILE__) + "/table/postgresql")
|
179
|
+
end
|
180
|
+
it 'select' do
|
181
|
+
@db.query("select id,name from users").should =~ [{"id" => 1,"name" => "hay"},{"id" => 2,"name" => "hello"},{"id" => 3,"name" => "good"}]
|
182
|
+
end
|
183
|
+
after do
|
184
|
+
@db.query("drop table users")
|
185
|
+
@db.close
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dbwrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Takeshi Morita
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: manipulatie with sqlite3,mysql,postgresql in the same way
|
56
|
+
email:
|
57
|
+
- takesy.morito@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- LICENSE.txt
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- dbwrapper.gemspec
|
70
|
+
- lib/dbwrapper.rb
|
71
|
+
- lib/dbwrapper/version.rb
|
72
|
+
- spec/dbwrapper_spec.rb
|
73
|
+
- spec/spec_helper.rb
|
74
|
+
homepage: https://github.com/takeshy/dbwrapper
|
75
|
+
licenses:
|
76
|
+
- MIT
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.2.0
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: you can use query with placeholder. still more, multiple insert with hash
|
98
|
+
array and csv backup and csv restore.
|
99
|
+
test_files:
|
100
|
+
- spec/dbwrapper_spec.rb
|
101
|
+
- spec/spec_helper.rb
|