sqlite3 1.3.5 → 1.3.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b430789a68a6d6079e0395db6fc53421e4b317ab
4
+ data.tar.gz: db014f4a1f4e980913a3dcb48d9aab14a5a9eca1
5
+ SHA512:
6
+ metadata.gz: 7e2764239b107677240476bb608bcb46cc0966c06d06e90881113b91dbdb8342c6c7558760cf0645a56449ac8e267f13a0e25dbef0d3e820a38f5857a96c4e05
7
+ data.tar.gz: 1e08a478ed043d22bbe95df2151bf009a7f03a1457c37df4199c8601fa1ccb9de27986e64341c4fb9a009e5ab4023638704078222f88441b55ac1ee2773838d8
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,87 @@
1
+ === 1.3.12
2
+
3
+ * Bugfixes:
4
+ * OS X install will default to homebrew if available. Fixes #195
5
+
6
+ === 1.3.11 / 2015-10-10
7
+
8
+ * Enhancements:
9
+ * Windows: build against SQLite 3.8.11.1
10
+
11
+ * Internal:
12
+ * Use rake-compiler-dock to build Windows binaries. Pull #159 [larskanis]
13
+ * Expand Ruby versions being tested for Travis and AppVeyor
14
+
15
+ === 1.3.10 / 2014-10-30
16
+
17
+ * Enhancements:
18
+ * Windows: build against SQLite 3.8.7.1. Closes #134, #135 [Hubro]
19
+
20
+ === 1.3.9 / 2014-02-25
21
+
22
+ * Bugfixes:
23
+ * Reset exception message. Closes #80
24
+ * Reduce warnings due unused pointers. Closes #89
25
+ * Add BSD-3 license reference to gemspec. Refs #99 and #106
26
+
27
+ === 1.3.8 / 2013-08-17
28
+
29
+ * Enhancements:
30
+ * Windows: build against SQLite 3.7.17
31
+
32
+ * Bugfixes:
33
+ * Reset exception message. Closes #80
34
+ * Correctly convert BLOB values to Ruby. Closes #65
35
+ * Add MIT license reference to gemspec. Closes #99
36
+ * Remove unused pointer. Closes #89
37
+
38
+ * Internal:
39
+ * Backport improvements in cross compilation for Windows
40
+ * Use of Minitest for internal tests
41
+ * Use Gemfile (generated by Hoe) to deal with dependencies
42
+ * Cleanup Travis CI
43
+
44
+ === 1.3.7 / 2013-01-11
45
+
46
+ * Bugfixes
47
+ * Closing a bad statement twice will not segv.
48
+ * Aggregate handlers are initialized on each query. Closes #44
49
+
50
+ * Internal
51
+ * Unset environment variables that could affect cross compilation.
52
+
53
+ === 1.3.6 / 2012-04-16
54
+
55
+ * Enhancements
56
+ * Windows: build against SQLite 3.7.11
57
+ * Added SQLite3::ResultSet#each_hash for fetching each row as a hash.
58
+ * Added SQLite3::ResultSet#next_hash for fetching one row as a hash.
59
+
60
+ * Bugfixes
61
+ * Support both UTF-16LE and UTF-16BE encoding modes on PPC. Closes #63
62
+ * Protect parameters to custom functions from being garbage collected too
63
+ soon. Fixes #60. Thanks hirataya!
64
+ * Fix backwards compatibility with 1.2.5 with bind vars and `query` method.
65
+ Fixes #35.
66
+ * Fix double definition error caused by defining sqlite3_int64/uint64.
67
+ * Fix suspicious version regexp.
68
+
69
+ * Deprecations
70
+ * ArrayWithTypesAndFields#types is deprecated and the class will be removed
71
+ in version 2.0.0. Please use the `types` method on the ResultSet class
72
+ that created this object.
73
+ * ArrayWithTypesAndFields#fields is deprecated and the class will be removed
74
+ in version 2.0.0. Please use the `columns` method on the ResultSet class
75
+ that created this object.
76
+ * The ArrayWithTypesAndFields class will be removed in 2.0.0
77
+ * The ArrayWithTypes class will be removed in 2.0.0
78
+ * HashWithTypesAndFields#types is deprecated and the class will be removed
79
+ in version 2.0.0. Please use the `types` method on the ResultSet class
80
+ that created this object.
81
+ * HashWithTypesAndFields#fields is deprecated and the class will be removed
82
+ in version 2.0.0. Please use the `columns` method on the ResultSet class
83
+ that created this object.
84
+
1
85
  === 1.3.5 / 2011-12-03 - ZOMG Holidays are here Edition!
2
86
 
3
87
  * Enhancements
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ # -*- ruby -*-
2
+
3
+ # DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
4
+
5
+ source "https://rubygems.org/"
6
+
7
+
8
+ gem "minitest", "~>5.9", :group => [:development, :test]
9
+ gem "rake-compiler", "~>0.9.3", :group => [:development, :test]
10
+ gem "rake-compiler-dock", "~>0.5.2", :group => [:development, :test]
11
+ gem "mini_portile", "~>0.6.2", :group => [:development, :test]
12
+ gem "hoe-bundler", "~>1.0", :group => [:development, :test]
13
+ gem "hoe", "~>3.15", :group => [:development, :test]
14
+
15
+ # vim: syntax=ruby
data/Manifest.txt CHANGED
@@ -1,6 +1,7 @@
1
1
  API_CHANGES.rdoc
2
2
  CHANGELOG.rdoc
3
3
  ChangeLog.cvs
4
+ Gemfile
4
5
  LICENSE
5
6
  Manifest.txt
6
7
  README.rdoc
@@ -45,6 +46,7 @@ test/test_integration_open_close.rb
45
46
  test/test_integration_pending.rb
46
47
  test/test_integration_resultset.rb
47
48
  test/test_integration_statement.rb
49
+ test/test_result_set.rb
48
50
  test/test_sqlite3.rb
49
51
  test/test_statement.rb
50
52
  test/test_statement_execute.rb
data/README.rdoc CHANGED
@@ -1,7 +1,11 @@
1
1
  = SQLite3/Ruby Interface
2
2
 
3
- * http://github.com/luislavena/sqlite3-ruby
3
+ * https://github.com/sparklemotion/sqlite3-ruby
4
4
  * http://groups.google.com/group/sqlite3-ruby
5
+ * http://rubygems.org/gems/sqlite3
6
+ * http://www.rubydoc.info/gems/sqlite3/frames
7
+
8
+ {<img src="https://travis-ci.org/sparklemotion/sqlite3-ruby.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/sparklemotion/sqlite3-ruby]
5
9
 
6
10
  == DESCRIPTION
7
11
 
@@ -18,7 +22,7 @@ Note that this module is only compatible with SQLite 3.6.16 or newer.
18
22
  # Open a database
19
23
  db = SQLite3::Database.new "test.db"
20
24
 
21
- # Create a database
25
+ # Create a table
22
26
  rows = db.execute <<-SQL
23
27
  create table numbers (
24
28
  name varchar(30),
@@ -33,12 +37,31 @@ Note that this module is only compatible with SQLite 3.6.16 or newer.
33
37
  }.each do |pair|
34
38
  db.execute "insert into numbers values ( ?, ? )", pair
35
39
  end
36
-
40
+
37
41
  # Find a few rows
38
42
  db.execute( "select * from numbers" ) do |row|
39
43
  p row
40
44
  end
41
45
 
46
+ # Create another table with multiple columns
47
+
48
+ db.execute <<-SQL
49
+ create table students (
50
+ name varchar(50),
51
+ email varchar(50),
52
+ grade varchar(5),
53
+ blog varchar(50)
54
+ );
55
+ SQL
56
+
57
+ # Execute inserts with parameter markers
58
+ db.execute("INSERT INTO students (name, email, grade, blog)
59
+ VALUES (?, ?, ?, ?)", ["Jane", "me@janedoe.com", "A", "http://blog.janedoe.com"])
60
+
61
+ db.execute( "select * from students" ) do |row|
62
+ p row
63
+ end
64
+
42
65
 
43
66
  == Compilation and Installation
44
67
 
@@ -75,10 +98,10 @@ can be found here:
75
98
 
76
99
  Uh oh. After contacting the mailing list, you've found that you've actually
77
100
  discovered a bug. You can file the bug at the
78
- {github issues page}[http://github.com/luislavena/sqlite3-ruby/issues]
101
+ {github issues page}[https://github.com/sparklemotion/sqlite3-ruby/issues]
79
102
  which can be found here:
80
103
 
81
- * http://github.com/luislavena/sqlite3-ruby/issues
104
+ * https://github.com/sparklemotion/sqlite3-ruby/issues
82
105
 
83
106
  == Usage
84
107
 
@@ -91,5 +114,5 @@ FAQ, please send them to {the mailing list}[http://groups.google.com/group/sqlit
91
114
 
92
115
  The source repository is accessible via git:
93
116
 
94
- git clone git://github.com/luislavena/sqlite3-ruby.git
117
+ git clone git://github.com/sparklemotion/sqlite3-ruby.git
95
118
 
@@ -30,6 +30,8 @@ utf16_string_value_ptr(VALUE str)
30
30
  return RSTRING_PTR(str);
31
31
  }
32
32
 
33
+ static VALUE sqlite3_rb_close(VALUE self);
34
+
33
35
  /* call-seq: SQLite3::Database.new(file, options = {})
34
36
  *
35
37
  * Create a new Database object that opens the given file. If utf16
@@ -44,7 +46,10 @@ static VALUE initialize(int argc, VALUE *argv, VALUE self)
44
46
  VALUE file;
45
47
  VALUE opts;
46
48
  VALUE zvfs;
49
+ VALUE flags;
50
+ #ifdef HAVE_SQLITE3_OPEN_V2
47
51
  int mode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
52
+ #endif
48
53
  int status;
49
54
 
50
55
  Data_Get_Struct(self, sqlite3Ruby, ctx);
@@ -60,7 +65,7 @@ static VALUE initialize(int argc, VALUE *argv, VALUE self)
60
65
  else Check_Type(opts, T_HASH);
61
66
 
62
67
  #ifdef HAVE_RUBY_ENCODING_H
63
- if(UTF16_LE_P(file)) {
68
+ if(UTF16_LE_P(file) || UTF16_BE_P(file)) {
64
69
  status = sqlite3_open16(utf16_string_value_ptr(file), &ctx->db);
65
70
  } else {
66
71
  #endif
@@ -75,15 +80,52 @@ static VALUE initialize(int argc, VALUE *argv, VALUE self)
75
80
  }
76
81
  #endif
77
82
 
83
+ /* The three primary flag values for sqlite3_open_v2 are:
84
+ * SQLITE_OPEN_READONLY
85
+ * SQLITE_OPEN_READWRITE
86
+ * SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE -- always used for sqlite3_open and sqlite3_open16
87
+ */
78
88
  if (Qtrue == rb_hash_aref(opts, ID2SYM(rb_intern("readonly")))) {
89
+ #ifdef HAVE_SQLITE3_OPEN_V2
79
90
  mode = SQLITE_OPEN_READONLY;
91
+ #else
92
+ rb_raise(rb_eNotImpError, "sqlite3-ruby was compiled against a version of sqlite that does not support readonly databases");
93
+ #endif
94
+ }
95
+ if (Qtrue == rb_hash_aref(opts, ID2SYM(rb_intern("readwrite")))) {
96
+ #ifdef HAVE_SQLITE3_OPEN_V2
97
+ if (mode == SQLITE_OPEN_READONLY) {
98
+ rb_raise(rb_eRuntimeError, "conflicting options: readonly and readwrite");
99
+ }
100
+ mode = SQLITE_OPEN_READWRITE;
101
+ #else
102
+ rb_raise(rb_eNotImpError, "sqlite3-ruby was compiled against a version of sqlite that does not support readwrite without create");
103
+ #endif
104
+ }
105
+ flags = rb_hash_aref(opts, ID2SYM(rb_intern("flags")));
106
+ if (flags != Qnil) {
107
+ #ifdef HAVE_SQLITE3_OPEN_V2
108
+ if ((mode & SQLITE_OPEN_CREATE) == 0) {
109
+ rb_raise(rb_eRuntimeError, "conflicting options: flags with readonly and/or readwrite");
110
+ }
111
+ mode = (int)NUM2INT(flags);
112
+ #else
113
+ rb_raise(rb_eNotImpError, "sqlite3-ruby was compiled against a version of sqlite that does not support flags on open");
114
+ #endif
80
115
  }
116
+ #ifdef HAVE_SQLITE3_OPEN_V2
81
117
  status = sqlite3_open_v2(
82
118
  StringValuePtr(file),
83
119
  &ctx->db,
84
120
  mode,
85
121
  NIL_P(zvfs) ? NULL : StringValuePtr(zvfs)
86
122
  );
123
+ #else
124
+ status = sqlite3_open(
125
+ StringValuePtr(file),
126
+ &ctx->db
127
+ );
128
+ #endif
87
129
  }
88
130
 
89
131
  #ifdef HAVE_RUBY_ENCODING_H
@@ -100,11 +142,14 @@ static VALUE initialize(int argc, VALUE *argv, VALUE self)
100
142
  rb_iv_set(self, "@functions", rb_hash_new());
101
143
  rb_iv_set(self, "@results_as_hash", rb_hash_aref(opts, sym_results_as_hash));
102
144
  rb_iv_set(self, "@type_translation", rb_hash_aref(opts, sym_type_translation));
103
- rb_iv_set(self, "@readonly", mode == SQLITE_OPEN_READONLY ? Qtrue : Qfalse);
145
+ #ifdef HAVE_SQLITE3_OPEN_V2
146
+ rb_iv_set(self, "@readonly", (mode & SQLITE_OPEN_READONLY) ? Qtrue : Qfalse);
147
+ #else
148
+ rb_iv_set(self, "@readonly", Qfalse);
149
+ #endif
104
150
 
105
151
  if(rb_block_given_p()) {
106
- rb_yield(self);
107
- rb_funcall(self, rb_intern("close"), 0);
152
+ rb_ensure(rb_yield, self, sqlite3_rb_close, self);
108
153
  }
109
154
 
110
155
  return self;
@@ -264,9 +309,23 @@ static VALUE sqlite3val2rb(sqlite3_value * val)
264
309
  case SQLITE_TEXT:
265
310
  return rb_tainted_str_new2((const char *)sqlite3_value_text(val));
266
311
  break;
267
- case SQLITE_BLOB:
268
- return rb_tainted_str_new2((const char *)sqlite3_value_blob(val));
312
+ case SQLITE_BLOB: {
313
+ /* Sqlite warns calling sqlite3_value_bytes may invalidate pointer from sqlite3_value_blob,
314
+ so we explicitly get the length before getting blob pointer.
315
+ Note that rb_str_new and rb_tainted_str_new apparently create string with ASCII-8BIT (BINARY) encoding,
316
+ which is what we want, as blobs are binary
317
+ */
318
+ int len = sqlite3_value_bytes(val);
319
+ #ifdef HAVE_RUBY_ENCODING_H
320
+ return rb_tainted_str_new((const char *)sqlite3_value_blob(val), len);
321
+ #else
322
+ /* When encoding is not available, make it class SQLite3::Blob. */
323
+ VALUE strargv[1];
324
+ strargv[0] = rb_tainted_str_new((const char *)sqlite3_value_blob(val), len);
325
+ return rb_class_new_instance(1, strargv, cSqlite3Blob);
326
+ #endif
269
327
  break;
328
+ }
270
329
  case SQLITE_NULL:
271
330
  return Qnil;
272
331
  break;
@@ -284,23 +343,39 @@ static void set_sqlite3_func_result(sqlite3_context * ctx, VALUE result)
284
343
  case T_FIXNUM:
285
344
  sqlite3_result_int64(ctx, (sqlite3_int64)FIX2LONG(result));
286
345
  break;
287
- case T_BIGNUM:
346
+ case T_BIGNUM: {
288
347
  #if SIZEOF_LONG < 8
289
- if (RBIGNUM_LEN(result) * SIZEOF_BDIGITS <= 8) {
290
- sqlite3_result_int64(ctx, NUM2LL(result));
291
- break;
348
+ sqlite3_int64 num64;
349
+
350
+ if (bignum_to_int64(result, &num64)) {
351
+ sqlite3_result_int64(ctx, num64);
352
+ break;
292
353
  }
293
354
  #endif
355
+ }
294
356
  case T_FLOAT:
295
357
  sqlite3_result_double(ctx, NUM2DBL(result));
296
358
  break;
297
359
  case T_STRING:
298
- sqlite3_result_text(
299
- ctx,
300
- (const char *)StringValuePtr(result),
301
- (int)RSTRING_LEN(result),
302
- SQLITE_TRANSIENT
303
- );
360
+ if(CLASS_OF(result) == cSqlite3Blob
361
+ #ifdef HAVE_RUBY_ENCODING_H
362
+ || rb_enc_get_index(result) == rb_ascii8bit_encindex()
363
+ #endif
364
+ ) {
365
+ sqlite3_result_blob(
366
+ ctx,
367
+ (const void *)StringValuePtr(result),
368
+ (int)RSTRING_LEN(result),
369
+ SQLITE_TRANSIENT
370
+ );
371
+ } else {
372
+ sqlite3_result_text(
373
+ ctx,
374
+ (const char *)StringValuePtr(result),
375
+ (int)RSTRING_LEN(result),
376
+ SQLITE_TRANSIENT
377
+ );
378
+ }
304
379
  break;
305
380
  default:
306
381
  rb_raise(rb_eRuntimeError, "can't return %s",
@@ -311,20 +386,18 @@ static void set_sqlite3_func_result(sqlite3_context * ctx, VALUE result)
311
386
  static void rb_sqlite3_func(sqlite3_context * ctx, int argc, sqlite3_value **argv)
312
387
  {
313
388
  VALUE callable = (VALUE)sqlite3_user_data(ctx);
314
- VALUE * params = NULL;
389
+ VALUE params = rb_ary_new2(argc);
315
390
  VALUE result;
316
391
  int i;
317
392
 
318
393
  if (argc > 0) {
319
- params = xcalloc((size_t)argc, sizeof(VALUE *));
320
-
321
394
  for(i = 0; i < argc; i++) {
322
- params[i] = sqlite3val2rb(argv[i]);
395
+ VALUE param = sqlite3val2rb(argv[i]);
396
+ rb_ary_push(params, param);
323
397
  }
324
398
  }
325
399
 
326
- result = rb_funcall2(callable, rb_intern("call"), argc, params);
327
- xfree(params);
400
+ result = rb_apply(callable, rb_intern("call"), params);
328
401
 
329
402
  set_sqlite3_func_result(ctx, result);
330
403
  }
@@ -625,13 +698,12 @@ static VALUE collation(VALUE self, VALUE name, VALUE comparator)
625
698
  Data_Get_Struct(self, sqlite3Ruby, ctx);
626
699
  REQUIRE_OPEN_DB(ctx);
627
700
 
628
- CHECK(ctx->db, sqlite3_create_collation_v2(
701
+ CHECK(ctx->db, sqlite3_create_collation(
629
702
  ctx->db,
630
703
  StringValuePtr(name),
631
704
  SQLITE_UTF8,
632
705
  (void *)comparator,
633
- NIL_P(comparator) ? NULL : rb_comparator_func,
634
- NULL));
706
+ NIL_P(comparator) ? NULL : rb_comparator_func));
635
707
 
636
708
  /* Make sure our comparator doesn't get garbage collected. */
637
709
  rb_hash_aset(rb_iv_get(self, "@collations"), name, comparator);
@@ -639,10 +711,11 @@ static VALUE collation(VALUE self, VALUE name, VALUE comparator)
639
711
  return self;
640
712
  }
641
713
 
714
+ #ifdef HAVE_SQLITE3_LOAD_EXTENSION
642
715
  /* call-seq: db.load_extension(file)
643
716
  *
644
717
  * Loads an SQLite extension library from the named file. Extension
645
- * loading must be enabled using db.enable_load_extension(1) prior
718
+ * loading must be enabled using db.enable_load_extension(true) prior
646
719
  * to calling this API.
647
720
  */
648
721
  static VALUE load_extension(VALUE self, VALUE file)
@@ -664,7 +737,9 @@ static VALUE load_extension(VALUE self, VALUE file)
664
737
 
665
738
  return self;
666
739
  }
740
+ #endif
667
741
 
742
+ #ifdef HAVE_SQLITE3_ENABLE_LOAD_EXTENSION
668
743
  /* call-seq: db.enable_load_extension(onoff)
669
744
  *
670
745
  * Enable or disable extension loading.
@@ -672,13 +747,23 @@ static VALUE load_extension(VALUE self, VALUE file)
672
747
  static VALUE enable_load_extension(VALUE self, VALUE onoff)
673
748
  {
674
749
  sqlite3RubyPtr ctx;
750
+ int onoffparam;
675
751
  Data_Get_Struct(self, sqlite3Ruby, ctx);
676
752
  REQUIRE_OPEN_DB(ctx);
677
753
 
678
- CHECK(ctx->db, sqlite3_enable_load_extension(ctx->db, (int)NUM2INT(onoff)));
754
+ if (Qtrue == onoff) {
755
+ onoffparam = 1;
756
+ } else if (Qfalse == onoff) {
757
+ onoffparam = 0;
758
+ } else {
759
+ onoffparam = (int)NUM2INT(onoff);
760
+ }
761
+
762
+ CHECK(ctx->db, sqlite3_enable_load_extension(ctx->db, onoffparam));
679
763
 
680
764
  return self;
681
765
  }
766
+ #endif
682
767
 
683
768
  #ifdef HAVE_RUBY_ENCODING_H
684
769
  static int enc_cb(void * _self, int UNUSED(columns), char **data, char **UNUSED(names))
@@ -737,6 +822,24 @@ static VALUE transaction_active_p(VALUE self)
737
822
  return sqlite3_get_autocommit(ctx->db) ? Qfalse : Qtrue;
738
823
  }
739
824
 
825
+ /* call-seq: db.db_filename(database_name)
826
+ *
827
+ * Returns the file associated with +database_name+. Can return nil or an
828
+ * empty string if the database is temporary, or in-memory.
829
+ */
830
+ static VALUE db_filename(VALUE self, VALUE db_name)
831
+ {
832
+ sqlite3RubyPtr ctx;
833
+ const char * fname;
834
+ Data_Get_Struct(self, sqlite3Ruby, ctx);
835
+ REQUIRE_OPEN_DB(ctx);
836
+
837
+ fname = sqlite3_db_filename(ctx->db, StringValueCStr(db_name));
838
+
839
+ if(fname) return SQLITE3_UTF8_STR_NEW2(fname);
840
+ return Qnil;
841
+ }
842
+
740
843
  void init_sqlite3_database()
741
844
  {
742
845
  ID id_utf16, id_results_as_hash, id_type_translation;
@@ -764,6 +867,7 @@ void init_sqlite3_database()
764
867
  rb_define_method(cSqlite3Database, "busy_handler", busy_handler, -1);
765
868
  rb_define_method(cSqlite3Database, "busy_timeout=", set_busy_timeout, 1);
766
869
  rb_define_method(cSqlite3Database, "transaction_active?", transaction_active_p, 0);
870
+ rb_define_private_method(cSqlite3Database, "db_filename", db_filename, 1);
767
871
 
768
872
  #ifdef HAVE_SQLITE3_LOAD_EXTENSION
769
873
  rb_define_method(cSqlite3Database, "load_extension", load_extension, 1);