sqlite3 1.7.3 → 2.5.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +292 -0
  3. data/CONTRIBUTING.md +33 -7
  4. data/FAQ.md +43 -77
  5. data/INSTALLATION.md +14 -6
  6. data/LICENSE +18 -22
  7. data/README.md +97 -9
  8. data/dependencies.yml +10 -11
  9. data/ext/sqlite3/aggregator.c +142 -145
  10. data/ext/sqlite3/aggregator.h +2 -4
  11. data/ext/sqlite3/backup.c +74 -65
  12. data/ext/sqlite3/backup.h +2 -2
  13. data/ext/sqlite3/database.c +621 -493
  14. data/ext/sqlite3/database.h +13 -4
  15. data/ext/sqlite3/exception.c +116 -92
  16. data/ext/sqlite3/exception.h +5 -1
  17. data/ext/sqlite3/extconf.rb +33 -24
  18. data/ext/sqlite3/sqlite3.c +176 -115
  19. data/ext/sqlite3/sqlite3_ruby.h +2 -2
  20. data/ext/sqlite3/statement.c +553 -300
  21. data/ext/sqlite3/statement.h +4 -3
  22. data/ext/sqlite3/timespec.h +20 -0
  23. data/lib/sqlite3/constants.rb +195 -47
  24. data/lib/sqlite3/database.rb +223 -187
  25. data/lib/sqlite3/errors.rb +54 -1
  26. data/lib/sqlite3/fork_safety.rb +66 -0
  27. data/lib/sqlite3/pragmas.rb +140 -136
  28. data/lib/sqlite3/resultset.rb +14 -97
  29. data/lib/sqlite3/statement.rb +58 -13
  30. data/lib/sqlite3/value.rb +17 -20
  31. data/lib/sqlite3/version.rb +2 -21
  32. data/lib/sqlite3/version_info.rb +17 -0
  33. data/lib/sqlite3.rb +8 -4
  34. data/ports/archives/sqlite-autoconf-3470200.tar.gz +0 -0
  35. metadata +9 -37
  36. data/API_CHANGES.md +0 -49
  37. data/ChangeLog.cvs +0 -88
  38. data/Gemfile +0 -10
  39. data/LICENSE-DEPENDENCIES +0 -20
  40. data/lib/sqlite3/translator.rb +0 -117
  41. data/ports/archives/sqlite-autoconf-3450200.tar.gz +0 -0
  42. data/test/helper.rb +0 -27
  43. data/test/test_backup.rb +0 -33
  44. data/test/test_collation.rb +0 -82
  45. data/test/test_database.rb +0 -668
  46. data/test/test_database_flags.rb +0 -95
  47. data/test/test_database_readonly.rb +0 -36
  48. data/test/test_database_readwrite.rb +0 -41
  49. data/test/test_deprecated.rb +0 -49
  50. data/test/test_encoding.rb +0 -165
  51. data/test/test_integration.rb +0 -507
  52. data/test/test_integration_aggregate.rb +0 -336
  53. data/test/test_integration_open_close.rb +0 -30
  54. data/test/test_integration_pending.rb +0 -115
  55. data/test/test_integration_resultset.rb +0 -142
  56. data/test/test_integration_statement.rb +0 -194
  57. data/test/test_pragmas.rb +0 -22
  58. data/test/test_result_set.rb +0 -47
  59. data/test/test_sqlite3.rb +0 -30
  60. data/test/test_statement.rb +0 -290
  61. data/test/test_statement_execute.rb +0 -39
@@ -3,162 +3,223 @@
3
3
  VALUE mSqlite3;
4
4
  VALUE cSqlite3Blob;
5
5
 
6
- int bignum_to_int64(VALUE value, sqlite3_int64 *result)
6
+ int
7
+ bignum_to_int64(VALUE value, sqlite3_int64 *result)
7
8
  {
8
9
  #ifdef HAVE_RB_INTEGER_PACK
9
- const int nails = 0;
10
- int t = rb_integer_pack(value, result, 1, sizeof(*result), nails,
11
- INTEGER_PACK_NATIVE_BYTE_ORDER|
12
- INTEGER_PACK_2COMP);
13
- switch (t) {
14
- case -2: case +2:
15
- return 0;
16
- case +1:
17
- if (!nails) {
18
- if (*result < 0) return 0;
10
+ const int nails = 0;
11
+ int t = rb_integer_pack(value, result, 1, sizeof(*result), nails,
12
+ INTEGER_PACK_NATIVE_BYTE_ORDER |
13
+ INTEGER_PACK_2COMP);
14
+ switch (t) {
15
+ case -2:
16
+ case +2:
17
+ return 0;
18
+ case +1:
19
+ if (!nails) {
20
+ if (*result < 0) { return 0; }
21
+ }
22
+ break;
23
+ case -1:
24
+ if (!nails) {
25
+ if (*result >= 0) { return 0; }
26
+ } else {
27
+ *result += INT64_MIN;
28
+ }
29
+ break;
19
30
  }
20
- break;
21
- case -1:
22
- if (!nails) {
23
- if (*result >= 0) return 0;
24
- }
25
- else {
26
- *result += INT64_MIN;
27
- }
28
- break;
29
- }
30
- return 1;
31
+ return 1;
31
32
  #else
32
33
  # ifndef RBIGNUM_LEN
33
34
  # define RBIGNUM_LEN(x) RBIGNUM(x)->len
34
35
  # endif
35
- const long len = RBIGNUM_LEN(value);
36
- if (len == 0) {
37
- *result = 0;
38
- return 1;
39
- }
40
- if (len > 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) return 0;
41
- if (len == 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) {
42
- const BDIGIT *digits = RBIGNUM_DIGITS(value);
43
- BDIGIT blast = digits[len-1];
44
- BDIGIT bmax = (BDIGIT)1UL << (63 % (CHAR_BIT * SIZEOF_BDIGITS));
45
- if (blast > bmax) return 0;
46
- if (blast == bmax) {
47
- if (RBIGNUM_POSITIVE_P(value)) {
48
- return 0;
49
- }
50
- else {
51
- long i = len-1;
52
- while (i) {
53
- if (digits[--i]) return 0;
54
- }
55
- }
36
+ const long len = RBIGNUM_LEN(value);
37
+ if (len == 0) {
38
+ *result = 0;
39
+ return 1;
56
40
  }
57
- }
58
- *result = (sqlite3_int64)NUM2LL(value);
59
- return 1;
41
+ if (len > 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) { return 0; }
42
+ if (len == 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) {
43
+ const BDIGIT *digits = RBIGNUM_DIGITS(value);
44
+ BDIGIT blast = digits[len - 1];
45
+ BDIGIT bmax = (BDIGIT)1UL << (63 % (CHAR_BIT * SIZEOF_BDIGITS));
46
+ if (blast > bmax) { return 0; }
47
+ if (blast == bmax) {
48
+ if (RBIGNUM_POSITIVE_P(value)) {
49
+ return 0;
50
+ } else {
51
+ long i = len - 1;
52
+ while (i) {
53
+ if (digits[--i]) { return 0; }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ *result = (sqlite3_int64)NUM2LL(value);
59
+ return 1;
60
60
  #endif
61
61
  }
62
62
 
63
- static VALUE libversion(VALUE UNUSED(klass))
63
+ static VALUE
64
+ libversion(VALUE UNUSED(klass))
64
65
  {
65
- return INT2NUM(sqlite3_libversion_number());
66
+ return INT2NUM(sqlite3_libversion_number());
66
67
  }
67
68
 
68
- static VALUE using_sqlcipher(VALUE UNUSED(klass))
69
+ static VALUE
70
+ using_sqlcipher(VALUE UNUSED(klass))
69
71
  {
70
72
  #ifdef USING_SQLCIPHER
71
- return Qtrue;
73
+ return Qtrue;
72
74
  #else
73
- return Qfalse;
75
+ return Qfalse;
74
76
  #endif
75
77
  }
76
78
 
77
79
  /* Returns the compile time setting of the SQLITE_THREADSAFE flag.
78
80
  * See: https://www.sqlite.org/c3ref/threadsafe.html
79
81
  */
80
- static VALUE threadsafe_p(VALUE UNUSED(klass))
82
+ static VALUE
83
+ threadsafe_p(VALUE UNUSED(klass))
84
+ {
85
+ return INT2NUM(sqlite3_threadsafe());
86
+ }
87
+
88
+ /*
89
+ * call-seq:
90
+ * status(parameter) → Hash
91
+ * status(parameter, reset_flag = false) → Hash
92
+ *
93
+ * Queries the SQLite3 library for run-time status information. Passing a truthy +reset_flag+ will
94
+ * reset the highwater mark to the current value.
95
+ *
96
+ * [Parameters]
97
+ * - +parameter+ (Integer, SQLite3::Constants::Status): The status parameter to query.
98
+ * - +reset_flag+ (Boolean): Whether to reset the highwater mark. (default is +false+)
99
+ *
100
+ * [Returns]
101
+ * A Hash containing +:current+ and +:highwater+ keys for integer values.
102
+ */
103
+ static VALUE
104
+ rb_sqlite3_status(int argc, VALUE *argv, VALUE klass)
81
105
  {
82
- return INT2NUM(sqlite3_threadsafe());
106
+ VALUE opArg, resetFlagArg;
107
+
108
+ rb_scan_args(argc, argv, "11", &opArg, &resetFlagArg);
109
+
110
+ int op = NUM2INT(opArg);
111
+ bool resetFlag = RTEST(resetFlagArg);
112
+
113
+ int pCurrent = 0;
114
+ int pHighwater = 0;
115
+ sqlite3_status(op, &pCurrent, &pHighwater, resetFlag);
116
+
117
+ VALUE hash = rb_hash_new();
118
+ rb_hash_aset(hash, ID2SYM(rb_intern("current")), INT2FIX(pCurrent));
119
+ rb_hash_aset(hash, ID2SYM(rb_intern("highwater")), INT2FIX(pHighwater));
120
+
121
+ return hash;
83
122
  }
84
123
 
85
- void init_sqlite3_constants(void)
124
+ void
125
+ init_sqlite3_constants(void)
86
126
  {
87
- VALUE mSqlite3Constants;
88
- VALUE mSqlite3Open;
89
-
90
- mSqlite3Constants = rb_define_module_under(mSqlite3, "Constants");
91
-
92
- /* sqlite3_open_v2 flags for Database::new */
93
- mSqlite3Open = rb_define_module_under(mSqlite3Constants, "Open");
94
-
95
- /* symbols = IO.readlines('sqlite3.h').map { |n| /\A#define\s+(SQLITE_OPEN_\w+)\s/ =~ n && $1 }.compact
96
- * pad = symbols.map(&:length).max - 9
97
- * symbols.each { |s| printf %Q{ rb_define_const(mSqlite3Open, %-#{pad}s INT2FIX(#{s}));\n}, '"' + s[12..-1] + '",' }
98
- */
99
- rb_define_const(mSqlite3Open, "READONLY", INT2FIX(SQLITE_OPEN_READONLY));
100
- rb_define_const(mSqlite3Open, "READWRITE", INT2FIX(SQLITE_OPEN_READWRITE));
101
- rb_define_const(mSqlite3Open, "CREATE", INT2FIX(SQLITE_OPEN_CREATE));
102
- rb_define_const(mSqlite3Open, "DELETEONCLOSE", INT2FIX(SQLITE_OPEN_DELETEONCLOSE));
103
- rb_define_const(mSqlite3Open, "EXCLUSIVE", INT2FIX(SQLITE_OPEN_EXCLUSIVE));
104
- rb_define_const(mSqlite3Open, "MAIN_DB", INT2FIX(SQLITE_OPEN_MAIN_DB));
105
- rb_define_const(mSqlite3Open, "TEMP_DB", INT2FIX(SQLITE_OPEN_TEMP_DB));
106
- rb_define_const(mSqlite3Open, "TRANSIENT_DB", INT2FIX(SQLITE_OPEN_TRANSIENT_DB));
107
- rb_define_const(mSqlite3Open, "MAIN_JOURNAL", INT2FIX(SQLITE_OPEN_MAIN_JOURNAL));
108
- rb_define_const(mSqlite3Open, "TEMP_JOURNAL", INT2FIX(SQLITE_OPEN_TEMP_JOURNAL));
109
- rb_define_const(mSqlite3Open, "SUBJOURNAL", INT2FIX(SQLITE_OPEN_SUBJOURNAL));
110
- rb_define_const(mSqlite3Open, "MASTER_JOURNAL", INT2FIX(SQLITE_OPEN_MASTER_JOURNAL));
111
- rb_define_const(mSqlite3Open, "NOMUTEX", INT2FIX(SQLITE_OPEN_NOMUTEX));
112
- rb_define_const(mSqlite3Open, "FULLMUTEX", INT2FIX(SQLITE_OPEN_FULLMUTEX));
127
+ VALUE mSqlite3Constants;
128
+ VALUE mSqlite3Open;
129
+
130
+ mSqlite3Constants = rb_define_module_under(mSqlite3, "Constants");
131
+
132
+ /* sqlite3_open_v2 flags for Database::new */
133
+ mSqlite3Open = rb_define_module_under(mSqlite3Constants, "Open");
134
+
135
+ /* symbols = IO.readlines('sqlite3.h').map { |n| /\A#define\s+(SQLITE_OPEN_\w+)\s/ =~ n && $1 }.compact
136
+ * pad = symbols.map(&:length).max - 9
137
+ * symbols.each { |s| printf %Q{ rb_define_const(mSqlite3Open, %-#{pad}s INT2FIX(#{s}));\n}, '"' + s[12..-1] + '",' }
138
+ */
139
+ rb_define_const(mSqlite3Open, "READONLY", INT2FIX(SQLITE_OPEN_READONLY));
140
+ rb_define_const(mSqlite3Open, "READWRITE", INT2FIX(SQLITE_OPEN_READWRITE));
141
+ rb_define_const(mSqlite3Open, "CREATE", INT2FIX(SQLITE_OPEN_CREATE));
142
+ rb_define_const(mSqlite3Open, "DELETEONCLOSE", INT2FIX(SQLITE_OPEN_DELETEONCLOSE));
143
+ rb_define_const(mSqlite3Open, "EXCLUSIVE", INT2FIX(SQLITE_OPEN_EXCLUSIVE));
144
+ rb_define_const(mSqlite3Open, "MAIN_DB", INT2FIX(SQLITE_OPEN_MAIN_DB));
145
+ rb_define_const(mSqlite3Open, "TEMP_DB", INT2FIX(SQLITE_OPEN_TEMP_DB));
146
+ rb_define_const(mSqlite3Open, "TRANSIENT_DB", INT2FIX(SQLITE_OPEN_TRANSIENT_DB));
147
+ rb_define_const(mSqlite3Open, "MAIN_JOURNAL", INT2FIX(SQLITE_OPEN_MAIN_JOURNAL));
148
+ rb_define_const(mSqlite3Open, "TEMP_JOURNAL", INT2FIX(SQLITE_OPEN_TEMP_JOURNAL));
149
+ rb_define_const(mSqlite3Open, "SUBJOURNAL", INT2FIX(SQLITE_OPEN_SUBJOURNAL));
150
+ rb_define_const(mSqlite3Open, "MASTER_JOURNAL",
151
+ INT2FIX(SQLITE_OPEN_MASTER_JOURNAL)); /* pre-3.33.0 */
152
+ rb_define_const(mSqlite3Open, "SUPER_JOURNAL", INT2FIX(SQLITE_OPEN_MASTER_JOURNAL));
153
+ rb_define_const(mSqlite3Open, "NOMUTEX", INT2FIX(SQLITE_OPEN_NOMUTEX));
154
+ rb_define_const(mSqlite3Open, "FULLMUTEX", INT2FIX(SQLITE_OPEN_FULLMUTEX));
113
155
  #ifdef SQLITE_OPEN_AUTOPROXY
114
- /* SQLITE_VERSION_NUMBER>=3007002 */
115
- rb_define_const(mSqlite3Open, "AUTOPROXY", INT2FIX(SQLITE_OPEN_AUTOPROXY));
116
- rb_define_const(mSqlite3Open, "SHAREDCACHE", INT2FIX(SQLITE_OPEN_SHAREDCACHE));
117
- rb_define_const(mSqlite3Open, "PRIVATECACHE", INT2FIX(SQLITE_OPEN_PRIVATECACHE));
118
- rb_define_const(mSqlite3Open, "WAL", INT2FIX(SQLITE_OPEN_WAL));
156
+ /* SQLITE_VERSION_NUMBER>=3007002 */
157
+ rb_define_const(mSqlite3Open, "AUTOPROXY", INT2FIX(SQLITE_OPEN_AUTOPROXY));
158
+ rb_define_const(mSqlite3Open, "SHAREDCACHE", INT2FIX(SQLITE_OPEN_SHAREDCACHE));
159
+ rb_define_const(mSqlite3Open, "PRIVATECACHE", INT2FIX(SQLITE_OPEN_PRIVATECACHE));
160
+ rb_define_const(mSqlite3Open, "WAL", INT2FIX(SQLITE_OPEN_WAL));
119
161
  #endif
120
162
  #ifdef SQLITE_OPEN_URI
121
- /* SQLITE_VERSION_NUMBER>=3007007 */
122
- rb_define_const(mSqlite3Open, "URI", INT2FIX(SQLITE_OPEN_URI));
163
+ /* SQLITE_VERSION_NUMBER>=3007007 */
164
+ rb_define_const(mSqlite3Open, "URI", INT2FIX(SQLITE_OPEN_URI));
123
165
  #endif
124
166
  #ifdef SQLITE_OPEN_MEMORY
125
- /* SQLITE_VERSION_NUMBER>=3007013 */
126
- rb_define_const(mSqlite3Open, "MEMORY", INT2FIX(SQLITE_OPEN_MEMORY));
167
+ /* SQLITE_VERSION_NUMBER>=3007013 */
168
+ rb_define_const(mSqlite3Open, "MEMORY", INT2FIX(SQLITE_OPEN_MEMORY));
127
169
  #endif
128
170
  }
129
171
 
130
172
  RUBY_FUNC_EXPORTED
131
- void Init_sqlite3_native(void)
173
+ void
174
+ Init_sqlite3_native(void)
132
175
  {
133
- /*
134
- * SQLite3 is a wrapper around the popular database
135
- * sqlite[http://sqlite.org].
136
- *
137
- * For an example of usage, see SQLite3::Database.
138
- */
139
- mSqlite3 = rb_define_module("SQLite3");
140
-
141
- /* A class for differentiating between strings and blobs, when binding them
142
- * into statements.
143
- */
144
- cSqlite3Blob = rb_define_class_under(mSqlite3, "Blob", rb_cString);
145
-
146
- /* Initialize the sqlite3 library */
176
+ /*
177
+ * SQLite3 is a wrapper around the popular database
178
+ * sqlite[http://sqlite.org].
179
+ *
180
+ * For an example of usage, see SQLite3::Database.
181
+ */
182
+ mSqlite3 = rb_define_module("SQLite3");
183
+
184
+ /* A class for differentiating between strings and blobs, when binding them
185
+ * into statements.
186
+ */
187
+ cSqlite3Blob = rb_define_class_under(mSqlite3, "Blob", rb_cString);
188
+
189
+ /* Initialize the sqlite3 library */
147
190
  #ifdef HAVE_SQLITE3_INITIALIZE
148
- sqlite3_initialize();
191
+ sqlite3_initialize();
149
192
  #endif
150
193
 
151
- init_sqlite3_constants();
152
- init_sqlite3_database();
153
- init_sqlite3_statement();
194
+ init_sqlite3_constants();
195
+ init_sqlite3_database();
196
+ init_sqlite3_statement();
154
197
  #ifdef HAVE_SQLITE3_BACKUP_INIT
155
- init_sqlite3_backup();
198
+ init_sqlite3_backup();
199
+ #endif
200
+ rb_define_singleton_method(mSqlite3, "sqlcipher?", using_sqlcipher, 0);
201
+ rb_define_singleton_method(mSqlite3, "libversion", libversion, 0);
202
+ rb_define_singleton_method(mSqlite3, "threadsafe", threadsafe_p, 0);
203
+ rb_define_singleton_method(mSqlite3, "status", rb_sqlite3_status, -1);
204
+
205
+ /* (String) The version of the sqlite3 library compiled with (e.g., "3.46.1") */
206
+ rb_define_const(mSqlite3, "SQLITE_VERSION", rb_str_new2(SQLITE_VERSION));
207
+
208
+ /* (Integer) The version of the sqlite3 library compiled with (e.g., 346001) */
209
+ rb_define_const(mSqlite3, "SQLITE_VERSION_NUMBER", INT2FIX(SQLITE_VERSION_NUMBER));
210
+
211
+ /* (String) The version of the sqlite3 library loaded at runtime (e.g., "3.46.1") */
212
+ rb_define_const(mSqlite3, "SQLITE_LOADED_VERSION", rb_str_new2(sqlite3_libversion()));
213
+
214
+ #ifdef USING_PACKAGED_LIBRARIES
215
+ rb_define_const(mSqlite3, "SQLITE_PACKAGED_LIBRARIES", Qtrue);
216
+ #else
217
+ rb_define_const(mSqlite3, "SQLITE_PACKAGED_LIBRARIES", Qfalse);
156
218
  #endif
157
- rb_define_singleton_method(mSqlite3, "sqlcipher?", using_sqlcipher, 0);
158
- rb_define_singleton_method(mSqlite3, "libversion", libversion, 0);
159
- rb_define_singleton_method(mSqlite3, "threadsafe", threadsafe_p, 0);
160
- rb_define_const(mSqlite3, "SQLITE_VERSION", rb_str_new2(SQLITE_VERSION));
161
- rb_define_const(mSqlite3, "SQLITE_VERSION_NUMBER", INT2FIX(SQLITE_VERSION_NUMBER));
162
- rb_define_const(mSqlite3, "SQLITE_LOADED_VERSION", rb_str_new2(sqlite3_libversion()));
163
219
 
220
+ #ifdef USING_PRECOMPILED_LIBRARIES
221
+ rb_define_const(mSqlite3, "SQLITE_PRECOMPILED_LIBRARIES", Qtrue);
222
+ #else
223
+ rb_define_const(mSqlite3, "SQLITE_PRECOMPILED_LIBRARIES", Qfalse);
224
+ #endif
164
225
  }
@@ -18,8 +18,7 @@
18
18
  #define UTF8_P(_obj) (rb_enc_get_index(_obj) == rb_utf8_encindex())
19
19
  #define UTF16_LE_P(_obj) (rb_enc_get_index(_obj) == rb_enc_find_index("UTF-16LE"))
20
20
  #define UTF16_BE_P(_obj) (rb_enc_get_index(_obj) == rb_enc_find_index("UTF-16BE"))
21
- #define SQLITE3_UTF8_STR_NEW2(_obj) \
22
- (rb_enc_associate_index(rb_str_new2(_obj), rb_utf8_encindex()))
21
+ #define SQLITE3_UTF8_STR_NEW2(_obj) (rb_utf8_str_new_cstr(_obj))
23
22
 
24
23
  #ifdef USING_SQLCIPHER_INC_SUBDIR
25
24
  # include <sqlcipher/sqlite3.h>
@@ -42,6 +41,7 @@ extern VALUE cSqlite3Blob;
42
41
  #include <statement.h>
43
42
  #include <exception.h>
44
43
  #include <backup.h>
44
+ #include <timespec.h>
45
45
 
46
46
  int bignum_to_int64(VALUE big, sqlite3_int64 *result);
47
47