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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +292 -0
- data/CONTRIBUTING.md +33 -7
- data/FAQ.md +43 -77
- data/INSTALLATION.md +14 -6
- data/LICENSE +18 -22
- data/README.md +97 -9
- data/dependencies.yml +10 -11
- data/ext/sqlite3/aggregator.c +142 -145
- data/ext/sqlite3/aggregator.h +2 -4
- data/ext/sqlite3/backup.c +74 -65
- data/ext/sqlite3/backup.h +2 -2
- data/ext/sqlite3/database.c +621 -493
- data/ext/sqlite3/database.h +13 -4
- data/ext/sqlite3/exception.c +116 -92
- data/ext/sqlite3/exception.h +5 -1
- data/ext/sqlite3/extconf.rb +33 -24
- data/ext/sqlite3/sqlite3.c +176 -115
- data/ext/sqlite3/sqlite3_ruby.h +2 -2
- data/ext/sqlite3/statement.c +553 -300
- data/ext/sqlite3/statement.h +4 -3
- data/ext/sqlite3/timespec.h +20 -0
- data/lib/sqlite3/constants.rb +195 -47
- data/lib/sqlite3/database.rb +223 -187
- data/lib/sqlite3/errors.rb +54 -1
- data/lib/sqlite3/fork_safety.rb +66 -0
- data/lib/sqlite3/pragmas.rb +140 -136
- data/lib/sqlite3/resultset.rb +14 -97
- data/lib/sqlite3/statement.rb +58 -13
- data/lib/sqlite3/value.rb +17 -20
- data/lib/sqlite3/version.rb +2 -21
- data/lib/sqlite3/version_info.rb +17 -0
- data/lib/sqlite3.rb +8 -4
- data/ports/archives/sqlite-autoconf-3470200.tar.gz +0 -0
- metadata +9 -37
- data/API_CHANGES.md +0 -49
- data/ChangeLog.cvs +0 -88
- data/Gemfile +0 -10
- data/LICENSE-DEPENDENCIES +0 -20
- data/lib/sqlite3/translator.rb +0 -117
- data/ports/archives/sqlite-autoconf-3450200.tar.gz +0 -0
- data/test/helper.rb +0 -27
- data/test/test_backup.rb +0 -33
- data/test/test_collation.rb +0 -82
- data/test/test_database.rb +0 -668
- data/test/test_database_flags.rb +0 -95
- data/test/test_database_readonly.rb +0 -36
- data/test/test_database_readwrite.rb +0 -41
- data/test/test_deprecated.rb +0 -49
- data/test/test_encoding.rb +0 -165
- data/test/test_integration.rb +0 -507
- data/test/test_integration_aggregate.rb +0 -336
- data/test/test_integration_open_close.rb +0 -30
- data/test/test_integration_pending.rb +0 -115
- data/test/test_integration_resultset.rb +0 -142
- data/test/test_integration_statement.rb +0 -194
- data/test/test_pragmas.rb +0 -22
- data/test/test_result_set.rb +0 -47
- data/test/test_sqlite3.rb +0 -30
- data/test/test_statement.rb +0 -290
- data/test/test_statement_execute.rb +0 -39
data/ext/sqlite3/sqlite3.c
CHANGED
@@ -3,162 +3,223 @@
|
|
3
3
|
VALUE mSqlite3;
|
4
4
|
VALUE cSqlite3Blob;
|
5
5
|
|
6
|
-
int
|
6
|
+
int
|
7
|
+
bignum_to_int64(VALUE value, sqlite3_int64 *result)
|
7
8
|
{
|
8
9
|
#ifdef HAVE_RB_INTEGER_PACK
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
59
|
-
|
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
|
63
|
+
static VALUE
|
64
|
+
libversion(VALUE UNUSED(klass))
|
64
65
|
{
|
65
|
-
|
66
|
+
return INT2NUM(sqlite3_libversion_number());
|
66
67
|
}
|
67
68
|
|
68
|
-
static VALUE
|
69
|
+
static VALUE
|
70
|
+
using_sqlcipher(VALUE UNUSED(klass))
|
69
71
|
{
|
70
72
|
#ifdef USING_SQLCIPHER
|
71
|
-
|
73
|
+
return Qtrue;
|
72
74
|
#else
|
73
|
-
|
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
|
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
|
-
|
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
|
124
|
+
void
|
125
|
+
init_sqlite3_constants(void)
|
86
126
|
{
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
122
|
-
|
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
|
-
|
126
|
-
|
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
|
173
|
+
void
|
174
|
+
Init_sqlite3_native(void)
|
132
175
|
{
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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
|
-
|
191
|
+
sqlite3_initialize();
|
149
192
|
#endif
|
150
193
|
|
151
|
-
|
152
|
-
|
153
|
-
|
194
|
+
init_sqlite3_constants();
|
195
|
+
init_sqlite3_database();
|
196
|
+
init_sqlite3_statement();
|
154
197
|
#ifdef HAVE_SQLITE3_BACKUP_INIT
|
155
|
-
|
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
|
}
|
data/ext/sqlite3/sqlite3_ruby.h
CHANGED
@@ -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
|
|