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

Sign up to get free protection for your applications and to get access to all the features.
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);