sqlite3 1.3.13 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gemtest +0 -0
- data/.travis.yml +33 -0
- data/CHANGELOG.rdoc +27 -1
- data/Gemfile +6 -4
- data/Manifest.txt +12 -4
- data/README.rdoc +1 -1
- data/Rakefile +0 -2
- data/appveyor.yml +36 -0
- data/ext/sqlite3/aggregator.c +273 -0
- data/ext/sqlite3/aggregator.h +12 -0
- data/ext/sqlite3/database.c +140 -201
- data/ext/sqlite3/database.h +2 -0
- data/ext/sqlite3/exception.c +6 -2
- data/ext/sqlite3/extconf.rb +39 -10
- data/ext/sqlite3/sqlite3.c +10 -1
- data/ext/sqlite3/sqlite3_ruby.h +0 -7
- data/ext/sqlite3/statement.c +13 -18
- data/lib/sqlite3/constants.rb +1 -0
- data/lib/sqlite3/database.rb +196 -51
- data/lib/sqlite3/errors.rb +1 -10
- data/lib/sqlite3/pragmas.rb +7 -7
- data/lib/sqlite3/resultset.rb +2 -10
- data/lib/sqlite3/version.rb +3 -3
- data/{tasks → rakelib}/faq.rake +0 -0
- data/{tasks → rakelib}/gem.rake +6 -4
- data/{tasks → rakelib}/native.rake +4 -0
- data/{tasks → rakelib}/vendor_sqlite3.rake +0 -0
- data/test/test_database.rb +79 -6
- data/test/test_database_flags.rb +95 -0
- data/test/test_database_readwrite.rb +41 -0
- data/test/test_integration.rb +12 -81
- data/test/test_integration_aggregate.rb +336 -0
- data/test/test_integration_resultset.rb +0 -17
- data/test/test_statement.rb +11 -8
- metadata +56 -27
data/ext/sqlite3/statement.c
CHANGED
@@ -43,11 +43,9 @@ static VALUE initialize(VALUE self, VALUE db, VALUE sql)
|
|
43
43
|
if(!db_ctx->db)
|
44
44
|
rb_raise(rb_eArgError, "prepare called on a closed database");
|
45
45
|
|
46
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
47
46
|
if(!UTF8_P(sql)) {
|
48
47
|
sql = rb_str_export_to_enc(sql, rb_utf8_encoding());
|
49
48
|
}
|
50
|
-
#endif
|
51
49
|
|
52
50
|
#ifdef HAVE_SQLITE3_PREPARE_V2
|
53
51
|
status = sqlite3_prepare_v2(
|
@@ -110,9 +108,7 @@ static VALUE step(VALUE self)
|
|
110
108
|
sqlite3_stmt *stmt;
|
111
109
|
int value, length;
|
112
110
|
VALUE list;
|
113
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
114
111
|
rb_encoding * internal_encoding;
|
115
|
-
#endif
|
116
112
|
|
117
113
|
Data_Get_Struct(self, sqlite3StmtRuby, ctx);
|
118
114
|
|
@@ -120,17 +116,24 @@ static VALUE step(VALUE self)
|
|
120
116
|
|
121
117
|
if(ctx->done_p) return Qnil;
|
122
118
|
|
123
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
124
119
|
{
|
125
120
|
VALUE db = rb_iv_get(self, "@connection");
|
126
121
|
rb_funcall(db, rb_intern("encoding"), 0);
|
127
122
|
internal_encoding = rb_default_internal_encoding();
|
128
123
|
}
|
129
|
-
#endif
|
130
124
|
|
131
125
|
stmt = ctx->st;
|
132
126
|
|
133
127
|
value = sqlite3_step(stmt);
|
128
|
+
if (rb_errinfo() != Qnil) {
|
129
|
+
/* some user defined function was invoked as a callback during step and
|
130
|
+
* it raised an exception that has been suppressed until step returns.
|
131
|
+
* Now re-raise it. */
|
132
|
+
VALUE exception = rb_errinfo();
|
133
|
+
rb_set_errinfo(Qnil);
|
134
|
+
rb_exc_raise(exception);
|
135
|
+
}
|
136
|
+
|
134
137
|
length = sqlite3_column_count(stmt);
|
135
138
|
list = rb_ary_new2((long)length);
|
136
139
|
|
@@ -148,21 +151,19 @@ static VALUE step(VALUE self)
|
|
148
151
|
break;
|
149
152
|
case SQLITE_TEXT:
|
150
153
|
{
|
151
|
-
VALUE str =
|
154
|
+
VALUE str = rb_str_new(
|
152
155
|
(const char *)sqlite3_column_text(stmt, i),
|
153
156
|
(long)sqlite3_column_bytes(stmt, i)
|
154
157
|
);
|
155
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
156
158
|
rb_enc_associate_index(str, rb_utf8_encindex());
|
157
159
|
if(internal_encoding)
|
158
160
|
str = rb_str_export_to_enc(str, internal_encoding);
|
159
|
-
#endif
|
160
161
|
rb_ary_push(list, str);
|
161
162
|
}
|
162
163
|
break;
|
163
164
|
case SQLITE_BLOB:
|
164
165
|
{
|
165
|
-
VALUE str =
|
166
|
+
VALUE str = rb_str_new(
|
166
167
|
(const char *)sqlite3_column_blob(stmt, i),
|
167
168
|
(long)sqlite3_column_bytes(stmt, i)
|
168
169
|
);
|
@@ -225,9 +226,7 @@ static VALUE bind_param(VALUE self, VALUE key, VALUE value)
|
|
225
226
|
switch(TYPE(value)) {
|
226
227
|
case T_STRING:
|
227
228
|
if(CLASS_OF(value) == cSqlite3Blob
|
228
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
229
229
|
|| rb_enc_get_index(value) == rb_ascii8bit_encindex()
|
230
|
-
#endif
|
231
230
|
) {
|
232
231
|
status = sqlite3_bind_blob(
|
233
232
|
ctx->st,
|
@@ -239,7 +238,6 @@ static VALUE bind_param(VALUE self, VALUE key, VALUE value)
|
|
239
238
|
} else {
|
240
239
|
|
241
240
|
|
242
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
243
241
|
if (UTF16_LE_P(value) || UTF16_BE_P(value)) {
|
244
242
|
status = sqlite3_bind_text16(
|
245
243
|
ctx->st,
|
@@ -252,7 +250,6 @@ static VALUE bind_param(VALUE self, VALUE key, VALUE value)
|
|
252
250
|
if (!UTF8_P(value) || !USASCII_P(value)) {
|
253
251
|
value = rb_str_encode(value, rb_enc_from_encoding(rb_utf8_encoding()), 0, Qnil);
|
254
252
|
}
|
255
|
-
#endif
|
256
253
|
status = sqlite3_bind_text(
|
257
254
|
ctx->st,
|
258
255
|
index,
|
@@ -260,9 +257,7 @@ static VALUE bind_param(VALUE self, VALUE key, VALUE value)
|
|
260
257
|
(int)RSTRING_LEN(value),
|
261
258
|
SQLITE_TRANSIENT
|
262
259
|
);
|
263
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
264
260
|
}
|
265
|
-
#endif
|
266
261
|
}
|
267
262
|
break;
|
268
263
|
case T_BIGNUM: {
|
@@ -316,7 +311,7 @@ static VALUE reset_bang(VALUE self)
|
|
316
311
|
* Resets the statement. This is typically done internally, though it might
|
317
312
|
* occassionally be necessary to manually reset the statement.
|
318
313
|
*/
|
319
|
-
static VALUE
|
314
|
+
static VALUE clear_bindings_bang(VALUE self)
|
320
315
|
{
|
321
316
|
sqlite3StmtRubyPtr ctx;
|
322
317
|
|
@@ -433,7 +428,7 @@ void init_sqlite3_statement()
|
|
433
428
|
rb_define_method(cSqlite3Statement, "closed?", closed_p, 0);
|
434
429
|
rb_define_method(cSqlite3Statement, "bind_param", bind_param, 2);
|
435
430
|
rb_define_method(cSqlite3Statement, "reset!", reset_bang, 0);
|
436
|
-
rb_define_method(cSqlite3Statement, "clear_bindings!",
|
431
|
+
rb_define_method(cSqlite3Statement, "clear_bindings!", clear_bindings_bang, 0);
|
437
432
|
rb_define_method(cSqlite3Statement, "step", step, 0);
|
438
433
|
rb_define_method(cSqlite3Statement, "done?", done_p, 0);
|
439
434
|
rb_define_method(cSqlite3Statement, "column_count", column_count, 0);
|
data/lib/sqlite3/constants.rb
CHANGED
data/lib/sqlite3/database.rb
CHANGED
@@ -54,12 +54,68 @@ module SQLite3
|
|
54
54
|
# as hashes or not. By default, rows are returned as arrays.
|
55
55
|
attr_accessor :results_as_hash
|
56
56
|
|
57
|
+
# call-seq: SQLite3::Database.new(file, options = {})
|
58
|
+
#
|
59
|
+
# Create a new Database object that opens the given file. If utf16
|
60
|
+
# is +true+, the filename is interpreted as a UTF-16 encoded string.
|
61
|
+
#
|
62
|
+
# By default, the new database will return result rows as arrays
|
63
|
+
# (#results_as_hash) and has type translation disabled (#type_translation=).
|
64
|
+
|
65
|
+
def initialize file, options = {}, zvfs = nil
|
66
|
+
mode = Constants::Open::READWRITE | Constants::Open::CREATE
|
67
|
+
|
68
|
+
if file.encoding == ::Encoding::UTF_16LE || file.encoding == ::Encoding::UTF_16BE || options[:utf16]
|
69
|
+
open16 file
|
70
|
+
else
|
71
|
+
# The three primary flag values for sqlite3_open_v2 are:
|
72
|
+
# SQLITE_OPEN_READONLY
|
73
|
+
# SQLITE_OPEN_READWRITE
|
74
|
+
# SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE -- always used for sqlite3_open and sqlite3_open16
|
75
|
+
mode = Constants::Open::READONLY if options[:readonly]
|
76
|
+
|
77
|
+
if options[:readwrite]
|
78
|
+
raise "conflicting options: readonly and readwrite" if options[:readonly]
|
79
|
+
mode = Constants::Open::READWRITE
|
80
|
+
end
|
81
|
+
|
82
|
+
if options[:flags]
|
83
|
+
if options[:readonly] || options[:readwrite]
|
84
|
+
raise "conflicting options: flags with readonly and/or readwrite"
|
85
|
+
end
|
86
|
+
mode = options[:flags]
|
87
|
+
end
|
88
|
+
|
89
|
+
open_v2 file.encode("utf-8"), mode, zvfs
|
90
|
+
end
|
91
|
+
|
92
|
+
@tracefunc = nil
|
93
|
+
@authorizer = nil
|
94
|
+
@encoding = nil
|
95
|
+
@busy_handler = nil
|
96
|
+
@collations = {}
|
97
|
+
@functions = {}
|
98
|
+
@results_as_hash = options[:results_as_hash]
|
99
|
+
@type_translation = options[:type_translation]
|
100
|
+
@type_translator = make_type_translator @type_translation
|
101
|
+
@readonly = mode & Constants::Open::READONLY != 0
|
102
|
+
|
103
|
+
if block_given?
|
104
|
+
begin
|
105
|
+
yield self
|
106
|
+
ensure
|
107
|
+
close
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
57
112
|
def type_translation= value # :nodoc:
|
58
113
|
warn(<<-eowarn) if $VERBOSE
|
59
114
|
#{caller[0]} is calling SQLite3::Database#type_translation=
|
60
115
|
SQLite3::Database#type_translation= is deprecated and will be removed
|
61
116
|
in version 2.0.0.
|
62
117
|
eowarn
|
118
|
+
@type_translator = make_type_translator value
|
63
119
|
@type_translation = value
|
64
120
|
end
|
65
121
|
attr_reader :type_translation # :nodoc:
|
@@ -136,25 +192,14 @@ Support for bind parameters as *args will be removed in 2.0.0.
|
|
136
192
|
|
137
193
|
prepare( sql ) do |stmt|
|
138
194
|
stmt.bind_params(bind_vars)
|
139
|
-
|
140
|
-
stmt = ResultSet.new(self, stmt).to_a if type_translation
|
195
|
+
stmt = ResultSet.new self, stmt
|
141
196
|
|
142
197
|
if block_given?
|
143
198
|
stmt.each do |row|
|
144
|
-
|
145
|
-
yield type_translation ? row : ordered_map_for(columns, row)
|
146
|
-
else
|
147
|
-
yield row
|
148
|
-
end
|
199
|
+
yield row
|
149
200
|
end
|
150
201
|
else
|
151
|
-
|
152
|
-
stmt.map { |row|
|
153
|
-
type_translation ? row : ordered_map_for(columns, row)
|
154
|
-
}
|
155
|
-
else
|
156
|
-
stmt.to_a
|
157
|
-
end
|
202
|
+
stmt.to_a
|
158
203
|
end
|
159
204
|
end
|
160
205
|
end
|
@@ -190,6 +235,9 @@ Support for bind parameters as *args will be removed in 2.0.0.
|
|
190
235
|
#
|
191
236
|
# This always returns +nil+, making it unsuitable for queries that return
|
192
237
|
# rows.
|
238
|
+
#
|
239
|
+
# See also #execute_batch2 for additional ways of
|
240
|
+
# executing statments.
|
193
241
|
def execute_batch( sql, bind_vars = [], *args )
|
194
242
|
# FIXME: remove this stuff later
|
195
243
|
unless [Array, Hash].include?(bind_vars.class)
|
@@ -234,6 +282,30 @@ Support for this behavior will be removed in version 2.0.0.
|
|
234
282
|
nil
|
235
283
|
end
|
236
284
|
|
285
|
+
# Executes all SQL statements in the given string. By contrast, the other
|
286
|
+
# means of executing queries will only execute the first statement in the
|
287
|
+
# string, ignoring all subsequent statements. This will execute each one
|
288
|
+
# in turn. Bind parameters cannot be passed to #execute_batch2.
|
289
|
+
#
|
290
|
+
# If a query is made, all values will be returned as strings.
|
291
|
+
# If no query is made, an empty array will be returned.
|
292
|
+
#
|
293
|
+
# Because all values except for 'NULL' are returned as strings,
|
294
|
+
# a block can be passed to parse the values accordingly.
|
295
|
+
#
|
296
|
+
# See also #execute_batch for additional ways of
|
297
|
+
# executing statments.
|
298
|
+
def execute_batch2(sql, &block)
|
299
|
+
if block_given?
|
300
|
+
result = exec_batch(sql, @results_as_hash)
|
301
|
+
result.map do |val|
|
302
|
+
yield val
|
303
|
+
end
|
304
|
+
else
|
305
|
+
exec_batch(sql, @results_as_hash)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
237
309
|
# This is a convenience method for creating a statement, binding
|
238
310
|
# paramters to it, and calling execute:
|
239
311
|
#
|
@@ -287,7 +359,11 @@ Support for this will be removed in version 2.0.0.
|
|
287
359
|
#
|
288
360
|
# See also #get_first_row.
|
289
361
|
def get_first_value( sql, *bind_vars )
|
290
|
-
|
362
|
+
query( sql, bind_vars ) do |rs|
|
363
|
+
if (row = rs.next)
|
364
|
+
return @results_as_hash ? row[rs.columns[0]] : row[0]
|
365
|
+
end
|
366
|
+
end
|
291
367
|
nil
|
292
368
|
end
|
293
369
|
|
@@ -316,8 +392,8 @@ Support for this will be removed in version 2.0.0.
|
|
316
392
|
# end
|
317
393
|
#
|
318
394
|
# puts db.get_first_value( "select maim(name) from table" )
|
319
|
-
def create_function name, arity, text_rep=Constants::TextRep::
|
320
|
-
|
395
|
+
def create_function name, arity, text_rep=Constants::TextRep::UTF8, &block
|
396
|
+
define_function_with_flags(name, text_rep) do |*args|
|
321
397
|
fp = FunctionProxy.new
|
322
398
|
block.call(fp, *args)
|
323
399
|
fp.result
|
@@ -364,42 +440,52 @@ Support for this will be removed in version 2.0.0.
|
|
364
440
|
def create_aggregate( name, arity, step=nil, finalize=nil,
|
365
441
|
text_rep=Constants::TextRep::ANY, &block )
|
366
442
|
|
367
|
-
|
443
|
+
proxy = Class.new do
|
368
444
|
def self.step( &block )
|
369
|
-
define_method(:
|
445
|
+
define_method(:step_with_ctx, &block)
|
370
446
|
end
|
371
447
|
|
372
448
|
def self.finalize( &block )
|
373
|
-
define_method(:
|
449
|
+
define_method(:finalize_with_ctx, &block)
|
374
450
|
end
|
375
451
|
end
|
376
452
|
|
377
453
|
if block_given?
|
378
|
-
|
454
|
+
proxy.instance_eval(&block)
|
379
455
|
else
|
380
|
-
|
381
|
-
define_method(:
|
382
|
-
define_method(:
|
456
|
+
proxy.class_eval do
|
457
|
+
define_method(:step_with_ctx, step)
|
458
|
+
define_method(:finalize_with_ctx, finalize)
|
383
459
|
end
|
384
460
|
end
|
385
461
|
|
386
|
-
proxy
|
387
|
-
|
388
|
-
|
462
|
+
proxy.class_eval do
|
463
|
+
# class instance variables
|
464
|
+
@name = name
|
465
|
+
@arity = arity
|
466
|
+
|
467
|
+
def self.name
|
468
|
+
@name
|
469
|
+
end
|
470
|
+
|
471
|
+
def self.arity
|
472
|
+
@arity
|
473
|
+
end
|
474
|
+
|
475
|
+
def initialize
|
476
|
+
@ctx = FunctionProxy.new
|
477
|
+
end
|
389
478
|
|
390
479
|
def step( *args )
|
391
|
-
|
480
|
+
step_with_ctx(@ctx, *args)
|
392
481
|
end
|
393
482
|
|
394
483
|
def finalize
|
395
|
-
|
396
|
-
|
397
|
-
@ctx = FunctionProxy.new
|
398
|
-
result
|
484
|
+
finalize_with_ctx(@ctx)
|
485
|
+
@ctx.result
|
399
486
|
end
|
400
|
-
|
401
|
-
proxy
|
402
|
-
define_aggregator(name, proxy)
|
487
|
+
end
|
488
|
+
define_aggregator2(proxy, name)
|
403
489
|
end
|
404
490
|
|
405
491
|
# This is another approach to creating an aggregate function (see
|
@@ -450,29 +536,75 @@ Support for this will be removed in version 2.0.0.
|
|
450
536
|
# db.create_aggregate_handler( LengthsAggregateHandler )
|
451
537
|
# puts db.get_first_value( "select lengths(name) from A" )
|
452
538
|
def create_aggregate_handler( handler )
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
539
|
+
# This is a compatiblity shim so the (basically pointless) FunctionProxy
|
540
|
+
# "ctx" object is passed as first argument to both step() and finalize().
|
541
|
+
# Now its up to the library user whether he prefers to store his
|
542
|
+
# temporaries as instance varibales or fields in the FunctionProxy.
|
543
|
+
# The library user still must set the result value with
|
544
|
+
# FunctionProxy.result= as there is no backwards compatible way to
|
545
|
+
# change this.
|
546
|
+
proxy = Class.new(handler) do
|
547
|
+
def initialize
|
548
|
+
super
|
549
|
+
@fp = FunctionProxy.new
|
457
550
|
end
|
458
551
|
|
459
552
|
def step( *args )
|
460
|
-
|
553
|
+
super(@fp, *args)
|
461
554
|
end
|
462
555
|
|
463
556
|
def finalize
|
464
|
-
|
465
|
-
@instance = nil
|
557
|
+
super(@fp)
|
466
558
|
@fp.result
|
467
559
|
end
|
560
|
+
end
|
561
|
+
define_aggregator2(proxy, proxy.name)
|
562
|
+
self
|
563
|
+
end
|
468
564
|
|
469
|
-
|
565
|
+
# Define an aggregate function named +name+ using a object template
|
566
|
+
# object +aggregator+. +aggregator+ must respond to +step+ and +finalize+.
|
567
|
+
# +step+ will be called with row information and +finalize+ must return the
|
568
|
+
# return value for the aggregator function.
|
569
|
+
#
|
570
|
+
# _API Change:_ +aggregator+ must also implement +clone+. The provided
|
571
|
+
# +aggregator+ object will serve as template that is cloned to provide the
|
572
|
+
# individual instances of the aggregate function. Regular ruby objects
|
573
|
+
# already provide a suitable +clone+.
|
574
|
+
# The functions arity is the arity of the +step+ method.
|
575
|
+
def define_aggregator( name, aggregator )
|
576
|
+
# Previously, this has been implemented in C. Now this is just yet
|
577
|
+
# another compatiblity shim
|
578
|
+
proxy = Class.new do
|
579
|
+
@template = aggregator
|
580
|
+
@name = name
|
470
581
|
|
471
|
-
def
|
472
|
-
@
|
582
|
+
def self.template
|
583
|
+
@template
|
584
|
+
end
|
585
|
+
|
586
|
+
def self.name
|
587
|
+
@name
|
588
|
+
end
|
589
|
+
|
590
|
+
def self.arity
|
591
|
+
# this is what sqlite3_obj_method_arity did before
|
592
|
+
@template.method(:step).arity
|
593
|
+
end
|
594
|
+
|
595
|
+
def initialize
|
596
|
+
@klass = self.class.template.clone
|
597
|
+
end
|
598
|
+
|
599
|
+
def step(*args)
|
600
|
+
@klass.step(*args)
|
601
|
+
end
|
602
|
+
|
603
|
+
def finalize
|
604
|
+
@klass.finalize
|
473
605
|
end
|
474
606
|
end
|
475
|
-
|
607
|
+
define_aggregator2(proxy, name)
|
476
608
|
self
|
477
609
|
end
|
478
610
|
|
@@ -499,7 +631,7 @@ Support for this will be removed in version 2.0.0.
|
|
499
631
|
abort = false
|
500
632
|
begin
|
501
633
|
yield self
|
502
|
-
rescue
|
634
|
+
rescue
|
503
635
|
abort = true
|
504
636
|
raise
|
505
637
|
ensure
|
@@ -580,12 +712,25 @@ Support for this will be removed in version 2.0.0.
|
|
580
712
|
end
|
581
713
|
end
|
582
714
|
|
715
|
+
# Translates a +row+ of data from the database with the given +types+
|
716
|
+
def translate_from_db types, row
|
717
|
+
@type_translator.call types, row
|
718
|
+
end
|
719
|
+
|
583
720
|
private
|
584
721
|
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
722
|
+
NULL_TRANSLATOR = lambda { |_, row| row }
|
723
|
+
|
724
|
+
def make_type_translator should_translate
|
725
|
+
if should_translate
|
726
|
+
lambda { |types, row|
|
727
|
+
types.zip(row).map do |type, value|
|
728
|
+
translator.translate( type, value )
|
729
|
+
end
|
730
|
+
}
|
731
|
+
else
|
732
|
+
NULL_TRANSLATOR
|
733
|
+
end
|
589
734
|
end
|
590
735
|
end
|
591
736
|
end
|
data/lib/sqlite3/errors.rb
CHANGED
@@ -2,17 +2,8 @@ require 'sqlite3/constants'
|
|
2
2
|
|
3
3
|
module SQLite3
|
4
4
|
class Exception < ::StandardError
|
5
|
-
@code = 0
|
6
|
-
|
7
|
-
# The numeric error code that this exception represents.
|
8
|
-
def self.code
|
9
|
-
@code
|
10
|
-
end
|
11
|
-
|
12
5
|
# A convenience for accessing the error code for this exception.
|
13
|
-
|
14
|
-
self.class.code
|
15
|
-
end
|
6
|
+
attr_reader :code
|
16
7
|
end
|
17
8
|
|
18
9
|
class SQLException < Exception; end
|
data/lib/sqlite3/pragmas.rb
CHANGED
@@ -19,19 +19,19 @@ module SQLite3
|
|
19
19
|
# integer that represents truth.
|
20
20
|
def set_boolean_pragma( name, mode )
|
21
21
|
case mode
|
22
|
-
|
22
|
+
when String
|
23
23
|
case mode.downcase
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
when "on", "yes", "true", "y", "t"; mode = "'ON'"
|
25
|
+
when "off", "no", "false", "n", "f"; mode = "'OFF'"
|
26
|
+
else
|
27
27
|
raise Exception,
|
28
28
|
"unrecognized pragma parameter #{mode.inspect}"
|
29
29
|
end
|
30
|
-
|
30
|
+
when true, 1
|
31
31
|
mode = "ON"
|
32
|
-
|
32
|
+
when false, 0, nil
|
33
33
|
mode = "OFF"
|
34
|
-
|
34
|
+
else
|
35
35
|
raise Exception,
|
36
36
|
"unrecognized pragma parameter #{mode.inspect}"
|
37
37
|
end
|
data/lib/sqlite3/resultset.rb
CHANGED
@@ -108,11 +108,7 @@ object that created this object
|
|
108
108
|
row = @stmt.step
|
109
109
|
return nil if @stmt.done?
|
110
110
|
|
111
|
-
|
112
|
-
row = @stmt.types.zip(row).map do |type, value|
|
113
|
-
@db.translator.translate( type, value )
|
114
|
-
end
|
115
|
-
end
|
111
|
+
row = @db.translate_from_db @stmt.types, row
|
116
112
|
|
117
113
|
if row.respond_to?(:fields)
|
118
114
|
# FIXME: this can only happen if the translator returns something
|
@@ -176,11 +172,7 @@ object that created this object
|
|
176
172
|
|
177
173
|
# FIXME: type translation is deprecated, so this can be removed
|
178
174
|
# in 2.0
|
179
|
-
|
180
|
-
row = @stmt.types.zip(row).map do |type, value|
|
181
|
-
@db.translator.translate( type, value )
|
182
|
-
end
|
183
|
-
end
|
175
|
+
row = @db.translate_from_db @stmt.types, row
|
184
176
|
|
185
177
|
# FIXME: this can be switched to a regular hash in 2.0
|
186
178
|
row = HashWithTypesAndFields[*@stmt.columns.zip(row).flatten]
|
data/lib/sqlite3/version.rb
CHANGED
data/{tasks → rakelib}/faq.rake
RENAMED
File without changes
|
data/{tasks → rakelib}/gem.rake
RENAMED
@@ -6,14 +6,14 @@ rescue LoadError
|
|
6
6
|
require 'hoe'
|
7
7
|
end
|
8
8
|
|
9
|
-
Hoe.plugin :debugging, :doofus, :git, :minitest, :bundler
|
9
|
+
Hoe.plugin :debugging, :doofus, :git, :minitest, :bundler, :gemspec
|
10
10
|
|
11
11
|
HOE = Hoe.spec 'sqlite3' do
|
12
12
|
developer 'Jamis Buck', 'jamis@37signals.com'
|
13
13
|
developer 'Luis Lavena', 'luislavena@gmail.com'
|
14
14
|
developer 'Aaron Patterson', 'aaron@tenderlovemaking.com'
|
15
15
|
|
16
|
-
license "BSD-3"
|
16
|
+
license "BSD-3-Clause"
|
17
17
|
|
18
18
|
self.readme_file = 'README.rdoc'
|
19
19
|
self.history_file = 'CHANGELOG.rdoc'
|
@@ -23,12 +23,14 @@ HOE = Hoe.spec 'sqlite3' do
|
|
23
23
|
require_rubygems_version ">= 1.3.5"
|
24
24
|
|
25
25
|
spec_extras[:extensions] = ["ext/sqlite3/extconf.rb"]
|
26
|
+
spec_extras[:metadata] = {'msys2_mingw_dependencies' => 'sqlite3'}
|
26
27
|
|
27
|
-
extra_dev_deps << ['rake-compiler', "~> 0
|
28
|
-
extra_dev_deps << ['rake-compiler-dock', "~> 0.
|
28
|
+
extra_dev_deps << ['rake-compiler', "~> 1.0"]
|
29
|
+
extra_dev_deps << ['rake-compiler-dock', "~> 0.6.0"]
|
29
30
|
extra_dev_deps << ["mini_portile", "~> 0.6.2"]
|
30
31
|
extra_dev_deps << ["minitest", "~> 5.0"]
|
31
32
|
extra_dev_deps << ["hoe-bundler", "~> 1.0"]
|
33
|
+
extra_dev_deps << ["hoe-gemspec", "~> 1.0"]
|
32
34
|
|
33
35
|
clean_globs.push('**/test.db')
|
34
36
|
end
|
@@ -40,6 +40,10 @@ RUBY_EXTENSION = Rake::ExtensionTask.new('sqlite3_native', HOE.spec) do |ext|
|
|
40
40
|
Rake::ExtensionCompiler.mingw_host
|
41
41
|
ext.cross_compile = true
|
42
42
|
ext.cross_platform = ['i386-mswin32-60', 'i386-mingw32', 'x64-mingw32']
|
43
|
+
ext.cross_compiling do |spec|
|
44
|
+
# The fat binary gem doesn't depend on the sqlite3 package, since it bundles the library.
|
45
|
+
spec.metadata.delete('msys2_mingw_dependencies')
|
46
|
+
end
|
43
47
|
rescue RuntimeError
|
44
48
|
# noop
|
45
49
|
end
|
File without changes
|