do_sqlite3 0.10.0-x86-mingw32 → 0.10.1-x86-mingw32

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 (43) hide show
  1. data/ChangeLog.markdown +32 -0
  2. data/LICENSE +1 -1
  3. data/README.markdown +101 -3
  4. data/Rakefile +56 -9
  5. data/ext/do_sqlite3/compat.h +55 -0
  6. data/ext/{do_sqlite3_ext/do_sqlite3_ext.c → do_sqlite3/do_sqlite3.c} +46 -34
  7. data/ext/{do_sqlite3_ext → do_sqlite3}/error.h +0 -0
  8. data/ext/{do_sqlite3_ext → do_sqlite3}/extconf.rb +3 -3
  9. data/lib/do_sqlite3.rb +19 -11
  10. data/lib/do_sqlite3/1.8/do_sqlite3.so +0 -0
  11. data/lib/do_sqlite3/1.9/do_sqlite3.so +0 -0
  12. data/lib/do_sqlite3/version.rb +1 -1
  13. data/spec/command_spec.rb +1 -1
  14. data/spec/connection_spec.rb +8 -6
  15. data/spec/reader_spec.rb +1 -1
  16. data/spec/result_spec.rb +3 -3
  17. data/spec/spec_helper.rb +19 -32
  18. data/spec/typecast/array_spec.rb +1 -1
  19. data/spec/typecast/bigdecimal_spec.rb +1 -1
  20. data/spec/typecast/boolean_spec.rb +1 -1
  21. data/spec/typecast/byte_array_spec.rb +1 -2
  22. data/spec/typecast/class_spec.rb +1 -1
  23. data/spec/typecast/date_spec.rb +1 -1
  24. data/spec/typecast/datetime_spec.rb +1 -1
  25. data/spec/typecast/float_spec.rb +2 -2
  26. data/spec/typecast/integer_spec.rb +1 -1
  27. data/spec/typecast/nil_spec.rb +4 -4
  28. data/spec/typecast/other_spec.rb +8 -0
  29. data/spec/typecast/range_spec.rb +1 -1
  30. data/spec/typecast/string_spec.rb +1 -1
  31. data/spec/typecast/time_spec.rb +1 -1
  32. data/tasks/compile.rake +64 -0
  33. data/tasks/release.rake +12 -71
  34. data/tasks/retrieve.rake +1 -1
  35. data/tasks/spec.rake +19 -15
  36. metadata +64 -38
  37. data/HISTORY.markdown +0 -22
  38. data/Manifest.txt +0 -31
  39. data/lib/do_sqlite3_ext.so +0 -0
  40. data/spec/lib/rspec_immediate_feedback_formatter.rb +0 -3
  41. data/tasks/gem.rake +0 -8
  42. data/tasks/install.rake +0 -15
  43. data/tasks/native.rake +0 -35
@@ -0,0 +1,32 @@
1
+ ## 0.10.1 (unreleased, in git)
2
+
3
+ * Support for Ruby 1.8 and 1.9 on Windows.
4
+ * Switch to Jeweler for Gem building tasks (this change may be temporary).
5
+ * Switch to using Bacon for running specs: This should make specs friendlier to
6
+ new Ruby implementations that are not yet 100% MRI-compatible, and in turn,
7
+ prepared the road for our own IronRuby and MacRuby support.
8
+ * Switch to the newly added rake-compiler `JavaExtensionTask` for compiling
9
+ JRuby extensions, instead of our (broken) home-grown solution.
10
+
11
+ ## 0.10.0 2009-09-15
12
+ * Improvements
13
+ * JRuby Support (using *do_jdbc*)
14
+
15
+ ## 0.9.12 2009-05-17
16
+ * Improvements
17
+ * rake-compiler for Windows support
18
+
19
+ ## 0.9.11 2009-01-19
20
+ * Improvements
21
+ * Ruby 1.9 support
22
+ * Fixes
23
+ * Fix Windows gem
24
+
25
+ ## 0.9.9 2008-11-27
26
+ * Improvements
27
+ * Added cross compile rake tasks for Windows gems [Jonathan Stott, Luis Lavena]
28
+ * Added initial support for Ruby 1.9 [John Harrison]
29
+
30
+ * Bug Fixes
31
+ * Removed sqlite3.dll from source gem [Dan Kubb]
32
+ * Removed hard coded .bundle from source [Dirkjan Bussink]
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007, 2008, 2009 Yehuda Katz, Dirkjan Bussink
1
+ Copyright (c) 2007 - 2010 Yehuda Katz, Dirkjan Bussink
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,4 +1,102 @@
1
- do_sqlite3
2
- ==========
1
+ # do_sqlite3
3
2
 
4
- A DataObjects driver for SQLite3
3
+ * <http://dataobjects.info>
4
+
5
+ ## Description
6
+
7
+ A SQLite3 driver for DataObjects.
8
+
9
+ ## Features/Problems
10
+
11
+ This driver implements the DataObjects API for the SQLite3 relational database.
12
+
13
+ ## Synopsis
14
+
15
+ An example of usage:
16
+
17
+ @connection = DataObjects::Connection.new("sqlite3://employees")
18
+ @reader = @connection.create_command('SELECT * FROM users').execute_reader
19
+ @reader.next!
20
+
21
+ In the future, the `Connection` constructor will be able to be passed either a
22
+ DataObjects-style URL or JDBC style URL, when using do\_sqlite3 on JRuby.
23
+ However, this feature is not currently working reliably and is a known issue.
24
+
25
+ ## Requirements
26
+
27
+ This driver is provided for the following platforms:
28
+ * Ruby MRI (1.8.6/7), 1.9: tested on Linux, Mac OS X and Windows platforms.
29
+ * JRuby 1.3.1 + (1.4+ recommended).
30
+ * Rubinius (experimental).
31
+
32
+ Additionally you should have the following prerequisites:
33
+ * `data_objects` gem
34
+ * `do_jdbc` gem (shared library), if running on JRuby.
35
+
36
+ ## Install
37
+
38
+ To install the gem:
39
+
40
+ gem install do_sqlite3
41
+
42
+ To compile and install from source:
43
+
44
+ * Install rake-compiler: `gem install rake-compiler`.
45
+
46
+ * For MRI/Rubinius extensions:
47
+ * Install the `gcc` compiler. On OS X, you should install XCode tools. On
48
+ Ubuntu, run `apt-get install build-essential`.
49
+ * Install Ruby and SQLite3.
50
+ * Install the Ruby and SQLite3 development headers.
51
+ * On Debian-Linux distributions, you can install the following packages
52
+ with `apt`: `ruby-dev` `libsqlite3-dev`.
53
+ * If you want to cross-compile for Windows:
54
+ * Install MinGW:
55
+ * On Debian-Linux distributions, you can install the following package
56
+ with `apt`: `mingw32`.
57
+ * On OS X, this can install the following package with MacPorts: `i386-mingw32-gcc`.
58
+ * Run `rake-compiler cross-ruby`.
59
+ * Run `rake-compiler update-config`.
60
+
61
+ * For JRuby extensions:
62
+ * Install the Java Development Kit (provided if you are
63
+ on a recent version of Mac OS X) from <http://java.sun.com>.
64
+ * Install a recent version of JRuby. Ensure `jruby` is in your `PATH` and/or
65
+ you have configured the `JRUBY_HOME` environment variable to point to your
66
+ JRuby installation.
67
+ * Install `data_objects` and `do_jdbc` with `jruby -S rake install`.
68
+
69
+ * Then, install this driver with `(jruby -S) rake install`.
70
+
71
+ For more information, see the SQLite3 driver wiki page:
72
+ <http://wiki.github.com/datamapper/do/sqlite3>.
73
+
74
+ ## Developers
75
+
76
+ Follow the above installation instructions. Additionally, you'll need:
77
+ * `bacon` gem for running specs.
78
+ * `YARD` gem for generating documentation.
79
+
80
+ See the DataObjects wiki for more comprehensive information on installing and
81
+ contributing to the JRuby-variant of this driver:
82
+ <http://wiki.github.com/datamapper/do/jruby>.
83
+
84
+ To run specs:
85
+
86
+ rake spec
87
+
88
+ To run specs without compiling extensions first:
89
+
90
+ rake spec_no_compile
91
+
92
+ To run individual specs:
93
+
94
+ rake spec TEST=spec/connection_spec.rb
95
+
96
+ (Note that the `rake` task uses a `TEST` parameter, not `SPEC`. This is because
97
+ the `Rake::TestTask` is used for executing the Bacon specs).
98
+
99
+ ## License
100
+
101
+ This code is licensed under an **MIT (X11) License**. Please see the
102
+ accompanying `LICENSE` file.
data/Rakefile CHANGED
@@ -1,16 +1,63 @@
1
+ require 'pathname'
1
2
  require 'rubygems'
2
3
  require 'rake'
3
4
  require 'rake/clean'
4
5
 
5
- require 'pathname'
6
- require 'lib/do_sqlite3/version'
6
+ ROOT = Pathname(__FILE__).dirname.expand_path
7
+
8
+ require ROOT + 'lib/do_sqlite3/version'
9
+
10
+ JRUBY = RUBY_PLATFORM =~ /java/
11
+ IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ironruby'
12
+ WINDOWS = Gem.win_platform? || (JRUBY && ENV_JAVA['os.name'] =~ /windows/i)
13
+ SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
14
+ BINARY_VERSION = '3_6_21'
15
+
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
+
18
+ begin
19
+ gem 'jeweler', '~> 1.4'
20
+ require 'jeweler'
21
+
22
+ Jeweler::Tasks.new do |gem|
23
+ gem.name = 'do_sqlite3'
24
+ gem.version = DataObjects::Sqlite3::VERSION
25
+ gem.summary = 'DataObjects Sqlite3 Driver'
26
+ gem.description = 'Implements the DataObjects API for Sqlite3'
27
+ gem.platform = Gem::Platform::RUBY
28
+ gem.files = FileList['lib/**/*.rb', 'spec/**/*.rb', 'tasks/**/*.rake',
29
+ 'ext/**/*.{rb,c,h}', 'LICENSE', 'Rakefile',
30
+ '*.{markdown,rdoc,txt,yml}']
31
+ gem.extra_rdoc_files = FileList['README*', 'ChangeLog*', 'LICENSE']
32
+ gem.test_files = FileList['spec/**/*.rb']
33
+
34
+ # rake-compiler should generate gemspecs for other platforms (e.g. 'java')
35
+ # and modify dependencies and extensions appropriately
36
+ gem.extensions << 'ext/do_sqlite3/extconf.rb'
37
+
38
+ gem.add_dependency 'data_objects', DataObjects::Sqlite3::VERSION
39
+
40
+ gem.add_development_dependency 'bacon', '~>1.1'
41
+ gem.add_development_dependency 'rake-compiler', '~>0.7'
42
+
43
+ gem.has_rdoc = false
44
+ gem.rubyforge_project = 'dorb'
45
+ gem.authors = [ 'Dirkjan Bussink' ]
46
+ gem.email = 'd.bussink@gmail.com'
47
+ end
7
48
 
8
- ROOT = Pathname(__FILE__).dirname.expand_path
9
- JRUBY = RUBY_PLATFORM =~ /java/
10
- WINDOWS = Gem.win_platform?
11
- SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
12
- BINARY_VERSION = '3_6_13'
49
+ if JRUBY
50
+ Rake::Task['build'].clear_actions if Rake::Task.task_defined?('build')
51
+ Rake::Task['install'].clear_actions if Rake::Task.task_defined?('install')
52
+ task :build => [ :java, :gem ]
53
+ task :install do
54
+ sh "#{Config::CONFIG['RUBY_INSTALL_NAME']} -S gem install pkg/do_sqlite3-#{DataObjects::Sqlite3::VERSION}-java.gem"
55
+ end
56
+ end
13
57
 
14
- Dir['tasks/*.rake'].sort.each { |f| import f }
58
+ Jeweler::GemcutterTasks.new
15
59
 
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 ])
60
+ FileList['tasks/**/*.rake'].each { |task| import task }
61
+ rescue LoadError
62
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
63
+ end
@@ -0,0 +1,55 @@
1
+ #ifndef RUBY_COMPAT_H
2
+ #define RUBY_COMPAT_H
3
+
4
+ /*
5
+ * Rules for better ruby C extensions:
6
+ *
7
+ * Never use the R<TYPE> macros directly, always use R<TYPE>_<FIELD>
8
+ *
9
+ * Never compare with RBASIC(obj)->klass, always use
10
+ * rb_obj_is_instance_of()
11
+ *
12
+ * Never use RHASH(obj)->tbl or RHASH_TBL().
13
+ *
14
+ */
15
+
16
+
17
+ // Array
18
+ #ifndef RARRAY_PTR
19
+ #define RARRAY_PTR(obj) RARRAY(obj)->ptr
20
+ #endif
21
+
22
+ #ifndef RARRAY_LEN
23
+ #define RARRAY_LEN(obj) RARRAY(obj)->len
24
+ #endif
25
+
26
+ // String
27
+ #ifndef RSTRING_PTR
28
+ #define RSTRING_PTR(obj) RSTRING(obj)->ptr
29
+ #endif
30
+
31
+ #ifndef RSTRING_LEN
32
+ #define RSTRING_LEN(obj) RSTRING(obj)->len
33
+ #endif
34
+
35
+ #ifndef rb_str_ptr
36
+ #define rb_str_ptr(str) RSTRING_PTR(str)
37
+ #endif
38
+
39
+ #ifndef rb_str_ptr_readonly
40
+ #define rb_str_ptr_readonly(str) RSTRING_PTR(str)
41
+ #endif
42
+
43
+ #ifndef rb_str_flush
44
+ #define rb_str_flush(str)
45
+ #endif
46
+
47
+ #ifndef rb_str_update
48
+ #define rb_str_update(str)
49
+ #endif
50
+
51
+ #ifndef rb_str_len
52
+ #define rb_str_len(str) RSTRING_LEN(str)
53
+ #endif
54
+
55
+ #endif
@@ -4,6 +4,7 @@
4
4
  #include <time.h>
5
5
  #include <locale.h>
6
6
  #include <sqlite3.h>
7
+ #include "compat.h"
7
8
  #include "error.h"
8
9
 
9
10
  #ifdef HAVE_RUBY_ENCODING_H
@@ -47,20 +48,6 @@
47
48
  #define CONST_GET(scope, constant) (rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant)))
48
49
  #define SQLITE3_CLASS(klass, parent) (rb_define_class_under(mSqlite3, klass, parent))
49
50
 
50
- #define TRUE_CLASS CONST_GET(rb_mKernel, "TrueClass")
51
-
52
- #ifndef RSTRING_PTR
53
- #define RSTRING_PTR(s) (RSTRING(s)->ptr)
54
- #endif
55
-
56
- #ifndef RSTRING_LEN
57
- #define RSTRING_LEN(s) (RSTRING(s)->len)
58
- #endif
59
-
60
- #ifndef RARRAY_LEN
61
- #define RARRAY_LEN(a) RARRAY(a)->len
62
- #endif
63
-
64
51
  #ifdef _WIN32
65
52
  #define do_int64 signed __int64
66
53
  #else
@@ -130,15 +117,15 @@ static int jd_from_date(int year, int month, int day) {
130
117
  }
131
118
  a = year / 100;
132
119
  b = 2 - a + (a / 4);
133
- return floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524;
120
+ return (int) (floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524);
134
121
  }
135
122
 
136
123
  static void data_objects_debug(VALUE string, struct timeval* start) {
137
124
  struct timeval stop;
138
125
  char *message;
139
126
 
140
- char *query = RSTRING_PTR(string);
141
- int length = RSTRING_LEN(string);
127
+ const char *query = rb_str_ptr_readonly(string);
128
+ size_t length = rb_str_len(string);
142
129
  char total_time[32];
143
130
  do_int64 duration = 0;
144
131
 
@@ -274,8 +261,8 @@ static VALUE parse_date_time(char *date) {
274
261
  if ( is_dst > 0 )
275
262
  gmt_offset -= is_dst;
276
263
 
277
- hour_offset = -(gmt_offset / 3600);
278
- minute_offset = -(gmt_offset % 3600 / 60);
264
+ hour_offset = -((int)gmt_offset / 3600);
265
+ minute_offset = -((int)gmt_offset % 3600 / 60);
279
266
 
280
267
  } else {
281
268
  // Something went terribly wrong
@@ -383,7 +370,7 @@ static VALUE typecast(sqlite3_stmt *stmt, int i, VALUE type, int encoding) {
383
370
  } else if (type == rb_cByteArray) {
384
371
  return rb_funcall(rb_cByteArray, ID_NEW, 1, rb_str_new((char*)sqlite3_column_blob(stmt, i), length));
385
372
  } else if (type == rb_cClass) {
386
- return rb_funcall(rb_cObject, rb_intern("full_const_get"), 1, rb_str_new((char*)sqlite3_column_text(stmt, i), length));
373
+ return rb_funcall(mDO, rb_intern("full_const_get"), 1, rb_str_new((char*)sqlite3_column_text(stmt, i), length));
387
374
  } else if (type == rb_cObject) {
388
375
  return rb_marshal_load(rb_str_new((char*)sqlite3_column_text(stmt, i), length));
389
376
  } else if (type == rb_cNilClass) {
@@ -441,9 +428,9 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
441
428
  path = rb_funcall(uri, ID_PATH, 0);
442
429
 
443
430
  #ifdef HAVE_SQLITE3_OPEN_V2
444
- ret = sqlite3_open_v2(StringValuePtr(path), &db, flags_from_uri(uri), 0);
431
+ ret = sqlite3_open_v2(rb_str_ptr_readonly(path), &db, flags_from_uri(uri), 0);
445
432
  #else
446
- ret = sqlite3_open(StringValuePtr(path), &db);
433
+ ret = sqlite3_open(rb_str_ptr_readonly(path), &db);
447
434
  #endif
448
435
 
449
436
  if ( ret != SQLITE_OK ) {
@@ -519,7 +506,7 @@ static VALUE cConnection_quote_boolean(VALUE self, VALUE value) {
519
506
  }
520
507
 
521
508
  static VALUE cConnection_quote_string(VALUE self, VALUE string) {
522
- const char *source = StringValuePtr(string);
509
+ const char *source = rb_str_ptr_readonly(string);
523
510
  char *escaped_with_quotes;
524
511
  VALUE result;
525
512
 
@@ -534,6 +521,18 @@ static VALUE cConnection_quote_string(VALUE self, VALUE string) {
534
521
  return result;
535
522
  }
536
523
 
524
+ static VALUE cConnection_quote_byte_array(VALUE self, VALUE string) {
525
+ VALUE source = StringValue(string);
526
+ VALUE array = rb_funcall(source, rb_intern("unpack"), 1, rb_str_new2("H*"));
527
+ rb_ary_unshift(array, rb_str_new2("X'"));
528
+ rb_ary_push(array, rb_str_new2("'"));
529
+ return rb_ary_join(array, Qnil);
530
+ }
531
+
532
+ static VALUE cConnection_character_set(VALUE self) {
533
+ return rb_iv_get(self, "@encoding");
534
+ }
535
+
537
536
  static VALUE build_query_from_args(VALUE klass, int count, VALUE *args) {
538
537
  VALUE query = rb_iv_get(klass, "@text");
539
538
  int i;
@@ -550,18 +549,23 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
550
549
  char *error_message;
551
550
  int status;
552
551
  int affected_rows;
553
- int insert_id;
554
- VALUE conn_obj;
552
+ do_int64 insert_id;
553
+ VALUE connection, sqlite3_connection;
555
554
  VALUE query;
556
555
  struct timeval start;
557
556
 
558
557
  query = build_query_from_args(self, argc, argv);
559
558
 
560
- conn_obj = rb_iv_get(self, "@connection");
561
- Data_Get_Struct(rb_iv_get(conn_obj, "@connection"), sqlite3, db);
559
+ connection = rb_iv_get(self, "@connection");
560
+ sqlite3_connection = rb_iv_get(connection, "@connection");
561
+ if (Qnil == sqlite3_connection) {
562
+ rb_raise(eConnectionError, "This connection has already been closed.");
563
+ }
564
+
565
+ Data_Get_Struct(sqlite3_connection, sqlite3, db);
562
566
 
563
567
  gettimeofday(&start, NULL);
564
- status = sqlite3_exec(db, StringValuePtr(query), 0, 0, &error_message);
568
+ status = sqlite3_exec(db, rb_str_ptr_readonly(query), 0, 0, &error_message);
565
569
 
566
570
  if ( status != SQLITE_OK ) {
567
571
  raise_error(self, db, query);
@@ -581,18 +585,23 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
581
585
  int field_count;
582
586
  int i;
583
587
  VALUE reader;
584
- VALUE conn_obj;
588
+ VALUE connection, sqlite3_connection;
585
589
  VALUE query;
586
590
  VALUE field_names, field_types;
587
591
  struct timeval start;
588
592
 
589
- conn_obj = rb_iv_get(self, "@connection");
590
- Data_Get_Struct(rb_iv_get(conn_obj, "@connection"), sqlite3, db);
593
+ connection = rb_iv_get(self, "@connection");
594
+ sqlite3_connection = rb_iv_get(connection, "@connection");
595
+ if (Qnil == sqlite3_connection) {
596
+ rb_raise(eConnectionError, "This connection has already been closed.");
597
+ }
598
+
599
+ Data_Get_Struct(sqlite3_connection, sqlite3, db);
591
600
 
592
601
  query = build_query_from_args(self, argc, argv);
593
602
 
594
603
  gettimeofday(&start, NULL);
595
- status = sqlite3_prepare_v2(db, StringValuePtr(query), -1, &sqlite3_reader, 0);
604
+ status = sqlite3_prepare_v2(db, rb_str_ptr_readonly(query), -1, &sqlite3_reader, 0);
596
605
  data_objects_debug(query, &start);
597
606
 
598
607
  if ( status != SQLITE_OK ) {
@@ -604,6 +613,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
604
613
 
605
614
  rb_iv_set(reader, "@reader", Data_Wrap_Struct(rb_cObject, 0, 0, sqlite3_reader));
606
615
  rb_iv_set(reader, "@field_count", INT2NUM(field_count));
616
+ rb_iv_set(reader, "@connection", connection);
607
617
 
608
618
  field_names = rb_ary_new();
609
619
  field_types = rb_iv_get(self, "@field_types");
@@ -647,7 +657,7 @@ static VALUE cReader_next(VALUE self) {
647
657
  int field_count;
648
658
  int result;
649
659
  int i;
650
- int ft_length;
660
+ size_t ft_length;
651
661
  VALUE arr = rb_ary_new();
652
662
  VALUE field_types;
653
663
  VALUE field_type;
@@ -707,7 +717,7 @@ static VALUE cReader_field_count(VALUE self) {
707
717
  return rb_iv_get(self, "@field_count");
708
718
  }
709
719
 
710
- void Init_do_sqlite3_ext() {
720
+ void Init_do_sqlite3() {
711
721
  rb_require("bigdecimal");
712
722
  rb_require("date");
713
723
 
@@ -752,6 +762,8 @@ void Init_do_sqlite3_ext() {
752
762
  rb_define_method(cConnection, "dispose", cConnection_dispose, 0);
753
763
  rb_define_method(cConnection, "quote_boolean", cConnection_quote_boolean, 1);
754
764
  rb_define_method(cConnection, "quote_string", cConnection_quote_string, 1);
765
+ rb_define_method(cConnection, "quote_byte_array", cConnection_quote_byte_array, 1);
766
+ rb_define_method(cConnection, "character_set", cConnection_character_set, 0);
755
767
 
756
768
  cCommand = SQLITE3_CLASS("Command", cDO_Command);
757
769
  rb_define_method(cCommand, "set_types", cCommand_set_types, -1);