rubyfb 0.5.8 → 0.5.9

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -45,6 +45,8 @@ ext/TypeMap.h
45
45
  ext/extconf.rb
46
46
  ext/rfbint.h
47
47
  ext/rfbsleep.h
48
+ ext/rfbstr.c
49
+ ext/rfbstr.h
48
50
  ext/uncrustify.cfg
49
51
  lib/Connection.rb
50
52
  lib/ProcedureCall.rb
@@ -69,6 +71,7 @@ test/CharacterSetTest.rb
69
71
  test/ConnectionTest.rb
70
72
  test/DDLTest.rb
71
73
  test/DatabaseTest.rb
74
+ test/FieldCharacterSetTest.rb
72
75
  test/GeneratorTest.rb
73
76
  test/KeyTest.rb
74
77
  test/ResultSetTest.rb
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'echoe'
2
- e = Echoe.new('rubyfb', '0.5.8') do |p|
2
+ e = Echoe.new('rubyfb', '0.5.9') do |p|
3
3
  p.description = "Firebird SQL access library"
4
4
  p.url = "http://rubyforge.org/projects/rubyfb"
5
5
  p.author = "George Georgiev"
data/ext/Blob.c CHANGED
@@ -27,6 +27,7 @@
27
27
  #include "Blob.h"
28
28
  #include <limits.h>
29
29
  #include "Common.h"
30
+ #include "rfbstr.h"
30
31
 
31
32
  /* Function prototypes. */
32
33
  static VALUE allocateBlob(VALUE);
@@ -67,12 +68,14 @@ static VALUE allocateBlob(VALUE klass) {
67
68
  /**
68
69
  * This function provides the initialize method for the Blob class.
69
70
  *
70
- * @param self A reference to the Blob object to be initialized.
71
+ * @param self A reference to the Blob object to be initialized.
72
+ * @param connection A reference to the Connection object owning the blob.
71
73
  *
72
74
  * @return A reference to the newly initialized Blob object.
73
75
  *
74
76
  */
75
- VALUE initializeBlob(VALUE self) {
77
+ VALUE initializeBlob(VALUE self, VALUE connection) {
78
+ rb_iv_set(self, "@connection", connection);
76
79
  rb_iv_set(self, "@data", Qnil);
77
80
  return(self);
78
81
  }
@@ -89,6 +92,7 @@ VALUE initializeBlob(VALUE self) {
89
92
  */
90
93
  static VALUE getBlobData(VALUE self) {
91
94
  VALUE data = rb_iv_get(self, "@data");
95
+ VALUE connection = rb_iv_get(self, "@connection");
92
96
 
93
97
  if(data == Qnil) {
94
98
  BlobHandle *blob = NULL;
@@ -98,7 +102,7 @@ static VALUE getBlobData(VALUE self) {
98
102
  char *buffer = loadBlobData(blob);
99
103
 
100
104
  if(buffer != NULL) {
101
- data = rb_str_new(buffer, blob->size);
105
+ data = rfbstr(connection, blob->charset, buffer, blob->size);
102
106
  }
103
107
  free(buffer);
104
108
  }
@@ -154,6 +158,7 @@ static VALUE eachBlobSegment(VALUE self) {
154
158
  VALUE result = Qnil;
155
159
 
156
160
  if(rb_block_given_p()) {
161
+ VALUE connection = rb_iv_get(self, "@connection");
157
162
  BlobHandle *blob = NULL;
158
163
  char *segment = NULL;
159
164
  unsigned short size = 0;
@@ -161,7 +166,7 @@ static VALUE eachBlobSegment(VALUE self) {
161
166
  Data_Get_Struct(self, BlobHandle, blob);
162
167
  segment = loadBlobSegment(blob, &size);
163
168
  while(segment != NULL) {
164
- result = rb_yield(rb_str_new(segment, size));
169
+ result = rb_yield(rfbstr(connection, blob->charset, segment, size));
165
170
  free(segment);
166
171
  segment = loadBlobSegment(blob, &size);
167
172
  }
@@ -175,7 +180,7 @@ static VALUE eachBlobSegment(VALUE self) {
175
180
  * This function allocates a BlobHandle structure and opens the structure for
176
181
  * use.
177
182
  *
178
- * @param blobId The unique identifier for the blob to be opened.
183
+ * @param blobEntry The blob SQLVAR data.
179
184
  * @param table The name of the table containing the blob being opened.
180
185
  * @param column The name of the column in the table that contains the
181
186
  * blob.
@@ -185,7 +190,7 @@ static VALUE eachBlobSegment(VALUE self) {
185
190
  * @return A pointer to an allocated and opened BlobHandle structure.
186
191
  *
187
192
  */
188
- BlobHandle *openBlob(ISC_QUAD blobId,
193
+ BlobHandle *openBlob(XSQLVAR *blobEntry,
189
194
  char *table,
190
195
  char *column,
191
196
  VALUE connection,
@@ -194,6 +199,7 @@ BlobHandle *openBlob(ISC_QUAD blobId,
194
199
  TransactionHandle *tHandle = NULL;
195
200
  Data_Get_Struct(connection, ConnectionHandle, cHandle);
196
201
  Data_Get_Struct(transaction, TransactionHandle, tHandle);
202
+ ISC_QUAD blobId = *(ISC_QUAD *)blobEntry->sqldata;
197
203
 
198
204
  BlobHandle *blob = ALLOC(BlobHandle);
199
205
 
@@ -202,6 +208,7 @@ BlobHandle *openBlob(ISC_QUAD blobId,
202
208
 
203
209
  /* Extract the blob details and open it. */
204
210
  blob->handle = 0;
211
+ blob->charset = blobEntry->sqlscale;
205
212
  isc_blob_default_desc(&blob->description,
206
213
  (unsigned char *)table,
207
214
  (unsigned char *)column);
@@ -365,7 +372,7 @@ void blobFree(void *blob) {
365
372
  void Init_Blob(VALUE module) {
366
373
  cBlob = rb_define_class_under(module, "Blob", rb_cObject);
367
374
  rb_define_alloc_func(cBlob, allocateBlob);
368
- rb_define_method(cBlob, "initialize", initializeBlob, 0);
375
+ rb_define_method(cBlob, "initialize", initializeBlob, 1);
369
376
  rb_define_method(cBlob, "initialize_copy", forbidObjectCopy, 1);
370
377
  rb_define_method(cBlob, "to_s", getBlobData, 0);
371
378
  rb_define_method(cBlob, "close", closeBlob, 0);
data/ext/Blob.h CHANGED
@@ -42,25 +42,27 @@
42
42
  #include "Connection.h"
43
43
  #include "Transaction.h"
44
44
 
45
+ #include "rfbint.h"
45
46
  /* Type definitions. */
46
47
  typedef struct {
47
48
  ISC_BLOB_DESC description;
48
49
  ISC_LONG segments,
49
50
  size;
50
51
  isc_blob_handle handle;
52
+ short charset;
51
53
  } BlobHandle;
52
54
 
53
55
  /* Data elements. */
54
56
  extern VALUE cBlob;
55
57
 
56
58
  /* Function prototypes. */
57
- BlobHandle *openBlob(ISC_QUAD,
59
+ BlobHandle *openBlob(XSQLVAR *,
58
60
  char *,
59
61
  char *,
60
62
  VALUE,
61
63
  VALUE);
62
64
  void Init_Blob(VALUE);
63
65
  void blobFree(void *);
64
- VALUE initializeBlob(VALUE);
66
+ VALUE initializeBlob(VALUE, VALUE);
65
67
 
66
68
  #endif /* FIRERUBY_BLOB_H */
data/ext/TypeMap.c CHANGED
@@ -35,6 +35,7 @@
35
35
  #include "Statement.h"
36
36
  #include "FireRuby.h"
37
37
  #include "rfbint.h"
38
+ #include "rfbstr.h"
38
39
 
39
40
  /* Function prototypes. */
40
41
  VALUE createDate(const struct tm *);
@@ -56,32 +57,6 @@ void populateDateField(VALUE, XSQLVAR *);
56
57
  void populateTimeField(VALUE, XSQLVAR *);
57
58
  void populateTimestampField(VALUE, XSQLVAR *);
58
59
 
59
-
60
- /**
61
- * This function converts a sql data into ruby string
62
- * respecting data encoding
63
- *
64
- * @param connection The connection object relating to the data
65
- * @param sqlsubtype SQL subtype of the field (fot character types - used to hold encoding information)
66
- * @param data A pointer to the sql data
67
- * @param length Length of the sql data
68
- *
69
- * @return A Ruby String object with correct encoding
70
- *
71
- */
72
- VALUE createString(VALUE connection, short sqlsubtype, const char *data, short length) {
73
- VALUE value = Qnil;
74
- if (length >= 0) {
75
- char *array = ALLOC_N(char, length + 1);
76
- memcpy(array, data, length);
77
- array[length] = 0;
78
- value = rb_str_new2(array);
79
- free(array);
80
- value = rb_funcall(connection, rb_intern("force_encoding"), 2, value, INT2FIX(sqlsubtype));
81
- }
82
- return value;
83
- }
84
-
85
60
  /**
86
61
  * This function converts a single XSQLVAR entry to a Ruby VALUE type.
87
62
  *
@@ -122,10 +97,10 @@ VALUE toValue(XSQLVAR *entry,
122
97
  memset(table, 0, 256);
123
98
  memcpy(column, entry->sqlname, entry->sqlname_length);
124
99
  memcpy(table, entry->relname, entry->relname_length);
125
- blob = openBlob(*(ISC_QUAD *)entry->sqldata, column, table, connection,
100
+ blob = openBlob(entry, column, table, connection,
126
101
  transaction);
127
102
  working = Data_Wrap_Struct(cBlob, NULL, blobFree, blob);
128
- rb_ary_push(value, initializeBlob(working));
103
+ rb_ary_push(value, initializeBlob(working, connection));
129
104
  rb_ary_push(value, getColumnType(entry));
130
105
  break;
131
106
 
@@ -190,7 +165,7 @@ VALUE toValue(XSQLVAR *entry,
190
165
  break;
191
166
 
192
167
  case SQL_TEXT: /* Type: CHAR */
193
- rb_ary_push(value, createString(connection, entry->sqlsubtype, entry->sqldata, entry->sqllen));
168
+ rb_ary_push(value, rfbstr(connection, entry->sqlsubtype, entry->sqldata, entry->sqllen));
194
169
  rb_ary_push(value, getColumnType(entry));
195
170
  break;
196
171
 
@@ -211,7 +186,7 @@ VALUE toValue(XSQLVAR *entry,
211
186
 
212
187
  case SQL_VARYING:
213
188
  memcpy(&length, entry->sqldata, 2);
214
- rb_ary_push(value, createString(connection, entry->sqlsubtype, &entry->sqldata[2], length));
189
+ rb_ary_push(value, rfbstr(connection, entry->sqlsubtype, &entry->sqldata[2], length));
215
190
  rb_ary_push(value, getColumnType(entry));
216
191
  break;
217
192
 
@@ -731,21 +706,23 @@ void storeBlob(VALUE info,
731
706
  ISC_STATUS status[ISC_STATUS_LENGTH];
732
707
  isc_blob_handle handle = 0;
733
708
  ISC_QUAD *blobId = (ISC_QUAD *)field->sqldata;
709
+ char *data = StringValuePtr(info);
734
710
  VALUE number = rb_funcall(info, rb_intern("length"), 0);
735
- long length = 0;
736
- char *data = StringValuePtr(info);
737
-
738
- length = TYPE(number) == T_FIXNUM ? FIX2INT(number) : NUM2INT(number);
711
+ long charLength = TYPE(number) == T_FIXNUM ? FIX2INT(number) : NUM2INT(number);
712
+ long byteLength = strlen(data);
713
+ short charSize = byteLength/charLength;
739
714
  field->sqltype = SQL_BLOB;
715
+
740
716
  if(isc_create_blob(status, &connection->handle, &transaction->handle,
741
717
  &handle, blobId) == 0) {
742
718
  long offset = 0;
743
719
  unsigned short size = 0;
744
720
 
745
- while(offset < length) {
721
+ while(offset < byteLength) {
746
722
  char *buffer = &data[offset];
747
723
 
748
- size = (length - offset) > USHRT_MAX ? USHRT_MAX : length - offset;
724
+ size = (byteLength - offset) > USHRT_MAX ? USHRT_MAX : byteLength - offset;
725
+ size = (size/charSize)*charSize; // align
749
726
  if(isc_put_segment(status, &handle, size, buffer) != 0) {
750
727
  ISC_STATUS other[20];
751
728
 
@@ -991,7 +968,7 @@ void populateTextField(VALUE value, XSQLVAR *field) {
991
968
  char *text = NULL;
992
969
  short length = 0;
993
970
 
994
- if(TYPE(value) != T_STRING) {
971
+ if(TYPE(value) == T_STRING) {
995
972
  actual = value;
996
973
  } else {
997
974
  actual = rb_funcall(value, rb_intern("to_s"), 0);
data/ext/rfbstr.c ADDED
@@ -0,0 +1,28 @@
1
+ /*------------------------------------------------------------------------------
2
+ * rfbstr.c
3
+ *----------------------------------------------------------------------------*/
4
+
5
+ /* Includes. */
6
+ #include "rfbstr.h"
7
+
8
+ /**
9
+ * This function converts a sql data into ruby string
10
+ * respecting data encoding
11
+ *
12
+ * @param connection The connection object relating to the data
13
+ * @param sqlsubtype SQL subtype of the field (fot character types - used to hold encoding information)
14
+ * @param data A pointer to the sql data
15
+ * @param length Length of the sql data
16
+ *
17
+ * @return A Ruby String object with correct encoding
18
+ *
19
+ */
20
+ VALUE rfbstr(VALUE connection, short sqlsubtype, const char *data, short length) {
21
+ VALUE value = Qnil;
22
+ if (length >= 0) {
23
+ value = rb_str_new(data, length);
24
+ value = rb_funcall(connection, rb_intern("force_encoding"), 2, value, INT2FIX(sqlsubtype));
25
+ }
26
+ return value;
27
+ }
28
+
data/ext/rfbstr.h ADDED
@@ -0,0 +1,12 @@
1
+ #ifndef RFB_STR_H
2
+ #define RFB_STR_H
3
+
4
+ #ifndef RUBY_H_INCLUDED
5
+ #include "ruby.h"
6
+ #define RUBY_H_INCLUDED
7
+ #endif
8
+ #include "rfbint.h"
9
+
10
+ VALUE rfbstr(VALUE, short, const char *, short);
11
+
12
+ #endif /* RFB_STR_H */
data/lib/rubyfb_lib.so CHANGED
Binary file
data/rubyfb.gemspec CHANGED
@@ -2,25 +2,24 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rubyfb}
5
- s.version = "0.5.8"
5
+ s.version = "0.5.9"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["George Georgiev"]
9
- s.date = %q{2011-04-03}
8
+ s.authors = [%q{George Georgiev}]
9
+ s.date = %q{2011-06-06}
10
10
  s.description = %q{Firebird SQL access library}
11
11
  s.email = %q{georgiev@heatbs.com}
12
- s.extensions = ["ext/extconf.rb"]
13
- s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "examples/example01.rb", "ext/extconf.rb", "lib/Connection.rb", "lib/ProcedureCall.rb", "lib/SQLType.rb", "lib/rubyfb.rb", "lib/rubyfb_options.rb", "lib/src.rb"]
14
- s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "examples/example01.rb", "ext/AddUser.c", "ext/AddUser.h", "ext/Backup.c", "ext/Backup.h", "ext/Blob.c", "ext/Blob.h", "ext/Common.c", "ext/Common.h", "ext/Connection.c", "ext/Connection.h", "ext/DataArea.c", "ext/DataArea.h", "ext/Database.c", "ext/Database.h", "ext/FireRuby.c", "ext/FireRuby.h", "ext/FireRubyException.c", "ext/FireRubyException.h", "ext/Generator.c", "ext/Generator.h", "ext/RemoveUser.c", "ext/RemoveUser.h", "ext/Restore.c", "ext/Restore.h", "ext/ResultSet.c", "ext/ResultSet.h", "ext/Row.c", "ext/Row.h", "ext/ServiceManager.c", "ext/ServiceManager.h", "ext/Services.c", "ext/Services.h", "ext/Statement.c", "ext/Statement.h", "ext/Transaction.c", "ext/Transaction.h", "ext/TypeMap.c", "ext/TypeMap.h", "ext/extconf.rb", "ext/rfbint.h", "ext/rfbsleep.h", "ext/uncrustify.cfg", "lib/Connection.rb", "lib/ProcedureCall.rb", "lib/SQLType.rb", "lib/active_record/connection_adapters/rubyfb_adapter.rb", "lib/arel/visitors/rubyfb.rb", "lib/arel/visitors/rubyfb_15compat.rb", "lib/mkdoc", "lib/rubyfb.rb", "lib/rubyfb_lib.so", "lib/rubyfb_options.rb", "lib/src.rb", "mswin32fb/fbclient_mingw.def", "mswin32fb/fbclient_mingw.lib", "mswin32fb/fbclient_ms.lib", "mswin32fb/ibase.h", "mswin32fb/iberror.h", "test/AddRemoveUserTest.rb", "test/BackupRestoreTest.rb", "test/BlobTest.rb", "test/CharacterSetTest.rb", "test/ConnectionTest.rb", "test/DDLTest.rb", "test/DatabaseTest.rb", "test/GeneratorTest.rb", "test/KeyTest.rb", "test/ResultSetTest.rb", "test/RoleTest.rb", "test/RowCountTest.rb", "test/RowTest.rb", "test/SQLTest.rb", "test/SQLTypeTest.rb", "test/ServiceManagerTest.rb", "test/StatementTest.rb", "test/TestSetup.rb", "test/TransactionTest.rb", "test/TypeTest.rb", "rubyfb.gemspec"]
12
+ s.extensions = [%q{ext/extconf.rb}]
13
+ s.extra_rdoc_files = [%q{CHANGELOG}, %q{LICENSE}, %q{README}, %q{examples/example01.rb}, %q{ext/extconf.rb}, %q{lib/Connection.rb}, %q{lib/ProcedureCall.rb}, %q{lib/SQLType.rb}, %q{lib/rubyfb.rb}, %q{lib/rubyfb_options.rb}, %q{lib/src.rb}]
14
+ s.files = [%q{CHANGELOG}, %q{LICENSE}, %q{Manifest}, %q{README}, %q{Rakefile}, %q{examples/example01.rb}, %q{ext/AddUser.c}, %q{ext/AddUser.h}, %q{ext/Backup.c}, %q{ext/Backup.h}, %q{ext/Blob.c}, %q{ext/Blob.h}, %q{ext/Common.c}, %q{ext/Common.h}, %q{ext/Connection.c}, %q{ext/Connection.h}, %q{ext/DataArea.c}, %q{ext/DataArea.h}, %q{ext/Database.c}, %q{ext/Database.h}, %q{ext/FireRuby.c}, %q{ext/FireRuby.h}, %q{ext/FireRubyException.c}, %q{ext/FireRubyException.h}, %q{ext/Generator.c}, %q{ext/Generator.h}, %q{ext/RemoveUser.c}, %q{ext/RemoveUser.h}, %q{ext/Restore.c}, %q{ext/Restore.h}, %q{ext/ResultSet.c}, %q{ext/ResultSet.h}, %q{ext/Row.c}, %q{ext/Row.h}, %q{ext/ServiceManager.c}, %q{ext/ServiceManager.h}, %q{ext/Services.c}, %q{ext/Services.h}, %q{ext/Statement.c}, %q{ext/Statement.h}, %q{ext/Transaction.c}, %q{ext/Transaction.h}, %q{ext/TypeMap.c}, %q{ext/TypeMap.h}, %q{ext/extconf.rb}, %q{ext/rfbint.h}, %q{ext/rfbsleep.h}, %q{ext/rfbstr.c}, %q{ext/rfbstr.h}, %q{ext/uncrustify.cfg}, %q{lib/Connection.rb}, %q{lib/ProcedureCall.rb}, %q{lib/SQLType.rb}, %q{lib/active_record/connection_adapters/rubyfb_adapter.rb}, %q{lib/arel/visitors/rubyfb.rb}, %q{lib/arel/visitors/rubyfb_15compat.rb}, %q{lib/mkdoc}, %q{lib/rubyfb.rb}, %q{lib/rubyfb_lib.so}, %q{lib/rubyfb_options.rb}, %q{lib/src.rb}, %q{mswin32fb/fbclient_mingw.def}, %q{mswin32fb/fbclient_mingw.lib}, %q{mswin32fb/fbclient_ms.lib}, %q{mswin32fb/ibase.h}, %q{mswin32fb/iberror.h}, %q{test/AddRemoveUserTest.rb}, %q{test/BackupRestoreTest.rb}, %q{test/BlobTest.rb}, %q{test/CharacterSetTest.rb}, %q{test/ConnectionTest.rb}, %q{test/DDLTest.rb}, %q{test/DatabaseTest.rb}, %q{test/FieldCharacterSetTest.rb}, %q{test/GeneratorTest.rb}, %q{test/KeyTest.rb}, %q{test/ResultSetTest.rb}, %q{test/RoleTest.rb}, %q{test/RowCountTest.rb}, %q{test/RowTest.rb}, %q{test/SQLTest.rb}, %q{test/SQLTypeTest.rb}, %q{test/ServiceManagerTest.rb}, %q{test/StatementTest.rb}, %q{test/TestSetup.rb}, %q{test/TransactionTest.rb}, %q{test/TypeTest.rb}, %q{rubyfb.gemspec}]
15
15
  s.homepage = %q{http://rubyforge.org/projects/rubyfb}
16
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rubyfb", "--main", "README"]
17
- s.require_paths = ["lib", "ext"]
16
+ s.rdoc_options = [%q{--line-numbers}, %q{--inline-source}, %q{--title}, %q{Rubyfb}, %q{--main}, %q{README}]
17
+ s.require_paths = [%q{lib}, %q{ext}]
18
18
  s.rubyforge_project = %q{rubyfb}
19
- s.rubygems_version = %q{1.3.7}
19
+ s.rubygems_version = %q{1.8.5}
20
20
  s.summary = %q{Firebird SQL access library}
21
21
 
22
22
  if s.respond_to? :specification_version then
23
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
23
  s.specification_version = 3
25
24
 
26
25
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
data/test/BlobTest.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  require './TestSetup'
4
5
  require 'test/unit'
@@ -11,6 +12,7 @@ class BlobTest < Test::Unit::TestCase
11
12
  DB_FILE = File.join(DB_DIR, "blob_unit_test.fdb")
12
13
  TXT_FILE = File.join(DB_DIR, "data.txt")
13
14
  DATA = "aasdfjakhdsfljkashdfslfhaslhasyhfawyufalwuhlhsdlkfhasljlkshflalksjhasjhalsjhdf\nasdflkajshdfjkahsdfjajdfalsdfasdf\nasdfasdfasdkljfhajdfhkjasdfagdsflalkjfgagsdflasdf\nasdfasdfasdf"
15
+ UTF_DATA = "ред с utf кирилица"
14
16
 
15
17
  def setup
16
18
  puts "#{self.class.name} started." if TEST_LOGGING
@@ -53,4 +55,28 @@ class BlobTest < Test::Unit::TestCase
53
55
  cxn.execute_immediate('DROP TABLE BLOB_TEST')
54
56
  end
55
57
  end
58
+
59
+ def test02
60
+ d = nil
61
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
62
+ cxn.execute_immediate('create table blob_test (data blob sub_type 1 segment size 10 CHARACTER SET UTF8)')
63
+ cxn.start_transaction do |tx|
64
+
65
+ s = Statement.new(cxn, tx, 'INSERT INTO BLOB_TEST VALUES(?)', 3)
66
+ s.execute_for([UTF_DATA])
67
+
68
+ # Perform a select of the value inserted.
69
+ r = cxn.execute('SELECT * FROM BLOB_TEST', tx)
70
+ d = r.fetch
71
+
72
+ assert_equal(d[0].to_s, UTF_DATA)
73
+
74
+ # Clean up.
75
+ s.close
76
+ r.close
77
+ end
78
+ cxn.execute_immediate('DROP TABLE BLOB_TEST')
79
+ end
80
+ end
81
+
56
82
  end
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require './TestSetup'
5
+ require 'test/unit'
6
+ require 'rubygems'
7
+ require 'rubyfb'
8
+
9
+ include Rubyfb
10
+
11
+ class FieldCharacterSetTest < Test::Unit::TestCase
12
+ DB_FILE = File.join(DB_DIR, "cxnarset_unit_test.fdb")
13
+ DB_CHAR_SET = 'NONE'
14
+
15
+ def setup
16
+ puts "#{self.class.name} started." if TEST_LOGGING
17
+ if File::exist?(DB_FILE)
18
+ Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
19
+ end
20
+ @database = Database.create(DB_FILE, DB_USER_NAME, DB_PASSWORD, 1024, DB_CHAR_SET)
21
+ end
22
+
23
+ def teardown
24
+ if File::exist?(DB_FILE)
25
+ Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
26
+ end
27
+ puts "#{self.class.name} finished." if TEST_LOGGING
28
+ end
29
+
30
+ def test01
31
+ db = Database.new(DB_FILE, DB_CHAR_SET)
32
+ utf8_str = "Малко utf8 кирилица"
33
+ db.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
34
+ cxn.start_transaction do |tr|
35
+ cxn.execute("CREATE TABLE SAMPLE_TABLE(SAMPLE_FIELD VARCHAR(100) CHARACTER SET UTF8)", tr)
36
+ end
37
+ cxn.start_transaction do |tr|
38
+ cxn.execute("INSERT INTO SAMPLE_TABLE VALUES ('#{utf8_str}')", tr)
39
+ row_count = 0
40
+ cxn.execute("SELECT * FROM SAMPLE_TABLE WHERE SAMPLE_FIELD = '#{utf8_str}'", tr) do |row|
41
+ assert(row['SAMPLE_FIELD'] == utf8_str, "Field encoding failed")
42
+ row_count += 1
43
+ end
44
+ assert(1==row_count)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  require './TestSetup'
4
5
  require 'test/unit'
@@ -131,4 +132,27 @@ class StatementTest < Test::Unit::TestCase
131
132
  cxn.execute_immediate('DROP TABLE STRING_TEST')
132
133
  end
133
134
  end
135
+
136
+ def test04
137
+ d = nil
138
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
139
+ utf_str = 'utf кирилица';
140
+ cxn.execute_immediate('CREATE TABLE STRING_TEST(TEXT VARCHAR(100) CHARACTER SET UTF8)')
141
+ cxn.start_transaction do |tx|
142
+ # Perform an truncated insert.
143
+ s = Statement.new(cxn, tx, 'INSERT INTO STRING_TEST VALUES(?)', 3)
144
+ s.execute_for([utf_str])
145
+
146
+ # Perform a select of the value inserted.
147
+ r = cxn.execute('SELECT * FROM STRING_TEST', tx)
148
+ d = r.fetch
149
+
150
+ # Clean up.
151
+ s.close
152
+ r.close
153
+ end
154
+ assert(d[0] == utf_str)
155
+ cxn.execute_immediate('DROP TABLE STRING_TEST')
156
+ end
157
+ end
134
158
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyfb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease: false
4
+ hash: 25
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 5
9
- - 8
10
- version: 0.5.8
9
+ - 9
10
+ version: 0.5.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - George Georgiev
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-03 00:00:00 +03:00
19
- default_executable:
18
+ date: 2011-06-06 00:00:00 Z
20
19
  dependencies: []
21
20
 
22
21
  description: Firebird SQL access library
@@ -85,6 +84,8 @@ files:
85
84
  - ext/extconf.rb
86
85
  - ext/rfbint.h
87
86
  - ext/rfbsleep.h
87
+ - ext/rfbstr.c
88
+ - ext/rfbstr.h
88
89
  - ext/uncrustify.cfg
89
90
  - lib/Connection.rb
90
91
  - lib/ProcedureCall.rb
@@ -109,6 +110,7 @@ files:
109
110
  - test/ConnectionTest.rb
110
111
  - test/DDLTest.rb
111
112
  - test/DatabaseTest.rb
113
+ - test/FieldCharacterSetTest.rb
112
114
  - test/GeneratorTest.rb
113
115
  - test/KeyTest.rb
114
116
  - test/ResultSetTest.rb
@@ -123,7 +125,6 @@ files:
123
125
  - test/TransactionTest.rb
124
126
  - test/TypeTest.rb
125
127
  - rubyfb.gemspec
126
- has_rdoc: true
127
128
  homepage: http://rubyforge.org/projects/rubyfb
128
129
  licenses: []
129
130
 
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  requirements: []
161
162
 
162
163
  rubyforge_project: rubyfb
163
- rubygems_version: 1.3.7
164
+ rubygems_version: 1.8.5
164
165
  signing_key:
165
166
  specification_version: 3
166
167
  summary: Firebird SQL access library