amalgalite 0.4.2-x86-mswin32-60

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.
Files changed (83) hide show
  1. data/HISTORY +81 -0
  2. data/LICENSE +29 -0
  3. data/README +40 -0
  4. data/bin/amalgalite-pack-into-db +155 -0
  5. data/examples/a.rb +9 -0
  6. data/examples/blob.rb +105 -0
  7. data/examples/bootstrap.rb +36 -0
  8. data/examples/gem-db.rb +94 -0
  9. data/examples/requires.rb +54 -0
  10. data/examples/schema-info.rb +34 -0
  11. data/ext/amalgalite3.c +201 -0
  12. data/ext/amalgalite3.h +121 -0
  13. data/ext/amalgalite3_blob.c +241 -0
  14. data/ext/amalgalite3_constants.c +221 -0
  15. data/ext/amalgalite3_database.c +550 -0
  16. data/ext/amalgalite3_requires_bootstrap.c +210 -0
  17. data/ext/amalgalite3_statement.c +628 -0
  18. data/ext/extconf.rb +19 -0
  19. data/ext/gen_constants.rb +130 -0
  20. data/ext/rbconfig-mingw.rb +178 -0
  21. data/ext/sqlite3.c +97092 -0
  22. data/ext/sqlite3.h +6364 -0
  23. data/ext/sqlite3_options.h +4 -0
  24. data/ext/sqlite3ext.h +372 -0
  25. data/gemspec.rb +55 -0
  26. data/lib/amalgalite.rb +33 -0
  27. data/lib/amalgalite/blob.rb +186 -0
  28. data/lib/amalgalite/boolean.rb +42 -0
  29. data/lib/amalgalite/column.rb +86 -0
  30. data/lib/amalgalite/core_ext/kernel/require.rb +14 -0
  31. data/lib/amalgalite/database.rb +514 -0
  32. data/lib/amalgalite/index.rb +43 -0
  33. data/lib/amalgalite/paths.rb +70 -0
  34. data/lib/amalgalite/profile_tap.rb +130 -0
  35. data/lib/amalgalite/requires.rb +112 -0
  36. data/lib/amalgalite/schema.rb +115 -0
  37. data/lib/amalgalite/sqlite3.rb +6 -0
  38. data/lib/amalgalite/sqlite3/constants.rb +82 -0
  39. data/lib/amalgalite/sqlite3/database/status.rb +69 -0
  40. data/lib/amalgalite/sqlite3/status.rb +61 -0
  41. data/lib/amalgalite/sqlite3/version.rb +38 -0
  42. data/lib/amalgalite/statement.rb +394 -0
  43. data/lib/amalgalite/table.rb +36 -0
  44. data/lib/amalgalite/taps.rb +2 -0
  45. data/lib/amalgalite/taps/console.rb +27 -0
  46. data/lib/amalgalite/taps/io.rb +71 -0
  47. data/lib/amalgalite/trace_tap.rb +35 -0
  48. data/lib/amalgalite/type_map.rb +63 -0
  49. data/lib/amalgalite/type_maps/default_map.rb +167 -0
  50. data/lib/amalgalite/type_maps/storage_map.rb +41 -0
  51. data/lib/amalgalite/type_maps/text_map.rb +23 -0
  52. data/lib/amalgalite/version.rb +37 -0
  53. data/lib/amalgalite/view.rb +26 -0
  54. data/lib/amalgalite3.so +0 -0
  55. data/spec/amalgalite_spec.rb +4 -0
  56. data/spec/blob_spec.rb +81 -0
  57. data/spec/boolean_spec.rb +23 -0
  58. data/spec/database_spec.rb +238 -0
  59. data/spec/default_map_spec.rb +87 -0
  60. data/spec/integeration_spec.rb +111 -0
  61. data/spec/paths_spec.rb +28 -0
  62. data/spec/schema_spec.rb +60 -0
  63. data/spec/spec_helper.rb +25 -0
  64. data/spec/sqlite3/constants_spec.rb +65 -0
  65. data/spec/sqlite3/database_status_spec.rb +36 -0
  66. data/spec/sqlite3/status_spec.rb +18 -0
  67. data/spec/sqlite3/version_spec.rb +14 -0
  68. data/spec/sqlite3_spec.rb +23 -0
  69. data/spec/statement_spec.rb +134 -0
  70. data/spec/storage_map_spec.rb +41 -0
  71. data/spec/tap_spec.rb +59 -0
  72. data/spec/text_map_spec.rb +23 -0
  73. data/spec/type_map_spec.rb +17 -0
  74. data/spec/version_spec.rb +9 -0
  75. data/tasks/announce.rake +39 -0
  76. data/tasks/config.rb +110 -0
  77. data/tasks/distribution.rake +53 -0
  78. data/tasks/documentation.rake +33 -0
  79. data/tasks/extension.rake +100 -0
  80. data/tasks/rspec.rake +32 -0
  81. data/tasks/rubyforge.rake +59 -0
  82. data/tasks/utils.rb +80 -0
  83. metadata +192 -0
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # Basic amalgalite example creating a table, inserting rows and doing various
5
+ # selects and prepared statements
6
+ #
7
+ require 'rubygems'
8
+ require 'amalgalite'
9
+
10
+ #
11
+ # Create a database, this will create the DB if it doesn't exist
12
+ #
13
+ puts "Opening database (version #{Amalgalite::Version})"
14
+ db = Amalgalite::Database.new("gems.db")
15
+
16
+ #
17
+ # Setup taps into profile and trace information of sqlite, the profile tap will
18
+ # goto the profile_tap.log file and the trace information will go to the
19
+ # trace_tap.log file
20
+ #
21
+ puts "Establishing taps"
22
+ db.trace_tap = Amalgalite::Taps::IO.new( trace_tap_file = File.open("trace_tap.log", "w+") )
23
+ db.profile_tap = Amalgalite::Taps::IO.new( profile_tap_file = File.open("profile_tap.log", "w+") )
24
+
25
+ #
26
+ # Create the schema unless it already exists in the table. The meta information
27
+ # about the database schema is available as the result of the db.schema method
28
+ #
29
+ schema = db.schema
30
+ unless schema.tables['gems']
31
+ puts "Create schema"
32
+ db.execute <<-SQL
33
+ CREATE TABLE gems (
34
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
35
+ name VARCHAR(128),
36
+ version VARCHAR(32),
37
+ author VARCHAR(128)
38
+ );
39
+ SQL
40
+ db.reload_schema!
41
+ end
42
+
43
+ #
44
+ # Get some data from the system to insert into the database. Since everyone
45
+ # probably has gems installed, that's a ready known piece of information. We'll
46
+ # just pull in the latest version of each installed gem and dump some meta
47
+ # information into a db for testing.
48
+ #
49
+ latest_specs = Gem.source_index.latest_specs
50
+
51
+ puts "Inserting #{latest_specs.size} rows of gem information..."
52
+ before = Time.now
53
+
54
+ # Inserting bulk rows as a transaction is good practice with SQLite, it is
55
+ # MUCH faster.
56
+ db.transaction do |db_in_transaction|
57
+ db_in_transaction.prepare("INSERT INTO gems(name, version, author) VALUES( :name, :version, :author );") do |stmt|
58
+ latest_specs.each do |spec|
59
+ insert_data = {}
60
+ insert_data[':name'] = spec.name.to_s
61
+ insert_data[':version'] = spec.version.to_s
62
+ insert_data[':author'] = spec.authors.join(' ')
63
+ #puts "Inserting #{insert_data.inspect}"
64
+ stmt.execute( insert_data )
65
+ end
66
+ end
67
+ end
68
+ puts "Took #{Time.now - before} seconds"
69
+ puts "Done Inserting"
70
+
71
+ authors_by_number = db.execute("SELECT author, count( name ) as num_gems FROM gems GROUP BY author ORDER BY num_gems DESC")
72
+ favorite_author = authors_by_number.first
73
+ puts "Your favorite gem author is <#{favorite_author['author']}>, with #{favorite_author['num_gems']} gems installed."
74
+
75
+ #
76
+ # Now we'll look at the profile sampler and see what information it traced about
77
+ # our behavoir.
78
+ #
79
+ db.profile_tap.samplers.each do |stat_name, stat_values|
80
+ puts "-" * 20
81
+ puts stat_values.to_s
82
+ end
83
+
84
+ #
85
+ # Clear out the taps (not really necessary, just cleaning up)
86
+ #
87
+ db.trace_tap = profile_tap = nil
88
+
89
+ #
90
+ # close things down
91
+ #
92
+ db.close
93
+ trace_tap_file.close
94
+ profile_tap_file.close
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # An Amalgalite example showing how to 'require' data in an amalgalite database
5
+ #
6
+ # We'll make a database with one table, that we store file contents in.
7
+ #
8
+
9
+ $: << "../lib"
10
+ $: << "../ext"
11
+ require 'rubygems'
12
+ require 'amalgalite'
13
+
14
+ #
15
+ # create the database
16
+ #
17
+ File.unlink( "lib.db" ) if File.exist?( "lib.db" )
18
+ db = Amalgalite::Database.new( "lib.db" )
19
+ STDERR.puts "Creating rubylibs table"
20
+ db.execute(<<-create)
21
+ CREATE TABLE rubylibs(
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ filename VARCHAR UNIQUE,
24
+ contents TEXT
25
+ )
26
+ create
27
+
28
+
29
+ #
30
+ # insert some source code into a row
31
+ #
32
+ db.execute("INSERT INTO rubylibs(filename, contents) VALUES ( $filename, $contents )",
33
+ { "$filename" => "example",
34
+ "$contents" => <<code
35
+ class ExampleCode
36
+ def initialize( x )
37
+ puts "Initializing ExampleCode"
38
+ @x = x
39
+ end
40
+
41
+ def foo
42
+ puts @x
43
+ end
44
+ end
45
+ code
46
+ })
47
+ db.close
48
+
49
+ require 'amalgalite/requires'
50
+ Amalgalite::Requires.new( :dbfile_name => "lib.db" )
51
+ require 'example'
52
+ e = ExampleCode.new( 'it works!' )
53
+ e.foo
54
+
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'amalgalite'
5
+
6
+ db_name = ARGV.shift
7
+ unless db_name
8
+ puts "Usage: #{File.basename($0)} dbname"
9
+ exit 1
10
+ end
11
+ db = Amalgalite::Database.new( db_name )
12
+ col_info = %w[ default_value declared_data_type collation_sequence_name not_null_constraint primary_key auto_increment ]
13
+ max_width = col_info.collect { |c| c.length }.sort.last
14
+
15
+ db.schema.tables.keys.sort.each do |table_name|
16
+ puts "Table: #{table_name}"
17
+ puts "=" * 42
18
+ db.schema.tables[table_name].columns.each_pair do |col_name, col|
19
+ puts " Column : #{col.name}"
20
+ col_info.each do |ci|
21
+ puts " |#{ci.rjust( max_width, "." )} : #{col.send( ci )}"
22
+ end
23
+ puts
24
+ end
25
+
26
+ db.schema.tables[table_name].indexes.each_pair do |idx_name, index|
27
+ puts " Index : #{index.name}"
28
+ puts " |#{"sequence_number".rjust( max_width, "." )} : #{index.sequence_number}"
29
+ puts " |#{"is unique?".rjust( max_width, ".")} : #{index.unique?}"
30
+ puts " |#{"columns".rjust( max_width, ".")} : #{index.columns.collect { |c| c.name }.join(',') }"
31
+ puts
32
+ end
33
+ end
34
+
data/ext/amalgalite3.c ADDED
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Copyright (c) 2008 Jeremy Hinegardner
3
+ * All rights reserved. See LICENSE and/or COPYING for details.
4
+ *
5
+ * vim: shiftwidth=4
6
+ */
7
+
8
+ #include "amalgalite3.h"
9
+
10
+ /* Module and Classes */
11
+ VALUE mA; /* module Amalgalite */
12
+ VALUE mAS; /* module Amalgalite::SQLite3 */
13
+ VALUE mASV; /* module Amalgalite::SQLite3::Version */
14
+ VALUE eAS_Error; /* class Amalgalite::SQLite3::Error */
15
+ VALUE cAS_Stat; /* class Amalgalite::SQLite3::Stat */
16
+
17
+ /*----------------------------------------------------------------------
18
+ * module methods for Amalgalite::SQLite3
19
+ *---------------------------------------------------------------------*/
20
+
21
+ /*
22
+ * call-seq:
23
+ * Amalgalite::SQLite3.threadsafe? -> true or false
24
+ *
25
+ * Has the SQLite3 extension been compiled "threadsafe". If threadsafe? is
26
+ * true then the internal SQLite mutexes are enabled and SQLite is threadsafe.
27
+ * That is threadsafe within the context of 'C' threads.
28
+ *
29
+ */
30
+ VALUE am_sqlite3_threadsafe(VALUE self)
31
+ {
32
+ if (sqlite3_threadsafe()) {
33
+ return Qtrue;
34
+ } else {
35
+ return Qfalse;
36
+ }
37
+ }
38
+
39
+ /*
40
+ * call-seq:
41
+ * Amalgalite::SQLite3.complete?( ... , opts = { :utf16 => false }) -> True, False
42
+ *
43
+ * Is the text passed in as a parameter a complete SQL statement? Or is
44
+ * additional input required before sending the SQL to the extension. If the
45
+ * extra 'opts' parameter is used, you can send in a UTF-16 encoded string as
46
+ * the SQL.
47
+ *
48
+ * A complete statement must end with a semicolon.
49
+ *
50
+ */
51
+ VALUE am_sqlite3_complete(VALUE self, VALUE args)
52
+ {
53
+ VALUE sql = rb_ary_shift( args );
54
+ VALUE opts = rb_ary_shift( args );
55
+ VALUE utf16 = Qnil;
56
+ int result = 0;
57
+
58
+ if ( ( Qnil != opts ) && ( T_HASH == TYPE(opts) ) ){
59
+ utf16 = rb_hash_aref( opts, rb_intern("utf16") );
60
+ }
61
+
62
+ if ( (Qfalse == utf16) || (Qnil == utf16) ) {
63
+ result = sqlite3_complete( StringValuePtr( sql ) );
64
+ } else {
65
+ result = sqlite3_complete16( (void*) StringValuePtr( sql ) );
66
+ }
67
+
68
+ return ( result > 0 ) ? Qtrue : Qfalse;
69
+ }
70
+
71
+ /*
72
+ * call-seq:
73
+ * Amalgalite::SQLite3::Stat.update!( reset = false ) -> nil
74
+ *
75
+ * Populates the _@current_ and _@higwater_ instance variables of self
76
+ * object with the values from the sqlite3_status call. If reset it true then
77
+ * the highwater mark for the stat is reset
78
+ *
79
+ */
80
+ VALUE am_sqlite3_stat_update_bang( int argc, VALUE *argv, VALUE self )
81
+ {
82
+ int status_op = -1;
83
+ int current = -1;
84
+ int highwater = -1;
85
+ VALUE reset = Qfalse;
86
+ int reset_flag = 0;
87
+ int rc;
88
+
89
+ status_op = FIX2INT( rb_iv_get( self, "@code" ) );
90
+ if ( argc > 0 ) {
91
+ reset = argv[0];
92
+ reset_flag = ( Qtrue == reset ) ? 1 : 0 ;
93
+ }
94
+
95
+ rc = sqlite3_status( status_op, &current, &highwater, reset_flag );
96
+
97
+ if ( SQLITE_OK != rc ) {
98
+ VALUE n = rb_iv_get( self, "@name" ) ;
99
+ char* name = StringValuePtr( n );
100
+ rb_raise(eAS_Error, "Failure to retrieve status for %s : [SQLITE_ERROR %d] \n", name, rc);
101
+ }
102
+
103
+ rb_iv_set( self, "@current", INT2NUM( current ) );
104
+ rb_iv_set( self, "@highwater", INT2NUM( highwater) );
105
+
106
+ return Qnil;
107
+ }
108
+
109
+ /*
110
+ * call-seq:
111
+ * Amalgalite::SQLite3.randomness( N ) -> String of length N
112
+ *
113
+ * Generate N bytes of random data.
114
+ *
115
+ */
116
+ VALUE am_sqlite3_randomness(VALUE self, VALUE num_bytes)
117
+ {
118
+ int n = NUM2INT(num_bytes);
119
+ char *buf = ALLOCA_N(char, n);
120
+
121
+ sqlite3_randomness( n, buf );
122
+ return rb_str_new( buf, n );
123
+ }
124
+
125
+ /*----------------------------------------------------------------------
126
+ * module methods for Amalgalite::SQLite3::Version
127
+ *---------------------------------------------------------------------*/
128
+
129
+ /*
130
+ * call-seq:
131
+ * Amalgalite::SQLite3::Version.to_s -> String
132
+ *
133
+ * Return the SQLite C library version number as a string
134
+ *
135
+ */
136
+ VALUE am_sqlite3_libversion(VALUE self)
137
+ {
138
+ return rb_str_new2(sqlite3_libversion());
139
+ }
140
+
141
+ /*
142
+ * call-seq:
143
+ * Amalgalite::SQLite3.Version.to_i -> Fixnum
144
+ *
145
+ * Return the SQLite C library version number as an integer
146
+ *
147
+ */
148
+ VALUE am_sqlite3_libversion_number(VALUE self)
149
+ {
150
+ return INT2FIX(sqlite3_libversion_number());
151
+ }
152
+
153
+ /**
154
+ * Document-class: Amalgalite::SQLite3
155
+ *
156
+ * The SQLite ruby extension inside Amalgalite.
157
+ *
158
+ */
159
+
160
+ void Init_amalgalite3()
161
+ {
162
+ /*
163
+ * top level module encapsulating the entire Amalgalite library
164
+ */
165
+ mA = rb_define_module("Amalgalite");
166
+
167
+ mAS = rb_define_module_under(mA, "SQLite3");
168
+ rb_define_module_function(mAS, "threadsafe?", am_sqlite3_threadsafe, 0);
169
+ rb_define_module_function(mAS, "complete?", am_sqlite3_complete, -2);
170
+ rb_define_module_function(mAS, "randomness", am_sqlite3_randomness,1);
171
+
172
+ /*
173
+ * class encapsulating a single Stat
174
+ */
175
+ cAS_Stat = rb_define_class_under(mAS, "Stat", rb_cObject);
176
+ rb_define_method(cAS_Stat, "update!", am_sqlite3_stat_update_bang, -1);
177
+
178
+ /*
179
+ * Base class of all SQLite3 errors
180
+ */
181
+ eAS_Error = rb_define_class_under(mAS, "Error", rb_eStandardError); /* in amalgalite.c */
182
+
183
+ /**
184
+ * Encapsulation of the SQLite C library version
185
+ */
186
+ mASV = rb_define_module_under(mAS, "Version");
187
+ rb_define_module_function(mASV, "to_s", am_sqlite3_libversion, 0); /* in amalgalite3.c */
188
+ rb_define_module_function(mASV, "to_i", am_sqlite3_libversion_number, 0); /* in amalgalite3.c */
189
+
190
+ /*
191
+ * Initialize the rest of the module
192
+ */
193
+ Init_amalgalite3_constants( );
194
+ Init_amalgalite3_database( );
195
+ Init_amalgalite3_statement( );
196
+ Init_amalgalite3_blob( );
197
+ Init_amalgalite3_requires_bootstrap( );
198
+
199
+ }
200
+
201
+
data/ext/amalgalite3.h ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Copyright (c) 2008 Jeremy Hinegardner
3
+ * All rights reserved. See LICENSE and/or COPYING for details.
4
+ *
5
+ * vim: shiftwidth=4
6
+ */
7
+
8
+ #ifndef __AMALGALITE_H__
9
+ #define __AMALGALITE_H__
10
+
11
+ #include "ruby.h"
12
+ #include "sqlite3.h"
13
+
14
+ /* wrapper struct around the sqlite3 opaque pointer */
15
+ typedef struct am_sqlite3 {
16
+ sqlite3 *db;
17
+ VALUE trace_obj;
18
+ VALUE profile_obj;
19
+ } am_sqlite3;
20
+
21
+ /* wrapper struct around the sqlite3_statement opaque pointer */
22
+ typedef struct am_sqlite3_stmt {
23
+ sqlite3_stmt *stmt;
24
+ VALUE remaining_sql;
25
+ } am_sqlite3_stmt;
26
+
27
+ /* wrapper struct around the sqlite3_blob opaque ponter */
28
+ typedef struct am_sqlite3_blob {
29
+ sqlite3_blob *blob;
30
+ sqlite3 *db;
31
+ int length;
32
+ int current_offset;
33
+ } am_sqlite3_blob;
34
+
35
+
36
+ /** module and classes **/
37
+ extern VALUE mA; /* module Amalgalite */
38
+ extern VALUE mAS; /* module Amalgalite::SQLite3 */
39
+ extern VALUE mASV; /* module Amalgalite::SQLite3::Version */
40
+ extern VALUE eAS_Error; /* class Amalgalite::SQLite3::Error */
41
+
42
+ /*----------------------------------------------------------------------
43
+ * Prototype for Amalgalite::SQLite3::Database
44
+ *---------------------------------------------------------------------*/
45
+ extern VALUE cAS_Database; /* class Amalgliate::SQLite3::Database */
46
+
47
+ extern void am_define_constants_under(VALUE);
48
+ extern VALUE am_sqlite3_database_alloc(VALUE klass);
49
+ extern void am_sqlite3_database_free(am_sqlite3*);
50
+ extern VALUE am_sqlite3_database_open(int argc, VALUE* argv, VALUE self);
51
+ extern VALUE am_sqlite3_database_close(VALUE self);
52
+ extern VALUE am_sqlite3_database_open16(VALUE self, VALUE rFilename);
53
+ extern VALUE am_sqlite3_database_last_insert_rowid(VALUE self);
54
+ extern VALUE am_sqlite3_database_is_autocommit(VALUE self);
55
+ extern VALUE am_sqlite3_database_row_changes(VALUE self);
56
+ extern VALUE am_sqlite3_database_total_changes(VALUE self);
57
+ extern VALUE am_sqlite3_database_table_column_metadata(VALUE self, VALUE db_name, VALUE tbl_name, VALUE col_name);
58
+
59
+ extern VALUE am_sqlite3_database_prepare(VALUE self, VALUE rSQL);
60
+ extern VALUE am_sqlite3_database_register_trace_tap(VALUE self, VALUE tap);
61
+ extern VALUE am_sqlite3_database_register_profile_tap(VALUE self, VALUE tap);
62
+
63
+ /*----------------------------------------------------------------------
64
+ * Prototype for Amalgalite::SQLite3::Statement
65
+ *---------------------------------------------------------------------*/
66
+ extern VALUE cAS_Statement; /* class Amalgalite::SQLite3::Statement */
67
+
68
+ extern VALUE am_sqlite3_statement_alloc(VALUE klass);
69
+ extern void am_sqlite3_statement_free(am_sqlite3_stmt* );
70
+ extern VALUE am_sqlite3_statement_sql(VALUE self);
71
+ extern VALUE am_sqlite3_statement_close(VALUE self);
72
+ extern VALUE am_sqlite3_statement_step(VALUE self);
73
+ extern VALUE am_sqlite3_statement_column_count(VALUE self);
74
+ extern VALUE am_sqlite3_statement_column_name(VALUE self, VALUE index);
75
+ extern VALUE am_sqlite3_statement_column_decltype(VALUE self, VALUE index);
76
+ extern VALUE am_sqlite3_statement_column_type(VALUE self, VALUE index);
77
+ extern VALUE am_sqlite3_statement_column_blob(VALUE self, VALUE index);
78
+ extern VALUE am_sqlite3_statement_column_text(VALUE self, VALUE index);
79
+ extern VALUE am_sqlite3_statement_column_int(VALUE self, VALUE index);
80
+ extern VALUE am_sqlite3_statement_column_int64(VALUE self, VALUE index);
81
+ extern VALUE am_sqlite3_statement_column_double(VALUE self, VALUE index);
82
+
83
+ extern VALUE am_sqlite3_statement_column_database_name(VALUE self, VALUE position);
84
+ extern VALUE am_sqlite3_statement_column_table_name(VALUE self, VALUE position);
85
+ extern VALUE am_sqlite3_statement_column_origin_name(VALUE self, VALUE position);
86
+
87
+ extern VALUE am_sqlite3_statement_reset(VALUE self);
88
+ extern VALUE am_sqlite3_statement_clear_bindings(VALUE self);
89
+ extern VALUE am_sqlite3_statement_bind_parameter_count(VALUE self);
90
+ extern VALUE am_sqlite3_statement_bind_parameter_index(VALUE self, VALUE parameter_name);
91
+ extern VALUE am_sqlite3_statement_remaining_sql(VALUE self);
92
+ extern VALUE am_sqlite3_statement_bind_text(VALUE self, VALUE position, VALUE value);
93
+ extern VALUE am_sqlite3_statement_bind_blob(VALUE self, VALUE position, VALUE value);
94
+ extern VALUE am_sqlite3_statement_bind_zeroblob(VALUE self, VALUE position, VALUE value);
95
+ extern VALUE am_sqlite3_statement_bind_int(VALUE self, VALUE position, VALUE value);
96
+ extern VALUE am_sqlite3_statement_bind_int64(VALUE self, VALUE position, VALUE value);
97
+ extern VALUE am_sqlite3_statement_bind_double(VALUE self, VALUE position, VALUE value);
98
+ extern VALUE am_sqlite3_statement_bind_null(VALUE self, VALUE position);
99
+
100
+ /*----------------------------------------------------------------------
101
+ * Prototype for Amalgalite::SQLite3::Blob
102
+ *---------------------------------------------------------------------*/
103
+ extern VALUE cAS_Blob; /* class Amalgalite::SQLite3::Blob */
104
+
105
+ extern VALUE am_sqlite3_blob_alloc(VALUE klass);
106
+ extern VALUE am_sqlite3_blob_initialize( VALUE self, VALUE db, VALUE db_name, VALUE table_name, VALUE column_name, VALUE rowid, VALUE flag) ;
107
+ extern void am_sqlite3_blob_free(am_sqlite3_blob* );
108
+ extern VALUE am_sqlite3_blob_read(VALUE self, VALUE length);
109
+ extern VALUE am_sqlite3_blob_write(VALUE self, VALUE buffer);
110
+ extern VALUE am_sqlite3_blob_close(VALUE self);
111
+ extern VALUE am_sqlite3_blob_length(VALUE self);
112
+
113
+ /***********************************************************************
114
+ * Type conversion macros between sqlite data types and ruby types
115
+ **********************************************************************/
116
+
117
+ #define SQLINT64_2NUM(x) ( LL2NUM( x ) )
118
+ #define SQLUINT64_2NUM(x) ( ULL2NUM( x ) )
119
+ #define NUM2SQLINT64( obj ) ( NUM2LL( obj ) )
120
+ #define NUM2SQLUINT64( obj ) ( NUM2ULL( obj ) )
121
+ #endif