sqlite3 1.5.0.rc1-x86_64-linux
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 +7 -0
- data/.gemtest +0 -0
- data/API_CHANGES.md +49 -0
- data/CHANGELOG.md +419 -0
- data/CONTRIBUTING.md +24 -0
- data/ChangeLog.cvs +88 -0
- data/Gemfile +3 -0
- data/LICENSE +27 -0
- data/LICENSE-DEPENDENCIES +20 -0
- data/README.md +233 -0
- data/ext/sqlite3/aggregator.c +273 -0
- data/ext/sqlite3/aggregator.h +12 -0
- data/ext/sqlite3/backup.c +168 -0
- data/ext/sqlite3/backup.h +15 -0
- data/ext/sqlite3/database.c +853 -0
- data/ext/sqlite3/database.h +17 -0
- data/ext/sqlite3/exception.c +98 -0
- data/ext/sqlite3/exception.h +8 -0
- data/ext/sqlite3/extconf.rb +159 -0
- data/ext/sqlite3/sqlite3.c +163 -0
- data/ext/sqlite3/sqlite3_ruby.h +45 -0
- data/ext/sqlite3/statement.c +442 -0
- data/ext/sqlite3/statement.h +16 -0
- data/faq/faq.md +431 -0
- data/faq/faq.rb +145 -0
- data/faq/faq.yml +426 -0
- data/lib/sqlite3/2.6/sqlite3_native.so +0 -0
- data/lib/sqlite3/2.7/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.0/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.1/sqlite3_native.so +0 -0
- data/lib/sqlite3/constants.rb +50 -0
- data/lib/sqlite3/database.rb +741 -0
- data/lib/sqlite3/errors.rb +35 -0
- data/lib/sqlite3/pragmas.rb +595 -0
- data/lib/sqlite3/resultset.rb +187 -0
- data/lib/sqlite3/statement.rb +145 -0
- data/lib/sqlite3/translator.rb +118 -0
- data/lib/sqlite3/value.rb +57 -0
- data/lib/sqlite3/version.rb +25 -0
- data/lib/sqlite3.rb +15 -0
- data/test/helper.rb +27 -0
- data/test/test_backup.rb +33 -0
- data/test/test_collation.rb +82 -0
- data/test/test_database.rb +538 -0
- data/test/test_database_flags.rb +95 -0
- data/test/test_database_readonly.rb +36 -0
- data/test/test_database_readwrite.rb +41 -0
- data/test/test_deprecated.rb +44 -0
- data/test/test_encoding.rb +155 -0
- data/test/test_integration.rb +507 -0
- data/test/test_integration_aggregate.rb +336 -0
- data/test/test_integration_open_close.rb +30 -0
- data/test/test_integration_pending.rb +115 -0
- data/test/test_integration_resultset.rb +142 -0
- data/test/test_integration_statement.rb +194 -0
- data/test/test_result_set.rb +37 -0
- data/test/test_sqlite3.rb +25 -0
- data/test/test_statement.rb +263 -0
- data/test/test_statement_execute.rb +35 -0
- metadata +190 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
#ifndef SQLITE3_DATABASE_RUBY
|
2
|
+
#define SQLITE3_DATABASE_RUBY
|
3
|
+
|
4
|
+
#include <sqlite3_ruby.h>
|
5
|
+
|
6
|
+
struct _sqlite3Ruby {
|
7
|
+
sqlite3 *db;
|
8
|
+
};
|
9
|
+
|
10
|
+
typedef struct _sqlite3Ruby sqlite3Ruby;
|
11
|
+
typedef sqlite3Ruby * sqlite3RubyPtr;
|
12
|
+
|
13
|
+
void init_sqlite3_database();
|
14
|
+
void set_sqlite3_func_result(sqlite3_context * ctx, VALUE result);
|
15
|
+
VALUE sqlite3val2rb(sqlite3_value * val);
|
16
|
+
|
17
|
+
#endif
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#include <sqlite3_ruby.h>
|
2
|
+
|
3
|
+
void rb_sqlite3_raise(sqlite3 * db, int status)
|
4
|
+
{
|
5
|
+
VALUE klass = Qnil;
|
6
|
+
|
7
|
+
/* Consider only lower 8 bits, to work correctly when
|
8
|
+
extended result codes are enabled. */
|
9
|
+
switch(status & 0xff) {
|
10
|
+
case SQLITE_OK:
|
11
|
+
return;
|
12
|
+
break;
|
13
|
+
case SQLITE_ERROR:
|
14
|
+
klass = rb_path2class("SQLite3::SQLException");
|
15
|
+
break;
|
16
|
+
case SQLITE_INTERNAL:
|
17
|
+
klass = rb_path2class("SQLite3::InternalException");
|
18
|
+
break;
|
19
|
+
case SQLITE_PERM:
|
20
|
+
klass = rb_path2class("SQLite3::PermissionException");
|
21
|
+
break;
|
22
|
+
case SQLITE_ABORT:
|
23
|
+
klass = rb_path2class("SQLite3::AbortException");
|
24
|
+
break;
|
25
|
+
case SQLITE_BUSY:
|
26
|
+
klass = rb_path2class("SQLite3::BusyException");
|
27
|
+
break;
|
28
|
+
case SQLITE_LOCKED:
|
29
|
+
klass = rb_path2class("SQLite3::LockedException");
|
30
|
+
break;
|
31
|
+
case SQLITE_NOMEM:
|
32
|
+
klass = rb_path2class("SQLite3::MemoryException");
|
33
|
+
break;
|
34
|
+
case SQLITE_READONLY:
|
35
|
+
klass = rb_path2class("SQLite3::ReadOnlyException");
|
36
|
+
break;
|
37
|
+
case SQLITE_INTERRUPT:
|
38
|
+
klass = rb_path2class("SQLite3::InterruptException");
|
39
|
+
break;
|
40
|
+
case SQLITE_IOERR:
|
41
|
+
klass = rb_path2class("SQLite3::IOException");
|
42
|
+
break;
|
43
|
+
case SQLITE_CORRUPT:
|
44
|
+
klass = rb_path2class("SQLite3::CorruptException");
|
45
|
+
break;
|
46
|
+
case SQLITE_NOTFOUND:
|
47
|
+
klass = rb_path2class("SQLite3::NotFoundException");
|
48
|
+
break;
|
49
|
+
case SQLITE_FULL:
|
50
|
+
klass = rb_path2class("SQLite3::FullException");
|
51
|
+
break;
|
52
|
+
case SQLITE_CANTOPEN:
|
53
|
+
klass = rb_path2class("SQLite3::CantOpenException");
|
54
|
+
break;
|
55
|
+
case SQLITE_PROTOCOL:
|
56
|
+
klass = rb_path2class("SQLite3::ProtocolException");
|
57
|
+
break;
|
58
|
+
case SQLITE_EMPTY:
|
59
|
+
klass = rb_path2class("SQLite3::EmptyException");
|
60
|
+
break;
|
61
|
+
case SQLITE_SCHEMA:
|
62
|
+
klass = rb_path2class("SQLite3::SchemaChangedException");
|
63
|
+
break;
|
64
|
+
case SQLITE_TOOBIG:
|
65
|
+
klass = rb_path2class("SQLite3::TooBigException");
|
66
|
+
break;
|
67
|
+
case SQLITE_CONSTRAINT:
|
68
|
+
klass = rb_path2class("SQLite3::ConstraintException");
|
69
|
+
break;
|
70
|
+
case SQLITE_MISMATCH:
|
71
|
+
klass = rb_path2class("SQLite3::MismatchException");
|
72
|
+
break;
|
73
|
+
case SQLITE_MISUSE:
|
74
|
+
klass = rb_path2class("SQLite3::MisuseException");
|
75
|
+
break;
|
76
|
+
case SQLITE_NOLFS:
|
77
|
+
klass = rb_path2class("SQLite3::UnsupportedException");
|
78
|
+
break;
|
79
|
+
case SQLITE_AUTH:
|
80
|
+
klass = rb_path2class("SQLite3::AuthorizationException");
|
81
|
+
break;
|
82
|
+
case SQLITE_FORMAT:
|
83
|
+
klass = rb_path2class("SQLite3::FormatException");
|
84
|
+
break;
|
85
|
+
case SQLITE_RANGE:
|
86
|
+
klass = rb_path2class("SQLite3::RangeException");
|
87
|
+
break;
|
88
|
+
case SQLITE_NOTADB:
|
89
|
+
klass = rb_path2class("SQLite3::NotADatabaseException");
|
90
|
+
break;
|
91
|
+
default:
|
92
|
+
klass = rb_eRuntimeError;
|
93
|
+
}
|
94
|
+
|
95
|
+
klass = rb_exc_new2(klass, sqlite3_errmsg(db));
|
96
|
+
rb_iv_set(klass, "@code", INT2FIX(status));
|
97
|
+
rb_exc_raise(klass);
|
98
|
+
}
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require "mkmf"
|
2
|
+
require "mini_portile2"
|
3
|
+
|
4
|
+
module Sqlite3
|
5
|
+
module ExtConf
|
6
|
+
ENV_ALLOWLIST = ["CC", "CFLAGS", "LDFLAGS", "LIBS", "CPPFLAGS", "LT_SYS_LIBRARY_PATH", "CPP"]
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def configure
|
10
|
+
configure_cross_compiler
|
11
|
+
|
12
|
+
if system_libraries?
|
13
|
+
message "Building sqlite3-ruby using system #{libname}.\n"
|
14
|
+
configure_system_libraries
|
15
|
+
else
|
16
|
+
message "Building sqlite3-ruby using packaged sqlite3.\n"
|
17
|
+
configure_packaged_libraries
|
18
|
+
end
|
19
|
+
|
20
|
+
configure_extension
|
21
|
+
|
22
|
+
create_makefile('sqlite3/sqlite3_native')
|
23
|
+
end
|
24
|
+
|
25
|
+
def configure_cross_compiler
|
26
|
+
RbConfig::CONFIG["CC"] = RbConfig::MAKEFILE_CONFIG["CC"] = ENV["CC"] if ENV["CC"]
|
27
|
+
ENV["CC"] = RbConfig::CONFIG["CC"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def system_libraries?
|
31
|
+
sqlcipher? || enable_config("system-libraries")
|
32
|
+
end
|
33
|
+
|
34
|
+
def libname
|
35
|
+
sqlcipher? ? "sqlcipher" : "sqlite3"
|
36
|
+
end
|
37
|
+
|
38
|
+
def sqlcipher?
|
39
|
+
with_config("sqlcipher")
|
40
|
+
end
|
41
|
+
|
42
|
+
def configure_system_libraries
|
43
|
+
pkg_config(libname)
|
44
|
+
append_cflags("-DUSING_SQLCIPHER") if sqlcipher?
|
45
|
+
end
|
46
|
+
|
47
|
+
def configure_packaged_libraries
|
48
|
+
minimal_recipe.tap do |recipe|
|
49
|
+
recipe.configure_options += ["--enable-shared=no", "--enable-static=yes"]
|
50
|
+
ENV.to_h.tap do |env|
|
51
|
+
env["CFLAGS"] = [env["CFLAGS"], "-fPIC"].join(" ") # needed for linking the static library into a shared library
|
52
|
+
recipe.configure_options += env.select { |k,v| ENV_ALLOWLIST.include?(k) }
|
53
|
+
.map { |key, value| "#{key}=#{value.strip}" }
|
54
|
+
end
|
55
|
+
|
56
|
+
unless File.exist?(File.join(recipe.target, recipe.host, recipe.name, recipe.version))
|
57
|
+
recipe.cook
|
58
|
+
end
|
59
|
+
recipe.activate
|
60
|
+
|
61
|
+
ENV["PKG_CONFIG_ALLOW_SYSTEM_CFLAGS"] = "t" # on macos, pkg-config will not return --cflags without this
|
62
|
+
pcfile = File.join(recipe.path, "lib", "pkgconfig", "sqlite3.pc")
|
63
|
+
if pkg_config(pcfile)
|
64
|
+
# see https://bugs.ruby-lang.org/issues/18490
|
65
|
+
libs = xpopen(["pkg-config", "--libs", "--static", pcfile], err: [:child, :out], &:read)
|
66
|
+
libs.split.each { |lib| append_ldflags(lib) } if $?.success?
|
67
|
+
else
|
68
|
+
abort("\nCould not configure the build properly. Please install either the `pkg-config` utility or the `pkg-config` rubygem.\n\n")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def configure_extension
|
74
|
+
if Gem::Requirement.new("< 2.7").satisfied_by?(Gem::Version.new(RUBY_VERSION))
|
75
|
+
append_cflags("-DTAINTING_SUPPORT")
|
76
|
+
end
|
77
|
+
|
78
|
+
abort_could_not_find("sqlite3.h") unless find_header("sqlite3.h")
|
79
|
+
abort_could_not_find(libname) unless find_library(libname, "sqlite3_libversion_number", "sqlite3.h")
|
80
|
+
|
81
|
+
# Functions defined in 1.9 but not 1.8
|
82
|
+
have_func('rb_proc_arity')
|
83
|
+
|
84
|
+
# Functions defined in 2.1 but not 2.0
|
85
|
+
have_func('rb_integer_pack')
|
86
|
+
|
87
|
+
# These functions may not be defined
|
88
|
+
have_func('sqlite3_initialize')
|
89
|
+
have_func('sqlite3_backup_init')
|
90
|
+
have_func('sqlite3_column_database_name')
|
91
|
+
have_func('sqlite3_enable_load_extension')
|
92
|
+
have_func('sqlite3_load_extension')
|
93
|
+
|
94
|
+
unless have_func('sqlite3_open_v2') # https://www.sqlite.org/releaselog/3_5_0.html
|
95
|
+
abort("\nPlease use a version of SQLite3 >= 3.5.0\n\n")
|
96
|
+
end
|
97
|
+
|
98
|
+
have_func('sqlite3_prepare_v2')
|
99
|
+
have_type('sqlite3_int64', 'sqlite3.h')
|
100
|
+
have_type('sqlite3_uint64', 'sqlite3.h')
|
101
|
+
end
|
102
|
+
|
103
|
+
def minimal_recipe
|
104
|
+
MiniPortile.new(libname, sqlite3_config[:version]).tap do |recipe|
|
105
|
+
recipe.files = sqlite3_config[:files]
|
106
|
+
recipe.target = File.join(package_root_dir, "ports")
|
107
|
+
recipe.patch_files = Dir[File.join(package_root_dir, "patches", "*.patch")].sort
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def package_root_dir
|
112
|
+
File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
113
|
+
end
|
114
|
+
|
115
|
+
def sqlite3_config
|
116
|
+
mini_portile_config[:sqlite3]
|
117
|
+
end
|
118
|
+
|
119
|
+
def mini_portile_config
|
120
|
+
{
|
121
|
+
sqlite3: {
|
122
|
+
# checksum verified by first checking the published sha3(256) checksum:
|
123
|
+
#
|
124
|
+
# $ sha3sum -a 256 sqlite-autoconf-3390000.tar.gz
|
125
|
+
# b8e5b3265992350d40c4ad31efc2e6dec6256813f1d5acc8f0ea805e9f33ca2a sqlite-autoconf-3390000.tar.gz
|
126
|
+
#
|
127
|
+
# $ sha256sum sqlite-autoconf-3390000.tar.gz
|
128
|
+
# e90bcaef6dd5813fcdee4e867f6b65f3c9bfd0aec0f1017f9f3bbce1e4ed09e2 sqlite-autoconf-3390000.tar.gz
|
129
|
+
#
|
130
|
+
version: "3.39.0",
|
131
|
+
files: [{
|
132
|
+
url: "https://www.sqlite.org/2022/sqlite-autoconf-3390000.tar.gz",
|
133
|
+
sha256: "e90bcaef6dd5813fcdee4e867f6b65f3c9bfd0aec0f1017f9f3bbce1e4ed09e2",
|
134
|
+
}],
|
135
|
+
}
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
def abort_could_not_find(missing)
|
140
|
+
abort("\nCould not find #{missing}.\nPlease visit https://github.com/sparklemotion/sqlite3-ruby for installation instructions.\n\n")
|
141
|
+
end
|
142
|
+
|
143
|
+
def cross_build?
|
144
|
+
enable_config("cross-build")
|
145
|
+
end
|
146
|
+
|
147
|
+
def download
|
148
|
+
minimal_recipe.download
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
if arg_config("--download-dependencies")
|
155
|
+
Sqlite3::ExtConf.download
|
156
|
+
exit!(0)
|
157
|
+
end
|
158
|
+
|
159
|
+
Sqlite3::ExtConf.configure
|
@@ -0,0 +1,163 @@
|
|
1
|
+
#include <sqlite3_ruby.h>
|
2
|
+
|
3
|
+
VALUE mSqlite3;
|
4
|
+
VALUE cSqlite3Blob;
|
5
|
+
|
6
|
+
int bignum_to_int64(VALUE value, sqlite3_int64 *result)
|
7
|
+
{
|
8
|
+
#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;
|
19
|
+
}
|
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
|
+
#else
|
32
|
+
# ifndef RBIGNUM_LEN
|
33
|
+
# define RBIGNUM_LEN(x) RBIGNUM(x)->len
|
34
|
+
# 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
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
*result = (sqlite3_int64)NUM2LL(value);
|
59
|
+
return 1;
|
60
|
+
#endif
|
61
|
+
}
|
62
|
+
|
63
|
+
static VALUE libversion(VALUE UNUSED(klass))
|
64
|
+
{
|
65
|
+
return INT2NUM(sqlite3_libversion_number());
|
66
|
+
}
|
67
|
+
|
68
|
+
static VALUE using_sqlcipher(VALUE UNUSED(klass))
|
69
|
+
{
|
70
|
+
#ifdef USING_SQLCIPHER
|
71
|
+
return Qtrue;
|
72
|
+
#else
|
73
|
+
return Qfalse;
|
74
|
+
#endif
|
75
|
+
}
|
76
|
+
|
77
|
+
/* Returns the compile time setting of the SQLITE_THREADSAFE flag.
|
78
|
+
* See: https://www.sqlite.org/c3ref/threadsafe.html
|
79
|
+
*/
|
80
|
+
static VALUE threadsafe_p(VALUE UNUSED(klass))
|
81
|
+
{
|
82
|
+
return INT2NUM(sqlite3_threadsafe());
|
83
|
+
}
|
84
|
+
|
85
|
+
void init_sqlite3_constants()
|
86
|
+
{
|
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));
|
113
|
+
#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));
|
119
|
+
#endif
|
120
|
+
#ifdef SQLITE_OPEN_URI
|
121
|
+
/* SQLITE_VERSION_NUMBER>=3007007 */
|
122
|
+
rb_define_const(mSqlite3Open, "URI", INT2FIX(SQLITE_OPEN_URI));
|
123
|
+
#endif
|
124
|
+
#ifdef SQLITE_OPEN_MEMORY
|
125
|
+
/* SQLITE_VERSION_NUMBER>=3007013 */
|
126
|
+
rb_define_const(mSqlite3Open, "MEMORY", INT2FIX(SQLITE_OPEN_MEMORY));
|
127
|
+
#endif
|
128
|
+
}
|
129
|
+
|
130
|
+
void Init_sqlite3_native()
|
131
|
+
{
|
132
|
+
/*
|
133
|
+
* SQLite3 is a wrapper around the popular database
|
134
|
+
* sqlite[http://sqlite.org].
|
135
|
+
*
|
136
|
+
* For an example of usage, see SQLite3::Database.
|
137
|
+
*/
|
138
|
+
mSqlite3 = rb_define_module("SQLite3");
|
139
|
+
|
140
|
+
/* A class for differentiating between strings and blobs, when binding them
|
141
|
+
* into statements.
|
142
|
+
*/
|
143
|
+
cSqlite3Blob = rb_define_class_under(mSqlite3, "Blob", rb_cString);
|
144
|
+
|
145
|
+
/* Initialize the sqlite3 library */
|
146
|
+
#ifdef HAVE_SQLITE3_INITIALIZE
|
147
|
+
sqlite3_initialize();
|
148
|
+
#endif
|
149
|
+
|
150
|
+
init_sqlite3_constants();
|
151
|
+
init_sqlite3_database();
|
152
|
+
init_sqlite3_statement();
|
153
|
+
#ifdef HAVE_SQLITE3_BACKUP_INIT
|
154
|
+
init_sqlite3_backup();
|
155
|
+
#endif
|
156
|
+
rb_define_singleton_method(mSqlite3, "sqlcipher?", using_sqlcipher, 0);
|
157
|
+
rb_define_singleton_method(mSqlite3, "libversion", libversion, 0);
|
158
|
+
rb_define_singleton_method(mSqlite3, "threadsafe", threadsafe_p, 0);
|
159
|
+
rb_define_const(mSqlite3, "SQLITE_VERSION", rb_str_new2(SQLITE_VERSION));
|
160
|
+
rb_define_const(mSqlite3, "SQLITE_VERSION_NUMBER", INT2FIX(SQLITE_VERSION_NUMBER));
|
161
|
+
rb_define_const(mSqlite3, "SQLITE_LOADED_VERSION", rb_str_new2(sqlite3_libversion()));
|
162
|
+
|
163
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#ifndef SQLITE3_RUBY
|
2
|
+
#define SQLITE3_RUBY
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
|
6
|
+
#ifdef UNUSED
|
7
|
+
#elif defined(__GNUC__)
|
8
|
+
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
|
9
|
+
#elif defined(__LCLINT__)
|
10
|
+
# define UNUSED(x) /*@unused@*/ x
|
11
|
+
#else
|
12
|
+
# define UNUSED(x) x
|
13
|
+
#endif
|
14
|
+
|
15
|
+
#include <ruby/encoding.h>
|
16
|
+
|
17
|
+
#define USASCII_P(_obj) (rb_enc_get_index(_obj) == rb_usascii_encindex())
|
18
|
+
#define UTF8_P(_obj) (rb_enc_get_index(_obj) == rb_utf8_encindex())
|
19
|
+
#define UTF16_LE_P(_obj) (rb_enc_get_index(_obj) == rb_enc_find_index("UTF-16LE"))
|
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()))
|
23
|
+
|
24
|
+
|
25
|
+
#include <sqlite3.h>
|
26
|
+
|
27
|
+
#ifndef HAVE_TYPE_SQLITE3_INT64
|
28
|
+
typedef sqlite_int64 sqlite3_int64;
|
29
|
+
#endif
|
30
|
+
|
31
|
+
#ifndef HAVE_TYPE_SQLITE3_UINT64
|
32
|
+
typedef sqlite_uint64 sqlite3_uint64;
|
33
|
+
#endif
|
34
|
+
|
35
|
+
extern VALUE mSqlite3;
|
36
|
+
extern VALUE cSqlite3Blob;
|
37
|
+
|
38
|
+
#include <database.h>
|
39
|
+
#include <statement.h>
|
40
|
+
#include <exception.h>
|
41
|
+
#include <backup.h>
|
42
|
+
|
43
|
+
int bignum_to_int64(VALUE big, sqlite3_int64 *result);
|
44
|
+
|
45
|
+
#endif
|