do_sqlite3 0.10.1.1-java → 0.10.2-java
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.markdown +4 -1
- data/Rakefile +2 -2
- data/ext/do_sqlite3/do_sqlite3.c +66 -106
- data/ext/do_sqlite3/do_sqlite3.h +65 -0
- data/ext/do_sqlite3/do_sqlite3_extension.c +78 -0
- data/ext/do_sqlite3/error.h +5 -0
- data/lib/do_sqlite3/do_sqlite3.jar +0 -0
- data/lib/do_sqlite3/version.rb +1 -1
- data/spec/encoding_spec.rb +9 -0
- data/spec/result_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -2
- data/tasks/compile.rake +1 -1
- metadata +56 -27
data/ChangeLog.markdown
CHANGED
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ JRUBY = RUBY_PLATFORM =~ /java/
|
|
11
11
|
IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ironruby'
|
12
12
|
WINDOWS = Gem.win_platform? || (JRUBY && ENV_JAVA['os.name'] =~ /windows/i)
|
13
13
|
SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
|
14
|
-
BINARY_VERSION = '
|
14
|
+
BINARY_VERSION = '3_6_23_1'
|
15
15
|
|
16
16
|
CLEAN.include(%w[ {tmp,pkg}/ **/*.{o,so,bundle,jar,log,a,gem,dSYM,obj,pdb,exp,DS_Store,rbc,db} ext/do_sqlite3/Makefile ext-java/target ])
|
17
17
|
|
@@ -35,7 +35,7 @@ begin
|
|
35
35
|
# and modify dependencies and extensions appropriately
|
36
36
|
gem.extensions << 'ext/do_sqlite3/extconf.rb'
|
37
37
|
|
38
|
-
gem.add_dependency 'data_objects',
|
38
|
+
gem.add_dependency 'data_objects', DataObjects::Sqlite3::VERSION
|
39
39
|
|
40
40
|
gem.add_development_dependency 'bacon', '~>1.1'
|
41
41
|
gem.add_development_dependency 'rake-compiler', '~>0.7'
|
data/ext/do_sqlite3/do_sqlite3.c
CHANGED
@@ -1,69 +1,13 @@
|
|
1
|
-
#include
|
2
|
-
#include <string.h>
|
3
|
-
#include <math.h>
|
4
|
-
#include <time.h>
|
5
|
-
#include <locale.h>
|
6
|
-
#include <sqlite3.h>
|
7
|
-
#include "compat.h"
|
1
|
+
#include "do_sqlite3.h"
|
8
2
|
#include "error.h"
|
9
|
-
|
10
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
11
|
-
#include <ruby/encoding.h>
|
12
|
-
|
13
|
-
#define DO_STR_NEW2(str, encoding) \
|
14
|
-
({ \
|
15
|
-
VALUE _string = rb_str_new2((const char *)str); \
|
16
|
-
if(encoding != -1) { \
|
17
|
-
rb_enc_associate_index(_string, encoding); \
|
18
|
-
} \
|
19
|
-
_string; \
|
20
|
-
})
|
21
|
-
|
22
|
-
#define DO_STR_NEW(str, len, encoding) \
|
23
|
-
({ \
|
24
|
-
VALUE _string = rb_str_new((const char *)str, (long)len); \
|
25
|
-
if(encoding != -1) { \
|
26
|
-
rb_enc_associate_index(_string, encoding); \
|
27
|
-
} \
|
28
|
-
_string; \
|
29
|
-
})
|
30
|
-
|
31
|
-
#else
|
32
|
-
|
33
|
-
#define DO_STR_NEW2(str, encoding) \
|
34
|
-
rb_str_new2((const char *)str)
|
35
|
-
|
36
|
-
#define DO_STR_NEW(str, len, encoding) \
|
37
|
-
rb_str_new((const char *)str, (long)len)
|
38
|
-
#endif
|
39
|
-
|
40
|
-
|
41
|
-
#define ID_CONST_GET rb_intern("const_get")
|
42
|
-
#define ID_PATH rb_intern("path")
|
43
|
-
#define ID_NEW rb_intern("new")
|
44
|
-
#define ID_ESCAPE rb_intern("escape_sql")
|
45
|
-
#define ID_QUERY rb_intern("query")
|
46
|
-
|
47
|
-
#define RUBY_CLASS(name) rb_const_get(rb_cObject, rb_intern(name))
|
48
|
-
#define CONST_GET(scope, constant) (rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant)))
|
49
|
-
#define SQLITE3_CLASS(klass, parent) (rb_define_class_under(mSqlite3, klass, parent))
|
50
|
-
|
51
|
-
#ifdef _WIN32
|
52
|
-
#define do_int64 signed __int64
|
53
|
-
#else
|
54
|
-
#define do_int64 signed long long int
|
55
|
-
#endif
|
56
|
-
|
57
|
-
#ifndef HAVE_SQLITE3_PREPARE_V2
|
58
|
-
#define sqlite3_prepare_v2 sqlite3_prepare
|
59
|
-
#endif
|
60
|
-
|
61
3
|
// To store rb_intern values
|
4
|
+
|
5
|
+
static ID ID_NEW;
|
62
6
|
static ID ID_NEW_DATE;
|
7
|
+
static ID ID_CONST_GET;
|
63
8
|
static ID ID_RATIONAL;
|
64
|
-
static ID
|
65
|
-
static ID
|
66
|
-
static ID ID_LEVEL;
|
9
|
+
static ID ID_ESCAPE;
|
10
|
+
static ID ID_LOG;
|
67
11
|
|
68
12
|
static VALUE mExtlib;
|
69
13
|
|
@@ -73,6 +17,8 @@ static VALUE cDO_Connection;
|
|
73
17
|
static VALUE cDO_Command;
|
74
18
|
static VALUE cDO_Result;
|
75
19
|
static VALUE cDO_Reader;
|
20
|
+
static VALUE cDO_Logger;
|
21
|
+
static VALUE cDO_Logger_Message;
|
76
22
|
|
77
23
|
static VALUE rb_cDate;
|
78
24
|
static VALUE rb_cDateTime;
|
@@ -84,8 +30,6 @@ static VALUE cConnection;
|
|
84
30
|
static VALUE cCommand;
|
85
31
|
static VALUE cResult;
|
86
32
|
static VALUE cReader;
|
87
|
-
|
88
|
-
static VALUE eArgumentError;
|
89
33
|
static VALUE eConnectionError;
|
90
34
|
static VALUE eDataError;
|
91
35
|
|
@@ -120,28 +64,16 @@ static int jd_from_date(int year, int month, int day) {
|
|
120
64
|
return (int) (floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524);
|
121
65
|
}
|
122
66
|
|
123
|
-
static void data_objects_debug(VALUE string, struct timeval* start) {
|
67
|
+
static void data_objects_debug(VALUE connection, VALUE string, struct timeval* start) {
|
124
68
|
struct timeval stop;
|
125
|
-
|
126
|
-
|
127
|
-
const char *query = rb_str_ptr_readonly(string);
|
128
|
-
size_t length = rb_str_len(string);
|
129
|
-
char total_time[32];
|
130
|
-
do_int64 duration = 0;
|
131
|
-
|
132
|
-
VALUE logger = rb_funcall(mSqlite3, ID_LOGGER, 0);
|
133
|
-
int log_level = NUM2INT(rb_funcall(logger, ID_LEVEL, 0));
|
69
|
+
VALUE message;
|
134
70
|
|
135
|
-
|
136
|
-
|
71
|
+
gettimeofday(&stop, NULL);
|
72
|
+
do_int64 duration = (stop.tv_sec - start->tv_sec) * 1000000 + stop.tv_usec - start->tv_usec;
|
137
73
|
|
138
|
-
|
74
|
+
message = rb_funcall(cDO_Logger_Message, ID_NEW, 3, string, rb_time_new(start->tv_sec, start->tv_usec), INT2NUM(duration));
|
139
75
|
|
140
|
-
|
141
|
-
message = (char *)calloc(length + strlen(total_time) + 4, sizeof(char));
|
142
|
-
snprintf(message, length + strlen(total_time) + 4, "(%s) %s", total_time, query);
|
143
|
-
rb_funcall(logger, ID_DEBUG, 1, rb_str_new(message, length + strlen(total_time) + 3));
|
144
|
-
}
|
76
|
+
rb_funcall(connection, ID_LOG, 1, message);
|
145
77
|
}
|
146
78
|
|
147
79
|
static void raise_error(VALUE self, sqlite3 *result, VALUE query) {
|
@@ -330,6 +262,12 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
|
|
330
262
|
return ruby_value;
|
331
263
|
}
|
332
264
|
|
265
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
266
|
+
rb_encoding * internal_encoding = rb_default_internal_encoding();
|
267
|
+
#else
|
268
|
+
void * internal_encoding = NULL;
|
269
|
+
#endif
|
270
|
+
|
333
271
|
if(type == Qnil) {
|
334
272
|
switch(original_type) {
|
335
273
|
case SQLITE_INTEGER: {
|
@@ -354,7 +292,7 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
|
|
354
292
|
if (type == rb_cInteger) {
|
355
293
|
return LL2NUM(sqlite3_column_int64(stmt, i));
|
356
294
|
} else if (type == rb_cString) {
|
357
|
-
return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding);
|
295
|
+
return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding, internal_encoding);
|
358
296
|
} else if (type == rb_cFloat) {
|
359
297
|
return rb_float_new(sqlite3_column_double(stmt, i));
|
360
298
|
} else if (type == rb_cBigDecimal) {
|
@@ -371,12 +309,10 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
|
|
371
309
|
return rb_funcall(rb_cByteArray, ID_NEW, 1, rb_str_new((char*)sqlite3_column_blob(stmt, i), length));
|
372
310
|
} else if (type == rb_cClass) {
|
373
311
|
return rb_funcall(mDO, rb_intern("full_const_get"), 1, rb_str_new((char*)sqlite3_column_text(stmt, i), length));
|
374
|
-
} else if (type == rb_cObject) {
|
375
|
-
return rb_marshal_load(rb_str_new((char*)sqlite3_column_text(stmt, i), length));
|
376
312
|
} else if (type == rb_cNilClass) {
|
377
313
|
return Qnil;
|
378
314
|
} else {
|
379
|
-
return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding);
|
315
|
+
return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding, internal_encoding);
|
380
316
|
}
|
381
317
|
}
|
382
318
|
|
@@ -385,7 +321,7 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
|
|
385
321
|
#define FLAG_PRESENT(query_values, flag) !NIL_P(rb_hash_aref(query_values, flag))
|
386
322
|
|
387
323
|
static int flags_from_uri(VALUE uri) {
|
388
|
-
VALUE query_values = rb_funcall(uri,
|
324
|
+
VALUE query_values = rb_funcall(uri, rb_intern("query"), 0);
|
389
325
|
|
390
326
|
int flags = 0;
|
391
327
|
|
@@ -425,7 +361,7 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
425
361
|
VALUE path;
|
426
362
|
sqlite3 *db;
|
427
363
|
|
428
|
-
path = rb_funcall(uri,
|
364
|
+
path = rb_funcall(uri, rb_intern("path"), 0);
|
429
365
|
|
430
366
|
#ifdef HAVE_SQLITE3_OPEN_V2
|
431
367
|
ret = sqlite3_open_v2(rb_str_ptr_readonly(path), &db, flags_from_uri(uri), 0);
|
@@ -488,11 +424,11 @@ static VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self) {
|
|
488
424
|
if(TYPE(sub_entry) == T_CLASS) {
|
489
425
|
rb_ary_push(type_strings, sub_entry);
|
490
426
|
} else {
|
491
|
-
rb_raise(
|
427
|
+
rb_raise(rb_eArgError, "Invalid type given");
|
492
428
|
}
|
493
429
|
}
|
494
430
|
} else {
|
495
|
-
rb_raise(
|
431
|
+
rb_raise(rb_eArgError, "Invalid type given");
|
496
432
|
}
|
497
433
|
}
|
498
434
|
|
@@ -570,7 +506,7 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
570
506
|
if ( status != SQLITE_OK ) {
|
571
507
|
raise_error(self, db, query);
|
572
508
|
}
|
573
|
-
data_objects_debug(query, &start);
|
509
|
+
data_objects_debug(connection, query, &start);
|
574
510
|
|
575
511
|
affected_rows = sqlite3_changes(db);
|
576
512
|
insert_id = sqlite3_last_insert_rowid(db);
|
@@ -602,7 +538,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
602
538
|
|
603
539
|
gettimeofday(&start, NULL);
|
604
540
|
status = sqlite3_prepare_v2(db, rb_str_ptr_readonly(query), -1, &sqlite3_reader, 0);
|
605
|
-
data_objects_debug(query, &start);
|
541
|
+
data_objects_debug(connection, query, &start);
|
606
542
|
|
607
543
|
if ( status != SQLITE_OK ) {
|
608
544
|
raise_error(self, db, query);
|
@@ -624,7 +560,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
624
560
|
// Whoops... wrong number of types passed to set_types. Close the reader and raise
|
625
561
|
// and error
|
626
562
|
rb_funcall(reader, rb_intern("close"), 0);
|
627
|
-
rb_raise(
|
563
|
+
rb_raise(rb_eArgError, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count);
|
628
564
|
}
|
629
565
|
|
630
566
|
for ( i = 0; i < field_count; i++ ) {
|
@@ -720,13 +656,14 @@ static VALUE cReader_field_count(VALUE self) {
|
|
720
656
|
void Init_do_sqlite3() {
|
721
657
|
rb_require("bigdecimal");
|
722
658
|
rb_require("date");
|
659
|
+
rb_require("data_objects");
|
723
660
|
|
724
|
-
|
725
|
-
rb_cDate = RUBY_CLASS("Date");
|
726
|
-
rb_cDateTime = RUBY_CLASS( "DateTime");
|
727
|
-
rb_cBigDecimal = RUBY_CLASS("BigDecimal");
|
661
|
+
ID_CONST_GET = rb_intern("const_get");
|
728
662
|
|
729
|
-
|
663
|
+
// Get references classes needed for Date/Time parsing
|
664
|
+
rb_cDate = CONST_GET(rb_mKernel, "Date");
|
665
|
+
rb_cDateTime = CONST_GET(rb_mKernel, "DateTime");
|
666
|
+
rb_cBigDecimal = CONST_GET(rb_mKernel, "BigDecimal");
|
730
667
|
|
731
668
|
#ifdef RUBY_LESS_THAN_186
|
732
669
|
ID_NEW_DATE = rb_intern("new0");
|
@@ -734,9 +671,9 @@ void Init_do_sqlite3() {
|
|
734
671
|
ID_NEW_DATE = rb_intern("new!");
|
735
672
|
#endif
|
736
673
|
ID_RATIONAL = rb_intern("Rational");
|
737
|
-
|
738
|
-
|
739
|
-
|
674
|
+
ID_NEW = rb_intern("new");
|
675
|
+
ID_ESCAPE = rb_intern("escape_sql");
|
676
|
+
ID_LOG = rb_intern("log");
|
740
677
|
|
741
678
|
// Get references to the Extlib module
|
742
679
|
mExtlib = CONST_GET(rb_mKernel, "Extlib");
|
@@ -749,15 +686,16 @@ void Init_do_sqlite3() {
|
|
749
686
|
cDO_Command = CONST_GET(mDO, "Command");
|
750
687
|
cDO_Result = CONST_GET(mDO, "Result");
|
751
688
|
cDO_Reader = CONST_GET(mDO, "Reader");
|
689
|
+
cDO_Logger = CONST_GET(mDO, "Logger");
|
690
|
+
cDO_Logger_Message = CONST_GET(cDO_Logger, "Message");
|
752
691
|
|
753
692
|
// Initialize the DataObjects::Sqlite3 module, and define its classes
|
754
693
|
mSqlite3 = rb_define_module_under(mDO, "Sqlite3");
|
755
694
|
|
756
|
-
eArgumentError = CONST_GET(rb_mKernel, "ArgumentError");
|
757
695
|
eConnectionError = CONST_GET(mDO, "ConnectionError");
|
758
696
|
eDataError = CONST_GET(mDO, "DataError");
|
759
697
|
|
760
|
-
cConnection =
|
698
|
+
cConnection = DRIVER_CLASS("Connection", cDO_Connection);
|
761
699
|
rb_define_method(cConnection, "initialize", cConnection_initialize, 1);
|
762
700
|
rb_define_method(cConnection, "dispose", cConnection_dispose, 0);
|
763
701
|
rb_define_method(cConnection, "quote_boolean", cConnection_quote_boolean, 1);
|
@@ -765,20 +703,41 @@ void Init_do_sqlite3() {
|
|
765
703
|
rb_define_method(cConnection, "quote_byte_array", cConnection_quote_byte_array, 1);
|
766
704
|
rb_define_method(cConnection, "character_set", cConnection_character_set, 0);
|
767
705
|
|
768
|
-
cCommand =
|
706
|
+
cCommand = DRIVER_CLASS("Command", cDO_Command);
|
769
707
|
rb_define_method(cCommand, "set_types", cCommand_set_types, -1);
|
770
708
|
rb_define_method(cCommand, "execute_non_query", cCommand_execute_non_query, -1);
|
771
709
|
rb_define_method(cCommand, "execute_reader", cCommand_execute_reader, -1);
|
772
710
|
|
773
|
-
cResult =
|
711
|
+
cResult = DRIVER_CLASS("Result", cDO_Result);
|
774
712
|
|
775
|
-
cReader =
|
713
|
+
cReader = DRIVER_CLASS("Reader", cDO_Reader);
|
776
714
|
rb_define_method(cReader, "close", cReader_close, 0);
|
777
715
|
rb_define_method(cReader, "next!", cReader_next, 0);
|
778
716
|
rb_define_method(cReader, "values", cReader_values, 0);
|
779
717
|
rb_define_method(cReader, "fields", cReader_fields, 0);
|
780
718
|
rb_define_method(cReader, "field_count", cReader_field_count, 0);
|
781
719
|
|
720
|
+
rb_global_variable(&ID_NEW_DATE);
|
721
|
+
rb_global_variable(&ID_RATIONAL);
|
722
|
+
rb_global_variable(&ID_CONST_GET);
|
723
|
+
rb_global_variable(&ID_ESCAPE);
|
724
|
+
rb_global_variable(&ID_LOG);
|
725
|
+
rb_global_variable(&ID_NEW);
|
726
|
+
|
727
|
+
rb_global_variable(&rb_cDate);
|
728
|
+
rb_global_variable(&rb_cDateTime);
|
729
|
+
rb_global_variable(&rb_cBigDecimal);
|
730
|
+
rb_global_variable(&rb_cByteArray);
|
731
|
+
|
732
|
+
rb_global_variable(&mDO);
|
733
|
+
rb_global_variable(&cDO_Logger_Message);
|
734
|
+
|
735
|
+
rb_global_variable(&cResult);
|
736
|
+
rb_global_variable(&cReader);
|
737
|
+
|
738
|
+
rb_global_variable(&eConnectionError);
|
739
|
+
rb_global_variable(&eDataError);
|
740
|
+
|
782
741
|
OPEN_FLAG_READONLY = rb_str_new2("read_only");
|
783
742
|
rb_global_variable(&OPEN_FLAG_READONLY);
|
784
743
|
OPEN_FLAG_READWRITE = rb_str_new2("read_write");
|
@@ -790,4 +749,5 @@ void Init_do_sqlite3() {
|
|
790
749
|
OPEN_FLAG_FULL_MUTEX = rb_str_new2("full_mutex");
|
791
750
|
rb_global_variable(&OPEN_FLAG_FULL_MUTEX);
|
792
751
|
|
752
|
+
Init_do_sqlite3_extension();
|
793
753
|
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#ifndef DO_SQLITE3_H
|
2
|
+
#define DO_SQLITE3_H
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <string.h>
|
6
|
+
#include <math.h>
|
7
|
+
#include <time.h>
|
8
|
+
#include <locale.h>
|
9
|
+
#include <sqlite3.h>
|
10
|
+
#include "compat.h"
|
11
|
+
|
12
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
13
|
+
#include <ruby/encoding.h>
|
14
|
+
|
15
|
+
#define DO_STR_NEW2(str, encoding, internal_encoding) \
|
16
|
+
({ \
|
17
|
+
VALUE _string = rb_str_new2((const char *)str); \
|
18
|
+
if(encoding != -1) { \
|
19
|
+
rb_enc_associate_index(_string, encoding); \
|
20
|
+
} \
|
21
|
+
if(internal_encoding) { \
|
22
|
+
_string = rb_str_export_to_enc(_string, internal_encoding); \
|
23
|
+
} \
|
24
|
+
_string; \
|
25
|
+
})
|
26
|
+
|
27
|
+
#define DO_STR_NEW(str, len, encoding, internal_encoding) \
|
28
|
+
({ \
|
29
|
+
VALUE _string = rb_str_new((const char *)str, (long)len); \
|
30
|
+
if(encoding != -1) { \
|
31
|
+
rb_enc_associate_index(_string, encoding); \
|
32
|
+
} \
|
33
|
+
if(internal_encoding) { \
|
34
|
+
_string = rb_str_export_to_enc(_string, internal_encoding); \
|
35
|
+
} \
|
36
|
+
_string; \
|
37
|
+
})
|
38
|
+
|
39
|
+
#else
|
40
|
+
|
41
|
+
#define DO_STR_NEW2(str, encoding, internal_encoding) \
|
42
|
+
rb_str_new2((const char *)str)
|
43
|
+
|
44
|
+
#define DO_STR_NEW(str, len, encoding, internal_encoding) \
|
45
|
+
rb_str_new((const char *)str, (long)len)
|
46
|
+
#endif
|
47
|
+
|
48
|
+
#define CONST_GET(scope, constant) (rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant)))
|
49
|
+
#define DRIVER_CLASS(klass, parent) (rb_define_class_under(mSqlite3, klass, parent))
|
50
|
+
|
51
|
+
#ifdef _WIN32
|
52
|
+
#define do_int64 signed __int64
|
53
|
+
#else
|
54
|
+
#define do_int64 signed long long int
|
55
|
+
#endif
|
56
|
+
|
57
|
+
#ifndef HAVE_SQLITE3_PREPARE_V2
|
58
|
+
#define sqlite3_prepare_v2 sqlite3_prepare
|
59
|
+
#endif
|
60
|
+
|
61
|
+
static ID ID_CONST_GET;
|
62
|
+
|
63
|
+
void Init_do_sqlite3_extension();
|
64
|
+
|
65
|
+
#endif
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#include "do_sqlite3.h"
|
2
|
+
|
3
|
+
static VALUE ID_CONST_GET;
|
4
|
+
static VALUE mDO;
|
5
|
+
static VALUE mSqlite3;
|
6
|
+
static VALUE eConnectionError;
|
7
|
+
static VALUE cDO_Extension;
|
8
|
+
static VALUE cExtension;
|
9
|
+
|
10
|
+
/*****************************************************/
|
11
|
+
/* File used for providing extensions on the default */
|
12
|
+
/* API that are driver specific. */
|
13
|
+
/*****************************************************/
|
14
|
+
static VALUE cExtension_enable_load_extension(VALUE self, VALUE on) {
|
15
|
+
VALUE id_connection = rb_intern("connection");
|
16
|
+
|
17
|
+
VALUE connection = rb_funcall(self, id_connection, 0);
|
18
|
+
sqlite3 *db;
|
19
|
+
int status;
|
20
|
+
|
21
|
+
if (connection == Qnil) { return Qfalse; }
|
22
|
+
|
23
|
+
// Retrieve the actual connection from the
|
24
|
+
connection = rb_iv_get(self, "@connection");
|
25
|
+
|
26
|
+
if (connection == Qnil) { return Qfalse; }
|
27
|
+
|
28
|
+
db = DATA_PTR(connection);
|
29
|
+
|
30
|
+
if(db == NULL) { return Qfalse; }
|
31
|
+
|
32
|
+
status = sqlite3_enable_load_extension(db, on == Qtrue ? 1 : 0);
|
33
|
+
|
34
|
+
if ( status != SQLITE_OK ) {
|
35
|
+
rb_raise(eConnectionError, "Couldn't enable extension loading");
|
36
|
+
}
|
37
|
+
return Qtrue;
|
38
|
+
}
|
39
|
+
|
40
|
+
static VALUE cExtension_load_extension(VALUE self, VALUE path) {
|
41
|
+
VALUE id_connection = rb_intern("connection");
|
42
|
+
|
43
|
+
VALUE connection = rb_funcall(self, id_connection, 0);
|
44
|
+
sqlite3 *db;
|
45
|
+
const char *extension_path = rb_str_ptr_readonly(path);
|
46
|
+
char* errmsg = sqlite3_malloc(1024);
|
47
|
+
int status;
|
48
|
+
|
49
|
+
if (connection == Qnil) { return Qfalse; }
|
50
|
+
|
51
|
+
// Retrieve the actual connection from the
|
52
|
+
connection = rb_iv_get(self, "@connection");
|
53
|
+
|
54
|
+
if (connection == Qnil) { return Qfalse; }
|
55
|
+
|
56
|
+
db = DATA_PTR(connection);
|
57
|
+
|
58
|
+
if(db == NULL) { return Qfalse; }
|
59
|
+
|
60
|
+
status = sqlite3_load_extension(db, extension_path, 0, &errmsg);
|
61
|
+
|
62
|
+
if ( status != SQLITE_OK ) {
|
63
|
+
VALUE errexp = rb_exc_new2(eConnectionError, errmsg);
|
64
|
+
sqlite3_free(errmsg);
|
65
|
+
rb_exc_raise(errexp);
|
66
|
+
}
|
67
|
+
return Qtrue;
|
68
|
+
}
|
69
|
+
|
70
|
+
void Init_do_sqlite3_extension() {
|
71
|
+
ID_CONST_GET = rb_intern("const_get");
|
72
|
+
mDO = CONST_GET(rb_mKernel, "DataObjects");
|
73
|
+
cDO_Extension = CONST_GET(mDO, "Extension");
|
74
|
+
mSqlite3 = rb_define_module_under(mDO, "Sqlite3");
|
75
|
+
cExtension = DRIVER_CLASS("Extension", cDO_Extension);
|
76
|
+
rb_define_method(cExtension, "load_extension", cExtension_load_extension, 1);
|
77
|
+
rb_define_method(cExtension, "enable_load_extension", cExtension_enable_load_extension, 1);
|
78
|
+
}
|
data/ext/do_sqlite3/error.h
CHANGED
Binary file
|
data/lib/do_sqlite3/version.rb
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
|
+
require 'data_objects/spec/encoding_spec'
|
5
|
+
|
6
|
+
describe DataObjects::Sqlite3::Connection do
|
7
|
+
behaves_like 'returning correctly encoded strings for the default database encoding'
|
8
|
+
behaves_like 'returning correctly encoded strings for the default internal encoding'
|
9
|
+
end
|
data/spec/result_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/tasks/compile.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: do_sqlite3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 10
|
8
|
+
- 2
|
9
|
+
version: 0.10.2
|
5
10
|
platform: java
|
6
11
|
authors:
|
7
12
|
- Dirkjan Bussink
|
@@ -9,59 +14,77 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-05-19 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: data_objects
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - "="
|
22
26
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 10
|
30
|
+
- 2
|
31
|
+
version: 0.10.2
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: bacon
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ~>
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 1
|
33
44
|
version: "1.1"
|
34
|
-
|
45
|
+
type: :development
|
46
|
+
version_requirements: *id002
|
35
47
|
- !ruby/object:Gem::Dependency
|
36
48
|
name: rake-compiler
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
42
53
|
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
- 7
|
43
57
|
version: "0.7"
|
44
|
-
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id003
|
45
60
|
- !ruby/object:Gem::Dependency
|
46
61
|
name: jdbc-sqlite3
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
65
|
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 3
|
69
|
+
- 5
|
70
|
+
- 8
|
53
71
|
version: 3.5.8
|
54
|
-
|
72
|
+
type: :runtime
|
73
|
+
version_requirements: *id004
|
55
74
|
- !ruby/object:Gem::Dependency
|
56
75
|
name: do_jdbc
|
57
|
-
|
58
|
-
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
76
|
+
prerelease: false
|
77
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
60
78
|
requirements:
|
61
79
|
- - "="
|
62
80
|
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
- 10
|
84
|
+
- 2
|
85
|
+
version: 0.10.2
|
86
|
+
type: :runtime
|
87
|
+
version_requirements: *id005
|
65
88
|
description: Implements the DataObjects API for Sqlite3
|
66
89
|
email: d.bussink@gmail.com
|
67
90
|
executables: []
|
@@ -78,6 +101,7 @@ files:
|
|
78
101
|
- lib/do_sqlite3.rb
|
79
102
|
- spec/command_spec.rb
|
80
103
|
- spec/connection_spec.rb
|
104
|
+
- spec/encoding_spec.rb
|
81
105
|
- spec/reader_spec.rb
|
82
106
|
- spec/result_spec.rb
|
83
107
|
- spec/spec_helper.rb
|
@@ -101,7 +125,9 @@ files:
|
|
101
125
|
- tasks/spec.rake
|
102
126
|
- ext/do_sqlite3/extconf.rb
|
103
127
|
- ext/do_sqlite3/do_sqlite3.c
|
128
|
+
- ext/do_sqlite3/do_sqlite3_extension.c
|
104
129
|
- ext/do_sqlite3/compat.h
|
130
|
+
- ext/do_sqlite3/do_sqlite3.h
|
105
131
|
- ext/do_sqlite3/error.h
|
106
132
|
- LICENSE
|
107
133
|
- Rakefile
|
@@ -121,24 +147,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
147
|
requirements:
|
122
148
|
- - ">="
|
123
149
|
- !ruby/object:Gem::Version
|
150
|
+
segments:
|
151
|
+
- 0
|
124
152
|
version: "0"
|
125
|
-
version:
|
126
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
154
|
requirements:
|
128
155
|
- - ">="
|
129
156
|
- !ruby/object:Gem::Version
|
157
|
+
segments:
|
158
|
+
- 0
|
130
159
|
version: "0"
|
131
|
-
version:
|
132
160
|
requirements: []
|
133
161
|
|
134
162
|
rubyforge_project: dorb
|
135
|
-
rubygems_version: 1.3.
|
163
|
+
rubygems_version: 1.3.6
|
136
164
|
signing_key:
|
137
165
|
specification_version: 3
|
138
166
|
summary: DataObjects Sqlite3 Driver
|
139
167
|
test_files:
|
140
168
|
- spec/command_spec.rb
|
141
169
|
- spec/connection_spec.rb
|
170
|
+
- spec/encoding_spec.rb
|
142
171
|
- spec/reader_spec.rb
|
143
172
|
- spec/result_spec.rb
|
144
173
|
- spec/spec_helper.rb
|