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/database.h
CHANGED
@@ -3,17 +3,26 @@
|
|
3
3
|
|
4
4
|
#include <sqlite3_ruby.h>
|
5
5
|
|
6
|
+
/* bits in the `flags` field */
|
7
|
+
#define SQLITE3_RB_DATABASE_READONLY 0x01
|
8
|
+
#define SQLITE3_RB_DATABASE_DISCARDED 0x02
|
9
|
+
|
6
10
|
struct _sqlite3Ruby {
|
7
|
-
|
11
|
+
sqlite3 *db;
|
12
|
+
VALUE busy_handler;
|
13
|
+
int stmt_timeout;
|
14
|
+
struct timespec stmt_deadline;
|
15
|
+
rb_pid_t owner;
|
16
|
+
int flags;
|
8
17
|
};
|
9
18
|
|
10
19
|
typedef struct _sqlite3Ruby sqlite3Ruby;
|
11
|
-
typedef sqlite3Ruby *
|
20
|
+
typedef sqlite3Ruby *sqlite3RubyPtr;
|
12
21
|
|
13
22
|
void init_sqlite3_database();
|
14
|
-
void set_sqlite3_func_result(sqlite3_context *
|
23
|
+
void set_sqlite3_func_result(sqlite3_context *ctx, VALUE result);
|
15
24
|
|
16
25
|
sqlite3RubyPtr sqlite3_database_unwrap(VALUE database);
|
17
|
-
VALUE sqlite3val2rb(sqlite3_value *
|
26
|
+
VALUE sqlite3val2rb(sqlite3_value *val);
|
18
27
|
|
19
28
|
#endif
|
data/ext/sqlite3/exception.c
CHANGED
@@ -1,98 +1,122 @@
|
|
1
1
|
#include <sqlite3_ruby.h>
|
2
2
|
|
3
|
-
|
3
|
+
static VALUE
|
4
|
+
status2klass(int status)
|
4
5
|
{
|
5
|
-
|
6
|
+
/* Consider only lower 8 bits, to work correctly when
|
7
|
+
extended result codes are enabled. */
|
8
|
+
switch (status & 0xff) {
|
9
|
+
case SQLITE_OK:
|
10
|
+
return Qnil;
|
11
|
+
case SQLITE_ERROR:
|
12
|
+
return rb_path2class("SQLite3::SQLException");
|
13
|
+
case SQLITE_INTERNAL:
|
14
|
+
return rb_path2class("SQLite3::InternalException");
|
15
|
+
case SQLITE_PERM:
|
16
|
+
return rb_path2class("SQLite3::PermissionException");
|
17
|
+
case SQLITE_ABORT:
|
18
|
+
return rb_path2class("SQLite3::AbortException");
|
19
|
+
case SQLITE_BUSY:
|
20
|
+
return rb_path2class("SQLite3::BusyException");
|
21
|
+
case SQLITE_LOCKED:
|
22
|
+
return rb_path2class("SQLite3::LockedException");
|
23
|
+
case SQLITE_NOMEM:
|
24
|
+
return rb_path2class("SQLite3::MemoryException");
|
25
|
+
case SQLITE_READONLY:
|
26
|
+
return rb_path2class("SQLite3::ReadOnlyException");
|
27
|
+
case SQLITE_INTERRUPT:
|
28
|
+
return rb_path2class("SQLite3::InterruptException");
|
29
|
+
case SQLITE_IOERR:
|
30
|
+
return rb_path2class("SQLite3::IOException");
|
31
|
+
case SQLITE_CORRUPT:
|
32
|
+
return rb_path2class("SQLite3::CorruptException");
|
33
|
+
case SQLITE_NOTFOUND:
|
34
|
+
return rb_path2class("SQLite3::NotFoundException");
|
35
|
+
case SQLITE_FULL:
|
36
|
+
return rb_path2class("SQLite3::FullException");
|
37
|
+
case SQLITE_CANTOPEN:
|
38
|
+
return rb_path2class("SQLite3::CantOpenException");
|
39
|
+
case SQLITE_PROTOCOL:
|
40
|
+
return rb_path2class("SQLite3::ProtocolException");
|
41
|
+
case SQLITE_EMPTY:
|
42
|
+
return rb_path2class("SQLite3::EmptyException");
|
43
|
+
case SQLITE_SCHEMA:
|
44
|
+
return rb_path2class("SQLite3::SchemaChangedException");
|
45
|
+
case SQLITE_TOOBIG:
|
46
|
+
return rb_path2class("SQLite3::TooBigException");
|
47
|
+
case SQLITE_CONSTRAINT:
|
48
|
+
return rb_path2class("SQLite3::ConstraintException");
|
49
|
+
case SQLITE_MISMATCH:
|
50
|
+
return rb_path2class("SQLite3::MismatchException");
|
51
|
+
case SQLITE_MISUSE:
|
52
|
+
return rb_path2class("SQLite3::MisuseException");
|
53
|
+
case SQLITE_NOLFS:
|
54
|
+
return rb_path2class("SQLite3::UnsupportedException");
|
55
|
+
case SQLITE_AUTH:
|
56
|
+
return rb_path2class("SQLite3::AuthorizationException");
|
57
|
+
case SQLITE_FORMAT:
|
58
|
+
return rb_path2class("SQLite3::FormatException");
|
59
|
+
case SQLITE_RANGE:
|
60
|
+
return rb_path2class("SQLite3::RangeException");
|
61
|
+
case SQLITE_NOTADB:
|
62
|
+
return rb_path2class("SQLite3::NotADatabaseException");
|
63
|
+
default:
|
64
|
+
return rb_path2class("SQLite3::Exception");
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
void
|
69
|
+
rb_sqlite3_raise(sqlite3 *db, int status)
|
70
|
+
{
|
71
|
+
VALUE klass = status2klass(status);
|
72
|
+
if (NIL_P(klass)) {
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
|
76
|
+
VALUE exception = rb_exc_new2(klass, sqlite3_errmsg(db));
|
77
|
+
rb_iv_set(exception, "@code", INT2FIX(status));
|
78
|
+
|
79
|
+
rb_exc_raise(exception);
|
80
|
+
}
|
81
|
+
|
82
|
+
/*
|
83
|
+
* accepts a sqlite3 error message as the final argument, which will be `sqlite3_free`d
|
84
|
+
*/
|
85
|
+
void
|
86
|
+
rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg)
|
87
|
+
{
|
88
|
+
VALUE klass = status2klass(status);
|
89
|
+
if (NIL_P(klass)) {
|
90
|
+
return;
|
91
|
+
}
|
92
|
+
|
93
|
+
VALUE exception = rb_exc_new2(klass, msg);
|
94
|
+
rb_iv_set(exception, "@code", INT2FIX(status));
|
95
|
+
sqlite3_free((void *)msg);
|
96
|
+
|
97
|
+
rb_exc_raise(exception);
|
98
|
+
}
|
99
|
+
|
100
|
+
void
|
101
|
+
rb_sqlite3_raise_with_sql(sqlite3 *db, int status, const char *sql)
|
102
|
+
{
|
103
|
+
VALUE klass = status2klass(status);
|
104
|
+
if (NIL_P(klass)) {
|
105
|
+
return;
|
106
|
+
}
|
107
|
+
|
108
|
+
const char *error_msg = sqlite3_errmsg(db);
|
109
|
+
int error_offset = -1;
|
110
|
+
#ifdef HAVE_SQLITE3_ERROR_OFFSET
|
111
|
+
error_offset = sqlite3_error_offset(db);
|
112
|
+
#endif
|
6
113
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
}
|
114
|
+
VALUE exception = rb_exc_new2(klass, error_msg);
|
115
|
+
rb_iv_set(exception, "@code", INT2FIX(status));
|
116
|
+
if (sql) {
|
117
|
+
rb_iv_set(exception, "@sql", rb_str_new2(sql));
|
118
|
+
rb_iv_set(exception, "@sql_offset", INT2FIX(error_offset));
|
119
|
+
}
|
94
120
|
|
95
|
-
|
96
|
-
rb_iv_set(klass, "@code", INT2FIX(status));
|
97
|
-
rb_exc_raise(klass);
|
121
|
+
rb_exc_raise(exception);
|
98
122
|
}
|
data/ext/sqlite3/exception.h
CHANGED
@@ -2,7 +2,11 @@
|
|
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);
|
6
|
+
#define CHECK_PREPARE(_db, _status, _sql) rb_sqlite3_raise_with_sql(_db, _status, _sql)
|
5
7
|
|
6
|
-
void rb_sqlite3_raise(sqlite3 *
|
8
|
+
void rb_sqlite3_raise(sqlite3 *db, int status);
|
9
|
+
void rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg);
|
10
|
+
void rb_sqlite3_raise_with_sql(sqlite3 *db, int status, const char *sql);
|
7
11
|
|
8
12
|
#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
|
@@ -50,9 +50,10 @@ module Sqlite3
|
|
50
50
|
def configure_packaged_libraries
|
51
51
|
minimal_recipe.tap do |recipe|
|
52
52
|
recipe.configure_options += [
|
53
|
-
"--
|
54
|
-
"--enable-static
|
55
|
-
"--
|
53
|
+
"--disable-shared",
|
54
|
+
"--enable-static",
|
55
|
+
"--disable-tcl",
|
56
|
+
"--enable-fts5"
|
56
57
|
]
|
57
58
|
ENV.to_h.tap do |env|
|
58
59
|
user_cflags = with_config("sqlite-cflags")
|
@@ -61,10 +62,13 @@ module Sqlite3
|
|
61
62
|
"-O2", # see https://github.com/sparklemotion/sqlite3-ruby/issues/335 for some benchmarks
|
62
63
|
"-fvisibility=hidden", # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
|
63
64
|
"-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1",
|
65
|
+
"-DSQLITE_USE_URI=1",
|
66
|
+
"-DSQLITE_ENABLE_DBPAGE_VTAB=1",
|
67
|
+
"-DSQLITE_ENABLE_DBSTAT_VTAB=1"
|
64
68
|
]
|
65
69
|
env["CFLAGS"] = [user_cflags, env["CFLAGS"], more_cflags].flatten.join(" ")
|
66
|
-
recipe.configure_options += env.select { |k,v| ENV_ALLOWLIST.include?(k) }
|
67
|
-
|
70
|
+
recipe.configure_options += env.select { |k, v| ENV_ALLOWLIST.include?(k) }
|
71
|
+
.map { |key, value| "#{key}=#{value.strip}" }
|
68
72
|
end
|
69
73
|
|
70
74
|
unless File.exist?(File.join(recipe.target, recipe.host, recipe.name, recipe.version))
|
@@ -93,14 +97,13 @@ module Sqlite3
|
|
93
97
|
end
|
94
98
|
|
95
99
|
ldflags.each { |ldflag| append_ldflags(ldflag) }
|
100
|
+
|
101
|
+
append_cppflags("-DUSING_PACKAGED_LIBRARIES")
|
102
|
+
append_cppflags("-DUSING_PRECOMPILED_LIBRARIES") if cross_build?
|
96
103
|
end
|
97
104
|
end
|
98
105
|
|
99
106
|
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
107
|
append_cflags("-fvisibility=hidden") # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
|
105
108
|
|
106
109
|
if find_header("sqlite3.h")
|
@@ -113,26 +116,33 @@ module Sqlite3
|
|
113
116
|
|
114
117
|
abort_could_not_find(libname) unless find_library(libname, "sqlite3_libversion_number", "sqlite3.h")
|
115
118
|
|
119
|
+
# Truffle Ruby doesn't support this yet:
|
120
|
+
# https://github.com/oracle/truffleruby/issues/3408
|
121
|
+
have_func("rb_enc_interned_str_cstr")
|
122
|
+
|
116
123
|
# Functions defined in 1.9 but not 1.8
|
117
|
-
have_func(
|
124
|
+
have_func("rb_proc_arity")
|
118
125
|
|
119
126
|
# Functions defined in 2.1 but not 2.0
|
120
|
-
have_func(
|
127
|
+
have_func("rb_integer_pack")
|
121
128
|
|
122
129
|
# These functions may not be defined
|
123
|
-
have_func(
|
124
|
-
have_func(
|
125
|
-
have_func(
|
126
|
-
have_func(
|
127
|
-
have_func(
|
130
|
+
have_func("sqlite3_initialize")
|
131
|
+
have_func("sqlite3_backup_init")
|
132
|
+
have_func("sqlite3_column_database_name")
|
133
|
+
have_func("sqlite3_enable_load_extension")
|
134
|
+
have_func("sqlite3_load_extension")
|
128
135
|
|
129
|
-
unless have_func(
|
136
|
+
unless have_func("sqlite3_open_v2") # https://www.sqlite.org/releaselog/3_5_0.html
|
130
137
|
abort("\nPlease use a version of SQLite3 >= 3.5.0\n\n")
|
131
138
|
end
|
132
139
|
|
133
|
-
have_func(
|
134
|
-
|
135
|
-
|
140
|
+
have_func("sqlite3_prepare_v2")
|
141
|
+
have_func("sqlite3_db_name", "sqlite3.h") # v3.39.0
|
142
|
+
have_func("sqlite3_error_offset", "sqlite3.h") # v3.38.0
|
143
|
+
|
144
|
+
have_type("sqlite3_int64", "sqlite3.h")
|
145
|
+
have_type("sqlite3_uint64", "sqlite3.h")
|
136
146
|
end
|
137
147
|
|
138
148
|
def minimal_recipe
|
@@ -158,8 +168,7 @@ module Sqlite3
|
|
158
168
|
end
|
159
169
|
|
160
170
|
def mini_portile_config
|
161
|
-
|
162
|
-
YAML.load_file(File.join(package_root_dir, "dependencies.yml"))
|
171
|
+
YAML.load_file(File.join(package_root_dir, "dependencies.yml"), symbolize_names: true)
|
163
172
|
end
|
164
173
|
|
165
174
|
def abort_could_not_find(missing)
|
@@ -167,7 +176,7 @@ module Sqlite3
|
|
167
176
|
end
|
168
177
|
|
169
178
|
def abort_pkg_config(id)
|
170
|
-
abort("\nCould not configure the build properly (#{id}). Please install
|
179
|
+
abort("\nCould not configure the build properly (#{id}). Please install the `pkg-config` utility.\n\n")
|
171
180
|
end
|
172
181
|
|
173
182
|
def cross_build?
|