sqlite3-ffi 0.1.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 +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.txt +24 -0
- data/README.md +55 -0
- data/lib/sqlite3/constants.rb +198 -0
- data/lib/sqlite3/database.rb +797 -0
- data/lib/sqlite3/errors.rb +88 -0
- data/lib/sqlite3/ffi/aggregator.rb +89 -0
- data/lib/sqlite3/ffi/backup.rb +59 -0
- data/lib/sqlite3/ffi/c_api.rb +214 -0
- data/lib/sqlite3/ffi/core_ext.rb +14 -0
- data/lib/sqlite3/ffi/database.rb +261 -0
- data/lib/sqlite3/ffi/exception.rb +111 -0
- data/lib/sqlite3/ffi/functions.rb +79 -0
- data/lib/sqlite3/ffi/sqlite3.rb +62 -0
- data/lib/sqlite3/ffi/statement.rb +242 -0
- data/lib/sqlite3/ffi/utils.rb +83 -0
- data/lib/sqlite3/ffi/version.rb +5 -0
- data/lib/sqlite3/ffi.rb +1 -0
- data/lib/sqlite3/fork_safety.rb +66 -0
- data/lib/sqlite3/pragmas.rb +599 -0
- data/lib/sqlite3/resultset.rb +96 -0
- data/lib/sqlite3/sqlite3_native.rb +14 -0
- data/lib/sqlite3/statement.rb +190 -0
- data/lib/sqlite3/value.rb +54 -0
- data/lib/sqlite3/version.rb +4 -0
- data/lib/sqlite3/version_info.rb +17 -0
- data/lib/sqlite3.rb +19 -0
- metadata +87 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require "sqlite3/constants"
|
|
2
|
+
|
|
3
|
+
module SQLite3
|
|
4
|
+
class Exception < ::StandardError
|
|
5
|
+
# A convenience for accessing the error code for this exception.
|
|
6
|
+
attr_reader :code
|
|
7
|
+
|
|
8
|
+
# If the error is associated with a SQL query, this is the query
|
|
9
|
+
attr_reader :sql
|
|
10
|
+
|
|
11
|
+
# If the error is associated with a particular offset in a SQL query, this is the non-negative
|
|
12
|
+
# offset. If the offset is not available, this will be -1.
|
|
13
|
+
attr_reader :sql_offset
|
|
14
|
+
|
|
15
|
+
def message
|
|
16
|
+
[super, sql_error].compact.join(":\n")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private def sql_error
|
|
20
|
+
return nil unless @sql
|
|
21
|
+
return @sql.chomp unless @sql_offset >= 0
|
|
22
|
+
|
|
23
|
+
offset = @sql_offset
|
|
24
|
+
sql.lines.flat_map do |line|
|
|
25
|
+
if offset >= 0 && line.length > offset
|
|
26
|
+
blanks = " " * offset
|
|
27
|
+
offset = -1
|
|
28
|
+
[line.chomp, blanks + "^"]
|
|
29
|
+
else
|
|
30
|
+
offset -= line.length if offset
|
|
31
|
+
line.chomp
|
|
32
|
+
end
|
|
33
|
+
end.join("\n")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class SQLException < Exception; end
|
|
38
|
+
|
|
39
|
+
class InternalException < Exception; end
|
|
40
|
+
|
|
41
|
+
class PermissionException < Exception; end
|
|
42
|
+
|
|
43
|
+
class AbortException < Exception; end
|
|
44
|
+
|
|
45
|
+
class BusyException < Exception; end
|
|
46
|
+
|
|
47
|
+
class LockedException < Exception; end
|
|
48
|
+
|
|
49
|
+
class MemoryException < Exception; end
|
|
50
|
+
|
|
51
|
+
class ReadOnlyException < Exception; end
|
|
52
|
+
|
|
53
|
+
class InterruptException < Exception; end
|
|
54
|
+
|
|
55
|
+
class IOException < Exception; end
|
|
56
|
+
|
|
57
|
+
class CorruptException < Exception; end
|
|
58
|
+
|
|
59
|
+
class NotFoundException < Exception; end
|
|
60
|
+
|
|
61
|
+
class FullException < Exception; end
|
|
62
|
+
|
|
63
|
+
class CantOpenException < Exception; end
|
|
64
|
+
|
|
65
|
+
class ProtocolException < Exception; end
|
|
66
|
+
|
|
67
|
+
class EmptyException < Exception; end
|
|
68
|
+
|
|
69
|
+
class SchemaChangedException < Exception; end
|
|
70
|
+
|
|
71
|
+
class TooBigException < Exception; end
|
|
72
|
+
|
|
73
|
+
class ConstraintException < Exception; end
|
|
74
|
+
|
|
75
|
+
class MismatchException < Exception; end
|
|
76
|
+
|
|
77
|
+
class MisuseException < Exception; end
|
|
78
|
+
|
|
79
|
+
class UnsupportedException < Exception; end
|
|
80
|
+
|
|
81
|
+
class AuthorizationException < Exception; end
|
|
82
|
+
|
|
83
|
+
class FormatException < Exception; end
|
|
84
|
+
|
|
85
|
+
class RangeException < Exception; end
|
|
86
|
+
|
|
87
|
+
class NotADatabaseException < Exception; end
|
|
88
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module SQLite3
|
|
2
|
+
module FFI
|
|
3
|
+
class AggregatorWrapper
|
|
4
|
+
attr_reader :handler_klass, :instances
|
|
5
|
+
|
|
6
|
+
def initialize(handler_klass)
|
|
7
|
+
@handler_klass = handler_klass
|
|
8
|
+
@instances = []
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class AggregatorInstance
|
|
13
|
+
attr_accessor :handler_instance
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.aggregate_instance(ctx)
|
|
17
|
+
aw = FFI.unwrap(CApi.sqlite3_user_data(ctx))
|
|
18
|
+
handler_klass = aw.handler_klass
|
|
19
|
+
inst_ptr = CApi.sqlite3_aggregate_context(ctx, 8)
|
|
20
|
+
|
|
21
|
+
if inst_ptr.null?
|
|
22
|
+
fatal "SQLite is out-of-merory"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if inst_ptr.read_pointer.null?
|
|
26
|
+
instances = aw.instances
|
|
27
|
+
|
|
28
|
+
inst = AggregatorInstance.new
|
|
29
|
+
inst.handler_instance = handler_klass.new
|
|
30
|
+
instances << inst
|
|
31
|
+
inst_ptr.write_pointer(FFI.wrap(inst))
|
|
32
|
+
else
|
|
33
|
+
inst = FFI.unwrap(inst_ptr.read_pointer)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if inst.nil?
|
|
37
|
+
fatal "SQLite called us back on an already destroyed aggregate instance"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
inst
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.aggregate_instance_destroy(ctx)
|
|
44
|
+
aw = FFI.unwrap(CApi.sqlite3_user_data(ctx))
|
|
45
|
+
instances = aw.instances
|
|
46
|
+
inst_ptr = CApi.sqlite3_aggregate_context(ctx, 0)
|
|
47
|
+
|
|
48
|
+
if inst_ptr.null? || inst_ptr.read_pointer.null?
|
|
49
|
+
return
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
inst = FFI.unwrap(inst_ptr.read_pointer)
|
|
53
|
+
|
|
54
|
+
if inst.nil?
|
|
55
|
+
fatal "attempt to destroy aggregate instance twice"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
inst.handler_instance = nil
|
|
59
|
+
if instances.delete(inst).nil?
|
|
60
|
+
fatal "must be in instances at that point"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
inst_ptr.write_pointer(::FFI::Pointer.new(0))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
AGGREGATOR_STEP = ::FFI::Function.new(:void, [:pointer, :int, :pointer]) do |ctx, argc, argv|
|
|
67
|
+
begin
|
|
68
|
+
inst = aggregate_instance(ctx)
|
|
69
|
+
handler_instance = inst.handler_instance
|
|
70
|
+
params = argv.read_array_of_pointer(argc).map { |v| FFI.sqlite3val2rb(v) }
|
|
71
|
+
handler_instance.step(*params)
|
|
72
|
+
rescue => e
|
|
73
|
+
FFI.rb_errinfo = e
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
AGGREGATOR_FINAL = ::FFI::Function.new(:void, [:pointer]) do |ctx|
|
|
78
|
+
begin
|
|
79
|
+
inst = aggregate_instance(ctx)
|
|
80
|
+
handler_instance = inst.handler_instance
|
|
81
|
+
result = handler_instance.finalize
|
|
82
|
+
FFI.set_sqlite3_func_result(ctx, result)
|
|
83
|
+
aggregate_instance_destroy(ctx)
|
|
84
|
+
rescue => e
|
|
85
|
+
FFI.rb_errinfo = e
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module SQLite3
|
|
2
|
+
class Backup
|
|
3
|
+
def initialize(dstdb, dstname, srcdb, srcname)
|
|
4
|
+
if srcdb.closed?
|
|
5
|
+
raise ArgumentError, "cannot backup from a closed database"
|
|
6
|
+
end
|
|
7
|
+
if dstdb.closed?
|
|
8
|
+
raise ArgumentError, "cannot backup to a closed database"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
ddb = dstdb.instance_variable_get(:@db)
|
|
12
|
+
@p =
|
|
13
|
+
FFI::CApi.sqlite3_backup_init(
|
|
14
|
+
ddb,
|
|
15
|
+
FFI.string_value(dstname),
|
|
16
|
+
srcdb.instance_variable_get(:@db),
|
|
17
|
+
FFI.string_value(srcname)
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if @p.null?
|
|
21
|
+
FFI.check(ddb, FFI::CApi.sqlite3_errcode(ddb))
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def step(n_page)
|
|
26
|
+
require_open_backup
|
|
27
|
+
|
|
28
|
+
FFI::CApi.sqlite3_backup_step(@p, n_page)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def finish
|
|
32
|
+
require_open_backup
|
|
33
|
+
|
|
34
|
+
FFI::CApi.sqlite3_backup_finish(@p)
|
|
35
|
+
@p = nil
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def remaining
|
|
40
|
+
require_open_backup
|
|
41
|
+
|
|
42
|
+
FFI::CApi.sqlite3_backup_remaining(@p)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def pagecount
|
|
46
|
+
require_open_backup
|
|
47
|
+
|
|
48
|
+
FFI::CApi.sqlite3_backup_pagecount(@p)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def require_open_backup
|
|
54
|
+
if @p.nil? || @p.null?
|
|
55
|
+
raise SQLite3::Exception, "cannot use a closed backup"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
module SQLite3
|
|
2
|
+
module FFI
|
|
3
|
+
module CApi
|
|
4
|
+
extend ::FFI::Library
|
|
5
|
+
|
|
6
|
+
# TODO vendor sqlite3
|
|
7
|
+
ffi_lib "sqlite3"
|
|
8
|
+
|
|
9
|
+
SQLITE_OK = 0
|
|
10
|
+
SQLITE_ERROR = 1
|
|
11
|
+
SQLITE_INTERNAL = 2
|
|
12
|
+
SQLITE_PERM = 3
|
|
13
|
+
SQLITE_ABORT = 4
|
|
14
|
+
SQLITE_BUSY = 5
|
|
15
|
+
SQLITE_LOCKED = 6
|
|
16
|
+
SQLITE_NOMEM = 7
|
|
17
|
+
SQLITE_READONLY = 8
|
|
18
|
+
SQLITE_INTERRUPT = 9
|
|
19
|
+
SQLITE_IOERR = 10
|
|
20
|
+
SQLITE_CORRUPT = 11
|
|
21
|
+
SQLITE_NOTFOUND = 12
|
|
22
|
+
SQLITE_FULL = 13
|
|
23
|
+
SQLITE_CANTOPEN = 14
|
|
24
|
+
SQLITE_PROTOCOL = 15
|
|
25
|
+
SQLITE_EMPTY = 16
|
|
26
|
+
SQLITE_SCHEMA = 17
|
|
27
|
+
SQLITE_TOOBIG = 18
|
|
28
|
+
SQLITE_CONSTRAINT = 19
|
|
29
|
+
SQLITE_MISMATCH = 20
|
|
30
|
+
SQLITE_MISUSE = 21
|
|
31
|
+
SQLITE_NOLFS = 22
|
|
32
|
+
SQLITE_AUTH = 23
|
|
33
|
+
SQLITE_FORMAT = 24
|
|
34
|
+
SQLITE_RANGE = 25
|
|
35
|
+
SQLITE_NOTADB = 26
|
|
36
|
+
SQLITE_NOTICE = 27
|
|
37
|
+
SQLITE_WARNING = 28
|
|
38
|
+
SQLITE_ROW = 100
|
|
39
|
+
SQLITE_DONE = 101
|
|
40
|
+
|
|
41
|
+
SQLITE_INTEGER = 1
|
|
42
|
+
SQLITE_FLOAT = 2
|
|
43
|
+
SQLITE_TEXT = 3
|
|
44
|
+
SQLITE_BLOB = 4
|
|
45
|
+
SQLITE_NULL = 5
|
|
46
|
+
|
|
47
|
+
SQLITE_UTF8 = 1
|
|
48
|
+
SQLITE_UTF16LE = 2
|
|
49
|
+
SQLITE_UTF16BE = 3
|
|
50
|
+
SQLITE_UTF16 = 4
|
|
51
|
+
SQLITE_ANY = 5
|
|
52
|
+
SQLITE_UTF16_ALIGNED = 8
|
|
53
|
+
|
|
54
|
+
SQLITE_DENY = 1
|
|
55
|
+
SQLITE_IGNORE = 2
|
|
56
|
+
|
|
57
|
+
SQLITE_STATIC = ::FFI::Pointer.new(0)
|
|
58
|
+
SQLITE_TRANSIENT = ::FFI::Pointer.new(-1)
|
|
59
|
+
|
|
60
|
+
SQLITE_DBCONFIG_MAINDBNAME = 1000
|
|
61
|
+
SQLITE_DBCONFIG_LOOKASIDE = 1001
|
|
62
|
+
SQLITE_DBCONFIG_ENABLE_FKEY = 1002
|
|
63
|
+
SQLITE_DBCONFIG_ENABLE_TRIGGER = 1003
|
|
64
|
+
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER = 1004
|
|
65
|
+
SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION = 1005
|
|
66
|
+
SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE = 1006
|
|
67
|
+
SQLITE_DBCONFIG_ENABLE_QPSG = 1007
|
|
68
|
+
SQLITE_DBCONFIG_TRIGGER_EQP = 1008
|
|
69
|
+
SQLITE_DBCONFIG_RESET_DATABASE = 1009
|
|
70
|
+
SQLITE_DBCONFIG_DEFENSIVE = 1010
|
|
71
|
+
SQLITE_DBCONFIG_WRITABLE_SCHEMA = 1011
|
|
72
|
+
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE = 1012
|
|
73
|
+
SQLITE_DBCONFIG_DQS_DML = 1013
|
|
74
|
+
SQLITE_DBCONFIG_DQS_DDL = 1014
|
|
75
|
+
SQLITE_DBCONFIG_ENABLE_VIEW = 1015
|
|
76
|
+
SQLITE_DBCONFIG_LEGACY_FILE_FORMAT = 1016
|
|
77
|
+
SQLITE_DBCONFIG_TRUSTED_SCHEMA = 1017
|
|
78
|
+
SQLITE_DBCONFIG_STMT_SCANSTATUS = 1018
|
|
79
|
+
SQLITE_DBCONFIG_REVERSE_SCANORDER = 1019
|
|
80
|
+
SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE = 1020
|
|
81
|
+
SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE = 1021
|
|
82
|
+
SQLITE_DBCONFIG_ENABLE_COMMENTS = 1022
|
|
83
|
+
SQLITE_DBCONFIG_MAX = 1022
|
|
84
|
+
|
|
85
|
+
SQLITE_OPEN_READONLY = 0x00000001
|
|
86
|
+
SQLITE_OPEN_READWRITE = 0x00000002
|
|
87
|
+
SQLITE_OPEN_CREATE = 0x00000004
|
|
88
|
+
SQLITE_OPEN_DELETEONCLOSE = 0x00000008
|
|
89
|
+
SQLITE_OPEN_EXCLUSIVE = 0x00000010
|
|
90
|
+
SQLITE_OPEN_AUTOPROXY = 0x00000020
|
|
91
|
+
SQLITE_OPEN_URI = 0x00000040
|
|
92
|
+
SQLITE_OPEN_MEMORY = 0x00000080
|
|
93
|
+
SQLITE_OPEN_MAIN_DB = 0x00000100
|
|
94
|
+
SQLITE_OPEN_TEMP_DB = 0x00000200
|
|
95
|
+
SQLITE_OPEN_TRANSIENT_DB = 0x00000400
|
|
96
|
+
SQLITE_OPEN_MAIN_JOURNAL = 0x00000800
|
|
97
|
+
SQLITE_OPEN_TEMP_JOURNAL = 0x00001000
|
|
98
|
+
SQLITE_OPEN_SUBJOURNAL = 0x00002000
|
|
99
|
+
SQLITE_OPEN_SUPER_JOURNAL = 0x00004000
|
|
100
|
+
SQLITE_OPEN_NOMUTEX = 0x00008000
|
|
101
|
+
SQLITE_OPEN_FULLMUTEX = 0x00010000
|
|
102
|
+
SQLITE_OPEN_SHAREDCACHE = 0x00020000
|
|
103
|
+
SQLITE_OPEN_PRIVATECACHE = 0x00040000
|
|
104
|
+
SQLITE_OPEN_WAL = 0x00080000
|
|
105
|
+
SQLITE_OPEN_NOFOLLOW = 0x01000000
|
|
106
|
+
SQLITE_OPEN_EXRESCODE = 0x02000000
|
|
107
|
+
SQLITE_OPEN_MASTER_JOURNAL = 0x00004000
|
|
108
|
+
|
|
109
|
+
SQLITE_STMTSTATUS_FULLSCAN_STEP = 1
|
|
110
|
+
SQLITE_STMTSTATUS_SORT = 2
|
|
111
|
+
SQLITE_STMTSTATUS_AUTOINDEX = 3
|
|
112
|
+
SQLITE_STMTSTATUS_VM_STEP = 4
|
|
113
|
+
SQLITE_STMTSTATUS_REPREPARE = 5
|
|
114
|
+
SQLITE_STMTSTATUS_RUN = 6
|
|
115
|
+
SQLITE_STMTSTATUS_FILTER_MISS = 7
|
|
116
|
+
SQLITE_STMTSTATUS_FILTER_HIT = 8
|
|
117
|
+
SQLITE_STMTSTATUS_MEMUSED = 99
|
|
118
|
+
|
|
119
|
+
SQLITE_TRACE_STMT = 0x01
|
|
120
|
+
SQLITE_TRACE_PROFILE = 0x02
|
|
121
|
+
SQLITE_TRACE_ROW = 0x04
|
|
122
|
+
SQLITE_TRACE_CLOSE = 0x08
|
|
123
|
+
|
|
124
|
+
attach_function :sqlite3_aggregate_context, [:pointer, :int], :pointer
|
|
125
|
+
attach_function :sqlite3_backup_finish, [:pointer], :int
|
|
126
|
+
attach_function :sqlite3_backup_init, [:pointer, :string, :pointer, :string], :pointer
|
|
127
|
+
attach_function :sqlite3_backup_pagecount, [:pointer], :int
|
|
128
|
+
attach_function :sqlite3_backup_remaining, [:pointer], :int
|
|
129
|
+
attach_function :sqlite3_backup_step, [:pointer, :int], :int
|
|
130
|
+
attach_function :sqlite3_bind_blob, [:pointer, :int, :pointer, :int, :pointer], :int
|
|
131
|
+
attach_function :sqlite3_bind_double, [:pointer, :int, :double], :int
|
|
132
|
+
attach_function :sqlite3_bind_int64, [:pointer, :int, :int64], :int
|
|
133
|
+
attach_function :sqlite3_bind_null, [:pointer, :int], :int
|
|
134
|
+
attach_function :sqlite3_bind_parameter_count, [:pointer], :int
|
|
135
|
+
attach_function :sqlite3_bind_parameter_index, [:pointer, :string], :int
|
|
136
|
+
attach_function :sqlite3_bind_text, [:pointer, :int, :string, :int, :pointer], :int
|
|
137
|
+
attach_function :sqlite3_bind_text16, [:pointer, :int, :pointer, :int, :pointer], :int
|
|
138
|
+
attach_function :sqlite3_busy_handler, [:pointer, :pointer, :pointer], :int
|
|
139
|
+
attach_function :sqlite3_busy_timeout, [:pointer, :int], :int
|
|
140
|
+
attach_function :sqlite3_changes, [:pointer], :int
|
|
141
|
+
attach_function :sqlite3_clear_bindings, [:pointer], :int
|
|
142
|
+
attach_function :sqlite3_close_v2, [:pointer], :int
|
|
143
|
+
attach_function :sqlite3_column_blob, [:pointer, :int], :pointer
|
|
144
|
+
attach_function :sqlite3_column_bytes, [:pointer, :int], :int
|
|
145
|
+
attach_function :sqlite3_column_count, [:pointer], :int
|
|
146
|
+
attach_function :sqlite3_column_decltype, [:pointer, :int], :string
|
|
147
|
+
attach_function :sqlite3_column_double, [:pointer, :int], :double
|
|
148
|
+
attach_function :sqlite3_column_int64, [:pointer, :int], :int64
|
|
149
|
+
attach_function :sqlite3_column_name, [:pointer, :int], :string
|
|
150
|
+
attach_function :sqlite3_column_text, [:pointer, :int], :pointer
|
|
151
|
+
attach_function :sqlite3_column_type, [:pointer, :int], :int
|
|
152
|
+
attach_function :sqlite3_complete, [:string], :int
|
|
153
|
+
attach_function :sqlite3_create_collation, [:pointer, :string, :int, :pointer, :pointer], :int
|
|
154
|
+
attach_function :sqlite3_create_function, [:pointer, :string, :int, :int, :pointer, :pointer, :pointer, :pointer], :int
|
|
155
|
+
attach_function :sqlite3_db_config, [:pointer, :int, :varargs], :int
|
|
156
|
+
attach_function :sqlite3_db_handle, [:pointer], :pointer
|
|
157
|
+
attach_function :sqlite3_db_filename, [:pointer, :string], :pointer
|
|
158
|
+
attach_function :sqlite3_db_release_memory, [:pointer], :int
|
|
159
|
+
attach_function :sqlite3_errcode, [:pointer], :int
|
|
160
|
+
attach_function :sqlite3_errmsg, [:pointer], :string
|
|
161
|
+
attach_function :sqlite3_error_offset, [:pointer], :int
|
|
162
|
+
attach_function :sqlite3_exec, [:pointer, :string, :pointer, :pointer, :pointer], :int
|
|
163
|
+
attach_function :sqlite3_expanded_sql, [:pointer], :string
|
|
164
|
+
attach_function :sqlite3_extended_result_codes, [:pointer, :int], :int
|
|
165
|
+
attach_function :sqlite3_file_control, [:pointer, :string, :int, :pointer], :int
|
|
166
|
+
attach_function :sqlite3_finalize, [:pointer], :int
|
|
167
|
+
attach_function :sqlite3_free, [:pointer], :void
|
|
168
|
+
attach_function :sqlite3_get_autocommit, [:pointer], :int
|
|
169
|
+
attach_function :sqlite3_interrupt, [:pointer], :void
|
|
170
|
+
attach_function :sqlite3_last_insert_rowid, [:pointer], :int64
|
|
171
|
+
attach_function :sqlite3_libversion, [], :string
|
|
172
|
+
attach_function :sqlite3_libversion_number, [], :int
|
|
173
|
+
attach_function :sqlite3_open16, [:pointer, :pointer], :int
|
|
174
|
+
attach_function :sqlite3_open_v2, [:string, :pointer, :int, :pointer], :int
|
|
175
|
+
attach_function :sqlite3_prepare_v2, [:pointer, :string, :int, :pointer, :pointer], :int
|
|
176
|
+
attach_function :sqlite3_progress_handler, [:pointer, :int, :pointer, :pointer], :void
|
|
177
|
+
attach_function :sqlite3_reset, [:pointer], :int
|
|
178
|
+
attach_function :sqlite3_result_blob, [:pointer, :pointer, :int, :pointer], :void
|
|
179
|
+
attach_function :sqlite3_result_double, [:pointer, :double], :void
|
|
180
|
+
attach_function :sqlite3_result_int64, [:pointer, :int64], :void
|
|
181
|
+
attach_function :sqlite3_result_null, [:pointer], :void
|
|
182
|
+
attach_function :sqlite3_result_text, [:pointer, :string, :int, :pointer], :void
|
|
183
|
+
attach_function :sqlite3_set_authorizer, [:pointer, :pointer, :pointer], :int
|
|
184
|
+
attach_function :sqlite3_sql, [:pointer], :string
|
|
185
|
+
attach_function :sqlite3_status64, [:int, :pointer, :pointer, :int], :int
|
|
186
|
+
attach_function :sqlite3_step, [:pointer], :int
|
|
187
|
+
attach_function :sqlite3_stmt_status, [:pointer, :int, :int], :int
|
|
188
|
+
attach_function :sqlite3_threadsafe, [], :int
|
|
189
|
+
attach_function :sqlite3_total_changes, [:pointer], :int
|
|
190
|
+
attach_function :sqlite3_trace_v2, [:pointer, :uint, :pointer, :pointer], :int
|
|
191
|
+
attach_function :sqlite3_user_data, [:pointer], :pointer
|
|
192
|
+
attach_function :sqlite3_value_blob, [:pointer], :pointer
|
|
193
|
+
attach_function :sqlite3_value_bytes, [:pointer], :int
|
|
194
|
+
attach_function :sqlite3_value_double, [:pointer], :double
|
|
195
|
+
attach_function :sqlite3_value_int64, [:pointer], :int64
|
|
196
|
+
attach_function :sqlite3_value_text, [:pointer], :pointer
|
|
197
|
+
attach_function :sqlite3_value_type, [:pointer], :int
|
|
198
|
+
|
|
199
|
+
HAVE_SQLITE3_ENABLE_LOAD_EXTENSION = begin
|
|
200
|
+
attach_function :sqlite3_enable_load_extension, [:pointer, :int], :int
|
|
201
|
+
true
|
|
202
|
+
rescue ::FFI::NotFoundError
|
|
203
|
+
false
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
HAVE_SQLITE3_LOAD_EXTENSION = begin
|
|
207
|
+
attach_function :sqlite3_load_extension, [:pointer, :string, :string, :pointer], :int
|
|
208
|
+
true
|
|
209
|
+
rescue ::FFI::NotFoundError
|
|
210
|
+
false
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|