do_oracle 0.10.10-x86-mingw32 → 0.10.11-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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-mingw32
|
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
|