rubyfb 0.6.3 → 0.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/Rakefile +1 -1
- data/ext/ResultSet.c +62 -11
- data/ext/ResultSet.h +1 -0
- data/ext/Row.c +139 -380
- data/ext/Row.h +1 -16
- data/ext/TypeMap.c +66 -66
- data/ext/TypeMap.h +1 -0
- data/lib/rubyfb_lib.so +0 -0
- data/rubyfb.gemspec +3 -3
- data/test/KeyTest.rb +4 -4
- data/test/RowTest.rb +20 -27
- data/test/StatementTest.rb +2 -2
- metadata +3 -3
data/ext/Row.h
CHANGED
@@ -31,23 +31,8 @@
|
|
31
31
|
#define RUBY_H_INCLUDED
|
32
32
|
#endif
|
33
33
|
|
34
|
-
/* Type definitions. */
|
35
|
-
typedef struct {
|
36
|
-
char name[32],
|
37
|
-
alias[32];
|
38
|
-
VALUE value,
|
39
|
-
type,
|
40
|
-
scale;
|
41
|
-
} ColumnHandle;
|
42
|
-
|
43
|
-
typedef struct {
|
44
|
-
unsigned int size,
|
45
|
-
number;
|
46
|
-
ColumnHandle *columns;
|
47
|
-
} RowHandle;
|
48
|
-
|
49
34
|
/* Function prototypes. */
|
50
35
|
void Init_Row(VALUE);
|
51
|
-
VALUE rb_row_new(VALUE, VALUE
|
36
|
+
VALUE rb_row_new(VALUE, VALUE);
|
52
37
|
|
53
38
|
#endif // FIRERUBY_ROW_H
|
data/ext/TypeMap.c
CHANGED
@@ -57,14 +57,18 @@ void populateDateField(VALUE, XSQLVAR *);
|
|
57
57
|
void populateTimeField(VALUE, XSQLVAR *);
|
58
58
|
void populateTimestampField(VALUE, XSQLVAR *);
|
59
59
|
|
60
|
+
ID NEW_ID, TO_F_ID, ROUND_ID, ASTERISK_ID, CLASS_ID, TRANSACTION_ID,
|
61
|
+
CONNECTION_ID, STATEMENT_ID, NAME_ID, AT_VALUE_ID, AT_TYPE_ID,
|
62
|
+
AT_COLUMN_ID;
|
63
|
+
|
60
64
|
long long sql_scale(VALUE value, XSQLVAR *field) {
|
61
|
-
value = rb_funcall(value,
|
65
|
+
value = rb_funcall(value, TO_F_ID, 0);
|
62
66
|
if(field->sqlscale) {
|
63
67
|
// this requires special care - decimal point shift can cause type overflow
|
64
68
|
// the easyest way is to use ruby arithmetics (although it's not the fastes)
|
65
|
-
value = rb_funcall(value,
|
69
|
+
value = rb_funcall(value, ASTERISK_ID, 1, LONG2NUM((long)pow(10, abs(field->sqlscale))));
|
66
70
|
}
|
67
|
-
return NUM2LL(rb_funcall(value,
|
71
|
+
return NUM2LL(rb_funcall(value, ROUND_ID, 0));
|
68
72
|
}
|
69
73
|
|
70
74
|
VALUE sql_unscale(VALUE value, XSQLVAR *field) {
|
@@ -72,7 +76,7 @@ VALUE sql_unscale(VALUE value, XSQLVAR *field) {
|
|
72
76
|
return value;
|
73
77
|
}
|
74
78
|
return rb_float_new(
|
75
|
-
NUM2DBL(rb_funcall(value,
|
79
|
+
NUM2DBL(rb_funcall(value, TO_F_ID, 0)) / pow(10, abs(field->sqlscale))
|
76
80
|
);
|
77
81
|
}
|
78
82
|
|
@@ -88,10 +92,11 @@ VALUE sql_unscale(VALUE value, XSQLVAR *field) {
|
|
88
92
|
* the field type referenced.
|
89
93
|
*
|
90
94
|
*/
|
91
|
-
VALUE
|
95
|
+
VALUE toColumn(XSQLVAR *entry,
|
96
|
+
VALUE metadata,
|
92
97
|
VALUE connection,
|
93
98
|
VALUE transaction) {
|
94
|
-
VALUE value
|
99
|
+
VALUE column, value = Qnil;
|
95
100
|
|
96
101
|
/* Check for NULL values. */
|
97
102
|
if(!((entry->sqltype & 1) && (*entry->sqlind < 0))) {
|
@@ -107,10 +112,6 @@ VALUE toValue(XSQLVAR *entry,
|
|
107
112
|
working = Qnil;
|
108
113
|
|
109
114
|
switch(type) {
|
110
|
-
case SQL_ARRAY: /* Type: ARRAY */
|
111
|
-
/* TO BE DONE! */
|
112
|
-
break;
|
113
|
-
|
114
115
|
case SQL_BLOB: /* Type: BLOB */
|
115
116
|
memset(column, 0, 256);
|
116
117
|
memset(table, 0, 256);
|
@@ -119,8 +120,7 @@ VALUE toValue(XSQLVAR *entry,
|
|
119
120
|
blob = openBlob(entry, column, table, connection,
|
120
121
|
transaction);
|
121
122
|
working = Data_Wrap_Struct(cBlob, NULL, blobFree, blob);
|
122
|
-
|
123
|
-
rb_ary_push(value, getColumnType(entry));
|
123
|
+
value = initializeBlob(working, connection);
|
124
124
|
break;
|
125
125
|
|
126
126
|
case SQL_TYPE_DATE: /* Type: DATE */
|
@@ -130,41 +130,34 @@ VALUE toValue(XSQLVAR *entry,
|
|
130
130
|
datetime.tm_min = 0;
|
131
131
|
datetime.tm_hour = 0;
|
132
132
|
if(setting == Qtrue) {
|
133
|
-
|
133
|
+
value = createDate(&datetime);
|
134
134
|
} else {
|
135
|
-
|
135
|
+
value = createSafeTime(&datetime);
|
136
136
|
}
|
137
|
-
rb_ary_push(value, getColumnType(entry));
|
138
137
|
break;
|
139
138
|
|
140
139
|
case SQL_DOUBLE: /* Type: DOUBLE PRECISION, DECIMAL, NUMERIC */
|
141
|
-
|
142
|
-
rb_ary_push(value, getColumnType(entry));
|
140
|
+
value = rb_float_new(*((double *)entry->sqldata));
|
143
141
|
break;
|
144
142
|
|
145
143
|
case SQL_FLOAT: /* Type: FLOAT */
|
146
|
-
|
147
|
-
rb_ary_push(value, getColumnType(entry));
|
144
|
+
value = rb_float_new(*((float *)entry->sqldata));
|
148
145
|
break;
|
149
146
|
|
150
147
|
case SQL_INT64: /* Type: DECIMAL, NUMERIC */
|
151
|
-
|
152
|
-
rb_ary_push(value, getColumnType(entry));
|
148
|
+
value = sql_unscale(LL2NUM(*((long long *)entry->sqldata)), entry);
|
153
149
|
break;
|
154
150
|
|
155
151
|
case SQL_LONG: /* Type: INTEGER, DECIMAL, NUMERIC */
|
156
|
-
|
157
|
-
rb_ary_push(value, getColumnType(entry));
|
152
|
+
value = sql_unscale(LONG2NUM(*((int32_t *)entry->sqldata)), entry);
|
158
153
|
break;
|
159
154
|
|
160
155
|
case SQL_SHORT: /* Type: SMALLINT, DECIMAL, NUMERIC */
|
161
|
-
|
162
|
-
rb_ary_push(value, getColumnType(entry));
|
156
|
+
value = sql_unscale(INT2NUM(*((short *)entry->sqldata)), entry);
|
163
157
|
break;
|
164
158
|
|
165
159
|
case SQL_TEXT: /* Type: CHAR */
|
166
|
-
|
167
|
-
rb_ary_push(value, getColumnType(entry));
|
160
|
+
value = rfbstr(connection, entry->sqlsubtype, entry->sqldata, entry->sqllen);
|
168
161
|
break;
|
169
162
|
|
170
163
|
case SQL_TYPE_TIME: /* Type: TIME */
|
@@ -172,32 +165,25 @@ VALUE toValue(XSQLVAR *entry,
|
|
172
165
|
datetime.tm_year = 70;
|
173
166
|
datetime.tm_mon = 0;
|
174
167
|
datetime.tm_mday = 1;
|
175
|
-
|
176
|
-
rb_ary_push(value, getColumnType(entry));
|
168
|
+
value = createSafeTime(&datetime);
|
177
169
|
break;
|
178
170
|
|
179
171
|
case SQL_TIMESTAMP: /* Type: TIMESTAMP */
|
180
172
|
isc_decode_timestamp((ISC_TIMESTAMP *)entry->sqldata, &datetime);
|
181
|
-
|
182
|
-
rb_ary_push(value, getColumnType(entry));
|
173
|
+
value = createSafeTime(&datetime);
|
183
174
|
break;
|
184
175
|
|
185
176
|
case SQL_VARYING:
|
186
177
|
memcpy(&length, entry->sqldata, 2);
|
187
|
-
|
188
|
-
rb_ary_push(value, getColumnType(entry));
|
178
|
+
value = rfbstr(connection, entry->sqlsubtype, &entry->sqldata[2], length);
|
189
179
|
break;
|
190
|
-
|
191
|
-
default:
|
192
|
-
rb_ary_push(value, Qnil);
|
193
|
-
rb_ary_push(value, Qnil);
|
194
180
|
} /* End of switch. */
|
195
|
-
} else {
|
196
|
-
rb_ary_push(value, Qnil);
|
197
|
-
rb_ary_push(value, getColumnType(entry));
|
198
181
|
}
|
199
182
|
|
200
|
-
|
183
|
+
column = rb_funcall(rb_cObject, NEW_ID, 0);
|
184
|
+
rb_ivar_set(column, AT_COLUMN_ID, metadata);
|
185
|
+
rb_ivar_set(column, AT_VALUE_ID, value);
|
186
|
+
return(column);
|
201
187
|
}
|
202
188
|
|
203
189
|
|
@@ -211,20 +197,21 @@ VALUE toValue(XSQLVAR *entry,
|
|
211
197
|
* @return A reference to the array containing the row data from the XSQLDA.
|
212
198
|
*
|
213
199
|
*/
|
214
|
-
VALUE
|
215
|
-
VALUE array
|
216
|
-
transaction = rb_funcall(results, rb_intern("transaction"), 0),
|
217
|
-
connection = rb_funcall(results, rb_intern("connection"), 0);
|
200
|
+
VALUE toRowColumns(VALUE results) {
|
201
|
+
VALUE array, transaction, connection, columns;
|
218
202
|
XSQLVAR *entry = NULL;
|
219
203
|
StatementHandle *hStatement = NULL;
|
220
204
|
int i;
|
221
205
|
|
222
|
-
Data_Get_Struct(rb_funcall(results,
|
206
|
+
Data_Get_Struct(rb_funcall(results, STATEMENT_ID, 0), StatementHandle, hStatement);
|
207
|
+
transaction = rb_funcall(results, TRANSACTION_ID, 0);
|
208
|
+
connection = rb_funcall(results, CONNECTION_ID, 0);
|
209
|
+
array = rb_ary_new2(hStatement->output->sqln);
|
210
|
+
|
223
211
|
entry = hStatement->output->sqlvar;
|
212
|
+
columns = getResultsColumns(results);
|
224
213
|
for(i = 0; i < hStatement->output->sqln; i++, entry++) {
|
225
|
-
|
226
|
-
|
227
|
-
rb_ary_push(array, value);
|
214
|
+
rb_ary_store(array, i, toColumn(entry, rb_ary_entry(columns, i), connection, transaction));
|
228
215
|
}
|
229
216
|
|
230
217
|
return(array);
|
@@ -246,14 +233,12 @@ VALUE toArray(VALUE results) {
|
|
246
233
|
*
|
247
234
|
*/
|
248
235
|
void setParameters(XSQLDA *parameters, VALUE array, VALUE transaction, VALUE connection) {
|
249
|
-
|
250
|
-
|
251
|
-
size;
|
236
|
+
long index,
|
237
|
+
size;
|
252
238
|
XSQLVAR *parameter = NULL;
|
253
239
|
|
254
240
|
/* Check that sufficient parameters have been provided. */
|
255
|
-
|
256
|
-
size = (TYPE(value) == T_FIXNUM ? FIX2INT(value) : NUM2INT(value));
|
241
|
+
size = RARRAY_LEN(array);
|
257
242
|
parameter = parameters->sqlvar;
|
258
243
|
if(size != parameters->sqld) {
|
259
244
|
rb_raise(rb_eException,
|
@@ -266,14 +251,14 @@ void setParameters(XSQLDA *parameters, VALUE array, VALUE transaction, VALUE con
|
|
266
251
|
/* Populate the parameters from the array's contents. */
|
267
252
|
for(index = 0; index < size; index++, parameter++) {
|
268
253
|
int type = (parameter->sqltype & ~1);
|
254
|
+
VALUE value = rb_ary_entry(array, index);
|
269
255
|
|
270
|
-
value = rb_ary_entry(array, index);
|
271
256
|
/* Check for nils to indicate null values. */
|
272
257
|
if(value != Qnil) {
|
273
|
-
VALUE name = rb_funcall(value,
|
258
|
+
VALUE name = rb_funcall(value, CLASS_ID, 0);
|
274
259
|
|
275
260
|
*parameter->sqlind = 0;
|
276
|
-
name = rb_funcall(name,
|
261
|
+
name = rb_funcall(name, NAME_ID, 0);
|
277
262
|
switch(type) {
|
278
263
|
case SQL_ARRAY: /* Type: ARRAY */
|
279
264
|
/* TO BE DONE! */
|
@@ -367,7 +352,7 @@ VALUE createDate(const struct tm *date) {
|
|
367
352
|
arguments[2] = INT2FIX(date->tm_mday);
|
368
353
|
|
369
354
|
/* Create the class instance. */
|
370
|
-
result = rb_funcall2(klass,
|
355
|
+
result = rb_funcall2(klass, NEW_ID, 3, arguments);
|
371
356
|
}
|
372
357
|
|
373
358
|
|
@@ -412,7 +397,7 @@ VALUE createDateTime(VALUE dt) {
|
|
412
397
|
arguments[6] = rb_funcall(rb_funcall(klass, rb_intern("now"), 0), rb_intern("offset"), 0);
|
413
398
|
|
414
399
|
/* Create the class instance. */
|
415
|
-
result = rb_funcall2(klass,
|
400
|
+
result = rb_funcall2(klass, NEW_ID, 7, arguments);
|
416
401
|
}
|
417
402
|
|
418
403
|
return(result);
|
@@ -522,7 +507,7 @@ VALUE getModule(const char *name) {
|
|
522
507
|
VALUE module = getConstant(name, Qnil);
|
523
508
|
|
524
509
|
if(module != Qnil) {
|
525
|
-
VALUE type = rb_funcall(module,
|
510
|
+
VALUE type = rb_funcall(module, CLASS_ID, 0);
|
526
511
|
|
527
512
|
if(type != rb_cModule) {
|
528
513
|
module = Qnil;
|
@@ -545,7 +530,7 @@ VALUE getClass(const char *name) {
|
|
545
530
|
VALUE klass = getConstant(name, Qnil);
|
546
531
|
|
547
532
|
if(klass != Qnil) {
|
548
|
-
VALUE type = rb_funcall(klass,
|
533
|
+
VALUE type = rb_funcall(klass, CLASS_ID, 0);
|
549
534
|
|
550
535
|
if(type != rb_cClass) {
|
551
536
|
klass = Qnil;
|
@@ -570,7 +555,7 @@ VALUE getModuleInModule(const char *name, VALUE owner) {
|
|
570
555
|
VALUE module = getConstant(name, owner);
|
571
556
|
|
572
557
|
if(module != Qnil) {
|
573
|
-
VALUE type = rb_funcall(module,
|
558
|
+
VALUE type = rb_funcall(module, CLASS_ID, 0);
|
574
559
|
|
575
560
|
if(type != rb_cModule) {
|
576
561
|
module = Qnil;
|
@@ -595,7 +580,7 @@ VALUE getClassInModule(const char *name, VALUE owner) {
|
|
595
580
|
VALUE klass = getConstant(name, owner);
|
596
581
|
|
597
582
|
if(klass != Qnil) {
|
598
|
-
VALUE type = rb_funcall(klass,
|
583
|
+
VALUE type = rb_funcall(klass, CLASS_ID, 0);
|
599
584
|
|
600
585
|
if(type != rb_cClass) {
|
601
586
|
klass = Qnil;
|
@@ -617,7 +602,7 @@ VALUE getClassInModule(const char *name, VALUE owner) {
|
|
617
602
|
*/
|
618
603
|
VALUE toDateTime(VALUE value) {
|
619
604
|
VALUE result,
|
620
|
-
klass = rb_funcall(value,
|
605
|
+
klass = rb_funcall(value, CLASS_ID, 0),
|
621
606
|
date_time_class = getClass("DateTime");
|
622
607
|
|
623
608
|
if((klass == rb_cTime) || (klass == date_time_class)) {
|
@@ -813,7 +798,7 @@ void populateDoubleField(VALUE value, XSQLVAR *field) {
|
|
813
798
|
|
814
799
|
if(TYPE(value) != T_FLOAT) {
|
815
800
|
if(rb_obj_is_kind_of(value, rb_cNumeric) || TYPE(value) == T_STRING) {
|
816
|
-
actual = rb_funcall(value,
|
801
|
+
actual = rb_funcall(value, TO_F_ID, 0);
|
817
802
|
} else {
|
818
803
|
rb_fireruby_raise(NULL,
|
819
804
|
"Error converting input parameter to double.");
|
@@ -840,7 +825,7 @@ void populateFloatField(VALUE value, XSQLVAR *field) {
|
|
840
825
|
|
841
826
|
if(TYPE(value) != T_FLOAT) {
|
842
827
|
if(rb_obj_is_kind_of(value, rb_cNumeric) || TYPE(value) == T_STRING) {
|
843
|
-
actual = rb_funcall(value,
|
828
|
+
actual = rb_funcall(value, TO_F_ID, 0);
|
844
829
|
} else {
|
845
830
|
rb_fireruby_raise(NULL,
|
846
831
|
"Error converting input parameter to double.");
|
@@ -981,3 +966,18 @@ void populateTimestampField(VALUE value, XSQLVAR *field) {
|
|
981
966
|
isc_encode_timestamp(&datetime, (ISC_TIMESTAMP *)field->sqldata);
|
982
967
|
field->sqltype = SQL_TIMESTAMP;
|
983
968
|
}
|
969
|
+
|
970
|
+
void Init_TypeMap() {
|
971
|
+
NEW_ID = rb_intern("new");
|
972
|
+
TO_F_ID = rb_intern("to_f");
|
973
|
+
ROUND_ID = rb_intern("round");
|
974
|
+
ASTERISK_ID = rb_intern("*");
|
975
|
+
CLASS_ID = rb_intern("class");
|
976
|
+
CONNECTION_ID = rb_intern("connection");
|
977
|
+
TRANSACTION_ID = rb_intern("transaction");
|
978
|
+
STATEMENT_ID = rb_intern("statement");
|
979
|
+
NAME_ID = rb_intern("name");
|
980
|
+
AT_VALUE_ID = rb_intern("@value");
|
981
|
+
AT_TYPE_ID = rb_intern("@type");
|
982
|
+
AT_COLUMN_ID = rb_intern("@column");
|
983
|
+
}
|
data/ext/TypeMap.h
CHANGED
data/lib/rubyfb_lib.so
CHANGED
Binary file
|
data/rubyfb.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "rubyfb"
|
5
|
-
s.version = "0.6.
|
5
|
+
s.version = "0.6.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["George Georgiev"]
|
9
|
-
s.date = "2012-
|
9
|
+
s.date = "2012-03-23"
|
10
10
|
s.description = "Firebird SQL access library"
|
11
11
|
s.email = "georgiev@heatbs.com"
|
12
12
|
s.extensions = ["ext/extconf.rb"]
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rubyfb", "--main", "README"]
|
17
17
|
s.require_paths = ["lib", "ext"]
|
18
18
|
s.rubyforge_project = "rubyfb"
|
19
|
-
s.rubygems_version = "1.8.
|
19
|
+
s.rubygems_version = "1.8.20"
|
20
20
|
s.summary = "Firebird SQL access library"
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
data/test/KeyTest.rb
CHANGED
@@ -122,10 +122,10 @@ class KeyTest < Test::Unit::TestCase
|
|
122
122
|
assert(array.include?(['COL03', 3]))
|
123
123
|
|
124
124
|
hash = data.to_hash
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
assert_equal(3, hash.length)
|
126
|
+
assert_equal(1, hash['COL01'])
|
127
|
+
assert_equal('Two', hash['COL02'])
|
128
|
+
assert_equal(3, hash['COL03'])
|
129
129
|
|
130
130
|
array = data.values_at('COL10', 'COL02', 'COL03')
|
131
131
|
assert(array.size == 3)
|
data/test/RowTest.rb
CHANGED
@@ -20,20 +20,6 @@ class RowTest < Test::Unit::TestCase
|
|
20
20
|
@connection = database.connect(DB_USER_NAME, DB_PASSWORD)
|
21
21
|
@transaction = @connection.start_transaction
|
22
22
|
@results = @connection.execute('SELECT * FROM RDB$FIELDS', @transaction)
|
23
|
-
@empty = [[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
24
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
25
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
26
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
27
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
28
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
29
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
30
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
31
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
32
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
33
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
34
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
35
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
36
|
-
[0, SQLType::INTEGER], [0, SQLType::INTEGER]]
|
37
23
|
|
38
24
|
@connection.start_transaction do |tx|
|
39
25
|
tx.execute('create table rowtest (COL01 integer, COL02 varchar(10), '\
|
@@ -68,17 +54,6 @@ class RowTest < Test::Unit::TestCase
|
|
68
54
|
puts "#{self.class.name} finished." if TEST_LOGGING
|
69
55
|
end
|
70
56
|
|
71
|
-
def test01
|
72
|
-
row = Row.new(@results, @empty, 100)
|
73
|
-
|
74
|
-
assert(row.column_count == 28)
|
75
|
-
assert(row.number == 100)
|
76
|
-
assert(row.column_name(0) == 'RDB$FIELD_NAME')
|
77
|
-
assert(row.column_alias(10) == 'RDB$FIELD_TYPE')
|
78
|
-
assert(row[0] == 0)
|
79
|
-
assert(row['RDB$FIELD_TYPE'] == 0)
|
80
|
-
end
|
81
|
-
|
82
57
|
def test02
|
83
58
|
sql = 'select COL01 one, COL02 two, COL03 three from rowtest'
|
84
59
|
rows = @connection.execute_immediate(sql)
|
@@ -86,7 +61,7 @@ class RowTest < Test::Unit::TestCase
|
|
86
61
|
|
87
62
|
count = 0
|
88
63
|
data.each do |name, value|
|
89
|
-
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
64
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name), name)
|
90
65
|
assert([1, 'Two', 3].include?(value))
|
91
66
|
count += 1
|
92
67
|
end
|
@@ -181,7 +156,7 @@ class RowTest < Test::Unit::TestCase
|
|
181
156
|
results = @connection.execute_immediate('select * from all_types')
|
182
157
|
row = results.fetch
|
183
158
|
|
184
|
-
|
159
|
+
assert_equal(SQLType::BIGINT, row.get_base_type(0))
|
185
160
|
assert(row.get_base_type(1) == SQLType::BLOB)
|
186
161
|
assert(row.get_base_type(2) == SQLType::CHAR)
|
187
162
|
assert(row.get_base_type(3) == SQLType::DATE)
|
@@ -214,4 +189,22 @@ class RowTest < Test::Unit::TestCase
|
|
214
189
|
ensure
|
215
190
|
results.close if results
|
216
191
|
end
|
192
|
+
|
193
|
+
def test05
|
194
|
+
@connection.start_transaction do |tx|
|
195
|
+
tx.execute('create table rowtest2 (COL01 varchar(5000), COL02 varchar(5000), '\
|
196
|
+
'COL03 integer)')
|
197
|
+
end
|
198
|
+
1000.times do |i|
|
199
|
+
begin
|
200
|
+
st = @connection.create_statement("insert into rowtest2 values (?, ?, ?)")
|
201
|
+
st.exec(['a'*5000, 'b'*5000, i])
|
202
|
+
ensure
|
203
|
+
st.close
|
204
|
+
end
|
205
|
+
end
|
206
|
+
@connection.execute_immediate("select * from rowtest2") do |row|
|
207
|
+
puts "#{row}\n"
|
208
|
+
end
|
209
|
+
end
|
217
210
|
end
|