do_oracle 0.10.10-x86-mswin32-60 → 0.10.11-x86-mswin32-60
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.
- data/ChangeLog.markdown +4 -0
- data/ext/do_oracle/do_oracle.c +208 -208
- data/lib/do_oracle/1.8/do_oracle.so +0 -0
- data/lib/do_oracle/1.9/do_oracle.so +0 -0
- data/lib/do_oracle/version.rb +1 -1
- data/tasks/compile.rake +1 -1
- metadata +5 -5
data/ChangeLog.markdown
CHANGED
data/ext/do_oracle/do_oracle.c
CHANGED
@@ -10,12 +10,12 @@
|
|
10
10
|
#include <ctype.h>
|
11
11
|
#include <time.h>
|
12
12
|
|
13
|
-
#define
|
13
|
+
#define DO_ID_CONST_GET rb_intern("const_get")
|
14
14
|
|
15
15
|
#define RUBY_STRING(char_ptr) rb_str_new2(char_ptr)
|
16
16
|
#define TAINTED_STRING(name, length) rb_tainted_str_new(name, length)
|
17
|
-
#define CONST_GET(scope, constant) (rb_funcall(scope,
|
18
|
-
#define ORACLE_CLASS(klass, parent) (rb_define_class_under(
|
17
|
+
#define CONST_GET(scope, constant) (rb_funcall(scope, DO_ID_CONST_GET, 1, rb_str_new2(constant)))
|
18
|
+
#define ORACLE_CLASS(klass, parent) (rb_define_class_under(mDO_Oracle, klass, parent))
|
19
19
|
#define DEBUG(value) data_objects_debug(value)
|
20
20
|
#define RUBY_CLASS(name) rb_const_get(rb_cObject, rb_intern(name))
|
21
21
|
|
@@ -33,56 +33,56 @@
|
|
33
33
|
|
34
34
|
|
35
35
|
// To store rb_intern values
|
36
|
-
static ID
|
37
|
-
static ID
|
38
|
-
static ID
|
39
|
-
static ID
|
40
|
-
static ID
|
41
|
-
static ID
|
42
|
-
static ID
|
43
|
-
|
44
|
-
static ID
|
45
|
-
|
46
|
-
static ID
|
47
|
-
static ID
|
48
|
-
static ID
|
49
|
-
static ID
|
50
|
-
static ID
|
51
|
-
static ID
|
52
|
-
static ID
|
53
|
-
static ID
|
54
|
-
static ID
|
55
|
-
static ID
|
56
|
-
static ID
|
57
|
-
static ID
|
58
|
-
static ID
|
59
|
-
static ID
|
60
|
-
static ID
|
61
|
-
|
62
|
-
static ID
|
63
|
-
static ID
|
64
|
-
static ID
|
65
|
-
static ID
|
66
|
-
|
67
|
-
static ID
|
68
|
-
static ID
|
69
|
-
|
70
|
-
static ID
|
71
|
-
static ID
|
72
|
-
static ID
|
73
|
-
static ID
|
74
|
-
static ID
|
75
|
-
|
76
|
-
static ID
|
77
|
-
static ID
|
78
|
-
static ID
|
79
|
-
static ID
|
80
|
-
static ID
|
81
|
-
static ID
|
82
|
-
static ID
|
83
|
-
|
84
|
-
static ID
|
85
|
-
static ID
|
36
|
+
static ID DO_ID_NEW;
|
37
|
+
static ID DO_ID_LOGGER;
|
38
|
+
static ID DO_ID_DEBUG;
|
39
|
+
static ID DO_ID_LEVEL;
|
40
|
+
static ID DO_ID_LOG;
|
41
|
+
static ID DO_ID_TO_S;
|
42
|
+
static ID DO_ID_RATIONAL;
|
43
|
+
|
44
|
+
static ID DO_ID_NAME;
|
45
|
+
|
46
|
+
static ID DO_ID_NUMBER;
|
47
|
+
static ID DO_ID_VARCHAR2;
|
48
|
+
static ID DO_ID_CHAR;
|
49
|
+
static ID DO_ID_DATE;
|
50
|
+
static ID DO_ID_TIMESTAMP;
|
51
|
+
static ID DO_ID_TIMESTAMP_TZ;
|
52
|
+
static ID DO_ID_TIMESTAMP_LTZ;
|
53
|
+
static ID DO_ID_CLOB;
|
54
|
+
static ID DO_ID_BLOB;
|
55
|
+
static ID DO_ID_LONG;
|
56
|
+
static ID DO_ID_RAW;
|
57
|
+
static ID DO_ID_LONG_RAW;
|
58
|
+
static ID DO_ID_BFILE;
|
59
|
+
static ID DO_ID_BINARY_FLOAT;
|
60
|
+
static ID DO_ID_BINARY_DOUBLE;
|
61
|
+
|
62
|
+
static ID DO_ID_TO_A;
|
63
|
+
static ID DO_ID_TO_I;
|
64
|
+
static ID DO_ID_TO_S;
|
65
|
+
static ID DO_ID_TO_F;
|
66
|
+
|
67
|
+
static ID DO_ID_UTC_OFFSET;
|
68
|
+
static ID DO_ID_FULL_CONST_GET;
|
69
|
+
|
70
|
+
static ID DO_ID_PARSE;
|
71
|
+
static ID DO_ID_FETCH;
|
72
|
+
static ID DO_ID_TYPE;
|
73
|
+
static ID DO_ID_EXECUTE;
|
74
|
+
static ID DO_ID_EXEC;
|
75
|
+
|
76
|
+
static ID DO_ID_SELECT_STMT;
|
77
|
+
static ID DO_ID_COLUMN_METADATA;
|
78
|
+
static ID DO_ID_PRECISION;
|
79
|
+
static ID DO_ID_SCALE;
|
80
|
+
static ID DO_ID_BIND_PARAM;
|
81
|
+
static ID DO_ID_ELEM;
|
82
|
+
static ID DO_ID_READ;
|
83
|
+
|
84
|
+
static ID DO_ID_CLOSE;
|
85
|
+
static ID DO_ID_LOGOFF;
|
86
86
|
|
87
87
|
static VALUE mExtlib;
|
88
88
|
static VALUE mDO;
|
@@ -104,16 +104,16 @@ static VALUE cOCI8_Cursor;
|
|
104
104
|
static VALUE cOCI8_BLOB;
|
105
105
|
static VALUE cOCI8_CLOB;
|
106
106
|
|
107
|
-
static VALUE
|
108
|
-
static VALUE
|
109
|
-
static VALUE
|
110
|
-
static VALUE
|
111
|
-
static VALUE
|
107
|
+
static VALUE mDO_Oracle;
|
108
|
+
static VALUE cDO_OracleConnection;
|
109
|
+
static VALUE cDO_OracleCommand;
|
110
|
+
static VALUE cDO_OracleResult;
|
111
|
+
static VALUE cDO_OracleReader;
|
112
112
|
|
113
113
|
static VALUE eArgumentError;
|
114
|
-
static VALUE
|
115
|
-
static VALUE
|
116
|
-
static VALUE
|
114
|
+
static VALUE eDO_SQLError;
|
115
|
+
static VALUE eDO_ConnectionError;
|
116
|
+
static VALUE eDO_DataError;
|
117
117
|
|
118
118
|
static void data_objects_debug(VALUE connection, VALUE string, struct timeval* start) {
|
119
119
|
struct timeval stop;
|
@@ -122,9 +122,9 @@ static void data_objects_debug(VALUE connection, VALUE string, struct timeval* s
|
|
122
122
|
gettimeofday(&stop, NULL);
|
123
123
|
do_int64 duration = (stop.tv_sec - start->tv_sec) * 1000000 + stop.tv_usec - start->tv_usec;
|
124
124
|
|
125
|
-
message = rb_funcall(cDO_Logger_Message,
|
125
|
+
message = rb_funcall(cDO_Logger_Message, DO_ID_NEW, 3, string, rb_time_new(start->tv_sec, start->tv_usec), INT2NUM(duration));
|
126
126
|
|
127
|
-
rb_funcall(connection,
|
127
|
+
rb_funcall(connection, DO_ID_LOG, 1, message);
|
128
128
|
}
|
129
129
|
|
130
130
|
|
@@ -155,10 +155,10 @@ static VALUE parse_date(VALUE r_value) {
|
|
155
155
|
year = NUM2INT(rb_funcall(r_value, rb_intern("year"), 0));
|
156
156
|
month = NUM2INT(rb_funcall(r_value, rb_intern("month"), 0));
|
157
157
|
day = NUM2INT(rb_funcall(r_value, rb_intern("day"), 0));
|
158
|
-
return rb_funcall(rb_cDate,
|
158
|
+
return rb_funcall(rb_cDate, DO_ID_NEW, 3, INT2NUM(year), INT2NUM(month), INT2NUM(day));
|
159
159
|
} else {
|
160
160
|
// Something went terribly wrong
|
161
|
-
rb_raise(
|
161
|
+
rb_raise(eDO_DataError, "Couldn't parse date from class %s object", rb_obj_classname(r_value));
|
162
162
|
}
|
163
163
|
}
|
164
164
|
|
@@ -178,7 +178,7 @@ static VALUE parse_date_time(VALUE r_value) {
|
|
178
178
|
if (rb_obj_class(r_value) == rb_cDateTime) {
|
179
179
|
return r_value;
|
180
180
|
} else if (rb_obj_class(r_value) == rb_cTime) {
|
181
|
-
time_array = rb_funcall(r_value,
|
181
|
+
time_array = rb_funcall(r_value, DO_ID_TO_A, 0);
|
182
182
|
year = NUM2INT(rb_ary_entry(time_array, 5));
|
183
183
|
month = NUM2INT(rb_ary_entry(time_array, 4));
|
184
184
|
day = NUM2INT(rb_ary_entry(time_array, 3));
|
@@ -186,13 +186,13 @@ static VALUE parse_date_time(VALUE r_value) {
|
|
186
186
|
min = NUM2INT(rb_ary_entry(time_array, 1));
|
187
187
|
sec = NUM2INT(rb_ary_entry(time_array, 0));
|
188
188
|
|
189
|
-
gmt_offset = NUM2INT(rb_funcall(r_value,
|
189
|
+
gmt_offset = NUM2INT(rb_funcall(r_value, DO_ID_UTC_OFFSET, 0 ));
|
190
190
|
|
191
|
-
return rb_funcall(rb_cDateTime,
|
191
|
+
return rb_funcall(rb_cDateTime, DO_ID_NEW, 7, INT2NUM(year), INT2NUM(month), INT2NUM(day),
|
192
192
|
INT2NUM(hour), INT2NUM(min), INT2NUM(sec), INT2NUM(gmt_offset));
|
193
193
|
} else {
|
194
194
|
// Something went terribly wrong
|
195
|
-
rb_raise(
|
195
|
+
rb_raise(eDO_DataError, "Couldn't parse datetime from class %s object", rb_obj_classname(r_value));
|
196
196
|
}
|
197
197
|
|
198
198
|
}
|
@@ -202,7 +202,7 @@ static VALUE parse_time(VALUE r_value) {
|
|
202
202
|
return r_value;
|
203
203
|
} else {
|
204
204
|
// Something went terribly wrong
|
205
|
-
rb_raise(
|
205
|
+
rb_raise(eDO_DataError, "Couldn't parse time from class %s object", rb_obj_classname(r_value));
|
206
206
|
}
|
207
207
|
}
|
208
208
|
|
@@ -214,7 +214,7 @@ static VALUE parse_boolean(VALUE r_value) {
|
|
214
214
|
return value == 'Y' || value == 'y' || value == 'T' || value == 't' ? Qtrue : Qfalse;
|
215
215
|
} else {
|
216
216
|
// Something went terribly wrong
|
217
|
-
rb_raise(
|
217
|
+
rb_raise(eDO_DataError, "Couldn't parse boolean from class %s object", rb_obj_classname(r_value));
|
218
218
|
}
|
219
219
|
}
|
220
220
|
|
@@ -223,22 +223,22 @@ static VALUE parse_boolean(VALUE r_value) {
|
|
223
223
|
static VALUE infer_ruby_type(VALUE type, VALUE precision, VALUE scale) {
|
224
224
|
ID type_id = SYM2ID(type);
|
225
225
|
|
226
|
-
if (type_id ==
|
226
|
+
if (type_id == DO_ID_NUMBER)
|
227
227
|
return scale != Qnil && NUM2INT(scale) == 0 ?
|
228
228
|
(NUM2INT(precision) == 1 ? rb_cTrueClass : rb_cInteger) : rb_cBigDecimal;
|
229
|
-
else if (type_id ==
|
229
|
+
else if (type_id == DO_ID_VARCHAR2 || type_id == DO_ID_CHAR || type_id == DO_ID_CLOB || type_id == DO_ID_LONG)
|
230
230
|
return rb_cString;
|
231
|
-
else if (type_id ==
|
231
|
+
else if (type_id == DO_ID_DATE)
|
232
232
|
// return rb_cDateTime;
|
233
233
|
// by default map DATE type to Time class as it is much faster than DateTime class
|
234
234
|
return rb_cTime;
|
235
|
-
else if (type_id ==
|
235
|
+
else if (type_id == DO_ID_TIMESTAMP || type_id == DO_ID_TIMESTAMP_TZ || type_id == DO_ID_TIMESTAMP_LTZ)
|
236
236
|
// return rb_cDateTime;
|
237
237
|
// by default map TIMESTAMP type to Time class as it is much faster than DateTime class
|
238
238
|
return rb_cTime;
|
239
|
-
else if (type_id ==
|
239
|
+
else if (type_id == DO_ID_BLOB || type_id == DO_ID_RAW || type_id == DO_ID_LONG_RAW || type_id == DO_ID_BFILE)
|
240
240
|
return rb_cByteArray;
|
241
|
-
else if (type_id ==
|
241
|
+
else if (type_id == DO_ID_BINARY_FLOAT || type_id == DO_ID_BINARY_DOUBLE)
|
242
242
|
return rb_cFloat;
|
243
243
|
else
|
244
244
|
return rb_cString;
|
@@ -248,22 +248,22 @@ static VALUE typecast(VALUE r_value, const VALUE type) {
|
|
248
248
|
VALUE r_data;
|
249
249
|
|
250
250
|
if (type == rb_cInteger) {
|
251
|
-
return TYPE(r_value) == T_FIXNUM || TYPE(r_value) == T_BIGNUM ? r_value : rb_funcall(r_value,
|
251
|
+
return TYPE(r_value) == T_FIXNUM || TYPE(r_value) == T_BIGNUM ? r_value : rb_funcall(r_value, DO_ID_TO_I, 0);
|
252
252
|
|
253
253
|
} else if (type == rb_cString) {
|
254
254
|
if (TYPE(r_value) == T_STRING)
|
255
255
|
return r_value;
|
256
256
|
else if (rb_obj_class(r_value) == cOCI8_CLOB)
|
257
|
-
return rb_funcall(r_value,
|
257
|
+
return rb_funcall(r_value, DO_ID_READ, 0);
|
258
258
|
else
|
259
|
-
return rb_funcall(r_value,
|
259
|
+
return rb_funcall(r_value, DO_ID_TO_S, 0);
|
260
260
|
|
261
261
|
} else if (type == rb_cFloat) {
|
262
|
-
return TYPE(r_value) == T_FLOAT ? r_value : rb_funcall(r_value,
|
262
|
+
return TYPE(r_value) == T_FLOAT ? r_value : rb_funcall(r_value, DO_ID_TO_F, 0);
|
263
263
|
|
264
264
|
} else if (type == rb_cBigDecimal) {
|
265
|
-
VALUE r_string = TYPE(r_value) == T_STRING ? r_value : rb_funcall(r_value,
|
266
|
-
return rb_funcall(rb_cBigDecimal,
|
265
|
+
VALUE r_string = TYPE(r_value) == T_STRING ? r_value : rb_funcall(r_value, DO_ID_TO_S, 0);
|
266
|
+
return rb_funcall(rb_cBigDecimal, DO_ID_NEW, 1, r_string);
|
267
267
|
|
268
268
|
} else if (type == rb_cDate) {
|
269
269
|
return parse_date(r_value);
|
@@ -279,20 +279,20 @@ static VALUE typecast(VALUE r_value, const VALUE type) {
|
|
279
279
|
|
280
280
|
} else if (type == rb_cByteArray) {
|
281
281
|
if (rb_obj_class(r_value) == cOCI8_BLOB)
|
282
|
-
r_data = rb_funcall(r_value,
|
282
|
+
r_data = rb_funcall(r_value, DO_ID_READ, 0);
|
283
283
|
else
|
284
284
|
r_data = r_value;
|
285
|
-
return rb_funcall(rb_cByteArray,
|
285
|
+
return rb_funcall(rb_cByteArray, DO_ID_NEW, 1, r_data);
|
286
286
|
|
287
287
|
} else if (type == rb_cClass) {
|
288
|
-
return rb_funcall(mDO,
|
288
|
+
return rb_funcall(mDO, DO_ID_FULL_CONST_GET, 1, r_value);
|
289
289
|
|
290
290
|
} else if (type == rb_cNilClass) {
|
291
291
|
return Qnil;
|
292
292
|
|
293
293
|
} else {
|
294
294
|
if (rb_obj_class(r_value) == cOCI8_CLOB)
|
295
|
-
return rb_funcall(r_value,
|
295
|
+
return rb_funcall(r_value, DO_ID_READ, 0);
|
296
296
|
else
|
297
297
|
return r_value;
|
298
298
|
}
|
@@ -308,36 +308,36 @@ static VALUE typecast_bind_value(VALUE connection, VALUE r_value) {
|
|
308
308
|
return RUBY_STRING("");
|
309
309
|
else if (r_class == rb_cString)
|
310
310
|
// if string is longer than 4000 characters then convert to CLOB
|
311
|
-
return RSTRING_LEN(r_value) <= 4000 ? r_value : rb_funcall(cOCI8_CLOB,
|
311
|
+
return RSTRING_LEN(r_value) <= 4000 ? r_value : rb_funcall(cOCI8_CLOB, DO_ID_NEW, 2, oci8_conn, r_value);
|
312
312
|
else if (r_class == rb_cBigDecimal)
|
313
|
-
return rb_funcall(r_value,
|
313
|
+
return rb_funcall(r_value, DO_ID_TO_S, 1, RUBY_STRING("F"));
|
314
314
|
else if (r_class == rb_cTrueClass)
|
315
315
|
return INT2NUM(1);
|
316
316
|
else if (r_class == rb_cFalseClass)
|
317
317
|
return INT2NUM(0);
|
318
318
|
else if (r_class == rb_cByteArray)
|
319
|
-
return rb_funcall(cOCI8_BLOB,
|
319
|
+
return rb_funcall(cOCI8_BLOB, DO_ID_NEW, 2, oci8_conn, r_value);
|
320
320
|
else if (r_class == rb_cClass)
|
321
|
-
return rb_funcall(r_value,
|
321
|
+
return rb_funcall(r_value, DO_ID_TO_S, 0);
|
322
322
|
else
|
323
323
|
return r_value;
|
324
324
|
}
|
325
325
|
|
326
326
|
/* ====== Public API ======= */
|
327
|
-
static VALUE
|
327
|
+
static VALUE cDO_OracleConnection_dispose(VALUE self) {
|
328
328
|
VALUE oci8_conn = rb_iv_get(self, "@connection");
|
329
329
|
|
330
330
|
if (Qnil == oci8_conn)
|
331
331
|
return Qfalse;
|
332
332
|
|
333
|
-
rb_funcall(oci8_conn,
|
333
|
+
rb_funcall(oci8_conn, DO_ID_LOGOFF, 0);
|
334
334
|
|
335
335
|
rb_iv_set(self, "@connection", Qnil);
|
336
336
|
|
337
337
|
return Qtrue;
|
338
338
|
}
|
339
339
|
|
340
|
-
static VALUE
|
340
|
+
static VALUE cDO_OracleCommand_set_types(int argc, VALUE *argv, VALUE self) {
|
341
341
|
VALUE type_strings = rb_ary_new();
|
342
342
|
VALUE array = rb_ary_new();
|
343
343
|
|
@@ -378,48 +378,48 @@ typedef struct {
|
|
378
378
|
VALUE args;
|
379
379
|
VALUE sql;
|
380
380
|
struct timeval start;
|
381
|
-
}
|
381
|
+
} cDO_OracleCommand_execute_try_t;
|
382
382
|
|
383
|
-
static VALUE
|
384
|
-
static VALUE
|
383
|
+
static VALUE cDO_OracleCommand_execute_try(cDO_OracleCommand_execute_try_t *arg);
|
384
|
+
static VALUE cDO_OracleCommand_execute_ensure(cDO_OracleCommand_execute_try_t *arg);
|
385
385
|
|
386
386
|
// called by Command#execute that is written in Ruby
|
387
|
-
static VALUE
|
388
|
-
|
387
|
+
static VALUE cDO_OracleCommand_execute_internal(VALUE self, VALUE connection, VALUE sql, VALUE args) {
|
388
|
+
cDO_OracleCommand_execute_try_t arg;
|
389
389
|
arg.self = self;
|
390
390
|
arg.connection = connection;
|
391
391
|
arg.sql = sql;
|
392
392
|
// store start time before SQL parsing
|
393
393
|
VALUE oci8_conn = rb_iv_get(connection, "@connection");
|
394
394
|
if (Qnil == oci8_conn) {
|
395
|
-
rb_raise(
|
395
|
+
rb_raise(eDO_ConnectionError, "This connection has already been closed.");
|
396
396
|
}
|
397
397
|
gettimeofday(&arg.start, NULL);
|
398
|
-
arg.cursor = rb_funcall(oci8_conn,
|
399
|
-
arg.statement_type = rb_funcall(arg.cursor,
|
398
|
+
arg.cursor = rb_funcall(oci8_conn, DO_ID_PARSE, 1, sql);
|
399
|
+
arg.statement_type = rb_funcall(arg.cursor, DO_ID_TYPE, 0);
|
400
400
|
arg.args = args;
|
401
401
|
|
402
|
-
return rb_ensure(
|
402
|
+
return rb_ensure(cDO_OracleCommand_execute_try, (VALUE)&arg, cDO_OracleCommand_execute_ensure, (VALUE)&arg);
|
403
403
|
}
|
404
404
|
|
405
405
|
// wrapper for simple SQL calls without arguments
|
406
406
|
static VALUE execute_sql(VALUE connection, VALUE sql) {
|
407
|
-
return
|
407
|
+
return cDO_OracleCommand_execute_internal(Qnil, connection, sql, Qnil);
|
408
408
|
}
|
409
409
|
|
410
|
-
static VALUE
|
410
|
+
static VALUE cDO_OracleCommand_execute_try(cDO_OracleCommand_execute_try_t *arg) {
|
411
411
|
VALUE result = Qnil;
|
412
412
|
int insert_id_present;
|
413
413
|
|
414
414
|
// no arguments given
|
415
415
|
if NIL_P(arg->args) {
|
416
|
-
result = rb_funcall(arg->cursor,
|
416
|
+
result = rb_funcall(arg->cursor, DO_ID_EXEC, 0);
|
417
417
|
// arguments given - need to typecast
|
418
418
|
} else {
|
419
419
|
insert_id_present = (!NIL_P(arg->self) && rb_iv_get(arg->self, "@insert_id_present") == Qtrue);
|
420
420
|
|
421
421
|
if (insert_id_present)
|
422
|
-
rb_funcall(arg->cursor,
|
422
|
+
rb_funcall(arg->cursor, DO_ID_BIND_PARAM, 2, RUBY_STRING(":insert_id"), INT2NUM(0));
|
423
423
|
|
424
424
|
int i;
|
425
425
|
VALUE r_orig_value, r_new_value;
|
@@ -430,15 +430,15 @@ static VALUE cCommand_execute_try(cCommand_execute_try_t *arg) {
|
|
430
430
|
rb_ary_store(arg->args, i, r_new_value);
|
431
431
|
}
|
432
432
|
|
433
|
-
result = rb_apply(arg->cursor,
|
433
|
+
result = rb_apply(arg->cursor, DO_ID_EXEC, arg->args);
|
434
434
|
|
435
435
|
if (insert_id_present) {
|
436
|
-
VALUE insert_id = rb_funcall(arg->cursor,
|
436
|
+
VALUE insert_id = rb_funcall(arg->cursor, DO_ID_ELEM, 1, RUBY_STRING(":insert_id"));
|
437
437
|
rb_iv_set(arg->self, "@insert_id", insert_id);
|
438
438
|
}
|
439
439
|
}
|
440
440
|
|
441
|
-
if (SYM2ID(arg->statement_type) ==
|
441
|
+
if (SYM2ID(arg->statement_type) == DO_ID_SELECT_STMT)
|
442
442
|
return arg->cursor;
|
443
443
|
else {
|
444
444
|
return result;
|
@@ -446,15 +446,15 @@ static VALUE cCommand_execute_try(cCommand_execute_try_t *arg) {
|
|
446
446
|
|
447
447
|
}
|
448
448
|
|
449
|
-
static VALUE
|
450
|
-
if (SYM2ID(arg->statement_type) !=
|
451
|
-
rb_funcall(arg->cursor,
|
449
|
+
static VALUE cDO_OracleCommand_execute_ensure(cDO_OracleCommand_execute_try_t *arg) {
|
450
|
+
if (SYM2ID(arg->statement_type) != DO_ID_SELECT_STMT)
|
451
|
+
rb_funcall(arg->cursor, DO_ID_CLOSE, 0);
|
452
452
|
// Log SQL and execution time
|
453
453
|
data_objects_debug(arg->connection, arg->sql, &(arg->start));
|
454
454
|
return Qnil;
|
455
455
|
}
|
456
456
|
|
457
|
-
static VALUE
|
457
|
+
static VALUE cDO_OracleConnection_initialize(VALUE self, VALUE uri) {
|
458
458
|
VALUE r_host, r_port, r_path, r_user, r_password;
|
459
459
|
VALUE r_query, r_time_zone;
|
460
460
|
char *non_blocking = NULL;
|
@@ -476,7 +476,7 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
476
476
|
|
477
477
|
r_port = rb_funcall(uri, rb_intern("port"), 0);
|
478
478
|
if ( Qnil != r_port ) {
|
479
|
-
r_port = rb_funcall(r_port,
|
479
|
+
r_port = rb_funcall(r_port, DO_ID_TO_S, 0);
|
480
480
|
port = StringValuePtr(r_port);
|
481
481
|
}
|
482
482
|
|
@@ -496,11 +496,11 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
496
496
|
connect_string = (char *)calloc(connect_string_length, sizeof(char));
|
497
497
|
snprintf(connect_string, connect_string_length, "//%s:%s%s", host, port, path);
|
498
498
|
} else {
|
499
|
-
rb_raise(
|
499
|
+
rb_raise(eDO_ConnectionError, "Database must be specified");
|
500
500
|
}
|
501
501
|
|
502
|
-
// oci8_conn = rb_funcall(cOCI8,
|
503
|
-
oci8_conn = rb_funcall(
|
502
|
+
// oci8_conn = rb_funcall(cOCI8, DO_ID_NEW, 3, r_user, r_password, RUBY_STRING(connect_string));
|
503
|
+
oci8_conn = rb_funcall(cDO_OracleConnection, rb_intern("oci8_new"), 3, r_user, r_password, RUBY_STRING(connect_string));
|
504
504
|
|
505
505
|
// Pull the querystring off the URI
|
506
506
|
r_query = rb_funcall(uri, rb_intern("query"), 0);
|
@@ -523,7 +523,7 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
523
523
|
|
524
524
|
// if no option specified then look in ENV['TZ']
|
525
525
|
if (time_zone == NULL) {
|
526
|
-
r_time_zone = rb_funcall(
|
526
|
+
r_time_zone = rb_funcall(cDO_OracleConnection, rb_intern("ruby_time_zone"), 0);
|
527
527
|
if (!NIL_P(r_time_zone))
|
528
528
|
time_zone = StringValuePtr(r_time_zone);
|
529
529
|
}
|
@@ -539,17 +539,17 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
539
539
|
return Qtrue;
|
540
540
|
}
|
541
541
|
|
542
|
-
static VALUE
|
543
|
-
VALUE affected_rows = rb_funcall2(self,
|
542
|
+
static VALUE cDO_OracleCommand_execute_non_query(int argc, VALUE *argv[], VALUE self) {
|
543
|
+
VALUE affected_rows = rb_funcall2(self, DO_ID_EXECUTE, argc, (VALUE *)argv);
|
544
544
|
if (affected_rows == Qtrue)
|
545
545
|
affected_rows = INT2NUM(0);
|
546
546
|
|
547
547
|
VALUE insert_id = rb_iv_get(self, "@insert_id");
|
548
548
|
|
549
|
-
return rb_funcall(
|
549
|
+
return rb_funcall(cDO_OracleResult, DO_ID_NEW, 3, self, affected_rows, insert_id);
|
550
550
|
}
|
551
551
|
|
552
|
-
static VALUE
|
552
|
+
static VALUE cDO_OracleCommand_execute_reader(int argc, VALUE *argv[], VALUE self) {
|
553
553
|
VALUE reader, query;
|
554
554
|
VALUE field_names, field_types;
|
555
555
|
VALUE column_metadata, column, column_name;
|
@@ -558,22 +558,22 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv[], VALUE self) {
|
|
558
558
|
int field_count;
|
559
559
|
int infer_types = 0;
|
560
560
|
|
561
|
-
VALUE cursor = rb_funcall2(self,
|
561
|
+
VALUE cursor = rb_funcall2(self, DO_ID_EXECUTE, argc, (VALUE *)argv);
|
562
562
|
|
563
563
|
if (rb_obj_class(cursor) != cOCI8_Cursor) {
|
564
564
|
rb_raise(eArgumentError, "\"%s\" is invalid SELECT query", StringValuePtr(query));
|
565
565
|
}
|
566
566
|
|
567
|
-
column_metadata = rb_funcall(cursor,
|
567
|
+
column_metadata = rb_funcall(cursor, DO_ID_COLUMN_METADATA, 0);
|
568
568
|
field_count = RARRAY_LEN(column_metadata);
|
569
569
|
// reduce field_count by 1 if RAW_RNUM_ is present as last column
|
570
570
|
// (generated by DataMapper to simulate LIMIT and OFFSET)
|
571
571
|
column = rb_ary_entry(column_metadata, field_count-1);
|
572
|
-
column_name = rb_funcall(column,
|
572
|
+
column_name = rb_funcall(column, DO_ID_NAME, 0);
|
573
573
|
if (strncmp(RSTRING_PTR(column_name), "RAW_RNUM_", RSTRING_LEN(column_name)) == 0)
|
574
574
|
field_count--;
|
575
575
|
|
576
|
-
reader = rb_funcall(
|
576
|
+
reader = rb_funcall(cDO_OracleReader, DO_ID_NEW, 0);
|
577
577
|
rb_iv_set(reader, "@reader", cursor);
|
578
578
|
rb_iv_set(reader, "@field_count", INT2NUM(field_count));
|
579
579
|
|
@@ -586,19 +586,19 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv[], VALUE self) {
|
|
586
586
|
} else if (RARRAY_LEN(field_types) != field_count) {
|
587
587
|
// Whoops... wrong number of types passed to set_types. Close the reader and raise
|
588
588
|
// and error
|
589
|
-
rb_funcall(reader,
|
589
|
+
rb_funcall(reader, DO_ID_CLOSE, 0);
|
590
590
|
rb_raise(eArgumentError, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count);
|
591
591
|
}
|
592
592
|
|
593
593
|
for ( i = 0; i < field_count; i++ ) {
|
594
594
|
column = rb_ary_entry(column_metadata, i);
|
595
|
-
column_name = rb_funcall(column,
|
595
|
+
column_name = rb_funcall(column, DO_ID_NAME, 0);
|
596
596
|
rb_ary_push(field_names, column_name);
|
597
597
|
if ( infer_types == 1 ) {
|
598
598
|
rb_ary_push(field_types,
|
599
599
|
infer_ruby_type(rb_iv_get(column, "@data_type"),
|
600
|
-
rb_funcall(column,
|
601
|
-
rb_funcall(column,
|
600
|
+
rb_funcall(column, DO_ID_PRECISION, 0),
|
601
|
+
rb_funcall(column, DO_ID_SCALE, 0))
|
602
602
|
);
|
603
603
|
}
|
604
604
|
}
|
@@ -612,19 +612,19 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv[], VALUE self) {
|
|
612
612
|
return reader;
|
613
613
|
}
|
614
614
|
|
615
|
-
static VALUE
|
615
|
+
static VALUE cDO_OracleReader_close(VALUE self) {
|
616
616
|
VALUE cursor = rb_iv_get(self, "@reader");
|
617
617
|
|
618
618
|
if (Qnil == cursor)
|
619
619
|
return Qfalse;
|
620
620
|
|
621
|
-
rb_funcall(cursor,
|
621
|
+
rb_funcall(cursor, DO_ID_CLOSE, 0);
|
622
622
|
|
623
623
|
rb_iv_set(self, "@reader", Qnil);
|
624
624
|
return Qtrue;
|
625
625
|
}
|
626
626
|
|
627
|
-
static VALUE
|
627
|
+
static VALUE cDO_OracleReader_next(VALUE self) {
|
628
628
|
VALUE cursor = rb_iv_get(self, "@reader");
|
629
629
|
|
630
630
|
int field_count;
|
@@ -637,7 +637,7 @@ static VALUE cReader_next(VALUE self) {
|
|
637
637
|
VALUE field_types, field_type;
|
638
638
|
VALUE value;
|
639
639
|
|
640
|
-
VALUE fetch_result = rb_funcall(cursor,
|
640
|
+
VALUE fetch_result = rb_funcall(cursor, DO_ID_FETCH, 0);
|
641
641
|
|
642
642
|
if (Qnil == fetch_result) {
|
643
643
|
rb_iv_set(self, "@values", Qnil);
|
@@ -663,22 +663,22 @@ static VALUE cReader_next(VALUE self) {
|
|
663
663
|
return Qtrue;
|
664
664
|
}
|
665
665
|
|
666
|
-
static VALUE
|
666
|
+
static VALUE cDO_OracleReader_values(VALUE self) {
|
667
667
|
|
668
668
|
VALUE values = rb_iv_get(self, "@values");
|
669
669
|
if(values == Qnil) {
|
670
|
-
rb_raise(
|
670
|
+
rb_raise(eDO_DataError, "Reader not initialized");
|
671
671
|
return Qnil;
|
672
672
|
} else {
|
673
673
|
return values;
|
674
674
|
}
|
675
675
|
}
|
676
676
|
|
677
|
-
static VALUE
|
677
|
+
static VALUE cDO_OracleReader_fields(VALUE self) {
|
678
678
|
return rb_iv_get(self, "@fields");
|
679
679
|
}
|
680
680
|
|
681
|
-
static VALUE
|
681
|
+
static VALUE cDO_OracleReader_field_count(VALUE self) {
|
682
682
|
return rb_iv_get(self, "@field_count");
|
683
683
|
}
|
684
684
|
|
@@ -697,56 +697,56 @@ void Init_do_oracle() {
|
|
697
697
|
|
698
698
|
rb_funcall(rb_mKernel, rb_intern("require"), 1, rb_str_new2("data_objects"));
|
699
699
|
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
700
|
+
DO_ID_NEW = rb_intern("new");
|
701
|
+
DO_ID_LOGGER = rb_intern("logger");
|
702
|
+
DO_ID_DEBUG = rb_intern("debug");
|
703
|
+
DO_ID_LEVEL = rb_intern("level");
|
704
|
+
DO_ID_LOG = rb_intern("log");
|
705
|
+
DO_ID_TO_S = rb_intern("to_s");
|
706
|
+
DO_ID_RATIONAL = rb_intern("Rational");
|
707
|
+
|
708
|
+
DO_ID_NAME = rb_intern("name");
|
709
|
+
|
710
|
+
DO_ID_NUMBER = rb_intern("number");
|
711
|
+
DO_ID_VARCHAR2 = rb_intern("varchar2");
|
712
|
+
DO_ID_CHAR = rb_intern("char");
|
713
|
+
DO_ID_DATE = rb_intern("date");
|
714
|
+
DO_ID_TIMESTAMP = rb_intern("timestamp");
|
715
|
+
DO_ID_TIMESTAMP_TZ = rb_intern("timestamp_tz");
|
716
|
+
DO_ID_TIMESTAMP_LTZ = rb_intern("timestamp_ltz");
|
717
|
+
DO_ID_CLOB = rb_intern("clob");
|
718
|
+
DO_ID_BLOB = rb_intern("blob");
|
719
|
+
DO_ID_LONG = rb_intern("long");
|
720
|
+
DO_ID_RAW = rb_intern("raw");
|
721
|
+
DO_ID_LONG_RAW = rb_intern("long_raw");
|
722
|
+
DO_ID_BFILE = rb_intern("bfile");
|
723
|
+
DO_ID_BINARY_FLOAT = rb_intern("binary_float");
|
724
|
+
DO_ID_BINARY_DOUBLE = rb_intern("binary_double");
|
725
|
+
|
726
|
+
DO_ID_TO_A = rb_intern("to_a");
|
727
|
+
DO_ID_TO_I = rb_intern("to_i");
|
728
|
+
DO_ID_TO_S = rb_intern("to_s");
|
729
|
+
DO_ID_TO_F = rb_intern("to_f");
|
730
|
+
|
731
|
+
DO_ID_UTC_OFFSET = rb_intern("utc_offset");
|
732
|
+
DO_ID_FULL_CONST_GET = rb_intern("full_const_get");
|
733
|
+
|
734
|
+
DO_ID_PARSE = rb_intern("parse");
|
735
|
+
DO_ID_FETCH = rb_intern("fetch");
|
736
|
+
DO_ID_TYPE = rb_intern("type");
|
737
|
+
DO_ID_EXECUTE = rb_intern("execute");
|
738
|
+
DO_ID_EXEC = rb_intern("exec");
|
739
|
+
|
740
|
+
DO_ID_SELECT_STMT = rb_intern("select_stmt");
|
741
|
+
DO_ID_COLUMN_METADATA = rb_intern("column_metadata");
|
742
|
+
DO_ID_PRECISION = rb_intern("precision");
|
743
|
+
DO_ID_SCALE = rb_intern("scale");
|
744
|
+
DO_ID_BIND_PARAM = rb_intern("bind_param");
|
745
|
+
DO_ID_ELEM = rb_intern("[]");
|
746
|
+
DO_ID_READ = rb_intern("read");
|
747
|
+
|
748
|
+
DO_ID_CLOSE = rb_intern("close");
|
749
|
+
DO_ID_LOGOFF = rb_intern("logoff");
|
750
750
|
|
751
751
|
// Get references to the Extlib module
|
752
752
|
mExtlib = CONST_GET(rb_mKernel, "Extlib");
|
@@ -769,31 +769,31 @@ void Init_do_oracle() {
|
|
769
769
|
cDO_Logger_Message = CONST_GET(cDO_Logger, "Message");
|
770
770
|
|
771
771
|
// Top Level Module that all the classes live under
|
772
|
-
|
772
|
+
mDO_Oracle = rb_define_module_under(mDO, "Oracle");
|
773
773
|
|
774
774
|
eArgumentError = CONST_GET(rb_mKernel, "ArgumentError");
|
775
|
-
|
776
|
-
|
777
|
-
|
775
|
+
eDO_SQLError = CONST_GET(mDO, "SQLError");
|
776
|
+
eDO_ConnectionError = CONST_GET(mDO, "ConnectionError");
|
777
|
+
eDO_DataError = CONST_GET(mDO, "DataError");
|
778
778
|
// eOracleError = rb_define_class("OracleError", rb_eStandardError);
|
779
779
|
|
780
|
-
|
781
|
-
rb_define_method(
|
782
|
-
rb_define_method(
|
780
|
+
cDO_OracleConnection = ORACLE_CLASS("Connection", cDO_Connection);
|
781
|
+
rb_define_method(cDO_OracleConnection, "initialize", cDO_OracleConnection_initialize, 1);
|
782
|
+
rb_define_method(cDO_OracleConnection, "dispose", cDO_OracleConnection_dispose, 0);
|
783
783
|
|
784
|
-
|
785
|
-
rb_define_method(
|
786
|
-
rb_define_method(
|
787
|
-
rb_define_method(
|
788
|
-
rb_define_method(
|
784
|
+
cDO_OracleCommand = ORACLE_CLASS("Command", cDO_Command);
|
785
|
+
rb_define_method(cDO_OracleCommand, "set_types", cDO_OracleCommand_set_types, -1);
|
786
|
+
rb_define_method(cDO_OracleCommand, "execute_non_query", cDO_OracleCommand_execute_non_query, -1);
|
787
|
+
rb_define_method(cDO_OracleCommand, "execute_reader", cDO_OracleCommand_execute_reader, -1);
|
788
|
+
rb_define_method(cDO_OracleCommand, "execute_internal", cDO_OracleCommand_execute_internal, 3);
|
789
789
|
|
790
|
-
|
790
|
+
cDO_OracleResult = ORACLE_CLASS("Result", cDO_Result);
|
791
791
|
|
792
|
-
|
793
|
-
rb_define_method(
|
794
|
-
rb_define_method(
|
795
|
-
rb_define_method(
|
796
|
-
rb_define_method(
|
797
|
-
rb_define_method(
|
792
|
+
cDO_OracleReader = ORACLE_CLASS("Reader", cDO_Reader);
|
793
|
+
rb_define_method(cDO_OracleReader, "close", cDO_OracleReader_close, 0);
|
794
|
+
rb_define_method(cDO_OracleReader, "next!", cDO_OracleReader_next, 0);
|
795
|
+
rb_define_method(cDO_OracleReader, "values", cDO_OracleReader_values, 0);
|
796
|
+
rb_define_method(cDO_OracleReader, "fields", cDO_OracleReader_fields, 0);
|
797
|
+
rb_define_method(cDO_OracleReader, "field_count", cDO_OracleReader_field_count, 0);
|
798
798
|
|
799
799
|
}
|
Binary file
|
Binary file
|
data/lib/do_oracle/version.rb
CHANGED
data/tasks/compile.rake
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 10
|
8
|
-
-
|
9
|
-
version: 0.10.
|
8
|
+
- 11
|
9
|
+
version: 0.10.11
|
10
10
|
platform: x86-mswin32-60
|
11
11
|
authors:
|
12
12
|
- Raimonds Simanovskis
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2012-12-29 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -28,8 +28,8 @@ dependencies:
|
|
28
28
|
segments:
|
29
29
|
- 0
|
30
30
|
- 10
|
31
|
-
-
|
32
|
-
version: 0.10.
|
31
|
+
- 11
|
32
|
+
version: 0.10.11
|
33
33
|
requirement: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
prerelease: false
|