amalgalite 1.6.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 +7 -0
- data/CONTRIBUTING.md +49 -0
- data/HISTORY.md +346 -0
- data/LICENSE +31 -0
- data/Manifest.txt +104 -0
- data/README.md +65 -0
- data/Rakefile +26 -0
- data/TODO.md +57 -0
- data/bin/amalgalite-pack +147 -0
- data/examples/a.rb +9 -0
- data/examples/blob.rb +88 -0
- data/examples/bootstrap.rb +36 -0
- data/examples/define_aggregate.rb +75 -0
- data/examples/define_function.rb +104 -0
- data/examples/fts5.rb +152 -0
- data/examples/gem-db.rb +94 -0
- data/examples/require_me.rb +11 -0
- data/examples/requires.rb +42 -0
- data/examples/schema-info.rb +34 -0
- data/ext/amalgalite/c/amalgalite.c +355 -0
- data/ext/amalgalite/c/amalgalite.h +151 -0
- data/ext/amalgalite/c/amalgalite_blob.c +240 -0
- data/ext/amalgalite/c/amalgalite_constants.c +1226 -0
- data/ext/amalgalite/c/amalgalite_database.c +1178 -0
- data/ext/amalgalite/c/amalgalite_requires_bootstrap.c +282 -0
- data/ext/amalgalite/c/amalgalite_statement.c +649 -0
- data/ext/amalgalite/c/extconf.rb +62 -0
- data/ext/amalgalite/c/gen_constants.rb +330 -0
- data/ext/amalgalite/c/notes.txt +134 -0
- data/ext/amalgalite/c/sqlite3.c +205352 -0
- data/ext/amalgalite/c/sqlite3.h +10727 -0
- data/ext/amalgalite/c/sqlite3_options.h +4 -0
- data/ext/amalgalite/c/sqlite3ext.h +578 -0
- data/lib/amalgalite.rb +51 -0
- data/lib/amalgalite/2.0/amalgalite.so +0 -0
- data/lib/amalgalite/2.1/amalgalite.so +0 -0
- data/lib/amalgalite/2.2/amalgalite.so +0 -0
- data/lib/amalgalite/2.3/amalgalite.so +0 -0
- data/lib/amalgalite/2.4/amalgalite.so +0 -0
- data/lib/amalgalite/aggregate.rb +67 -0
- data/lib/amalgalite/blob.rb +186 -0
- data/lib/amalgalite/boolean.rb +42 -0
- data/lib/amalgalite/busy_timeout.rb +47 -0
- data/lib/amalgalite/column.rb +99 -0
- data/lib/amalgalite/core_ext/kernel/require.rb +21 -0
- data/lib/amalgalite/csv_table_importer.rb +74 -0
- data/lib/amalgalite/database.rb +984 -0
- data/lib/amalgalite/function.rb +61 -0
- data/lib/amalgalite/index.rb +43 -0
- data/lib/amalgalite/memory_database.rb +15 -0
- data/lib/amalgalite/packer.rb +231 -0
- data/lib/amalgalite/paths.rb +80 -0
- data/lib/amalgalite/profile_tap.rb +131 -0
- data/lib/amalgalite/progress_handler.rb +21 -0
- data/lib/amalgalite/requires.rb +151 -0
- data/lib/amalgalite/schema.rb +225 -0
- data/lib/amalgalite/sqlite3.rb +6 -0
- data/lib/amalgalite/sqlite3/constants.rb +95 -0
- data/lib/amalgalite/sqlite3/database/function.rb +48 -0
- data/lib/amalgalite/sqlite3/database/status.rb +68 -0
- data/lib/amalgalite/sqlite3/status.rb +60 -0
- data/lib/amalgalite/sqlite3/version.rb +55 -0
- data/lib/amalgalite/statement.rb +418 -0
- data/lib/amalgalite/table.rb +91 -0
- data/lib/amalgalite/taps.rb +2 -0
- data/lib/amalgalite/taps/console.rb +27 -0
- data/lib/amalgalite/taps/io.rb +71 -0
- data/lib/amalgalite/trace_tap.rb +35 -0
- data/lib/amalgalite/type_map.rb +63 -0
- data/lib/amalgalite/type_maps/default_map.rb +166 -0
- data/lib/amalgalite/type_maps/storage_map.rb +38 -0
- data/lib/amalgalite/type_maps/text_map.rb +21 -0
- data/lib/amalgalite/version.rb +8 -0
- data/lib/amalgalite/view.rb +26 -0
- data/spec/aggregate_spec.rb +154 -0
- data/spec/amalgalite_spec.rb +4 -0
- data/spec/blob_spec.rb +78 -0
- data/spec/boolean_spec.rb +24 -0
- data/spec/busy_handler.rb +157 -0
- data/spec/data/iso-3166-country.txt +242 -0
- data/spec/data/iso-3166-schema.sql +22 -0
- data/spec/data/iso-3166-subcountry.txt +3995 -0
- data/spec/data/make-iso-db.sh +12 -0
- data/spec/database_spec.rb +508 -0
- data/spec/default_map_spec.rb +92 -0
- data/spec/function_spec.rb +78 -0
- data/spec/integeration_spec.rb +97 -0
- data/spec/iso_3166_database.rb +58 -0
- data/spec/packer_spec.rb +60 -0
- data/spec/paths_spec.rb +28 -0
- data/spec/progress_handler_spec.rb +91 -0
- data/spec/requires_spec.rb +54 -0
- data/spec/rtree_spec.rb +66 -0
- data/spec/schema_spec.rb +131 -0
- data/spec/spec_helper.rb +48 -0
- data/spec/sqlite3/constants_spec.rb +108 -0
- data/spec/sqlite3/database_status_spec.rb +36 -0
- data/spec/sqlite3/status_spec.rb +22 -0
- data/spec/sqlite3/version_spec.rb +28 -0
- data/spec/sqlite3_spec.rb +53 -0
- data/spec/statement_spec.rb +168 -0
- data/spec/storage_map_spec.rb +38 -0
- data/spec/tap_spec.rb +57 -0
- data/spec/text_map_spec.rb +20 -0
- data/spec/type_map_spec.rb +14 -0
- data/spec/version_spec.rb +8 -0
- data/tasks/custom.rake +102 -0
- data/tasks/default.rake +240 -0
- data/tasks/extension.rake +38 -0
- data/tasks/this.rb +208 -0
- metadata +318 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module Amalgalite
|
2
|
+
##
|
3
|
+
# A base class for use in creating your own progress handler classes
|
4
|
+
#
|
5
|
+
class ProgressHandler
|
6
|
+
def to_proc
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
# the arity of the call method
|
11
|
+
def arity() 0 ; end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Override this method, returning +false+ if the SQLite should act as if
|
15
|
+
# +interrupt!+ had been invoked.
|
16
|
+
#
|
17
|
+
def call
|
18
|
+
raise NotImplementedError, "The progress handler call() method must be implemented"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require 'amalgalite'
|
2
|
+
require 'pathname'
|
3
|
+
require 'zlib'
|
4
|
+
require 'amalgalite/packer'
|
5
|
+
|
6
|
+
module Amalgalite
|
7
|
+
#
|
8
|
+
# Requires encapsulates requiring items from the database
|
9
|
+
#
|
10
|
+
class Requires
|
11
|
+
class << self
|
12
|
+
def load_path_db_connections
|
13
|
+
@load_path_db_connections ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def load_path
|
17
|
+
@load_path ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Allocate a database connection to the given filename. For
|
22
|
+
# file databases, this means giving the same connection
|
23
|
+
# back if you ask for a connection to the same file.
|
24
|
+
# For in-memory databases, you get a new one each time.
|
25
|
+
#
|
26
|
+
def db_connection_to( dbfile_name )
|
27
|
+
if dbfile_name == ":memory:"
|
28
|
+
return ::Amalgalite::Database.new( dbfile_name )
|
29
|
+
else
|
30
|
+
unless connection = load_path_db_connections[ dbfile_name ]
|
31
|
+
connection = ::Amalgalite::Database.new( dbfile_name )
|
32
|
+
load_path_db_connections[dbfile_name] = connection
|
33
|
+
end
|
34
|
+
return connection
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Setting a class level variable as a flag to know what we are currently
|
40
|
+
# in the middle of requiring
|
41
|
+
#
|
42
|
+
def requiring
|
43
|
+
@requiring ||= []
|
44
|
+
end
|
45
|
+
|
46
|
+
def require( filename )
|
47
|
+
if load_path.empty? then
|
48
|
+
raise ::LoadError, "Amalgalite load path is empty -- #{filename}"
|
49
|
+
elsif $LOADED_FEATURES.include?( filename ) then
|
50
|
+
return false
|
51
|
+
elsif Requires.requiring.include?( filename ) then
|
52
|
+
return false
|
53
|
+
else
|
54
|
+
Requires.requiring << filename
|
55
|
+
load_path.each do |lp|
|
56
|
+
if lp.require( filename ) then
|
57
|
+
Requires.requiring.delete( filename )
|
58
|
+
return true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
Requires.requiring.delete( filename )
|
62
|
+
raise ::LoadError, "amalgalite has no such file to load -- #{filename}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
attr_reader :dbfile_name
|
68
|
+
attr_reader :table_name
|
69
|
+
attr_reader :filename_column
|
70
|
+
attr_reader :contents_column
|
71
|
+
attr_reader :compressed_column
|
72
|
+
attr_reader :db_connection
|
73
|
+
|
74
|
+
def initialize( opts = {} )
|
75
|
+
@dbfile_name = opts[:dbfile_name] || Bootstrap::DEFAULT_DB
|
76
|
+
@table_name = opts[:table_name] || Bootstrap::DEFAULT_TABLE
|
77
|
+
@filename_column = opts[:filename_column] || Bootstrap::DEFAULT_FILENAME_COLUMN
|
78
|
+
@contents_column = opts[:contents_column] || Bootstrap::DEFAULT_CONTENTS_COLUMN
|
79
|
+
@compressed_column = opts[:compressed_column] || Bootstrap::DEFAULT_COMPRESSED_COLUMN
|
80
|
+
@db_connection = Requires.db_connection_to( dbfile_name )
|
81
|
+
Requires.load_path << self
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# return the sql to find the file contents for a file in this requires
|
86
|
+
#
|
87
|
+
def sql
|
88
|
+
@sql ||= "SELECT #{filename_column}, #{compressed_column}, #{contents_column} FROM #{table_name} WHERE #{filename_column} = ?"
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# load a file in this database table. This will check and see if the
|
93
|
+
# file is already required. If it isn't it will select the contents
|
94
|
+
# associated with the row identified by the filename and eval those contents
|
95
|
+
# within the context of TOPLEVEL_BINDING. The filename is then appended to
|
96
|
+
# $LOADED_FEATURES.
|
97
|
+
#
|
98
|
+
# if the file was required then true is returned, otherwise false
|
99
|
+
#
|
100
|
+
def require( filename )
|
101
|
+
if $LOADED_FEATURES.include?( filename ) then
|
102
|
+
return false
|
103
|
+
else
|
104
|
+
begin
|
105
|
+
filename = filename.gsub(/\.rb\Z/,'')
|
106
|
+
|
107
|
+
contents = file_contents(filename)
|
108
|
+
|
109
|
+
if contents
|
110
|
+
eval( contents, TOPLEVEL_BINDING, filename )
|
111
|
+
$LOADED_FEATURES << filename
|
112
|
+
return true
|
113
|
+
else
|
114
|
+
return false
|
115
|
+
end
|
116
|
+
rescue => e
|
117
|
+
raise ::LoadError, "Failure loading #{filename} from #{dbfile_name} : #{e}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Return the contents of the named file.
|
124
|
+
#
|
125
|
+
def file_contents(filename)
|
126
|
+
rows = db_connection.execute(sql, filename)
|
127
|
+
if rows.size > 0 then
|
128
|
+
row = rows.first
|
129
|
+
|
130
|
+
contents = row[contents_column].to_s
|
131
|
+
if row[compressed_column] then
|
132
|
+
contents = ::Amalgalite::Packer.gunzip( contents )
|
133
|
+
end
|
134
|
+
|
135
|
+
return contents
|
136
|
+
else
|
137
|
+
return nil
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
#
|
143
|
+
# Import an SQL dump into the fake file system.
|
144
|
+
#
|
145
|
+
def import(sql)
|
146
|
+
db_connection.import(sql)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
151
|
+
require 'amalgalite/core_ext/kernel/require'
|
@@ -0,0 +1,225 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'amalgalite/table'
|
7
|
+
require 'amalgalite/index'
|
8
|
+
require 'amalgalite/column'
|
9
|
+
require 'amalgalite/view'
|
10
|
+
|
11
|
+
module Amalgalite
|
12
|
+
#
|
13
|
+
# An object view of the schema in the SQLite database. If the schema changes
|
14
|
+
# after this class is created, it has no knowledge of that.
|
15
|
+
#
|
16
|
+
class Schema
|
17
|
+
|
18
|
+
# The internal database that this schema is for. Most of the time this will
|
19
|
+
# be 'main' for the main database. For the temp tables, this will be 'temp'
|
20
|
+
# and for any attached databsae, this is the name of attached database.
|
21
|
+
attr_reader :catalog
|
22
|
+
|
23
|
+
# The schema_version at the time this schema was taken.
|
24
|
+
attr_reader :schema_version
|
25
|
+
|
26
|
+
# The Amalagalite::Database this schema is associated with.
|
27
|
+
attr_reader :db
|
28
|
+
|
29
|
+
#
|
30
|
+
# Create a new instance of Schema
|
31
|
+
#
|
32
|
+
def initialize( db, catalog = 'main', master_table = 'sqlite_master' )
|
33
|
+
@db = db
|
34
|
+
@catalog = catalog
|
35
|
+
@schema_version = nil
|
36
|
+
@tables = {}
|
37
|
+
@views = {}
|
38
|
+
@master_table = master_table
|
39
|
+
|
40
|
+
if @master_table == 'sqlite_master' then
|
41
|
+
@temp_schema = ::Amalgalite::Schema.new( db, 'temp', 'sqlite_temp_master')
|
42
|
+
else
|
43
|
+
@temp_schema = nil
|
44
|
+
end
|
45
|
+
load_schema!
|
46
|
+
end
|
47
|
+
|
48
|
+
def catalog_master_table
|
49
|
+
"#{catalog}.#{@master_table}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def temporary?
|
53
|
+
catalog == "temp"
|
54
|
+
end
|
55
|
+
|
56
|
+
def dirty?()
|
57
|
+
return true if (@schema_version != self.current_version)
|
58
|
+
return false unless @temp_schema
|
59
|
+
return @temp_schema.dirty?
|
60
|
+
end
|
61
|
+
|
62
|
+
def current_version
|
63
|
+
@db.first_value_from("PRAGMA #{catalog}.schema_version")
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# load the schema from the database
|
68
|
+
def load_schema!
|
69
|
+
load_tables
|
70
|
+
load_views
|
71
|
+
if @temp_schema then
|
72
|
+
@temp_schema.load_schema!
|
73
|
+
end
|
74
|
+
@schema_version = self.current_version
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# return the tables, reloading if dirty.
|
80
|
+
# If there is a temp table and a normal table with the same name, then the
|
81
|
+
# temp table is the one that is returned in the hash.
|
82
|
+
def tables
|
83
|
+
load_schema! if dirty?
|
84
|
+
t = @tables
|
85
|
+
if @temp_schema then
|
86
|
+
t = @tables.merge( @temp_schema.tables )
|
87
|
+
end
|
88
|
+
return t
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# load all the tables
|
93
|
+
#
|
94
|
+
def load_tables
|
95
|
+
@tables = {}
|
96
|
+
@db.execute("SELECT tbl_name FROM #{catalog_master_table} WHERE type = 'table' AND name != 'sqlite_sequence'") do |table_info|
|
97
|
+
table = load_table( table_info['tbl_name'] )
|
98
|
+
table.indexes = load_indexes( table )
|
99
|
+
@tables[table.name] = table
|
100
|
+
end
|
101
|
+
return @tables
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Load a single table
|
106
|
+
def load_table( table_name )
|
107
|
+
rows = @db.execute("SELECT tbl_name, sql FROM #{catalog_master_table} WHERE type = 'table' AND tbl_name = ?", table_name)
|
108
|
+
table_info = rows.first
|
109
|
+
table = nil
|
110
|
+
if table_info then
|
111
|
+
table = Amalgalite::Table.new( table_info['tbl_name'], table_info['sql'] )
|
112
|
+
table.schema = self
|
113
|
+
table.columns = load_columns( table )
|
114
|
+
table.indexes = load_indexes( table )
|
115
|
+
@tables[table.name] = table
|
116
|
+
end
|
117
|
+
return table
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# load all the indexes for a particular table
|
122
|
+
#
|
123
|
+
def load_indexes( table )
|
124
|
+
indexes = {}
|
125
|
+
|
126
|
+
@db.prepare("SELECT name, sql FROM #{catalog_master_table} WHERE type ='index' and tbl_name = $name") do |idx_stmt|
|
127
|
+
idx_stmt.execute( "$name" => table.name) do |idx_info|
|
128
|
+
indexes[idx_info['name']] = Amalgalite::Index.new( idx_info['name'], idx_info['sql'], table )
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
@db.execute("PRAGMA index_list( #{@db.quote(table.name)} );") do |idx_list|
|
133
|
+
idx = indexes[idx_list['name']]
|
134
|
+
|
135
|
+
# temporary indexes do not show up in the previous list
|
136
|
+
if idx.nil? then
|
137
|
+
idx = Amalgalite::Index.new( idx_list['name'], nil, table )
|
138
|
+
indexes[idx_list['name']] = idx
|
139
|
+
end
|
140
|
+
|
141
|
+
idx.sequence_number = idx_list['seq']
|
142
|
+
idx.unique = Boolean.to_bool( idx_list['unique'] )
|
143
|
+
|
144
|
+
@db.execute("PRAGMA index_info( #{@db.quote(idx.name)} );") do |col_info|
|
145
|
+
idx.columns << table.columns[col_info['name']]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
return indexes
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# load all the columns for a particular table
|
153
|
+
#
|
154
|
+
def load_columns( table )
|
155
|
+
cols = {}
|
156
|
+
idx = 0
|
157
|
+
@db.execute("PRAGMA #{catalog}.table_info(#{@db.quote(table.name)})") do |row|
|
158
|
+
col = Amalgalite::Column.new( catalog, table.name, row['name'], row['cid'])
|
159
|
+
|
160
|
+
col.default_value = row['dflt_value']
|
161
|
+
|
162
|
+
col.declared_data_type = row['type']
|
163
|
+
col.not_null_constraint = row['notnull']
|
164
|
+
col.primary_key = row['pk']
|
165
|
+
|
166
|
+
# need to remove leading and trailing ' or " from the default value
|
167
|
+
if col.default_value and col.default_value.kind_of?( String ) and ( col.default_value.length >= 2 ) then
|
168
|
+
fc = col.default_value[0].chr
|
169
|
+
lc = col.default_value[-1].chr
|
170
|
+
if fc == lc and ( fc == "'" || fc == '"' ) then
|
171
|
+
col.default_value = col.default_value[1..-2]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
unless table.temporary? then
|
176
|
+
# get more exact information
|
177
|
+
@db.api.table_column_metadata( catalog, table.name, col.name ).each_pair do |key, value|
|
178
|
+
col.send("#{key}=", value)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
col.schema = self
|
182
|
+
cols[col.name] = col
|
183
|
+
idx += 1
|
184
|
+
end
|
185
|
+
return cols
|
186
|
+
end
|
187
|
+
|
188
|
+
##
|
189
|
+
# return the views, reloading if dirty
|
190
|
+
#
|
191
|
+
# If there is a temp view, and a regular view of the same name, then the
|
192
|
+
# temporary view is the one that is returned in the hash.
|
193
|
+
#
|
194
|
+
def views
|
195
|
+
reload_schema! if dirty?
|
196
|
+
v = @views
|
197
|
+
if @temp_schema then
|
198
|
+
v = @views.merge( @temp_schema.views )
|
199
|
+
end
|
200
|
+
return v
|
201
|
+
end
|
202
|
+
|
203
|
+
##
|
204
|
+
# load a single view
|
205
|
+
#
|
206
|
+
def load_view( name )
|
207
|
+
rows = @db.execute("SELECT name, sql FROM #{catalog_master_table} WHERE type = 'view' AND name = ?", name )
|
208
|
+
view_info = rows.first
|
209
|
+
view = Amalgalite::View.new( view_info['name'], view_info['sql'] )
|
210
|
+
view.schema = self
|
211
|
+
return view
|
212
|
+
end
|
213
|
+
|
214
|
+
##
|
215
|
+
# load all the views for the database
|
216
|
+
#
|
217
|
+
def load_views
|
218
|
+
@db.execute("SELECT name, sql FROM #{catalog_master_table} WHERE type = 'view'") do |view_info|
|
219
|
+
view = load_view( view_info['name'] )
|
220
|
+
@views[view.name] = view
|
221
|
+
end
|
222
|
+
return @views
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. See LICENSE and/or COPYING for details.
|
4
|
+
#++
|
5
|
+
module Amalgalite::SQLite3
|
6
|
+
module Constants
|
7
|
+
module Helpers
|
8
|
+
#
|
9
|
+
# convert an integer value into the string representation of the associated
|
10
|
+
# constant. this is a helper method used by some of the other modules
|
11
|
+
#
|
12
|
+
def name_from_value( value )
|
13
|
+
unless defined? @const_map_from_value
|
14
|
+
@const_map_from_value = {}
|
15
|
+
constants.each do |const_name|
|
16
|
+
c_int = const_get( const_name )
|
17
|
+
@const_map_from_value[c_int] = const_name.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return @const_map_from_value[ value ]
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# convert a string into the constant value. This is helper method used by
|
25
|
+
# some of the other modules
|
26
|
+
#
|
27
|
+
def value_from_name( name )
|
28
|
+
unless defined? @const_map_from_name
|
29
|
+
@const_map_from_name = {}
|
30
|
+
constants.each do |const_name|
|
31
|
+
c_int = const_get( const_name )
|
32
|
+
@const_map_from_name[ const_name.to_s ] = c_int
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return @const_map_from_name[ name.upcase ]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
##
|
41
|
+
# DataType defines the namespace for all possible SQLite data types.
|
42
|
+
#
|
43
|
+
module DataType
|
44
|
+
extend Helpers
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Open defines the namespace for all possible flags to the Database.open
|
49
|
+
# method
|
50
|
+
#
|
51
|
+
module Open
|
52
|
+
extend Helpers
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Status defines the namespace for all the possible status flags for
|
57
|
+
# Amalgalite::SQLite3::Status objects
|
58
|
+
#
|
59
|
+
module Status
|
60
|
+
extend Helpers
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# DBStatus defines the namespace for all the possible status codes for the
|
65
|
+
# Amalgalite::SQlite3::Database::Status objects.
|
66
|
+
#
|
67
|
+
module DBStatus
|
68
|
+
extend Helpers
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# ResultCode defines the namespace for all possible result codes from an
|
73
|
+
# SQLite API call.
|
74
|
+
#
|
75
|
+
module ResultCode
|
76
|
+
extend Helpers
|
77
|
+
end # end ResultCode
|
78
|
+
|
79
|
+
##
|
80
|
+
# Config defines the namespace for all possible parameter for the
|
81
|
+
# sqlite config API.
|
82
|
+
#
|
83
|
+
module Config
|
84
|
+
extend Helpers
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# StatementStatus defines the namespace for all the possible status codes
|
89
|
+
# for the SQLite prepared statements
|
90
|
+
#
|
91
|
+
module StatementStatus
|
92
|
+
extend Helpers
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|