extralite 0.2.1 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +1 -1
- data/ext/extralite/extralite.c +37 -31
- data/lib/extralite/version.rb +1 -1
- data/test/test_database.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8063960fd539fc0384882cf017572baefe79b9e29591d03c790951c6fad4fac0
|
4
|
+
data.tar.gz: 9f1c5be233721502dd0b97ffef2d195912ec029eccee977b16ca67b567299f04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b674b89217ff2231d7c48f7d93917c29e84bbcb8b240216854a87b85d0c4ca5588fe821d0e6db406df04adc5c0b29aca4e24335349084e45a7d98449119a981f
|
7
|
+
data.tar.gz: 3f33b7ef708052e51033e2ca38f2323c8b78f95eecda2c328fba506762831e260ae03a66ff5944e4b961b22906aa42740ebdeaad1ff233f1141daded682a6d47
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/ext/extralite/extralite.c
CHANGED
@@ -123,6 +123,32 @@ static inline VALUE row_to_hash(sqlite3_stmt *stmt, int column_count, VALUE colu
|
|
123
123
|
return row;
|
124
124
|
}
|
125
125
|
|
126
|
+
inline void prepare_multi_stmt(sqlite3 *db, sqlite3_stmt **stmt, VALUE sql) {
|
127
|
+
const char *rest = 0;
|
128
|
+
const char *ptr = RSTRING_PTR(sql);
|
129
|
+
const char *end = ptr + RSTRING_LEN(sql);
|
130
|
+
while (1) {
|
131
|
+
int rc = sqlite3_prepare(db, ptr, end - ptr, stmt, &rest);
|
132
|
+
if (rc) {
|
133
|
+
sqlite3_finalize(*stmt);
|
134
|
+
rb_raise(cError, "%s", sqlite3_errmsg(db));
|
135
|
+
}
|
136
|
+
|
137
|
+
if (rest == end) return;
|
138
|
+
|
139
|
+
// perform current query, but discard its results
|
140
|
+
rc = sqlite3_step(*stmt);
|
141
|
+
sqlite3_finalize(*stmt);
|
142
|
+
switch (rc) {
|
143
|
+
case SQLITE_BUSY:
|
144
|
+
rb_raise(cError, "Database is busy");
|
145
|
+
case SQLITE_ERROR:
|
146
|
+
rb_raise(cError, "%s", sqlite3_errmsg(db));
|
147
|
+
}
|
148
|
+
ptr = rest;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
126
152
|
VALUE Database_query_hash(int argc, VALUE *argv, VALUE self) {
|
127
153
|
int rc;
|
128
154
|
sqlite3_stmt* stmt;
|
@@ -138,13 +164,7 @@ VALUE Database_query_hash(int argc, VALUE *argv, VALUE self) {
|
|
138
164
|
sql = argv[0];
|
139
165
|
GetDatabase(self, db);
|
140
166
|
|
141
|
-
|
142
|
-
if (rc) {
|
143
|
-
sqlite3_finalize(stmt);
|
144
|
-
rb_raise(cError, "%s", sqlite3_errmsg(db->sqlite3_db));
|
145
|
-
return Qnil;
|
146
|
-
}
|
147
|
-
|
167
|
+
prepare_multi_stmt(db->sqlite3_db, &stmt, sql);
|
148
168
|
bind_all_parameters(stmt, argc, argv);
|
149
169
|
column_count = sqlite3_column_count(stmt);
|
150
170
|
column_names = get_column_names(stmt, column_count);
|
@@ -202,14 +222,7 @@ VALUE Database_query_ary(int argc, VALUE *argv, VALUE self) {
|
|
202
222
|
sql = argv[0];
|
203
223
|
GetDatabase(self, db);
|
204
224
|
|
205
|
-
|
206
|
-
if (rc) {
|
207
|
-
fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db->sqlite3_db));
|
208
|
-
sqlite3_finalize(stmt);
|
209
|
-
// TODO: raise error
|
210
|
-
return Qfalse;
|
211
|
-
}
|
212
|
-
|
225
|
+
prepare_multi_stmt(db->sqlite3_db, &stmt, sql);
|
213
226
|
bind_all_parameters(stmt, argc, argv);
|
214
227
|
column_count = sqlite3_column_count(stmt);
|
215
228
|
|
@@ -225,10 +238,13 @@ step:
|
|
225
238
|
case SQLITE_DONE:
|
226
239
|
break;
|
227
240
|
case SQLITE_BUSY:
|
241
|
+
sqlite3_finalize(stmt);
|
228
242
|
rb_raise(cError, "Database is busy");
|
229
243
|
case SQLITE_ERROR:
|
244
|
+
sqlite3_finalize(stmt);
|
230
245
|
rb_raise(cError, "%s", sqlite3_errmsg(db->sqlite3_db));
|
231
246
|
default:
|
247
|
+
sqlite3_finalize(stmt);
|
232
248
|
rb_raise(cError, "Invalid return code for sqlite3_step: %d", rc);
|
233
249
|
}
|
234
250
|
sqlite3_finalize(stmt);
|
@@ -251,14 +267,7 @@ VALUE Database_query_single_column(int argc, VALUE *argv, VALUE self) {
|
|
251
267
|
sql = argv[0];
|
252
268
|
GetDatabase(self, db);
|
253
269
|
|
254
|
-
|
255
|
-
if (rc) {
|
256
|
-
fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db->sqlite3_db));
|
257
|
-
sqlite3_finalize(stmt);
|
258
|
-
// TODO: raise error
|
259
|
-
return Qfalse;
|
260
|
-
}
|
261
|
-
|
270
|
+
prepare_multi_stmt(db->sqlite3_db, &stmt, sql);
|
262
271
|
bind_all_parameters(stmt, argc, argv);
|
263
272
|
column_count = sqlite3_column_count(stmt);
|
264
273
|
if (column_count != 1)
|
@@ -268,6 +277,7 @@ VALUE Database_query_single_column(int argc, VALUE *argv, VALUE self) {
|
|
268
277
|
if (!yield_to_block) result = rb_ary_new();
|
269
278
|
step:
|
270
279
|
rc = sqlite3_step(stmt);
|
280
|
+
printf("rc=%d\n", rc);
|
271
281
|
switch (rc) {
|
272
282
|
case SQLITE_ROW:
|
273
283
|
value = get_column_value(stmt, 0, sqlite3_column_type(stmt, 0));
|
@@ -276,10 +286,13 @@ step:
|
|
276
286
|
case SQLITE_DONE:
|
277
287
|
break;
|
278
288
|
case SQLITE_BUSY:
|
289
|
+
sqlite3_finalize(stmt);
|
279
290
|
rb_raise(cError, "Database is busy");
|
280
291
|
case SQLITE_ERROR:
|
292
|
+
sqlite3_finalize(stmt);
|
281
293
|
rb_raise(cError, "%s", sqlite3_errmsg(db->sqlite3_db));
|
282
294
|
default:
|
295
|
+
sqlite3_finalize(stmt);
|
283
296
|
rb_raise(cError, "Invalid return code for sqlite3_step: %d", rc);
|
284
297
|
}
|
285
298
|
|
@@ -301,14 +314,7 @@ VALUE Database_query_single_value(int argc, VALUE *argv, VALUE self) {
|
|
301
314
|
sql = argv[0];
|
302
315
|
GetDatabase(self, db);
|
303
316
|
|
304
|
-
|
305
|
-
if (rc) {
|
306
|
-
fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db->sqlite3_db));
|
307
|
-
sqlite3_finalize(stmt);
|
308
|
-
// TODO: raise error
|
309
|
-
return Qfalse;
|
310
|
-
}
|
311
|
-
|
317
|
+
prepare_multi_stmt(db->sqlite3_db, &stmt, sql);
|
312
318
|
bind_all_parameters(stmt, argc, argv);
|
313
319
|
column_count = sqlite3_column_count(stmt);
|
314
320
|
if (column_count != 1)
|
data/lib/extralite/version.rb
CHANGED
data/test/test_database.rb
CHANGED
@@ -48,4 +48,10 @@ class DatabaseTest < MiniTest::Test
|
|
48
48
|
@db.query('rollback')
|
49
49
|
assert_equal false, @db.transaction_active?
|
50
50
|
end
|
51
|
+
|
52
|
+
def test_multiple_statements
|
53
|
+
@db.query("insert into t values ('a', 'b', 'c'); insert into t values ('d', 'e', 'f');")
|
54
|
+
|
55
|
+
assert_equal [1, 4, 'a', 'd'], @db.query_single_column('select x from t order by x')
|
56
|
+
end
|
51
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extralite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|