amalgalite 1.1.2-x86-mswin32 → 1.3.0-x86-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +49 -0
  3. data/{HISTORY.rdoc → HISTORY.md} +96 -73
  4. data/LICENSE +2 -2
  5. data/Manifest.txt +104 -0
  6. data/README.md +73 -0
  7. data/Rakefile +25 -0
  8. data/TODO.md +50 -0
  9. data/ext/amalgalite/{amalgalite3.c → c/amalgalite.c} +12 -12
  10. data/ext/amalgalite/{amalgalite3.h → c/amalgalite.h} +5 -5
  11. data/ext/amalgalite/{amalgalite3_blob.c → c/amalgalite_blob.c} +2 -2
  12. data/ext/amalgalite/{amalgalite3_constants.c → c/amalgalite_constants.c} +2 -2
  13. data/ext/amalgalite/{amalgalite3_database.c → c/amalgalite_database.c} +49 -21
  14. data/ext/amalgalite/{amalgalite3_requires_bootstrap.c → c/amalgalite_requires_bootstrap.c} +131 -58
  15. data/ext/amalgalite/{amalgalite3_statement.c → c/amalgalite_statement.c} +2 -2
  16. data/ext/amalgalite/{extconf.rb → c/extconf.rb} +4 -4
  17. data/ext/amalgalite/{gen_constants.rb → c/gen_constants.rb} +3 -3
  18. data/ext/amalgalite/c/notes.txt +134 -0
  19. data/ext/amalgalite/{sqlite3.c → c/sqlite3.c} +94602 -80497
  20. data/ext/amalgalite/{sqlite3.h → c/sqlite3.h} +1047 -216
  21. data/ext/amalgalite/{sqlite3_options.h → c/sqlite3_options.h} +0 -0
  22. data/ext/amalgalite/{sqlite3ext.h → c/sqlite3ext.h} +40 -13
  23. data/lib/amalgalite.rb +13 -6
  24. data/lib/amalgalite/1.8/amalgalite.so +0 -0
  25. data/lib/amalgalite/1.9/amalgalite.so +0 -0
  26. data/lib/amalgalite/2.0/amalgalite.so +0 -0
  27. data/lib/amalgalite/column.rb +7 -5
  28. data/lib/amalgalite/database.rb +18 -10
  29. data/lib/amalgalite/packer.rb +5 -2
  30. data/lib/amalgalite/requires.rb +47 -16
  31. data/lib/amalgalite/schema.rb +63 -36
  32. data/lib/amalgalite/sqlite3/version.rb +0 -1
  33. data/lib/amalgalite/statement.rb +7 -5
  34. data/lib/amalgalite/table.rb +9 -8
  35. data/lib/amalgalite/type_maps/default_map.rb +0 -1
  36. data/lib/amalgalite/type_maps/storage_map.rb +0 -2
  37. data/lib/amalgalite/type_maps/text_map.rb +0 -1
  38. data/lib/amalgalite/version.rb +3 -32
  39. data/spec/aggregate_spec.rb +1 -1
  40. data/spec/amalgalite_spec.rb +1 -1
  41. data/spec/blob_spec.rb +1 -1
  42. data/spec/boolean_spec.rb +2 -1
  43. data/spec/busy_handler.rb +1 -1
  44. data/spec/database_spec.rb +16 -11
  45. data/spec/default_map_spec.rb +1 -1
  46. data/spec/function_spec.rb +1 -1
  47. data/spec/integeration_spec.rb +2 -1
  48. data/spec/packer_spec.rb +4 -4
  49. data/spec/paths_spec.rb +1 -1
  50. data/spec/progress_handler_spec.rb +4 -5
  51. data/spec/requires_spec.rb +36 -2
  52. data/spec/rtree_spec.rb +6 -5
  53. data/spec/schema_spec.rb +28 -20
  54. data/spec/spec_helper.rb +2 -7
  55. data/spec/sqlite3/constants_spec.rb +1 -1
  56. data/spec/sqlite3/database_status_spec.rb +4 -4
  57. data/spec/sqlite3/status_spec.rb +5 -5
  58. data/spec/sqlite3/version_spec.rb +7 -7
  59. data/spec/sqlite3_spec.rb +3 -3
  60. data/spec/statement_spec.rb +3 -4
  61. data/spec/storage_map_spec.rb +1 -1
  62. data/spec/tap_spec.rb +4 -4
  63. data/spec/text_map_spec.rb +1 -1
  64. data/spec/type_map_spec.rb +1 -1
  65. data/spec/version_spec.rb +2 -9
  66. data/tasks/custom.rake +99 -0
  67. data/tasks/default.rake +277 -0
  68. data/tasks/extension.rake +28 -202
  69. data/tasks/this.rb +209 -0
  70. metadata +102 -191
  71. data/README.rdoc +0 -54
  72. data/gemspec.rb +0 -63
  73. data/lib/amalgalite/1.8/amalgalite3.so +0 -0
  74. data/lib/amalgalite/1.9/amalgalite3.so +0 -0
  75. data/tasks/announce.rake +0 -44
  76. data/tasks/config.rb +0 -107
  77. data/tasks/distribution.rake +0 -77
  78. data/tasks/documentation.rake +0 -36
  79. data/tasks/rspec.rake +0 -30
  80. data/tasks/utils.rb +0 -80
@@ -5,7 +5,7 @@
5
5
  * vim: shiftwidth=4
6
6
  */
7
7
 
8
- #include "amalgalite3.h"
8
+ #include "amalgalite.h"
9
9
  #include <stdio.h>
10
10
  extern VALUE mA;
11
11
  VALUE cAR;
@@ -28,57 +28,24 @@ void am_bootstrap_cleanup_and_raise( const char* msg, sqlite3* db, sqlite3_stmt*
28
28
  }
29
29
 
30
30
 
31
- /**
32
- * call-seq:
33
- * Amalgalite::Requires::Bootstrap.lift( 'dbfile' => "lib.db", 'table_name' => "bootload", 'rowid_column' => "id", 'filename_column' => "filename", 'content_column' => "contents" )
34
- *
35
- * *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*
36
- *
37
- * This is a boostrap mechanism to eval all the code in a particular column in a
38
- * specially formatted table in an sqlite database. It should only be used for
39
- * a specific purpose, mainly loading the Amalgalite ruby code directly from an
40
- * sqlite table.
41
- *
42
- * Amalgalite::Requires adds in the ability to _require_ code that is in an
43
- * sqlite database. Since Amalgalite::Requires is itself ruby code, if
44
- * Amalgalite::Requires was in an sqlite database, it could not _require_
45
- * itself. Therefore this method is made available. It is a pure C extension
46
- * method that directly calls the sqlite3 C functions directly and uses the ruby
47
- * C api to eval the data in the table.
48
- *
49
- * This method attaches to an sqlite3 database (filename) and then does:
50
- *
51
- * SELECT filename_column_name, content_column_name
52
- * FROM table_name
53
- * ORDER BY rowid_column_name
54
- *
55
- * For each row returned it does an _eval_ on the code in the
56
- * *content_column_name* and then updates _$LOADED_FEATURES_ directly with the value from
57
- * *filename_column_name*.
58
- *
59
- * The database to be opened by _lift_ *must* be an sqlite3 UTF-8 database.
60
- *
61
- */
62
- VALUE am_bootstrap_lift( VALUE self, VALUE args )
31
+ void am_bootstrap_from_db( sqlite3* db, VALUE args )
63
32
  {
64
- sqlite3* db = NULL;
65
33
  sqlite3_stmt* stmt = NULL;
66
34
  int rc;
67
- int last_row_good;
68
35
  char raise_msg[BUFSIZ];
36
+ int last_row_good;
69
37
 
70
- VALUE am_db_c = rb_const_get( cARB, rb_intern("DEFAULT_DB") );
71
38
  VALUE am_tbl_c = rb_const_get( cARB, rb_intern("DEFAULT_BOOTSTRAP_TABLE") );
72
39
  VALUE am_pk_c = rb_const_get( cARB, rb_intern("DEFAULT_ROWID_COLUMN") );
73
40
  VALUE am_fname_c = rb_const_get( cARB, rb_intern("DEFAULT_FILENAME_COLUMN") );
74
41
  VALUE am_content_c = rb_const_get( cARB, rb_intern("DEFAULT_CONTENTS_COLUMN") );
75
42
 
76
- char* dbfile = NULL;
77
43
  char* tbl_name = NULL;
78
44
  char* pk_col = NULL;
79
45
  char* fname_col = NULL;
80
46
  char* content_col = NULL;
81
47
 
48
+
82
49
  char sql[BUFSIZ];
83
50
  const char* sql_tail = NULL;
84
51
  int sql_bytes = 0;
@@ -94,30 +61,13 @@ VALUE am_bootstrap_lift( VALUE self, VALUE args )
94
61
  ID eval_id = rb_intern("eval");
95
62
 
96
63
 
97
- if ( Qnil == args ) {
98
- args = rb_hash_new();
99
- } else {
100
- args = rb_ary_shift( args );
101
- }
102
64
 
103
- Check_Type( args, T_HASH );
104
-
105
- /* get the arguments */
106
- dbfile = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "dbfile" ) ) ) ) ? StringValuePtr( am_db_c ) : StringValuePtr( tmp );
107
65
  tbl_name = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "table_name" ) ) ) ) ? StringValuePtr( am_tbl_c ) : StringValuePtr( tmp );
108
66
  pk_col = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "rowid_column" ) ) ) ) ? StringValuePtr( am_pk_c ) : StringValuePtr( tmp );
109
67
  fname_col = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "filename_column" ) ) ) ) ? StringValuePtr( am_fname_c ) : StringValuePtr( tmp );
110
68
  content_col = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "contents_column" ) ) ) ) ? StringValuePtr( am_content_c ) : StringValuePtr( tmp );
111
69
 
112
70
 
113
- /* open the database */
114
- rc = sqlite3_open_v2( dbfile , &db, SQLITE_OPEN_READONLY, NULL);
115
- if ( SQLITE_OK != rc ) {
116
- memset( raise_msg, 0, BUFSIZ );
117
- snprintf(raise_msg, BUFSIZ, "Failure to open database %s for bootload: [SQLITE_ERROR %d] : %s", dbfile, rc, sqlite3_errmsg( db ) );
118
- am_bootstrap_cleanup_and_raise( raise_msg, db, stmt );
119
- }
120
-
121
71
  /* prepare the db query */
122
72
  memset( sql, 0, BUFSIZ );
123
73
  sql_bytes = snprintf( sql, BUFSIZ, "SELECT %s, %s FROM %s ORDER BY %s", fname_col, content_col, tbl_name, pk_col );
@@ -167,24 +117,146 @@ VALUE am_bootstrap_lift( VALUE self, VALUE args )
167
117
  am_bootstrap_cleanup_and_raise( raise_msg, db, stmt );
168
118
  }
169
119
 
170
- stmt = NULL;
120
+ }
121
+
122
+
123
+ /**
124
+ * call-seq:
125
+ * Amalgalite::Requires::Bootstrap.lift( 'dbfile' => "lib.db", 'table_name' => "bootload", 'rowid_column' => "id", 'filename_column' => "filename", 'content_column' => "contents" )
126
+ *
127
+ * *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*
128
+ *
129
+ * This is a boostrap mechanism to eval all the code in a particular column in a
130
+ * specially formatted table in an sqlite database. It should only be used for
131
+ * a specific purpose, mainly loading the Amalgalite ruby code directly from an
132
+ * sqlite table.
133
+ *
134
+ * Amalgalite::Requires adds in the ability to _require_ code that is in an
135
+ * sqlite database. Since Amalgalite::Requires is itself ruby code, if
136
+ * Amalgalite::Requires was in an sqlite database, it could not _require_
137
+ * itself. Therefore this method is made available. It is a pure C extension
138
+ * method that directly calls the sqlite3 C functions directly and uses the ruby
139
+ * C api to eval the data in the table.
140
+ *
141
+ * This method attaches to an sqlite3 database (filename) and then does:
142
+ *
143
+ * SELECT filename_column_name, content_column_name
144
+ * FROM table_name
145
+ * ORDER BY rowid_column_name
146
+ *
147
+ * For each row returned it does an _eval_ on the code in the
148
+ * *content_column_name* and then updates _$LOADED_FEATURES_ directly with the value from
149
+ * *filename_column_name*.
150
+ *
151
+ * The database to be opened by _lift_ *must* be an sqlite3 UTF-8 database.
152
+ *
153
+ */
154
+ VALUE am_bootstrap_lift( VALUE self, VALUE args )
155
+ {
156
+ sqlite3 *db = NULL;
157
+ int rc;
158
+ char raise_msg[BUFSIZ];
159
+ VALUE tmp = Qnil;
160
+
161
+ VALUE am_db_c = rb_const_get( cARB, rb_intern("DEFAULT_DB") );
162
+
163
+ char *dbfile = NULL;
164
+
165
+
166
+ if ( Qnil == args ) {
167
+ args = rb_hash_new();
168
+ } else {
169
+ args = rb_ary_shift( args );
170
+ }
171
+
172
+ Check_Type( args, T_HASH );
173
+
174
+ /* get the arguments */
175
+ dbfile = ( Qnil == (tmp = rb_hash_aref( args, rb_str_new2( "dbfile" ) ) ) ) ? StringValuePtr( am_db_c ) : StringValuePtr( tmp );
176
+
177
+ /* open the database */
178
+ rc = sqlite3_open_v2( dbfile , &db, SQLITE_OPEN_READONLY, NULL);
179
+ if ( SQLITE_OK != rc ) {
180
+ memset( raise_msg, 0, BUFSIZ );
181
+ snprintf(raise_msg, BUFSIZ, "Failure to open database %s for bootload: [SQLITE_ERROR %d] : %s", dbfile, rc, sqlite3_errmsg( db ) );
182
+ am_bootstrap_cleanup_and_raise( raise_msg, db, NULL );
183
+ }
184
+
185
+ am_bootstrap_from_db( db, args );
171
186
 
172
187
  /* close the database */
173
188
  rc = sqlite3_close( db );
174
189
  if ( SQLITE_OK != rc ) {
175
190
  memset( raise_msg, 0, BUFSIZ );
176
191
  snprintf( raise_msg, BUFSIZ, "Failure to close database : [SQLITE_ERROR %d] : %s\n", rc, sqlite3_errmsg( db )),
177
- am_bootstrap_cleanup_and_raise( raise_msg, db,stmt );
192
+ am_bootstrap_cleanup_and_raise( raise_msg, db, NULL );
178
193
  }
179
194
 
180
195
  return Qnil;
181
196
  }
182
197
 
198
+ /**
199
+ * call-seq:
200
+ * Amalgalite::Requires::Bootstrap.lift_str( sql, 'table_name' => "bootload", 'rowid_column' => "id", 'filename_column' => "filename", 'content_column' => "contents" )
201
+ *
202
+ * Bootstrap Amalgalite from a string containing an SQL dump. See Amalgalite::Requires::Bootstrap.lift.
203
+ *
204
+ * For example:
205
+ *
206
+ * Amalgalite::Requires::Bootstrap.lifts(File.read("lib.sql"))
207
+ */
208
+ VALUE am_bootstrap_lift_str( VALUE self, VALUE args )
209
+ {
210
+ sqlite3 *db = NULL;
211
+ int rc;
212
+ char raise_msg[BUFSIZ];
213
+ VALUE sql = Qnil;
214
+ VALUE args_hsh = Qnil;
215
+
216
+ sql = rb_ary_shift(args);
217
+ StringValue(sql);
218
+ if ( Qnil == sql ) { rb_raise(eARB_Error, "SQL required." ); }
219
+
220
+ args_hsh = rb_ary_shift(args);
221
+ if ( Qnil == args_hsh ) { args_hsh = rb_hash_new(); }
222
+
223
+
224
+ rc = sqlite3_open_v2( ":memory:", &db, SQLITE_OPEN_READWRITE, NULL );
225
+ if ( SQLITE_OK != rc ) {
226
+ memset( raise_msg, 0, BUFSIZ );
227
+ snprintf(raise_msg, BUFSIZ, "Failure to open database :memory: for bootload: [SQLITE_ERROR %d] : %s", rc, sqlite3_errmsg( db ) );
228
+ am_bootstrap_cleanup_and_raise( raise_msg, db, NULL );
229
+ }
230
+
231
+ /* Load the bootstrap SQL into the database */
232
+ rc = sqlite3_exec( db, StringValuePtr( sql ), NULL, NULL, NULL );
233
+
234
+ if ( SQLITE_OK != rc ) {
235
+ memset( raise_msg, 0, BUFSIZ );
236
+ snprintf(raise_msg, BUFSIZ, "Failure to import bootload sql: [SQLITE_ERROR %d] : %s", rc, sqlite3_errmsg( db ) );
237
+ am_bootstrap_cleanup_and_raise( raise_msg, db, NULL );
238
+ }
239
+
240
+ am_bootstrap_from_db( db, args_hsh );
241
+
242
+ rc = sqlite3_close( db );
243
+
244
+ if ( SQLITE_OK != rc ) {
245
+ memset( raise_msg, 0, BUFSIZ );
246
+ snprintf( raise_msg, BUFSIZ, "Failure to close database : [SQLITE_ERROR %d] : %s\n", rc, sqlite3_errmsg( db )),
247
+ am_bootstrap_cleanup_and_raise( raise_msg, db, NULL );
248
+ }
249
+
250
+ return Qnil;
251
+
252
+ }
253
+
254
+
183
255
  /**
184
256
  * Bootstrapping module to help _require_ when Amalgalite::Requires is not
185
257
  * availble in files.
186
258
  */
187
- void Init_amalgalite3_requires_bootstrap()
259
+ void Init_amalgalite_requires_bootstrap()
188
260
  {
189
261
 
190
262
  mA = rb_define_module("Amalgalite");
@@ -193,7 +265,8 @@ void Init_amalgalite3_requires_bootstrap()
193
265
 
194
266
  eARB_Error = rb_define_class_under(cARB, "Error", rb_eStandardError);
195
267
 
196
- rb_define_module_function(cARB, "lift", am_bootstrap_lift, -2);
268
+ rb_define_module_function(cARB, "lift", am_bootstrap_lift, -2);
269
+ rb_define_module_function(cARB, "lifts", am_bootstrap_lift, -2);
197
270
 
198
271
  /* constants for default db, table, column, rowid, contents */
199
272
  rb_define_const(cARB, "DEFAULT_DB", rb_str_new2( "lib.db" ));
@@ -1,4 +1,4 @@
1
- #include "amalgalite3.h"
1
+ #include "amalgalite.h"
2
2
  /**
3
3
  * Copyright (c) 2008 Jeremy Hinegardner
4
4
  * All rights reserved. See LICENSE and/or COPYING for details.
@@ -604,7 +604,7 @@ VALUE am_sqlite3_statement_alloc(VALUE klass)
604
604
  * Amagalite Database extension
605
605
  */
606
606
 
607
- void Init_amalgalite3_statement( )
607
+ void Init_amalgalite_statement( )
608
608
  {
609
609
 
610
610
  VALUE ma = rb_define_module("Amalgalite");
@@ -20,17 +20,17 @@ else
20
20
  end
21
21
 
22
22
  # remove the -g flags if it exists
23
- %w[ -ggdb -g ].each do |debug|
23
+ %w[ -ggdb\\d* -g\\d* ].each do |debug|
24
24
  $CFLAGS = $CFLAGS.gsub(/#{debug}/,'')
25
- RbConfig::MAKEFILE_CONFIG['debugflags'] = Config::MAKEFILE_CONFIG['debugflags'].gsub(/#{debug}/,'') if Config::MAKEFILE_CONFIG['debugflags']
25
+ RbConfig::MAKEFILE_CONFIG['debugflags'] = RbConfig::MAKEFILE_CONFIG['debugflags'].gsub(/#{debug}/,'') if RbConfig::MAKEFILE_CONFIG['debugflags']
26
26
  end
27
27
 
28
28
  %w[ shorten-64-to-32 write-strings ].each do |warning|
29
29
  $CFLAGS = $CFLAGS.gsub(/-W#{warning}/,'')
30
- Config::MAKEFILE_CONFIG['warnflags'] = Config::MAKEFILE_CONFIG['warnflags'].gsub(/-W#{warning}/,'') if Config::MAKEFILE_CONFIG['warnflags']
30
+ RbConfig::MAKEFILE_CONFIG['warnflags'] = RbConfig::MAKEFILE_CONFIG['warnflags'].gsub(/-W#{warning}/,'') if RbConfig::MAKEFILE_CONFIG['warnflags']
31
31
  end
32
32
 
33
33
 
34
34
 
35
35
  subdir = RUBY_VERSION.sub(/\.\d$/,'')
36
- create_makefile("amalgalite/#{subdir}/amalgalite3")
36
+ create_makefile("amalgalite/#{subdir}/amalgalite")
@@ -135,17 +135,17 @@ CONSTANTS = {
135
135
 
136
136
  }
137
137
 
138
- fname = File.expand_path(File.join(File.dirname(__FILE__), "amalgalite3_constants.c"))
138
+ fname = File.expand_path(File.join(File.dirname(__FILE__), "amalgalite_constants.c"))
139
139
  File.open(fname, "w+") do |f|
140
140
  f.puts "/* Generated by gen_constants.rb -- do not edit */"
141
141
  f.puts
142
- f.puts '#include "amalgalite3.h"'
142
+ f.puts '#include "amalgalite.h"'
143
143
  f.puts '/**'
144
144
  f.puts ' * Document-class: Amalgalite::SQLite3::Constants'
145
145
  f.puts ' *'
146
146
  f.puts ' * class holding constants in the sqlite extension'
147
147
  f.puts ' */'
148
- f.puts "void Init_amalgalite3_constants( )"
148
+ f.puts "void Init_amalgalite_constants( )"
149
149
  f.puts "{"
150
150
  f.puts
151
151
  f.puts ' VALUE ma = rb_define_module("Amalgalite");'
@@ -0,0 +1,134 @@
1
+ Top level "methods"
2
+ ===================
3
+
4
+ *done* const char* sqlite3_libversion(void)
5
+ *done* int sqlite3_libversion_number(void)
6
+ *done* int sqlite3_threadsave(void)
7
+ *done* int sqlite3_complete(const char*sql);
8
+ *done* int sqlite3_complete16(const void *sql);
9
+
10
+ *done* sqlite3_int64 sqlite3_memory_used(void);
11
+ *done* sqlite3_int64 sqtlie3_memory_highwater(int resetFlag);
12
+ *done* void sqlite3_randomness(int N, void *p)
13
+
14
+ *future* int sqlite3_enabled_shared_cache(int); # TODO maybe
15
+ *future* int sqlite3_release_memory(int); // maybe, hook into gc calls ?
16
+ *future* void sqlite3_soft_heap_limit(int);
17
+ *future* char* sqlite3_temp_directory;
18
+
19
+ UTF-8 vs. UTF-16
20
+ ----------------
21
+
22
+ in cases where there is a xxx16() method in the C api, the ruby methods add a
23
+ flag to the method.
24
+
25
+ Core 'Objects'
26
+ ==============
27
+
28
+ sqlite3 (typdef struct sqlite3) -> main database handle
29
+ -------
30
+ *done* int sqlite3_open_v2(*filename, sqlite3**, flags, NULL)
31
+ *done* int sqlite3_open16
32
+ *done* int sqlite3_extended_result_codes(sqlite3, int onoff) # default to turning this on
33
+ *skipped* called during rb_raise
34
+ *skipped* const char *sqlite3_errmsg(sqlite3*);
35
+ *skipped* const void *sqlite3_errmsg16(sqlite3*);
36
+ *done* int sqlite3_close(sqlite3 *)
37
+ *skipped* int sqlite3_exec -> don't use, wrap in ruby exec
38
+ *done* sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*)
39
+ *done* int sqlite3_get_autocommit(sqlite3*)
40
+ *done* int sqlite3_changes(sqlite3*)
41
+ *done* int sqlite3_total_changes(sqlite3*)
42
+ *skipped* int sqlite3_errcode(sqlite3 *db)
43
+ *done* int sqlite3_prepare_v2(sqlite3* db, sql, nbyte, sqlite3_stmt**, const char **tail)
44
+
45
+ int sqlite3_prepare16_v2(sqlite3* db, sql, nbyte, sqlite3_stmt**, const char **tail)
46
+
47
+ // not yet, but implement if/when a purchase of sqlite3 encryption works
48
+ TODO: int sqlite3_key(sqlite3* db, const void *pKey, int nKey);
49
+ TODO: int sqlite3_rekey(sqlite3* db, const void *pKey, int nKey);
50
+
51
+
52
+
53
+ TODO: int sqlite3_busy_timeout(sqlite3*)
54
+ *done* void sqlite3_progress_hander(sqlite3*, int, int(*)(void*), void*)
55
+
56
+ *done* tracing should be an IO object, if it is true then send it to STDERR
57
+ *done* tracing should also yield a block like a transaction so that during the block the db has tracing turned on.
58
+ *done* sqlite3_trace
59
+
60
+ TODO: create Table and Column classes
61
+ TODO: int sqlite3_table_column_metadata();
62
+
63
+ for later implementation
64
+ ________________________
65
+ sqlite3_enable_load_extensions
66
+ sqlite3_load_extension
67
+ sqlite3_interrupt
68
+ sqlite3_busy_handler(sqlite3*, function pointer, void *)
69
+
70
+ *skip - experimental* sqlite3_profile
71
+ *Skip - experimental* sqlite3_limit(sqlite3*, int id, int newVal) -- maybe implement
72
+ *skip - experimental* sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
73
+ *skip - experimental* sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
74
+ *skip - experimental* sqlite3_update_hook(sqlite3*, function ponter, void*);
75
+
76
+
77
+ sqlite3_stmt (typedef struct sqlite3_stmt) -> handle for statements
78
+ ------------
79
+ *done* const char *sqlite3_sql(sqlite3_stmt *pStmt)
80
+ *done* int sqlite3_bind_parameter_count(sqlite3_stmt*);
81
+
82
+ *done* sqlite3_bind_double(sqlite3_stmt*, int, double);
83
+ *done* sqlite3_bind_int(sqlite3_stmt*, int, int);
84
+ *done* sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
85
+ *done* sqlite3_bind_null(sqlite3_stmt*, int);
86
+ *done* sqlite3_bind_text(sqlite3_stmt*, int, constc char*, int n, void(*)(void*));
87
+ * skipping *sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
88
+ *done* const char* sqlite3_bind_parameter_name(sqlite3_stmt*, int )
89
+ *done* sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
90
+ *done* sqlite3_clear_bindings(sqlite3_stmt*);
91
+ *done* sqlite3_column_count(sqlite3_stmt *pStmt);
92
+ *done* sqlite3_column_name(sqlite3_stmt*, int N);
93
+ *skip - used internally* sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
94
+ *done* sqlite3_column_database_name(sqlite3_stmt*, int);
95
+ *done* sqlite3_column_table_name(sqlite3_stmt*, int);
96
+ *done* sqlite3_column_origin_name(sqlite3_stmt*, int);
97
+ *done* sqlite3_step(sqlite3_stmt*);
98
+ *done - as 'close' *int sqlite3_finalize(sqlite3_stmt *pStmt);
99
+ *done* int sqlite3_reset(sqlite3_stmt *pStmt);
100
+ *done - same as sqlite3_column_count* sqlite3_data_count(sqlite3_stmt *pStmt);
101
+ *do not use* sqlite3_value* sqlite3_column_value(sqlite3_stmt*, int iCol);
102
+
103
+ sqlite3_bind_text16(sqlite3_stmt*, int, constc char*, int, void(*)(void*));
104
+ * done *sqlite3_column_database_name16(sqlite3_stmt*, int);
105
+ * done *sqlite3_column_table_name16(sqlite3_stmt*, int);
106
+ * done *sqlite3_column_origin_name16(sqlite3_stmt*, int);
107
+ sqlite3_column_name16(sqlite3_stmt*, int N);
108
+
109
+ *done* sqlite3_column_decltype(sqlite3_stmt*, int);
110
+ sqlite3_column_decltype16(sqlite3_stmt*, int);
111
+
112
+ // use this to find the type and then call the appropriate method afterwards.
113
+ *done* sqlite3_column_type(sqlite3_stmt*, int iCol);
114
+
115
+ # binding by name or index, if passed in an array to the bind() method then
116
+ # bind by index, if passed in a hash, bind by name, using hte keys of the hash
117
+ *done* sqlite3_bind_blob(sqlite3_stmt*, int, const void *, int n, void(*)(void*));
118
+ *done* sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
119
+
120
+
121
+ sqlite3_blob
122
+ ------------
123
+ // BLOB
124
+ *done* sqlite3_blob_open(sqlite3*, *db, *table, *column, rowid, flags, **blob);
125
+ *done* sqlite3_blob_close(sqlite3_blob*)
126
+ *done* sqlite3_blob_bytes(sqlite3_blob*)
127
+ *done* sqlite3_blob_read(sqlite3_blob*, *to_buffer, bytes_to_read, starting_at_offset);
128
+ *done* sqlite3_blob_write(sqlite3_blob*, *from_buffer, bytes_to_write, starting_at_offset);
129
+
130
+ Result Codes
131
+ ============
132
+
133
+ *done* Convert to Individual Exceptions and allow the top level module generate them
134
+ based upon integer value