baza 0.0.13 → 0.0.14
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/Gemfile +7 -4
- data/Gemfile.lock +84 -48
- data/README.md +186 -0
- data/VERSION +1 -1
- data/baza.gemspec +37 -22
- data/include/db.rb +153 -166
- data/include/dbtime.rb +2 -2
- data/include/driver.rb +9 -0
- data/include/drivers/active_record/active_record.rb +64 -27
- data/include/drivers/mysql/mysql_columns.rb +33 -33
- data/include/drivers/mysql/mysql_indexes.rb +26 -17
- data/include/drivers/mysql/mysql_tables.rb +140 -132
- data/include/drivers/sqlite3/sqlite3_indexes.rb +37 -9
- data/include/drivers/sqlite3/sqlite3_tables.rb +181 -152
- data/include/query_buffer.rb +22 -22
- data/include/revision.rb +70 -70
- data/lib/baza.rb +3 -1
- data/shippable.yml +11 -0
- data/spec/include/drivers/active_record_spec.rb +8 -0
- data/spec/include/drivers/mysql_spec.rb +47 -0
- data/spec/include/drivers/sqlite3_spec.rb +60 -0
- data/spec/info_active_record.rb +37 -0
- data/spec/info_active_record_example.rb +37 -0
- data/spec/info_active_record_shippable.rb +36 -0
- data/spec/info_mysql_example.rb +24 -6
- data/spec/info_mysql_shippable.rb +23 -0
- data/spec/info_sqlite3.rb +23 -15
- data/spec/model_handler_spec.rb +84 -84
- data/spec/spec_helper.rb +6 -6
- data/spec/support/driver_collection.rb +288 -0
- data/spec/support/driver_columns_collection.rb +49 -0
- data/spec/support/driver_indexes_collection.rb +49 -0
- data/spec/support/driver_tables_collection.rb +73 -0
- metadata +100 -102
- data/README.rdoc +0 -136
- data/spec/baza_spec.rb +0 -410
- data/spec/db_spec_encoding_test_file.txt +0 -1
@@ -0,0 +1,288 @@
|
|
1
|
+
shared_examples_for "a baza driver" do
|
2
|
+
let(:constant){
|
3
|
+
name = described_class.name.split("::").last
|
4
|
+
const_name = "Info#{name.slice(0, 1).upcase}#{name.slice(1, name.length)}"
|
5
|
+
require "#{File.dirname(__FILE__)}/../info_#{StringCases.camel_to_snake(name)}"
|
6
|
+
raise "Constant was not defined: '#{const_name}'." unless Baza.const_defined?(const_name)
|
7
|
+
Baza.const_get(const_name)
|
8
|
+
}
|
9
|
+
let(:driver){ constant.new }
|
10
|
+
let(:driver2){ constant.new }
|
11
|
+
let(:db){ driver.db }
|
12
|
+
let(:db2){ driver2.db }
|
13
|
+
let(:test_table){
|
14
|
+
db.tables.create("test", {
|
15
|
+
columns: [
|
16
|
+
{name: "id", type: :int, autoincr: true, primarykey: true},
|
17
|
+
{name: "text", type: :varchar}
|
18
|
+
]
|
19
|
+
})
|
20
|
+
db.tables[:test]
|
21
|
+
}
|
22
|
+
|
23
|
+
before do
|
24
|
+
driver.before
|
25
|
+
driver2.before
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
driver.after
|
30
|
+
driver2.after
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should do revisions" do
|
34
|
+
test_table
|
35
|
+
|
36
|
+
schema = {
|
37
|
+
tables: {
|
38
|
+
test_table: {
|
39
|
+
columns: [
|
40
|
+
{name: "id", type: :int, autoincr: true, primarykey: true},
|
41
|
+
{name: "name", type: :varchar},
|
42
|
+
{name: "age", type: :int, default: 0},
|
43
|
+
{name: "nickname", type: :varchar, default: ""}
|
44
|
+
],
|
45
|
+
indexes: [
|
46
|
+
"name"
|
47
|
+
],
|
48
|
+
rows: [
|
49
|
+
{
|
50
|
+
find_by: {"id" => 1},
|
51
|
+
data: {"id" => 1, "name" => "trala"}
|
52
|
+
}
|
53
|
+
]
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
rev = Baza::Revision.new
|
59
|
+
rev.init_db(schema: schema, debug: false, db: db)
|
60
|
+
|
61
|
+
test_table = db.tables[:test_table]
|
62
|
+
test_table.columns.keys.should include :age
|
63
|
+
test_table.columns.keys.should include :nickname
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should do id-queries" do
|
67
|
+
test_table
|
68
|
+
|
69
|
+
rows_count = 1250
|
70
|
+
db.transaction do
|
71
|
+
0.upto(rows_count) do |count|
|
72
|
+
db.insert(:test, text: "User #{count}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
block_ran = 0
|
77
|
+
idq = Baza::Idquery.new(db: db, debug: false, table: :test, query: "SELECT id FROM test") do |data|
|
78
|
+
block_ran += 1
|
79
|
+
end
|
80
|
+
|
81
|
+
raise "Block with should have ran too little: #{block_ran}." if block_ran < rows_count
|
82
|
+
|
83
|
+
block_ran = 0
|
84
|
+
db.select(:test, {}, idquery: true) do |data|
|
85
|
+
block_ran += 1
|
86
|
+
end
|
87
|
+
|
88
|
+
raise "Block with should have ran too little: #{block_ran}." if block_ran < rows_count
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should do upserting" do
|
92
|
+
test_table.create_columns([{name: "nickname", type: :varchar}])
|
93
|
+
|
94
|
+
#Test upserting.
|
95
|
+
data = {text: "upsert - Kasper Johansen"}
|
96
|
+
data2 = {text: "upsert - Kasper Nielsen Johansen"}
|
97
|
+
sel = {nickname: "upsert - kaspernj"}
|
98
|
+
|
99
|
+
table = db.tables[:test]
|
100
|
+
table.reload
|
101
|
+
rows_count = table.rows_count
|
102
|
+
|
103
|
+
db.upsert(:test, data, sel)
|
104
|
+
row = db.select(:test, sel).fetch
|
105
|
+
row[:text].should eq "upsert - Kasper Johansen"
|
106
|
+
|
107
|
+
table.reload
|
108
|
+
table.rows_count.should eql(rows_count + 1)
|
109
|
+
|
110
|
+
db.upsert(:test, data2, sel)
|
111
|
+
row = db.select(:test, sel).fetch
|
112
|
+
row[:text].should eq "upsert - Kasper Nielsen Johansen"
|
113
|
+
|
114
|
+
table.reload
|
115
|
+
table.rows_count.should eq rows_count + 1
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should dump as SQL" do
|
119
|
+
dump = Baza::Dump.new(db: db, debug: false)
|
120
|
+
str_io = StringIO.new
|
121
|
+
dump.dump(str_io)
|
122
|
+
str_io.rewind
|
123
|
+
|
124
|
+
#Remember some numbers for validation.
|
125
|
+
tables_count = db.tables.list.length
|
126
|
+
|
127
|
+
#Remove everything in the db.
|
128
|
+
db.tables.list do |table|
|
129
|
+
table.drop unless table.native?
|
130
|
+
end
|
131
|
+
|
132
|
+
#Run the exported SQL.
|
133
|
+
db.transaction do
|
134
|
+
str_io.each_line do |sql|
|
135
|
+
db.q(sql)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
#Vaildate import.
|
140
|
+
raise "Not same amount of tables: #{tables_count}, #{db.tables.list.length}" if tables_count != db.tables.list.length
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should rename tables in revisions" do
|
144
|
+
test_table
|
145
|
+
|
146
|
+
Baza::Revision.new.init_db(db: db, debug: false, schema: {
|
147
|
+
tables: {
|
148
|
+
new_test_table: {
|
149
|
+
renames: [:test]
|
150
|
+
}
|
151
|
+
}
|
152
|
+
})
|
153
|
+
tables = db.tables.list
|
154
|
+
raise "Didnt expect table 'test' to exist but it did." if tables.key?(:test)
|
155
|
+
raise "Expected 'new_test_table' to exist but it didnt." if !tables.key?(:new_test_table)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should rename columns in revisions" do
|
159
|
+
test_table
|
160
|
+
|
161
|
+
Baza::Revision.new.init_db(db: db, debug: false, schema: {
|
162
|
+
tables: {
|
163
|
+
new_test_table: {
|
164
|
+
columns: [
|
165
|
+
{name: :new_name, type: :varchar, renames: [:text]}
|
166
|
+
]
|
167
|
+
}
|
168
|
+
}
|
169
|
+
})
|
170
|
+
columns = db.tables[:new_test_table].columns
|
171
|
+
raise "Didnt expect 'text' to exist but it did." if columns.key?(:text)
|
172
|
+
raise "Expected 'new_name'-column to exist but it didnt." unless columns.key?(:new_name)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should generate proper sql" do
|
176
|
+
time = Time.new(1985, 6, 17, 10, 30)
|
177
|
+
db.insert(:test, {:date => time}, :return_sql => true).should eql("INSERT INTO `test` (`date`) VALUES ('1985-06-17 10:30:00')")
|
178
|
+
|
179
|
+
date = Date.new(1985, 6, 17)
|
180
|
+
db.insert(:test, {:date => date}, :return_sql => true).should eql("INSERT INTO `test` (`date`) VALUES ('1985-06-17')")
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should be able to make new connections based on given objects" do
|
184
|
+
new_db = Baza::Db.from_object(:object => db.conn.conn)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should be able to do ID-queries through the select-method" do
|
188
|
+
db.tables.create(:test_table, {
|
189
|
+
:columns => [
|
190
|
+
{:name => :idrow, :type => :int, :autoincr => true, :primarykey => true},
|
191
|
+
{:name => :name, :type => :varchar}
|
192
|
+
]
|
193
|
+
})
|
194
|
+
|
195
|
+
count = 0
|
196
|
+
100.times do
|
197
|
+
arr = []
|
198
|
+
100.times do
|
199
|
+
count += 1
|
200
|
+
arr << {name: "Kasper #{count}"}
|
201
|
+
end
|
202
|
+
|
203
|
+
db.insert_multi(:test_table, arr)
|
204
|
+
end
|
205
|
+
|
206
|
+
count_found = 0
|
207
|
+
db.select(:test_table, nil, :idquery => :idrow) do |row|
|
208
|
+
count_found += 1
|
209
|
+
|
210
|
+
row[:name].should eq "Kasper #{count_found}"
|
211
|
+
end
|
212
|
+
|
213
|
+
count_found.should eq 10000
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should be able to use query buffers" do
|
217
|
+
db.tables.create(:test_table, {
|
218
|
+
:columns => [
|
219
|
+
{:name => :id, :type => :int, :autoincr => true, :primarykey => true},
|
220
|
+
{:name => :name, :type => :varchar}
|
221
|
+
]
|
222
|
+
})
|
223
|
+
|
224
|
+
upsert = false
|
225
|
+
db.q_buffer do |buffer|
|
226
|
+
2500.times do |count|
|
227
|
+
if upsert
|
228
|
+
buffer.upsert(:test_table, {:name => "Kasper #{count}"}, {:name => "Kasper #{count}"})
|
229
|
+
upsert = false
|
230
|
+
else
|
231
|
+
buffer.insert(:test_table, {:name => "Kasper #{count}"})
|
232
|
+
upsert = true
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
test_table = db.tables[:test_table]
|
238
|
+
test_table.rows_count.should eql(2500)
|
239
|
+
|
240
|
+
db.q_buffer do |buffer|
|
241
|
+
count = 0
|
242
|
+
upsert = false
|
243
|
+
|
244
|
+
db.select(:test_table, {}, :orderby => :id) do |row|
|
245
|
+
row[:name].should eql("Kasper #{count}")
|
246
|
+
|
247
|
+
if upsert
|
248
|
+
buffer.upsert(:test_table, {name: "Kasper #{count}-#{count}"}, {id: row[:id]})
|
249
|
+
upsert = false
|
250
|
+
else
|
251
|
+
buffer.update(:test_table, {name: "Kasper #{count}-#{count}"}, {id: row[:id]})
|
252
|
+
upsert = true
|
253
|
+
end
|
254
|
+
|
255
|
+
count += 1
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
count = 0
|
260
|
+
db.select(:test_table, {}, :orderby => :id) do |row|
|
261
|
+
row[:name].should eq "Kasper #{count}-#{count}"
|
262
|
+
count += 1
|
263
|
+
end
|
264
|
+
|
265
|
+
#Test the flush-async which flushes transactions in a thread asyncronous.
|
266
|
+
db.q_buffer(:flush_async => true) do |buffer|
|
267
|
+
count = 0
|
268
|
+
db.select(:test_table) do |row|
|
269
|
+
count += 1
|
270
|
+
|
271
|
+
if count == 1000
|
272
|
+
time_start = Time.now.to_f
|
273
|
+
end
|
274
|
+
|
275
|
+
buffer.delete(:test_table, {:id => row[:id]})
|
276
|
+
|
277
|
+
if count == 1000
|
278
|
+
time_end = Time.now.to_f
|
279
|
+
|
280
|
+
time_spent = time_end - time_start
|
281
|
+
raise "Too much time spent: '#{time_spent}'." if time_spent > 0.01
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
test_table.rows_count.should eql(0)
|
287
|
+
end
|
288
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
shared_examples_for "a baza columns driver" do
|
2
|
+
let(:constant){
|
3
|
+
name = described_class.name.split("::").last
|
4
|
+
const_name = "Info#{name.slice(0, 1).upcase}#{name.slice(1, name.length)}"
|
5
|
+
require "#{File.dirname(__FILE__)}/../info_#{StringCases.camel_to_snake(name)}"
|
6
|
+
raise "Constant was not defined: '#{const_name}'." unless Baza.const_defined?(const_name)
|
7
|
+
Baza.const_get(const_name)
|
8
|
+
}
|
9
|
+
let(:driver){ constant.new }
|
10
|
+
let(:db){ driver.db }
|
11
|
+
let(:test_table){
|
12
|
+
db.tables.create("test", {
|
13
|
+
columns: [
|
14
|
+
{name: "id", type: :int, autoincr: true, primarykey: true},
|
15
|
+
{name: "text", type: :varchar}
|
16
|
+
]
|
17
|
+
})
|
18
|
+
db.tables[:test]
|
19
|
+
}
|
20
|
+
|
21
|
+
before do
|
22
|
+
driver.before
|
23
|
+
end
|
24
|
+
|
25
|
+
after do
|
26
|
+
driver.after
|
27
|
+
end
|
28
|
+
|
29
|
+
it "renames columns for renamed tables" do
|
30
|
+
# Load up columns to make them set table-name.
|
31
|
+
test_table.columns.each do |name, column|
|
32
|
+
end
|
33
|
+
|
34
|
+
test_table.rename("test2")
|
35
|
+
test_table.columns[:text].change(name: "text2")
|
36
|
+
|
37
|
+
table = db.tables[:test2]
|
38
|
+
column = table.columns[:text2]
|
39
|
+
column.table.name.should eq :test2
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should create columns right" do
|
43
|
+
col_id = test_table.column(:id)
|
44
|
+
col_id.type.should eq :int
|
45
|
+
|
46
|
+
col_text = test_table.column(:text)
|
47
|
+
col_text.type.should eq :varchar
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
shared_examples_for "a baza indexes driver" do
|
2
|
+
let(:constant){
|
3
|
+
name = described_class.name.split("::").last
|
4
|
+
const_name = "Info#{name.slice(0, 1).upcase}#{name.slice(1, name.length)}"
|
5
|
+
require "#{File.dirname(__FILE__)}/../info_#{StringCases.camel_to_snake(name)}"
|
6
|
+
raise "Constant was not defined: '#{const_name}'." unless Baza.const_defined?(const_name)
|
7
|
+
Baza.const_get(const_name)
|
8
|
+
}
|
9
|
+
let(:driver){ constant.new }
|
10
|
+
let(:db){ driver.db }
|
11
|
+
let(:test_table){
|
12
|
+
db.tables.create("test", {
|
13
|
+
columns: [
|
14
|
+
{name: "id", type: :int, autoincr: true, primarykey: true},
|
15
|
+
{name: "text", type: :varchar}
|
16
|
+
]
|
17
|
+
})
|
18
|
+
db.tables[:test]
|
19
|
+
}
|
20
|
+
|
21
|
+
before do
|
22
|
+
driver.before
|
23
|
+
end
|
24
|
+
|
25
|
+
after do
|
26
|
+
driver.after
|
27
|
+
end
|
28
|
+
|
29
|
+
it "renames indexes for renamed tables" do
|
30
|
+
# Load up columns to make them set table-name.
|
31
|
+
test_table.indexes.each do |name, index|
|
32
|
+
end
|
33
|
+
|
34
|
+
test_table.create_indexes([{name: "index_on_text", columns: [:text]}])
|
35
|
+
test_table.rename("test2")
|
36
|
+
|
37
|
+
test_table.index("index_on_text").rename("index_on_text2")
|
38
|
+
|
39
|
+
table = db.tables[:test2]
|
40
|
+
index = table.index(:index_on_text2)
|
41
|
+
index.table.name.should eq :test2
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should raise an error when index is not found" do
|
45
|
+
expect {
|
46
|
+
test_table.index("index_that_doesnt_exist")
|
47
|
+
}.to raise_error(Errno::ENOENT)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
shared_examples_for "a baza tables driver" do
|
2
|
+
let(:constant){
|
3
|
+
name = described_class.name.split("::").last
|
4
|
+
const_name = "Info#{name.slice(0, 1).upcase}#{name.slice(1, name.length)}"
|
5
|
+
require "#{File.dirname(__FILE__)}/../info_#{StringCases.camel_to_snake(name)}"
|
6
|
+
raise "Constant was not defined: '#{const_name}'." unless Baza.const_defined?(const_name)
|
7
|
+
Baza.const_get(const_name)
|
8
|
+
}
|
9
|
+
let(:driver){ constant.new }
|
10
|
+
let(:driver2){ constant.new }
|
11
|
+
let(:db){ driver.db }
|
12
|
+
let(:db2){ driver2.db }
|
13
|
+
let(:test_table){
|
14
|
+
db.tables.create("test", {
|
15
|
+
columns: [
|
16
|
+
{name: "id", type: :int, autoincr: true, primarykey: true},
|
17
|
+
{name: "text", type: :varchar}
|
18
|
+
]
|
19
|
+
})
|
20
|
+
db.tables[:test]
|
21
|
+
}
|
22
|
+
|
23
|
+
before do
|
24
|
+
driver.before
|
25
|
+
end
|
26
|
+
|
27
|
+
after do
|
28
|
+
driver.after
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should create tables" do
|
32
|
+
test_table.name.should eq :test
|
33
|
+
db.tables[:test].should_not eq nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should list tables" do
|
37
|
+
test_table
|
38
|
+
db.tables.list.values.should include test_table
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should optimize tables" do
|
42
|
+
test_table.optimize
|
43
|
+
# FIXME: How to validate?
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should truncate tables" do
|
47
|
+
test_table
|
48
|
+
|
49
|
+
db.insert(:test, text: "test")
|
50
|
+
test_table.rows_count.should eq 1
|
51
|
+
|
52
|
+
# Throw out invalid encoding because it will make dumping fail.
|
53
|
+
db.tables[:test].truncate
|
54
|
+
test_table.rows_count.should eq 0
|
55
|
+
end
|
56
|
+
|
57
|
+
it "#clone" do
|
58
|
+
test_table
|
59
|
+
test_table.create_indexes([{name: "index_on_text", columns: ["text"]}])
|
60
|
+
test_table.indexes.length.should eq 1
|
61
|
+
|
62
|
+
test_table.insert(text: "test1")
|
63
|
+
test_table.insert(text: "test2")
|
64
|
+
|
65
|
+
test_table.clone("test2")
|
66
|
+
test_table2 = db.tables[:test2]
|
67
|
+
|
68
|
+
test_table2.columns.length.should eq test_table.columns.length
|
69
|
+
test_table2.indexes.length.should eq test_table.indexes.length
|
70
|
+
test_table2.rows_count.should eq test_table.rows_count
|
71
|
+
test_table2.rows_count.should eq 2
|
72
|
+
end
|
73
|
+
end
|