sqlite3 1.7.3-x64-mingw32 → 2.0.0-x64-mingw32
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 +152 -0
- data/CONTRIBUTING.md +23 -1
- data/FAQ.md +0 -43
- data/INSTALLATION.md +13 -5
- data/LICENSE +18 -22
- data/README.md +75 -4
- 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 +535 -482
- data/ext/sqlite3/database.h +7 -4
- data/ext/sqlite3/exception.c +111 -92
- data/ext/sqlite3/exception.h +3 -1
- data/ext/sqlite3/extconf.rb +21 -22
- data/ext/sqlite3/sqlite3.c +159 -115
- data/ext/sqlite3/sqlite3_ruby.h +2 -2
- data/ext/sqlite3/statement.c +516 -300
- data/ext/sqlite3/statement.h +3 -3
- data/ext/sqlite3/timespec.h +20 -0
- data/lib/sqlite3/3.0/sqlite3_native.so +0 -0
- data/lib/sqlite3/constants.rb +171 -47
- data/lib/sqlite3/database.rb +105 -165
- data/lib/sqlite3/errors.rb +26 -1
- data/lib/sqlite3/pragmas.rb +126 -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 +1 -21
- data/lib/sqlite3.rb +6 -4
- metadata +3 -28
- 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/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/database.h
CHANGED
@@ -4,16 +4,19 @@
|
|
4
4
|
#include <sqlite3_ruby.h>
|
5
5
|
|
6
6
|
struct _sqlite3Ruby {
|
7
|
-
|
7
|
+
sqlite3 *db;
|
8
|
+
VALUE busy_handler;
|
9
|
+
int stmt_timeout;
|
10
|
+
struct timespec stmt_deadline;
|
8
11
|
};
|
9
12
|
|
10
13
|
typedef struct _sqlite3Ruby sqlite3Ruby;
|
11
|
-
typedef sqlite3Ruby *
|
14
|
+
typedef sqlite3Ruby *sqlite3RubyPtr;
|
12
15
|
|
13
16
|
void init_sqlite3_database();
|
14
|
-
void set_sqlite3_func_result(sqlite3_context *
|
17
|
+
void set_sqlite3_func_result(sqlite3_context *ctx, VALUE result);
|
15
18
|
|
16
19
|
sqlite3RubyPtr sqlite3_database_unwrap(VALUE database);
|
17
|
-
VALUE sqlite3val2rb(sqlite3_value *
|
20
|
+
VALUE sqlite3val2rb(sqlite3_value *val);
|
18
21
|
|
19
22
|
#endif
|
data/ext/sqlite3/exception.c
CHANGED
@@ -1,98 +1,117 @@
|
|
1
1
|
#include <sqlite3_ruby.h>
|
2
2
|
|
3
|
-
void
|
3
|
+
void
|
4
|
+
rb_sqlite3_raise(sqlite3 *db, int status)
|
4
5
|
{
|
5
|
-
|
6
|
+
VALUE klass = Qnil;
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
8
|
+
/* Consider only lower 8 bits, to work correctly when
|
9
|
+
extended result codes are enabled. */
|
10
|
+
switch (status & 0xff) {
|
11
|
+
case SQLITE_OK:
|
12
|
+
return;
|
13
|
+
break;
|
14
|
+
case SQLITE_ERROR:
|
15
|
+
klass = rb_path2class("SQLite3::SQLException");
|
16
|
+
break;
|
17
|
+
case SQLITE_INTERNAL:
|
18
|
+
klass = rb_path2class("SQLite3::InternalException");
|
19
|
+
break;
|
20
|
+
case SQLITE_PERM:
|
21
|
+
klass = rb_path2class("SQLite3::PermissionException");
|
22
|
+
break;
|
23
|
+
case SQLITE_ABORT:
|
24
|
+
klass = rb_path2class("SQLite3::AbortException");
|
25
|
+
break;
|
26
|
+
case SQLITE_BUSY:
|
27
|
+
klass = rb_path2class("SQLite3::BusyException");
|
28
|
+
break;
|
29
|
+
case SQLITE_LOCKED:
|
30
|
+
klass = rb_path2class("SQLite3::LockedException");
|
31
|
+
break;
|
32
|
+
case SQLITE_NOMEM:
|
33
|
+
klass = rb_path2class("SQLite3::MemoryException");
|
34
|
+
break;
|
35
|
+
case SQLITE_READONLY:
|
36
|
+
klass = rb_path2class("SQLite3::ReadOnlyException");
|
37
|
+
break;
|
38
|
+
case SQLITE_INTERRUPT:
|
39
|
+
klass = rb_path2class("SQLite3::InterruptException");
|
40
|
+
break;
|
41
|
+
case SQLITE_IOERR:
|
42
|
+
klass = rb_path2class("SQLite3::IOException");
|
43
|
+
break;
|
44
|
+
case SQLITE_CORRUPT:
|
45
|
+
klass = rb_path2class("SQLite3::CorruptException");
|
46
|
+
break;
|
47
|
+
case SQLITE_NOTFOUND:
|
48
|
+
klass = rb_path2class("SQLite3::NotFoundException");
|
49
|
+
break;
|
50
|
+
case SQLITE_FULL:
|
51
|
+
klass = rb_path2class("SQLite3::FullException");
|
52
|
+
break;
|
53
|
+
case SQLITE_CANTOPEN:
|
54
|
+
klass = rb_path2class("SQLite3::CantOpenException");
|
55
|
+
break;
|
56
|
+
case SQLITE_PROTOCOL:
|
57
|
+
klass = rb_path2class("SQLite3::ProtocolException");
|
58
|
+
break;
|
59
|
+
case SQLITE_EMPTY:
|
60
|
+
klass = rb_path2class("SQLite3::EmptyException");
|
61
|
+
break;
|
62
|
+
case SQLITE_SCHEMA:
|
63
|
+
klass = rb_path2class("SQLite3::SchemaChangedException");
|
64
|
+
break;
|
65
|
+
case SQLITE_TOOBIG:
|
66
|
+
klass = rb_path2class("SQLite3::TooBigException");
|
67
|
+
break;
|
68
|
+
case SQLITE_CONSTRAINT:
|
69
|
+
klass = rb_path2class("SQLite3::ConstraintException");
|
70
|
+
break;
|
71
|
+
case SQLITE_MISMATCH:
|
72
|
+
klass = rb_path2class("SQLite3::MismatchException");
|
73
|
+
break;
|
74
|
+
case SQLITE_MISUSE:
|
75
|
+
klass = rb_path2class("SQLite3::MisuseException");
|
76
|
+
break;
|
77
|
+
case SQLITE_NOLFS:
|
78
|
+
klass = rb_path2class("SQLite3::UnsupportedException");
|
79
|
+
break;
|
80
|
+
case SQLITE_AUTH:
|
81
|
+
klass = rb_path2class("SQLite3::AuthorizationException");
|
82
|
+
break;
|
83
|
+
case SQLITE_FORMAT:
|
84
|
+
klass = rb_path2class("SQLite3::FormatException");
|
85
|
+
break;
|
86
|
+
case SQLITE_RANGE:
|
87
|
+
klass = rb_path2class("SQLite3::RangeException");
|
88
|
+
break;
|
89
|
+
case SQLITE_NOTADB:
|
90
|
+
klass = rb_path2class("SQLite3::NotADatabaseException");
|
91
|
+
break;
|
92
|
+
default:
|
93
|
+
klass = rb_path2class("SQLite3::Exception");
|
94
|
+
}
|
94
95
|
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
klass = rb_exc_new2(klass, sqlite3_errmsg(db));
|
97
|
+
rb_iv_set(klass, "@code", INT2FIX(status));
|
98
|
+
rb_exc_raise(klass);
|
99
|
+
}
|
100
|
+
|
101
|
+
/*
|
102
|
+
* accepts a sqlite3 error message as the final argument, which will be `sqlite3_free`d
|
103
|
+
*/
|
104
|
+
void
|
105
|
+
rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg)
|
106
|
+
{
|
107
|
+
VALUE exception;
|
108
|
+
|
109
|
+
if (status == SQLITE_OK) {
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
|
113
|
+
exception = rb_exc_new2(rb_path2class("SQLite3::Exception"), msg);
|
114
|
+
sqlite3_free((void *)msg);
|
115
|
+
rb_iv_set(exception, "@code", INT2FIX(status));
|
116
|
+
rb_exc_raise(exception);
|
98
117
|
}
|
data/ext/sqlite3/exception.h
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
#define SQLITE3_EXCEPTION_RUBY
|
3
3
|
|
4
4
|
#define CHECK(_db, _status) rb_sqlite3_raise(_db, _status);
|
5
|
+
#define CHECK_MSG(_db, _status, _msg) rb_sqlite3_raise_msg(_db, _status, _msg);
|
5
6
|
|
6
|
-
void rb_sqlite3_raise(sqlite3 *
|
7
|
+
void rb_sqlite3_raise(sqlite3 *db, int status);
|
8
|
+
void rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg);
|
7
9
|
|
8
10
|
#endif
|
data/ext/sqlite3/extconf.rb
CHANGED
@@ -19,7 +19,7 @@ module Sqlite3
|
|
19
19
|
|
20
20
|
configure_extension
|
21
21
|
|
22
|
-
create_makefile(
|
22
|
+
create_makefile("sqlite3/sqlite3_native")
|
23
23
|
end
|
24
24
|
|
25
25
|
def configure_cross_compiler
|
@@ -52,7 +52,7 @@ module Sqlite3
|
|
52
52
|
recipe.configure_options += [
|
53
53
|
"--enable-shared=no",
|
54
54
|
"--enable-static=yes",
|
55
|
-
"--enable-fts5"
|
55
|
+
"--enable-fts5"
|
56
56
|
]
|
57
57
|
ENV.to_h.tap do |env|
|
58
58
|
user_cflags = with_config("sqlite-cflags")
|
@@ -60,11 +60,11 @@ module Sqlite3
|
|
60
60
|
"-fPIC", # needed for linking the static library into a shared library
|
61
61
|
"-O2", # see https://github.com/sparklemotion/sqlite3-ruby/issues/335 for some benchmarks
|
62
62
|
"-fvisibility=hidden", # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
|
63
|
-
"-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1"
|
63
|
+
"-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1"
|
64
64
|
]
|
65
65
|
env["CFLAGS"] = [user_cflags, env["CFLAGS"], more_cflags].flatten.join(" ")
|
66
|
-
recipe.configure_options += env.select { |k,v| ENV_ALLOWLIST.include?(k) }
|
67
|
-
|
66
|
+
recipe.configure_options += env.select { |k, v| ENV_ALLOWLIST.include?(k) }
|
67
|
+
.map { |key, value| "#{key}=#{value.strip}" }
|
68
68
|
end
|
69
69
|
|
70
70
|
unless File.exist?(File.join(recipe.target, recipe.host, recipe.name, recipe.version))
|
@@ -97,10 +97,6 @@ module Sqlite3
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def configure_extension
|
100
|
-
if Gem::Requirement.new("< 2.7").satisfied_by?(Gem::Version.new(RUBY_VERSION))
|
101
|
-
append_cppflags("-DTAINTING_SUPPORT")
|
102
|
-
end
|
103
|
-
|
104
100
|
append_cflags("-fvisibility=hidden") # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
|
105
101
|
|
106
102
|
if find_header("sqlite3.h")
|
@@ -113,26 +109,30 @@ module Sqlite3
|
|
113
109
|
|
114
110
|
abort_could_not_find(libname) unless find_library(libname, "sqlite3_libversion_number", "sqlite3.h")
|
115
111
|
|
112
|
+
# Truffle Ruby doesn't support this yet:
|
113
|
+
# https://github.com/oracle/truffleruby/issues/3408
|
114
|
+
have_func("rb_enc_interned_str_cstr")
|
115
|
+
|
116
116
|
# Functions defined in 1.9 but not 1.8
|
117
|
-
have_func(
|
117
|
+
have_func("rb_proc_arity")
|
118
118
|
|
119
119
|
# Functions defined in 2.1 but not 2.0
|
120
|
-
have_func(
|
120
|
+
have_func("rb_integer_pack")
|
121
121
|
|
122
122
|
# These functions may not be defined
|
123
|
-
have_func(
|
124
|
-
have_func(
|
125
|
-
have_func(
|
126
|
-
have_func(
|
127
|
-
have_func(
|
123
|
+
have_func("sqlite3_initialize")
|
124
|
+
have_func("sqlite3_backup_init")
|
125
|
+
have_func("sqlite3_column_database_name")
|
126
|
+
have_func("sqlite3_enable_load_extension")
|
127
|
+
have_func("sqlite3_load_extension")
|
128
128
|
|
129
|
-
unless have_func(
|
129
|
+
unless have_func("sqlite3_open_v2") # https://www.sqlite.org/releaselog/3_5_0.html
|
130
130
|
abort("\nPlease use a version of SQLite3 >= 3.5.0\n\n")
|
131
131
|
end
|
132
132
|
|
133
|
-
have_func(
|
134
|
-
have_type(
|
135
|
-
have_type(
|
133
|
+
have_func("sqlite3_prepare_v2")
|
134
|
+
have_type("sqlite3_int64", "sqlite3.h")
|
135
|
+
have_type("sqlite3_uint64", "sqlite3.h")
|
136
136
|
end
|
137
137
|
|
138
138
|
def minimal_recipe
|
@@ -158,8 +158,7 @@ module Sqlite3
|
|
158
158
|
end
|
159
159
|
|
160
160
|
def mini_portile_config
|
161
|
-
|
162
|
-
YAML.load_file(File.join(package_root_dir, "dependencies.yml"))
|
161
|
+
YAML.load_file(File.join(package_root_dir, "dependencies.yml"), symbolize_names: true)
|
163
162
|
end
|
164
163
|
|
165
164
|
def abort_could_not_find(missing)
|
data/ext/sqlite3/sqlite3.c
CHANGED
@@ -3,162 +3,206 @@
|
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
36
|
+
const long len = RBIGNUM_LEN(value);
|
37
|
+
if (len == 0) {
|
38
|
+
*result = 0;
|
39
|
+
return 1;
|
40
|
+
}
|
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
|
+
}
|
56
57
|
}
|
57
|
-
|
58
|
-
|
59
|
-
return 1;
|
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();
|
156
199
|
#endif
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
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
|
+
rb_define_const(mSqlite3, "SQLITE_VERSION", rb_str_new2(SQLITE_VERSION));
|
205
|
+
rb_define_const(mSqlite3, "SQLITE_VERSION_NUMBER", INT2FIX(SQLITE_VERSION_NUMBER));
|
206
|
+
rb_define_const(mSqlite3, "SQLITE_LOADED_VERSION", rb_str_new2(sqlite3_libversion()));
|
163
207
|
|
164
208
|
}
|