do_sqlite3 0.9.12-x86-mswin32-60 → 0.10.0-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.
@@ -1,10 +1,18 @@
1
- == 0.9.11 2009-01-19
1
+ ## 0.10.0 2009-10-15
2
+ * Improvements
3
+ * JRuby Support (using *do_jdbc*)
4
+
5
+ ## 0.9.12 2009-05-17
6
+ * Improvements
7
+ * rake-compiler for Windows support
8
+
9
+ ## 0.9.11 2009-01-19
2
10
  * Improvements
3
11
  * Ruby 1.9 support
4
12
  * Fixes
5
13
  * Fix Windows gem
6
14
 
7
- == 0.9.9 2008-11-27
15
+ ## 0.9.9 2008-11-27
8
16
  * Improvements
9
17
  * Added cross compile rake tasks for Windows gems [Jonathan Stott, Luis Lavena]
10
18
  * Added initial support for Ruby 1.9 [John Harrison]
@@ -1,8 +1,8 @@
1
1
  .gitignore
2
- History.txt
2
+ HISTORY.markdown
3
3
  LICENSE
4
4
  Manifest.txt
5
- README.txt
5
+ README.markdown
6
6
  Rakefile
7
7
  buildfile
8
8
  ext-java/src/main/java/DoSqlite3ExtService.java
@@ -1,3 +1,4 @@
1
- = do_sqlite3
1
+ do_sqlite3
2
+ ==========
2
3
 
3
4
  A DataObjects driver for SQLite3
data/Rakefile CHANGED
@@ -8,9 +8,9 @@ require 'lib/do_sqlite3/version'
8
8
  ROOT = Pathname(__FILE__).dirname.expand_path
9
9
  JRUBY = RUBY_PLATFORM =~ /java/
10
10
  WINDOWS = Gem.win_platform?
11
- SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
11
+ SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
12
12
  BINARY_VERSION = '3_6_13'
13
13
 
14
- Dir['tasks/*.rake'].each { |f| import f }
14
+ Dir['tasks/*.rake'].sort.each { |f| import f }
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_ext/Makefile ext-java/target ])
@@ -4,6 +4,38 @@
4
4
  #include <time.h>
5
5
  #include <locale.h>
6
6
  #include <sqlite3.h>
7
+ #include "error.h"
8
+
9
+ #ifdef HAVE_RUBY_ENCODING_H
10
+ #include <ruby/encoding.h>
11
+
12
+ #define DO_STR_NEW2(str, encoding) \
13
+ ({ \
14
+ VALUE _string = rb_str_new2((const char *)str); \
15
+ if(encoding != -1) { \
16
+ rb_enc_associate_index(_string, encoding); \
17
+ } \
18
+ _string; \
19
+ })
20
+
21
+ #define DO_STR_NEW(str, len, encoding) \
22
+ ({ \
23
+ VALUE _string = rb_str_new((const char *)str, (long)len); \
24
+ if(encoding != -1) { \
25
+ rb_enc_associate_index(_string, encoding); \
26
+ } \
27
+ _string; \
28
+ })
29
+
30
+ #else
31
+
32
+ #define DO_STR_NEW2(str, encoding) \
33
+ rb_str_new2((const char *)str)
34
+
35
+ #define DO_STR_NEW(str, len, encoding) \
36
+ rb_str_new((const char *)str, (long)len)
37
+ #endif
38
+
7
39
 
8
40
  #define ID_CONST_GET rb_intern("const_get")
9
41
  #define ID_PATH rb_intern("path")
@@ -12,8 +44,6 @@
12
44
  #define ID_QUERY rb_intern("query")
13
45
 
14
46
  #define RUBY_CLASS(name) rb_const_get(rb_cObject, rb_intern(name))
15
- #define RUBY_STRING(char_ptr) rb_str_new2(char_ptr)
16
- #define TAINTED_STRING(name, length) rb_tainted_str_new(name, length)
17
47
  #define CONST_GET(scope, constant) (rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant)))
18
48
  #define SQLITE3_CLASS(klass, parent) (rb_define_class_under(mSqlite3, klass, parent))
19
49
 
@@ -69,7 +99,8 @@ static VALUE cResult;
69
99
  static VALUE cReader;
70
100
 
71
101
  static VALUE eArgumentError;
72
- static VALUE eSqlite3Error;
102
+ static VALUE eConnectionError;
103
+ static VALUE eDataError;
73
104
 
74
105
  static VALUE OPEN_FLAG_READONLY;
75
106
  static VALUE OPEN_FLAG_READWRITE;
@@ -126,6 +157,32 @@ static void data_objects_debug(VALUE string, struct timeval* start) {
126
157
  }
127
158
  }
128
159
 
160
+ static void raise_error(VALUE self, sqlite3 *result, VALUE query) {
161
+ VALUE exception;
162
+ const char *message = sqlite3_errmsg(result);
163
+ const char *exception_type = "SQLError";
164
+ int sqlite3_errno = sqlite3_errcode(result);
165
+
166
+ struct errcodes *errs;
167
+
168
+ for (errs = errors; errs->error_name; errs++) {
169
+ if(errs->error_no == sqlite3_errno) {
170
+ exception_type = errs->exception;
171
+ break;
172
+ }
173
+ }
174
+
175
+
176
+ VALUE uri = rb_funcall(rb_iv_get(self, "@connection"), rb_intern("to_s"), 0);
177
+
178
+ exception = rb_funcall(CONST_GET(mDO, exception_type), ID_NEW, 5,
179
+ rb_str_new2(message),
180
+ INT2NUM(sqlite3_errno),
181
+ rb_str_new2(""),
182
+ query,
183
+ uri);
184
+ rb_exc_raise(exception);
185
+ }
129
186
 
130
187
  static VALUE parse_date(char *date) {
131
188
  int year, month, day;
@@ -200,7 +257,7 @@ static VALUE parse_date_time(char *date) {
200
257
  hour_offset = 0;
201
258
  minute_offset = 0;
202
259
  sec = 0;
203
- }
260
+ }
204
261
  // We read the Date and Time, default to the current locale's offset
205
262
 
206
263
  // Get localtime
@@ -222,7 +279,7 @@ static VALUE parse_date_time(char *date) {
222
279
 
223
280
  } else {
224
281
  // Something went terribly wrong
225
- rb_raise(eSqlite3Error, "Couldn't parse date: %s", date);
282
+ rb_raise(eDataError, "Couldn't parse date: %s", date);
226
283
  }
227
284
 
228
285
  jd = jd_from_date(year, month, day);
@@ -278,7 +335,7 @@ static VALUE parse_time(char *date) {
278
335
  return rb_funcall(rb_cTime, rb_intern("local"), 7, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec), INT2NUM(usec));
279
336
  }
280
337
 
281
- static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type) {
338
+ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
282
339
  VALUE ruby_value = Qnil;
283
340
  int original_type = sqlite3_column_type(stmt, i);
284
341
  int length = sqlite3_column_bytes(stmt, i);
@@ -310,11 +367,11 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type) {
310
367
  if (type == rb_cInteger) {
311
368
  return LL2NUM(sqlite3_column_int64(stmt, i));
312
369
  } else if (type == rb_cString) {
313
- return TAINTED_STRING((char*)sqlite3_column_text(stmt, i), length);
370
+ return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding);
314
371
  } else if (type == rb_cFloat) {
315
372
  return rb_float_new(sqlite3_column_double(stmt, i));
316
373
  } else if (type == rb_cBigDecimal) {
317
- return rb_funcall(rb_cBigDecimal, ID_NEW, 1, TAINTED_STRING((char*)sqlite3_column_text(stmt, i), length));
374
+ return rb_funcall(rb_cBigDecimal, ID_NEW, 1, rb_str_new((char*)sqlite3_column_text(stmt, i), length));
318
375
  } else if (type == rb_cDate) {
319
376
  return parse_date((char*)sqlite3_column_text(stmt, i));
320
377
  } else if (type == rb_cDateTime) {
@@ -324,15 +381,15 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type) {
324
381
  } else if (type == rb_cTrueClass) {
325
382
  return strcmp((char*)sqlite3_column_text(stmt, i), "t") == 0 ? Qtrue : Qfalse;
326
383
  } else if (type == rb_cByteArray) {
327
- return rb_funcall(rb_cByteArray, ID_NEW, 1, TAINTED_STRING((char*)sqlite3_column_blob(stmt, i), length));
384
+ return rb_funcall(rb_cByteArray, ID_NEW, 1, rb_str_new((char*)sqlite3_column_blob(stmt, i), length));
328
385
  } else if (type == rb_cClass) {
329
- return rb_funcall(rb_cObject, rb_intern("full_const_get"), 1, TAINTED_STRING((char*)sqlite3_column_text(stmt, i), length));
386
+ return rb_funcall(rb_cObject, rb_intern("full_const_get"), 1, rb_str_new((char*)sqlite3_column_text(stmt, i), length));
330
387
  } else if (type == rb_cObject) {
331
388
  return rb_marshal_load(rb_str_new((char*)sqlite3_column_text(stmt, i), length));
332
389
  } else if (type == rb_cNilClass) {
333
390
  return Qnil;
334
391
  } else {
335
- return TAINTED_STRING((char*)sqlite3_column_text(stmt, i), length);
392
+ return DO_STR_NEW((char*)sqlite3_column_text(stmt, i), length, encoding);
336
393
  }
337
394
  }
338
395
 
@@ -390,11 +447,16 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
390
447
  #endif
391
448
 
392
449
  if ( ret != SQLITE_OK ) {
393
- rb_raise(eSqlite3Error, sqlite3_errmsg(db));
450
+ raise_error(self, db, Qnil);
394
451
  }
395
452
 
396
453
  rb_iv_set(self, "@uri", uri);
397
454
  rb_iv_set(self, "@connection", Data_Wrap_Struct(rb_cObject, 0, 0, db));
455
+ // Sqlite3 only supports UTF-8, so this is the standard encoding
456
+ rb_iv_set(self, "@encoding", rb_str_new2("UTF-8"));
457
+ #ifdef HAVE_RUBY_ENCODING_H
458
+ rb_iv_set(self, "@encoding_id", INT2FIX(rb_enc_find_index("UTF-8")));
459
+ #endif
398
460
 
399
461
  return Qtrue;
400
462
  }
@@ -453,7 +515,7 @@ static VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self) {
453
515
  }
454
516
 
455
517
  static VALUE cConnection_quote_boolean(VALUE self, VALUE value) {
456
- return rb_tainted_str_new2(value == Qtrue ? "'t'" : "'f'");
518
+ return rb_str_new2(value == Qtrue ? "'t'" : "'f'");
457
519
  }
458
520
 
459
521
  static VALUE cConnection_quote_string(VALUE self, VALUE string) {
@@ -464,7 +526,10 @@ static VALUE cConnection_quote_string(VALUE self, VALUE string) {
464
526
  // Wrap the escaped string in single-quotes, this is DO's convention
465
527
  escaped_with_quotes = sqlite3_mprintf("%Q", source);
466
528
 
467
- result = rb_tainted_str_new2(escaped_with_quotes);
529
+ result = rb_str_new2(escaped_with_quotes);
530
+ #ifdef HAVE_RUBY_ENCODING_H
531
+ rb_enc_associate_index(result, FIX2INT(rb_iv_get(self, "@encoding_id")));
532
+ #endif
468
533
  sqlite3_free(escaped_with_quotes);
469
534
  return result;
470
535
  }
@@ -499,7 +564,7 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
499
564
  status = sqlite3_exec(db, StringValuePtr(query), 0, 0, &error_message);
500
565
 
501
566
  if ( status != SQLITE_OK ) {
502
- rb_raise(eSqlite3Error, "%s\nQuery: %s", sqlite3_errmsg(db), StringValuePtr(query));
567
+ raise_error(self, db, query);
503
568
  }
504
569
  data_objects_debug(query, &start);
505
570
 
@@ -531,7 +596,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
531
596
  data_objects_debug(query, &start);
532
597
 
533
598
  if ( status != SQLITE_OK ) {
534
- rb_raise(eSqlite3Error, "%s\nQuery: %s", sqlite3_errmsg(db), StringValuePtr(query));
599
+ raise_error(self, db, query);
535
600
  }
536
601
 
537
602
  field_count = sqlite3_column_count(sqlite3_reader);
@@ -603,9 +668,18 @@ static VALUE cReader_next(VALUE self) {
603
668
  return Qfalse;
604
669
  }
605
670
 
671
+ int enc = -1;
672
+ #ifdef HAVE_RUBY_ENCODING_H
673
+ VALUE encoding_id = rb_iv_get(rb_iv_get(self, "@connection"), "@encoding_id");
674
+ if (encoding_id != Qnil) {
675
+ enc = FIX2INT(encoding_id);
676
+ }
677
+ #endif
678
+
679
+
606
680
  for ( i = 0; i < field_count; i++ ) {
607
681
  field_type = rb_ary_entry(field_types, i);
608
- value = typecast(reader, i, field_type);
682
+ value = typecast(reader, i, field_type, enc);
609
683
  rb_ary_push(arr, value);
610
684
  }
611
685
 
@@ -617,7 +691,7 @@ static VALUE cReader_next(VALUE self) {
617
691
  static VALUE cReader_values(VALUE self) {
618
692
  VALUE state = rb_iv_get(self, "@state");
619
693
  if ( state == Qnil || NUM2INT(state) != SQLITE_ROW ) {
620
- rb_raise(eSqlite3Error, "Reader is not initialized");
694
+ rb_raise(eDataError, "Reader is not initialized");
621
695
  return Qnil;
622
696
  }
623
697
  else {
@@ -670,7 +744,8 @@ void Init_do_sqlite3_ext() {
670
744
  mSqlite3 = rb_define_module_under(mDO, "Sqlite3");
671
745
 
672
746
  eArgumentError = CONST_GET(rb_mKernel, "ArgumentError");
673
- eSqlite3Error = rb_define_class("Sqlite3Error", rb_eStandardError);
747
+ eConnectionError = CONST_GET(mDO, "ConnectionError");
748
+ eDataError = CONST_GET(mDO, "DataError");
674
749
 
675
750
  cConnection = SQLITE3_CLASS("Connection", cDO_Connection);
676
751
  rb_define_method(cConnection, "initialize", cConnection_initialize, 1);
@@ -0,0 +1,106 @@
1
+ static struct errcodes {
2
+ int error_no;
3
+ const char *error_name;
4
+ const char *exception;
5
+ } errors [] = {
6
+ #ifdef SQLITE_ERROR
7
+ { SQLITE_ERROR,
8
+ "SQLITE_ERROR", "SyntaxError"},
9
+ #endif
10
+ #ifdef SQLITE_INTERNAL
11
+ { SQLITE_INTERNAL,
12
+ "SQLITE_INTERNAL", "SQLError"},
13
+ #endif
14
+ #ifdef SQLITE_PERM
15
+ { SQLITE_PERM,
16
+ "SQLITE_PERM", "ConnectionError"},
17
+ #endif
18
+ #ifdef SQLITE_ABORT
19
+ { SQLITE_ABORT,
20
+ "SQLITE_ABORT", "ConnectionError"},
21
+ #endif
22
+ #ifdef SQLITE_BUSY
23
+ { SQLITE_BUSY,
24
+ "SQLITE_BUSY", "ConnectionError"},
25
+ #endif
26
+
27
+ #ifdef SQLITE_LOCKED
28
+ { SQLITE_LOCKED,
29
+ "SQLITE_LOCKED", "ConnectionError"},
30
+ #endif
31
+ #ifdef SQLITE_NOMEM
32
+ { SQLITE_NOMEM,
33
+ "SQLITE_NOMEM", "ConnectionError"},
34
+ #endif
35
+ #ifdef SQLITE_READONLY
36
+ { SQLITE_READONLY,
37
+ "SQLITE_READONLY", "ConnectionError"},
38
+ #endif
39
+ #ifdef SQLITE_INTERRUPT
40
+ { SQLITE_INTERRUPT,
41
+ "SQLITE_INTERRUPT", "ConnectionError"},
42
+ #endif
43
+ #ifdef SQLITE_IOERR
44
+ { SQLITE_IOERR,
45
+ "SQLITE_IOERR", "ConnectionError"},
46
+ #endif
47
+ #ifdef SQLITE_CORRUPT
48
+ { SQLITE_CORRUPT,
49
+ "SQLITE_CORRUPT", "ConnectionError"},
50
+ #endif
51
+ #ifdef SQLITE_FULL
52
+ { SQLITE_FULL,
53
+ "SQLITE_FULL", "ConnectionError"},
54
+ #endif
55
+ #ifdef SQLITE_CANTOPEN
56
+ { SQLITE_CANTOPEN,
57
+ "SQLITE_CANTOPEN", "ConnectionError"},
58
+ #endif
59
+ #ifdef SQLITE_EMPTY
60
+ { SQLITE_EMPTY,
61
+ "SQLITE_EMPTY", "ConnectionError"},
62
+ #endif
63
+ #ifdef SQLITE_SCHEMA
64
+ { SQLITE_SCHEMA,
65
+ "SQLITE_SCHEMA", "DataError"},
66
+ #endif
67
+ #ifdef SQLITE_TOOBIG
68
+ { SQLITE_TOOBIG,
69
+ "SQLITE_TOOBIG", "DataError"},
70
+ #endif
71
+ #ifdef SQLITE_MISMATCH
72
+ { SQLITE_MISMATCH,
73
+ "SQLITE_MISMATCH", "DataError"},
74
+ #endif
75
+ #ifdef SQLITE_CONSTRAINT
76
+ { SQLITE_CONSTRAINT,
77
+ "SQLITE_CONSTRAINT", "IntegrityError"},
78
+ #endif
79
+ #ifdef SQLITE_MISUSE
80
+ { SQLITE_MISUSE,
81
+ "SQLITE_MISUSE", "SQLError"},
82
+ #endif
83
+
84
+ #ifdef SQLITE_NOLFS
85
+ { SQLITE_NOLFS,
86
+ "SQLITE_NOLFS", "ConnectionError"},
87
+ #endif
88
+ #ifdef SQLITE_FORMAT
89
+ { SQLITE_FORMAT,
90
+ "SQLITE_FORMAT", "SyntaxError"},
91
+ #endif
92
+ #ifdef SQLITE_RANGE
93
+ { SQLITE_RANGE,
94
+ "SQLITE_RANGE", "DataError"},
95
+ #endif
96
+ #ifdef SQLITE_NOTADB
97
+ { SQLITE_NOTADB,
98
+ "SQLITE_NOTADB", "ConnectionError"},
99
+ #endif
100
+
101
+ #ifdef SQLITE_ROW
102
+ { SQLITE_ROW,
103
+ "SQLITE_ROW", "SyntaxError"},
104
+ #endif
105
+ {0, NULL, NULL}
106
+ };
@@ -1,21 +1,4 @@
1
- # ENV["RC_ARCHS"] = `uname -m`.chomp if `uname -sr` =~ /^Darwin/
2
- #
3
- # require 'mkmf'
4
- #
5
- # SWIG_WRAP = "sqlite3_api_wrap.c"
6
- #
7
- # dir_config( "sqlite3", "/usr/local" )
8
- #
9
- # if have_header( "sqlite3.h" ) && have_library( "sqlite3", "sqlite3_open" )
10
- # create_makefile( "sqlite3_c" )
11
- # end
12
-
13
- if RUBY_PLATFORM =~ /darwin/
14
- ENV["RC_ARCHS"] = `uname -m`.chomp if `uname -sr` =~ /^Darwin/
15
-
16
- # On PowerPC the defaults are fine
17
- ENV["RC_ARCHS"] = '' if `uname -m` =~ /^Power Macintosh/
18
- end
1
+ ENV["RC_ARCHS"] = "" if RUBY_PLATFORM =~ /darwin/
19
2
 
20
3
  # Loads mkmf which is used to make makefiles for Ruby extensions
21
4
  require 'mkmf'
@@ -23,7 +6,8 @@ require 'mkmf'
23
6
  # Give it a name
24
7
  extension_name = 'do_sqlite3_ext'
25
8
 
26
- dir_config("sqlite3")
9
+ # Use some default search paths
10
+ dir_config("sqlite3", ["/usr/local", "/opt/local", "/usr"])
27
11
 
28
12
  # NOTE: use GCC flags unless Visual C compiler is used
29
13
  $CFLAGS << ' -Wall ' unless RUBY_PLATFORM =~ /mswin/
@@ -1,35 +1,36 @@
1
- # HACK: If running on Windows, then add the current directory to the PATH
2
- # for the current process so it can find the bundled dlls before the require
3
- # of the actual extension file.
4
- if RUBY_PLATFORM.match(/mingw|mswin/i)
5
- libdir = File.expand_path(File.dirname(__FILE__)).gsub(File::SEPARATOR, File::ALT_SEPARATOR)
6
- ENV['PATH'] = "#{libdir};" + ENV['PATH']
7
- end
8
-
9
- require 'rubygems'
10
1
  require 'data_objects'
11
2
  if RUBY_PLATFORM =~ /java/
12
3
  require 'do_jdbc'
13
4
  require 'java'
14
- gem 'jdbc-sqlite3'
15
- require 'jdbc/sqlite3' # the JDBC driver, packaged as a gem
5
+
6
+ driver = 'org.sqlite.JDBC'
7
+ begin
8
+ java.lang.Thread.currentThread.getContextClassLoader().loadClass(driver, true)
9
+ rescue
10
+ require 'jdbc/sqlite3' # the JDBC driver, packaged as a gem
11
+ end
12
+
13
+ # Another way of loading the JDBC Class. This seems to be more reliable
14
+ # than Class.forName() or
15
+ # Thread.currentThread.getContextClassLoader().loadClass() within the
16
+ # data_objects.Connection Java class, which is currently not working as
17
+ # expected.
18
+ java_import driver
16
19
  end
17
20
 
18
21
  require 'do_sqlite3_ext'
19
- require File.expand_path(File.join(File.dirname(__FILE__), 'do_sqlite3', 'version'))
20
- require File.expand_path(File.join(File.dirname(__FILE__), 'do_sqlite3', 'transaction'))
22
+ require 'do_sqlite3/version'
23
+ require 'do_sqlite3/transaction'
21
24
 
22
25
  if RUBY_PLATFORM =~ /java/
23
- # Another way of loading the JDBC Class. This seems to be more reliable
24
- # than Class.forName() within the data_objects.Connection Java class,
25
- # which is currently not working as expected.
26
- import 'org.sqlite.JDBC'
27
26
 
28
27
  module DataObjects
29
28
  module Sqlite3
30
29
  class Connection
31
30
  def self.pool_size
32
- 20
31
+ # sqlite3 can have only one write access at a time, with this
32
+ # concurrent write access will result in "Database locked" errors
33
+ 1
33
34
  end
34
35
  end
35
36
  end
@@ -5,28 +5,20 @@ module DataObjects
5
5
 
6
6
  class Transaction < DataObjects::Transaction
7
7
 
8
- def begin
9
- cmd = "BEGIN"
10
- connection.create_command(cmd).execute_non_query
8
+ def begin_prepared
9
+ raise NotImplementedError
11
10
  end
12
11
 
13
- def commit
14
- cmd = "COMMIT"
15
- connection.create_command(cmd).execute_non_query
16
- end
17
-
18
- def rollback
19
- cmd = "ROLLBACK"
20
- connection.create_command(cmd).execute_non_query
12
+ def commit_prepared
13
+ raise NotImplementedError
21
14
  end
22
15
 
23
16
  def rollback_prepared
24
- cmd = "ROLLBACK"
25
- connection.create_command(cmd).execute_non_query
17
+ raise NotImplementedError
26
18
  end
27
19
 
28
20
  def prepare
29
- # Eek, I don't know how to do this. Lets hope a commit arrives soon...
21
+ raise NotImplementedError
30
22
  end
31
23
 
32
24
  end
@@ -1,5 +1,5 @@
1
1
  module DataObjects
2
2
  module Sqlite3
3
- VERSION = "0.9.12"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
Binary file
@@ -3,7 +3,17 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
4
4
  require 'data_objects/spec/result_spec'
5
5
 
6
+ # splitting the descibe into two separate declaration avoids
7
+ # concurrent execution of the "it_should_behave_like ....." calls
8
+ # which would lock the database
9
+
10
+ # TODO
11
+ # the locked database created a deadlock which is worth exploring since
12
+ # such situation could appear in the wild too
6
13
  describe DataObjects::Sqlite3::Result do
7
14
  it_should_behave_like 'a Result'
15
+ end
16
+
17
+ describe DataObjects::Sqlite3::Result do
8
18
  it_should_behave_like 'a Result which returns inserted keys'
9
19
  end
@@ -11,21 +11,24 @@ require 'ostruct'
11
11
  require 'pathname'
12
12
  require 'fileutils'
13
13
 
14
+ dir = File.dirname(__FILE__)
15
+ lib_path = File.expand_path("#{dir}/../lib")
16
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
14
17
  # put data_objects from repository in the load path
15
18
  # DO NOT USE installed gem of data_objects!
16
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data_objects', 'lib'))
17
- require 'data_objects'
18
-
19
- DATAOBJECTS_SPEC_ROOT = Pathname(__FILE__).dirname.parent.parent + 'data_objects' + 'spec'
20
- Pathname.glob((DATAOBJECTS_SPEC_ROOT + 'lib/**/*.rb').to_s).each { |f| require f }
19
+ do_lib_path = File.expand_path("#{dir}/../../data_objects/lib")
20
+ $LOAD_PATH.unshift do_lib_path unless $LOAD_PATH.include?(do_lib_path)
21
21
 
22
22
  if JRUBY
23
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'do_jdbc', 'lib'))
23
+ jdbc_lib_path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'do_jdbc', 'lib'))
24
+ $LOAD_PATH.unshift jdbc_lib_path unless $LOAD_PATH.include?(jdbc_lib_path)
24
25
  require 'do_jdbc'
25
26
  end
26
27
 
27
- # put the pre-compiled extension in the path to be found
28
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
28
+ require 'data_objects'
29
+
30
+ DATAOBJECTS_SPEC_ROOT = Pathname(__FILE__).dirname.parent.parent + 'data_objects' + 'spec'
31
+ Pathname.glob((DATAOBJECTS_SPEC_ROOT + 'lib/**/*.rb').to_s).each { |f| require f }
29
32
  require 'do_sqlite3'
30
33
 
31
34
  log_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'log', 'do.log'))
@@ -79,6 +82,8 @@ module DataObjectsSpecHelpers
79
82
  );
80
83
  EOF
81
84
 
85
+ local_offset = Rational(Time.local(2008, 2, 14).utc_offset, 86400)
86
+ t = DateTime.civil(2008, 2, 14, 00, 31, 12, local_offset)
82
87
  conn.create_command(<<-EOF).execute_non_query
83
88
  CREATE TABLE "widgets" (
84
89
  "id" INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -91,7 +96,7 @@ module DataObjectsSpecHelpers
91
96
  "ad_image" blob NULL,
92
97
  "whitepaper_text" text NULL,
93
98
  "cad_drawing" blob,
94
- "flags" char default 'f',
99
+ "flags" boolean default 'f',
95
100
  "number_in_stock" smallint default 500,
96
101
  "number_sold" integer default 0,
97
102
  "super_number" bigint default 9223372036854775807,
@@ -99,7 +104,7 @@ module DataObjectsSpecHelpers
99
104
  "cost1" double precision default 10.23,
100
105
  "cost2" decimal(8,2) default 50.23,
101
106
  "release_date" date default '2008-02-14',
102
- "release_datetime" timestamp default '2008-02-14T00:31:12+00:00',
107
+ "release_datetime" timestamp default '#{t.to_s}',
103
108
  "release_timestamp" timestamp with time zone default '2008-02-14 00:31:31'
104
109
  );
105
110
  EOF
@@ -118,6 +123,30 @@ module DataObjectsSpecHelpers
118
123
  update widgets set ad_description = NULL where id = 3
119
124
  EOF
120
125
 
126
+ conn.create_command(<<-EOF).execute_non_query
127
+ update widgets set flags = NULL where id = 4
128
+ EOF
129
+
130
+ conn.create_command(<<-EOF).execute_non_query
131
+ update widgets set cost1 = NULL where id = 5
132
+ EOF
133
+
134
+ conn.create_command(<<-EOF).execute_non_query
135
+ update widgets set cost2 = NULL where id = 6
136
+ EOF
137
+
138
+ conn.create_command(<<-EOF).execute_non_query
139
+ update widgets set release_date = NULL where id = 7
140
+ EOF
141
+
142
+ conn.create_command(<<-EOF).execute_non_query
143
+ update widgets set release_datetime = NULL where id = 8
144
+ EOF
145
+
146
+ conn.create_command(<<-EOF).execute_non_query
147
+ update widgets set release_timestamp = NULL where id = 9
148
+ EOF
149
+
121
150
  conn.close
122
151
  end
123
152
 
@@ -3,6 +3,9 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
4
4
  require 'data_objects/spec/typecast/bigdecimal_spec'
5
5
 
6
+ # Sqlite3 doesn't support decimals natively, so autocasting is not available:
7
+ # http://www.sqlite.org/datatype3.html
8
+
6
9
  describe 'DataObjects::Sqlite3 with BigDecimal' do
7
10
  it_should_behave_like 'supporting BigDecimal'
8
11
  end
@@ -3,6 +3,9 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
4
4
  require 'data_objects/spec/typecast/boolean_spec'
5
5
 
6
+ # Sqlite3 doesn't support booleans natively, so autocasting is not available:
7
+ # http://www.sqlite.org/datatype3.html
8
+
6
9
  describe 'DataObjects::Sqlite3 with Boolean' do
7
10
  it_should_behave_like 'supporting Boolean'
8
11
  end
@@ -3,6 +3,9 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
4
4
  require 'data_objects/spec/typecast/date_spec'
5
5
 
6
+ # Sqlite3 doesn't support dates natively, so autocasting is not available:
7
+ # http://www.sqlite.org/datatype3.html
8
+
6
9
  describe 'DataObjects::Sqlite3 with Date' do
7
10
  it_should_behave_like 'supporting Date'
8
11
  end
@@ -3,6 +3,9 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
4
4
  require 'data_objects/spec/typecast/datetime_spec'
5
5
 
6
+ # Sqlite3 doesn't support datetimes natively, so autocasting is not available:
7
+ # http://www.sqlite.org/datatype3.html
8
+
6
9
  describe 'DataObjects::Sqlite3 with DateTime' do
7
10
  it_should_behave_like 'supporting DateTime'
8
11
  end
@@ -6,3 +6,7 @@ require 'data_objects/spec/typecast/float_spec'
6
6
  describe 'DataObjects::Sqlite3 with Float' do
7
7
  it_should_behave_like 'supporting Float'
8
8
  end
9
+
10
+ describe 'DataObjects::Sqlite3 with Float' do
11
+ it_should_behave_like 'supporting Float autocasting'
12
+ end
@@ -3,8 +3,18 @@
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
4
4
  require 'data_objects/spec/typecast/nil_spec'
5
5
 
6
+ # splitting the descibe into two separate declaration avoids
7
+ # concurrent execution of the "it_should_behave_like ....." calls
8
+ # which would lock the database
9
+
6
10
  describe 'DataObjects::Sqlite3 with Nil' do
7
11
  it_should_behave_like 'supporting Nil'
8
- # it_should_behave_like 'supporting writing an Nil'
12
+ end
13
+
14
+ describe 'DataObjects::Sqlite3 with Nil' do
15
+ it_should_behave_like 'supporting writing an Nil'
16
+ end
17
+
18
+ describe 'DataObjects::Sqlite3 with Nil' do
9
19
  it_should_behave_like 'supporting Nil autocasting'
10
20
  end
@@ -1,61 +1,8 @@
1
1
  require 'rubygems/package_task'
2
2
 
3
- GEM_SPEC = Gem::Specification.new do |s|
4
- # basic information
5
- s.name = "do_sqlite3"
6
- s.version = DataObjects::Sqlite3::VERSION
7
-
8
- # description and details
9
- s.summary = 'DataObjects Sqlite3 Driver'
10
- s.description = "Implements the DataObjects API for Sqlite3"
11
-
12
- # dependencies
13
- s.add_dependency "addressable", "~>2.0.0"
14
- s.add_dependency "extlib", "~>0.9.12"
15
- s.add_dependency "data_objects", DataObjects::Sqlite3::VERSION
16
-
17
- if JRUBY
18
- s.add_dependency "jdbc-sqlite3", ">=3.5.8"
19
- s.add_dependency "do_jdbc", DataObjects::Sqlite3::VERSION
20
- s.platform = "java"
21
- # components, files and paths
22
- s.files = FileList["lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake",
23
- "LICENSE", "Rakefile", "*.{rdoc,txt,yml}", "lib/*.jar"]
24
- else
25
- s.platform = Gem::Platform::RUBY
26
- s.extensions << 'ext/do_sqlite3_ext/extconf.rb'
27
- # components, files and paths
28
- s.files = FileList["lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake", "ext/**/*.{rb,c}",
29
- "LICENSE", "Rakefile", "*.{rdoc,txt,yml}"]
30
- end
31
-
32
- # development dependencies
33
- s.add_development_dependency 'rspec', '~>1.2.0'
34
-
35
-
36
- s.require_path = 'lib'
37
-
38
- # documentation
39
- s.has_rdoc = false
40
-
41
- # project information
42
- s.homepage = 'http://github.com/datamapper/do'
43
- s.rubyforge_project = 'dorb'
44
-
45
- # author and contributors
46
- s.author = 'Dirkjan Bussink'
47
- s.email = 'd.bussink@gmail.com'
48
- end
3
+ GEM_SPEC = eval(File.read('do_sqlite3.gemspec'))
49
4
 
50
5
  gem_package = Gem::PackageTask.new(GEM_SPEC) do |pkg|
51
6
  pkg.need_tar = false
52
7
  pkg.need_zip = false
53
8
  end
54
-
55
- file "#{GEM_SPEC.name}.gemspec" => ['Rakefile', 'tasks/gem.rake'] do |t|
56
- puts "Generating #{t.name}"
57
- File.open(t.name, 'w') { |f| f.puts GEM_SPEC.to_yaml }
58
- end
59
-
60
- desc "Generate or update the standalone gemspec file for the project"
61
- task :gemspec => ["#{GEM_SPEC.name}.gemspec"]
@@ -8,7 +8,7 @@ end
8
8
  if defined?(RubyForge) then
9
9
  if defined?(GEM_SPEC) then
10
10
  desc 'Package and upload to RubyForge'
11
- task :release => [:package] do |t|
11
+ task :release do |t|
12
12
  ver = ENV['VERSION'] or fail "Must supply VERSION (rake release VERSION=x.y.z)."
13
13
 
14
14
  # compare versions to avoid mistakes
@@ -26,19 +26,19 @@ if defined?(RubyForge) then
26
26
 
27
27
  # read project info and overview
28
28
  notes = begin
29
- r = File.read("README.rdoc")
30
- r.split(/^(=+ .*)/)[1..4].join.strip
29
+ r = File.read("README.markdown")
30
+ r.split(/^(.*\n\-+)/)[1..4].join.strip
31
31
  rescue
32
- warn "Missing README.rdoc"
32
+ warn "Missing README.markdown"
33
33
  ''
34
34
  end
35
35
 
36
36
  # read changes
37
37
  changes = begin
38
- h = File.read("History.txt")
39
- h.split(/^(==+ .*)/)[1..2].join.strip
38
+ h = File.read("HISTORY.markdown")
39
+ h.split(/^(##+ .*)/)[1..2].join.strip
40
40
  rescue
41
- warn "Missing History.txt"
41
+ warn "Missing HISTORY.markdown"
42
42
  ''
43
43
  end
44
44
 
@@ -36,7 +36,7 @@ begin
36
36
  url = "http://www.sqlite.org/#{File.basename(t.name)}"
37
37
  when_writing "downloading #{t.name}" do
38
38
  cd File.dirname(t.name) do
39
- system "wget -c #{url} || curl -C - -O #{url}"
39
+ system "wget -c #{url} || curl -L -C - -O #{url}"
40
40
  end
41
41
  end
42
42
  end
@@ -46,7 +46,7 @@ begin
46
46
  url = "http://www.sqlite.org/#{File.basename(t.name)}"
47
47
  when_writing "downloading #{t.name}" do
48
48
  cd File.dirname(t.name) do
49
- system "wget -c #{url} || curl -C - -O #{url}"
49
+ system "wget -c #{url} || curl -L -C - -O #{url}"
50
50
  end
51
51
  end
52
52
  end
@@ -5,6 +5,7 @@ desc 'Run specifications'
5
5
  Spec::Rake::SpecTask.new(:spec => [ :clean, :compile ]) do |t|
6
6
  t.spec_opts << '--options' << ROOT + 'spec/spec.opts'
7
7
  t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }
8
+ t.libs << 'lib'
8
9
 
9
10
  begin
10
11
  # RCov is run by default, except on the JRuby platform
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: do_sqlite3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.10.0
5
5
  platform: x86-mswin32-60
6
6
  authors:
7
7
  - Dirkjan Bussink
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-17 00:00:00 +02:00
12
+ date: 2009-09-15 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 2.0.0
23
+ version: "2.0"
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: extlib
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - "="
42
42
  - !ruby/object:Gem::Version
43
- version: 0.9.12
43
+ version: 0.10.0
44
44
  version:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: rspec
@@ -91,13 +91,14 @@ files:
91
91
  - tasks/spec.rake
92
92
  - ext/do_sqlite3_ext/extconf.rb
93
93
  - ext/do_sqlite3_ext/do_sqlite3_ext.c
94
+ - ext/do_sqlite3_ext/error.h
94
95
  - LICENSE
95
96
  - Rakefile
96
- - History.txt
97
+ - HISTORY.markdown
98
+ - README.markdown
97
99
  - Manifest.txt
98
- - README.txt
99
100
  - lib/do_sqlite3_ext.so
100
- has_rdoc: true
101
+ has_rdoc: false
101
102
  homepage: http://github.com/datamapper/do
102
103
  licenses: []
103
104
 
@@ -108,9 +109,9 @@ require_paths:
108
109
  - lib
109
110
  required_ruby_version: !ruby/object:Gem::Requirement
110
111
  requirements:
111
- - - ~>
112
+ - - ">="
112
113
  - !ruby/object:Gem::Version
113
- version: 1.8.6
114
+ version: "0"
114
115
  version:
115
116
  required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  requirements:
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  requirements: []
122
123
 
123
124
  rubyforge_project: dorb
124
- rubygems_version: 1.3.3
125
+ rubygems_version: 1.3.5
125
126
  signing_key:
126
127
  specification_version: 3
127
128
  summary: DataObjects Sqlite3 Driver