do_sqlite3 0.10.2 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ ## 0.10.3 2011-01-30
2
+ * Reworked transactions
3
+ * Fix a DST bug that could cause datetimes in the wrong timezone
4
+
1
5
  ## 0.10.2 2010-05-19
2
6
  * Make Encoding.default_internal aware
3
7
  * Rework logging for making callbacks possible
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 = '3_6_23_1'
14
+ BINARY_VERSION = '3070400'
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
 
@@ -38,7 +38,7 @@ begin
38
38
  gem.add_dependency 'data_objects', DataObjects::Sqlite3::VERSION
39
39
 
40
40
  gem.add_development_dependency 'bacon', '~>1.1'
41
- gem.add_development_dependency 'rake-compiler', '~>0.7'
41
+ gem.add_development_dependency 'rake-compiler', '= 0.7.0'
42
42
 
43
43
  gem.has_rdoc = false
44
44
  gem.rubyforge_project = 'dorb'
@@ -142,10 +142,10 @@ static VALUE parse_date_time(char *date) {
142
142
  do_int64 num, den;
143
143
 
144
144
  long int gmt_offset;
145
- int is_dst;
145
+ int dst_adjustment;
146
146
 
147
147
  time_t rawtime;
148
- struct tm * timeinfo;
148
+ struct tm timeinfo;
149
149
 
150
150
  int tokens_read, max_tokens;
151
151
 
@@ -179,22 +179,48 @@ static VALUE parse_date_time(char *date) {
179
179
  }
180
180
  // We read the Date and Time, default to the current locale's offset
181
181
 
182
+ tzset();
183
+
182
184
  // Get localtime
183
185
  time(&rawtime);
184
- timeinfo = localtime(&rawtime);
186
+ #ifdef HAVE_LOCALTIME_R
187
+ localtime_r(&rawtime, &timeinfo);
188
+ #else
189
+ timeinfo = *localtime(&rawtime);
190
+ #endif
185
191
 
186
- is_dst = timeinfo->tm_isdst * 3600;
192
+ timeinfo.tm_sec = sec;
193
+ timeinfo.tm_min = min;
194
+ timeinfo.tm_hour = hour;
195
+ timeinfo.tm_mday = day;
196
+ timeinfo.tm_mon = month;
197
+ timeinfo.tm_year = year - 1900;
198
+ timeinfo.tm_isdst = -1;
199
+
200
+ // Update tm_isdst
201
+ mktime(&timeinfo);
202
+
203
+ if (timeinfo.tm_isdst) {
204
+ dst_adjustment = 3600;
205
+ } else {
206
+ dst_adjustment = 0;
207
+ }
187
208
 
188
209
  // Reset to GM Time
189
- timeinfo = gmtime(&rawtime);
210
+ #ifdef HAVE_GMTIME_R
211
+ gmtime_r(&rawtime, &timeinfo);
212
+ #else
213
+ timeinfo = *gmtime(&rawtime);
214
+ #endif
190
215
 
191
- gmt_offset = mktime(timeinfo) - rawtime;
216
+ gmt_offset = rawtime - mktime(&timeinfo);
192
217
 
193
- if ( is_dst > 0 )
194
- gmt_offset -= is_dst;
218
+ if (dst_adjustment) {
219
+ gmt_offset += dst_adjustment;
220
+ }
195
221
 
196
- hour_offset = -((int)gmt_offset / 3600);
197
- minute_offset = -((int)gmt_offset % 3600 / 60);
222
+ hour_offset = ((int)gmt_offset / 3600);
223
+ minute_offset = ((int)gmt_offset % 3600 / 60);
198
224
 
199
225
  } else {
200
226
  // Something went terribly wrong
@@ -364,9 +390,9 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
364
390
  path = rb_funcall(uri, rb_intern("path"), 0);
365
391
 
366
392
  #ifdef HAVE_SQLITE3_OPEN_V2
367
- ret = sqlite3_open_v2(rb_str_ptr_readonly(path), &db, flags_from_uri(uri), 0);
393
+ ret = sqlite3_open_v2(StringValuePtr(path), &db, flags_from_uri(uri), 0);
368
394
  #else
369
- ret = sqlite3_open(rb_str_ptr_readonly(path), &db);
395
+ ret = sqlite3_open(StringValuePtr(path), &db);
370
396
  #endif
371
397
 
372
398
  if ( ret != SQLITE_OK ) {
@@ -469,6 +495,52 @@ static VALUE cConnection_character_set(VALUE self) {
469
495
  return rb_iv_get(self, "@encoding");
470
496
  }
471
497
 
498
+ static VALUE cConnection_enable_load_extension(VALUE self, VALUE value) {
499
+ VALUE connection;
500
+ int status;
501
+ sqlite3 *db;
502
+
503
+ connection = rb_iv_get(self, "@connection");
504
+
505
+ if (Qnil == connection)
506
+ return Qfalse;
507
+
508
+ db = DATA_PTR(connection);
509
+
510
+ if (NULL == db)
511
+ return Qfalse;
512
+
513
+ status = sqlite3_enable_load_extension(db, value == Qtrue ? 1 : 0);
514
+ if ( status != SQLITE_OK ) {
515
+ rb_raise(eConnectionError, "Error enabling load extension.");
516
+ }
517
+ return Qtrue;
518
+ }
519
+
520
+ static VALUE cConnection_load_extension(VALUE self, VALUE string) {
521
+ VALUE connection;
522
+ sqlite3 *db;
523
+ const char *extension_name = rb_str_ptr_readonly(string);
524
+ char* errmsg;
525
+ int status;
526
+
527
+ connection = rb_iv_get(self, "@connection");
528
+
529
+ if (Qnil == connection)
530
+ return Qfalse;
531
+
532
+ db = DATA_PTR(connection);
533
+
534
+ if (NULL == db)
535
+ return Qfalse;
536
+
537
+ status = sqlite3_load_extension(db, extension_name, 0, &errmsg);
538
+ if ( status != SQLITE_OK ) {
539
+ rb_raise(eConnectionError, "%s", errmsg);
540
+ }
541
+ return Qtrue;
542
+ }
543
+
472
544
  static VALUE build_query_from_args(VALUE klass, int count, VALUE *args) {
473
545
  VALUE query = rb_iv_get(klass, "@text");
474
546
  int i;
@@ -599,6 +671,10 @@ static VALUE cReader_next(VALUE self) {
599
671
  VALUE field_type;
600
672
  VALUE value;
601
673
 
674
+ if(rb_iv_get(self, "@done") == Qtrue) {
675
+ return Qfalse;
676
+ }
677
+
602
678
  Data_Get_Struct(rb_iv_get(self, "@reader"), sqlite3_stmt, reader);
603
679
  field_count = NUM2INT(rb_iv_get(self, "@field_count"));
604
680
 
@@ -611,6 +687,7 @@ static VALUE cReader_next(VALUE self) {
611
687
 
612
688
  if ( result != SQLITE_ROW ) {
613
689
  rb_iv_set(self, "@values", Qnil);
690
+ rb_iv_set(self, "@done", Qtrue);
614
691
  return Qfalse;
615
692
  }
616
693
 
@@ -656,6 +733,7 @@ static VALUE cReader_field_count(VALUE self) {
656
733
  void Init_do_sqlite3() {
657
734
  rb_require("bigdecimal");
658
735
  rb_require("date");
736
+ rb_require("rational");
659
737
  rb_require("data_objects");
660
738
 
661
739
  ID_CONST_GET = rb_intern("const_get");
@@ -702,6 +780,8 @@ void Init_do_sqlite3() {
702
780
  rb_define_method(cConnection, "quote_string", cConnection_quote_string, 1);
703
781
  rb_define_method(cConnection, "quote_byte_array", cConnection_quote_byte_array, 1);
704
782
  rb_define_method(cConnection, "character_set", cConnection_character_set, 0);
783
+ rb_define_method(cConnection, "enable_load_extension", cConnection_enable_load_extension, 1);
784
+ rb_define_method(cConnection, "load_extension", cConnection_load_extension, 1);
705
785
 
706
786
  cCommand = DRIVER_CLASS("Command", cDO_Command);
707
787
  rb_define_method(cCommand, "set_types", cCommand_set_types, -1);
@@ -75,4 +75,4 @@ void Init_do_sqlite3_extension() {
75
75
  cExtension = DRIVER_CLASS("Extension", cDO_Extension);
76
76
  rb_define_method(cExtension, "load_extension", cExtension_load_extension, 1);
77
77
  rb_define_method(cExtension, "enable_load_extension", cExtension_enable_load_extension, 1);
78
- }
78
+ }
@@ -19,6 +19,8 @@ end
19
19
  # Do the work
20
20
  # create_makefile(extension_name)
21
21
  if have_header( "sqlite3.h" ) && have_library( "sqlite3", "sqlite3_open" )
22
+ have_func("localtime_r")
23
+ have_func("gmtime_r")
22
24
  have_func("sqlite3_prepare_v2")
23
25
  have_func("sqlite3_open_v2")
24
26
 
@@ -1,5 +1,5 @@
1
1
  module DataObjects
2
2
  module Sqlite3
3
- VERSION = '0.10.2'
3
+ VERSION = '0.10.3'
4
4
  end
5
5
  end
@@ -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/error/sql_error_spec'
5
+
6
+ describe 'DataObjects::Sqlite3 raising SQLError' do
7
+ # This fails for now, need to think of a query that also exposes the issue on sqlite :S
8
+ # behaves_like 'raising a SQLError'
9
+ end
@@ -131,6 +131,10 @@ module DataObjectsSpecHelpers
131
131
  update widgets set release_timestamp = NULL where id = 9
132
132
  EOF
133
133
 
134
+ conn.create_command(<<-EOF).execute_non_query
135
+ update widgets set release_datetime = '2008-07-14 00:31:12' where id = 10
136
+ EOF
137
+
134
138
  conn.close
135
139
  end
136
140
 
@@ -56,7 +56,7 @@ begin
56
56
  ext.classpath = '../do_jdbc/lib/do_jdbc_internal.jar'
57
57
  ext.java_compiling do |gem|
58
58
  gem.add_dependency 'jdbc-sqlite3', '>=3.5.8'
59
- gem.add_dependency 'do_jdbc', '0.10.2'
59
+ gem.add_dependency 'do_jdbc', '0.10.3'
60
60
  end
61
61
  end
62
62
  rescue LoadError
@@ -3,7 +3,7 @@ task :build_all do
3
3
  `rake clean`
4
4
  `rake build`
5
5
  `rake java gem`
6
- `rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1`
6
+ `rake cross native gem RUBY_CC_VERSION=1.8.7:1.9.2`
7
7
  end
8
8
 
9
9
  desc 'Release all gems (native, binaries for JRuby and Windows)'
@@ -42,7 +42,7 @@ begin
42
42
  end
43
43
 
44
44
  # download dll binaries
45
- file "vendor/sqlitedll-#{BINARY_VERSION}.zip" => ['vendor'] do |t|
45
+ file "vendor/sqlite-dll-win32-x86-#{BINARY_VERSION}.zip" => ['vendor'] do |t|
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
@@ -56,7 +56,7 @@ begin
56
56
  full_file = File.expand_path(t.prerequisites.last)
57
57
  when_writing "creating #{t.name}" do
58
58
  cd File.dirname(t.name) do
59
- sh "unzip #{full_file}"
59
+ sh "unzip -j #{full_file}"
60
60
  # update file timestamp to avoid Rake perform this extraction again.
61
61
  touch File.basename(t.name)
62
62
  end
@@ -64,11 +64,11 @@ begin
64
64
  end
65
65
 
66
66
  # extract dll files into lib folder
67
- file "vendor/sqlite3/lib/sqlite3.dll" => ['vendor/sqlite3/lib', "vendor/sqlitedll-#{BINARY_VERSION}.zip"] do |t|
67
+ file "vendor/sqlite3/lib/sqlite3.dll" => ['vendor/sqlite3/lib', "vendor/sqlite-dll-win32-x86-#{BINARY_VERSION}.zip"] do |t|
68
68
  full_file = File.expand_path(t.prerequisites.last)
69
69
  when_writing "creating #{t.name}" do
70
70
  cd File.dirname(t.name) do
71
- sh "unzip #{full_file}"
71
+ sh "unzip -j #{full_file}"
72
72
  # update file timestamp to avoid Rake perform this extraction again.
73
73
  touch File.basename(t.name)
74
74
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: do_sqlite3
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 49
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 10
8
- - 2
9
- version: 0.10.2
9
+ - 3
10
+ version: 0.10.3
10
11
  platform: ruby
11
12
  authors:
12
13
  - Dirkjan Bussink
@@ -14,30 +15,34 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-19 00:00:00 +02:00
18
+ date: 2011-01-30 00:00:00 +01:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: data_objects
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - "="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 49
27
30
  segments:
28
31
  - 0
29
32
  - 10
30
- - 2
31
- version: 0.10.2
33
+ - 3
34
+ version: 0.10.3
32
35
  type: :runtime
33
36
  version_requirements: *id001
34
37
  - !ruby/object:Gem::Dependency
35
38
  name: bacon
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ~>
40
44
  - !ruby/object:Gem::Version
45
+ hash: 13
41
46
  segments:
42
47
  - 1
43
48
  - 1
@@ -48,13 +53,16 @@ dependencies:
48
53
  name: rake-compiler
49
54
  prerelease: false
50
55
  requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
51
57
  requirements:
52
- - - ~>
58
+ - - "="
53
59
  - !ruby/object:Gem::Version
60
+ hash: 3
54
61
  segments:
55
62
  - 0
56
63
  - 7
57
- version: "0.7"
64
+ - 0
65
+ version: 0.7.0
58
66
  type: :development
59
67
  version_requirements: *id003
60
68
  description: Implements the DataObjects API for Sqlite3
@@ -84,6 +92,7 @@ files:
84
92
  - spec/command_spec.rb
85
93
  - spec/connection_spec.rb
86
94
  - spec/encoding_spec.rb
95
+ - spec/error/sql_error_spec.rb
87
96
  - spec/reader_spec.rb
88
97
  - spec/result_spec.rb
89
98
  - spec/spec_helper.rb
@@ -115,23 +124,27 @@ rdoc_options:
115
124
  require_paths:
116
125
  - lib
117
126
  required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
118
128
  requirements:
119
129
  - - ">="
120
130
  - !ruby/object:Gem::Version
131
+ hash: 3
121
132
  segments:
122
133
  - 0
123
134
  version: "0"
124
135
  required_rubygems_version: !ruby/object:Gem::Requirement
136
+ none: false
125
137
  requirements:
126
138
  - - ">="
127
139
  - !ruby/object:Gem::Version
140
+ hash: 3
128
141
  segments:
129
142
  - 0
130
143
  version: "0"
131
144
  requirements: []
132
145
 
133
146
  rubyforge_project: dorb
134
- rubygems_version: 1.3.6
147
+ rubygems_version: 1.3.7
135
148
  signing_key:
136
149
  specification_version: 3
137
150
  summary: DataObjects Sqlite3 Driver
@@ -139,6 +152,7 @@ test_files:
139
152
  - spec/command_spec.rb
140
153
  - spec/connection_spec.rb
141
154
  - spec/encoding_spec.rb
155
+ - spec/error/sql_error_spec.rb
142
156
  - spec/reader_spec.rb
143
157
  - spec/result_spec.rb
144
158
  - spec/spec_helper.rb