rubyfb 0.5.9 → 0.6

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/ext/Connection.c CHANGED
@@ -41,14 +41,12 @@ static VALUE getConnectionDatabase(VALUE);
41
41
  static VALUE startConnectionTransaction(VALUE);
42
42
  static VALUE connectionToString(VALUE);
43
43
  static VALUE executeOnConnection(VALUE, VALUE, VALUE);
44
+ static VALUE executeOnConnectionWithParams(VALUE, VALUE, VALUE, VALUE);
44
45
  static VALUE executeOnConnectionImmediate(VALUE, VALUE);
46
+ static VALUE createStatement(VALUE, VALUE);
45
47
  static VALUE getConnectionUser(VALUE);
46
48
  VALUE startTransactionBlock(VALUE);
47
49
  VALUE startTransactionRescue(VALUE, VALUE);
48
- VALUE executeBlock(VALUE);
49
- VALUE executeRescue(VALUE, VALUE);
50
- VALUE executeImmediateBlock(VALUE);
51
- VALUE executeImmediateRescue(VALUE, VALUE);
52
50
  char *createDPB(VALUE, VALUE, VALUE, short *);
53
51
 
54
52
  /* Globals. */
@@ -300,8 +298,26 @@ static VALUE connectionToString(VALUE self) {
300
298
  * non-query statement.
301
299
  *
302
300
  */
303
- static VALUE executeOnConnection(VALUE self, VALUE sql, VALUE transaction) {
304
- return rb_execute_sql(self, transaction, sql);
301
+ VALUE executeOnConnection(VALUE self, VALUE sql, VALUE transaction) {
302
+ return executeOnConnectionWithParams(self, sql, rb_ary_new(), transaction);
303
+ }
304
+
305
+ /**
306
+ * This function provides the execute_for method for the Connection class.
307
+ *
308
+ * @param self A reference to the connection object to perform the
309
+ * execution through.
310
+ * @param sql A reference to the SQL statement to be executed.
311
+ * @param params Array containing parameter values for the statement.
312
+ * @param transaction A reference to the transction that the statement will
313
+ * be executed under.
314
+ *
315
+ * @return Either a ResultSet object for a query statement or nil for a
316
+ * non-query statement.
317
+ *
318
+ */
319
+ VALUE executeOnConnectionWithParams(VALUE self, VALUE sql, VALUE params, VALUE transaction) {
320
+ return rb_execute_sql(self, sql, params, transaction);
305
321
  }
306
322
 
307
323
  /**
@@ -314,41 +330,23 @@ static VALUE connectionToString(VALUE self) {
314
330
  * @return Always returns nil.
315
331
  *
316
332
  */
317
- static VALUE executeOnConnectionImmediate(VALUE self, VALUE sql) {
318
- VALUE transaction = rb_transaction_new(self),
319
- set = Qnil,
320
- results = Qnil,
321
- array = rb_ary_new(),
322
- dialect = INT2FIX(3),
323
- statement = rb_statement_new(self, transaction, sql, dialect);
324
-
325
- rb_ary_push(array, self);
326
- rb_ary_push(array, transaction);
327
- rb_ary_push(array, sql);
328
- rb_ary_push(array, statement);
329
-
330
- set = rb_rescue(executeBlock, array, executeRescue, array);
331
- if(set != Qnil) {
332
- if(TYPE(set) == T_DATA &&
333
- RDATA(set)->dfree == (RUBY_DATA_FUNC)resultSetFree) {
334
- rb_assign_transaction(set, transaction);
335
- if(rb_block_given_p()) {
336
- results = rb_rescue(executeImmediateBlock, set,
337
- executeImmediateRescue, set);
338
- } else {
339
- results = set;
340
- }
341
- } else {
342
- rb_funcall(transaction, rb_intern("commit"), 0);
343
- results = set;
344
- }
345
- } else {
346
- rb_funcall(transaction, rb_intern("commit"), 0);
347
- }
348
-
349
- return(results);
333
+ VALUE executeOnConnectionImmediate(VALUE self, VALUE sql) {
334
+ return executeOnConnection(self, sql, Qnil);
350
335
  }
351
336
 
337
+ /**
338
+ * Create statement object
339
+ *
340
+ * @param self A reference to the connection object to perform the execution
341
+ * through.
342
+ * @param sql A reference to the SQL statement to be executed.
343
+ *
344
+ * @return Reference to the statement object.
345
+ *
346
+ */
347
+ VALUE createStatement(VALUE self, VALUE sql) {
348
+ return rb_statement_new(self, sql);
349
+ }
352
350
 
353
351
  /**
354
352
  * This function provides the user accessor method for the Connection object.
@@ -398,93 +396,6 @@ VALUE startTransactionRescue(VALUE transaction, VALUE error) {
398
396
  return(Qnil);
399
397
  }
400
398
 
401
-
402
- /**
403
- * This function is used to wrap the call to the executeOnConnection() function
404
- * made by the executeOnConnectionImmediate() function to help insure that the
405
- * transaction is rolled back in case of an error.
406
- *
407
- * @param array An array of the parameters for the function to use.
408
- *
409
- * @return The ResultSet object generated by execution or nil if it wasn't a
410
- * query.
411
- *
412
- */
413
- VALUE executeBlock(VALUE array) {
414
- VALUE result = Qnil,
415
- connection = rb_ary_entry(array, 0),
416
- transaction = rb_ary_entry(array, 1),
417
- sql = rb_ary_entry(array, 2),
418
- statement = rb_ary_entry(array, 3);
419
-
420
- result = rb_execute_statement(statement);
421
- rb_statement_close(statement);
422
-
423
- return(result);
424
- }
425
-
426
-
427
- /**
428
- * This function provides clean up for the execution of a block associated
429
- * with the execute method.
430
- *
431
- * @param array An array of the parameters for the function to use.
432
- * @param error A reference to details relating to the exception raised.
433
- *
434
- * @return Would always returns nil except that it always raises an exception.
435
- *
436
- */
437
- VALUE executeRescue(VALUE array, VALUE error) {
438
- VALUE transaction = rb_ary_entry(array, 1),
439
- statement = rb_ary_entry(array, 3);
440
-
441
- rb_funcall(transaction, rb_intern("rollback"), 0);
442
- rb_statement_close(statement);
443
- rb_exc_raise(error);
444
- return(Qnil);
445
- }
446
-
447
-
448
- /**
449
- * This function is executed to process a block passed to the execute_immedate
450
- * method.
451
- *
452
- * @param set A reference to the ResultSet to be processed by the block.
453
- *
454
- * @return A reference to the return value generated by the block.
455
- *
456
- */
457
- VALUE executeImmediateBlock(VALUE set) {
458
- VALUE result = Qnil,
459
- row = rb_funcall(set, rb_intern("fetch"), 0);
460
-
461
- while(row != Qnil) {
462
- result = rb_yield(row);
463
- row = rb_funcall(set, rb_intern("fetch"), 0);
464
- }
465
- rb_funcall(set, rb_intern("close"), 0);
466
-
467
- return(result);
468
- }
469
-
470
-
471
- /**
472
- * This function provides clean up for the execution of a block associated
473
- * with the execute_immediate method.
474
- *
475
- * @param set A reference to the ResultSet object for the block.
476
- * @param error A reference to details relating to the exception raised.
477
- *
478
- * @return Would always returns nil except that it always raises an exception.
479
- *
480
- */
481
- VALUE executeImmediateRescue(VALUE set, VALUE error) {
482
- rb_funcall(set, rb_intern("close"), 0);
483
- rb_exc_raise(error);
484
- return(Qnil);
485
- }
486
-
487
-
488
399
  /**
489
400
  * This method creates a database parameter buffer to be used in creating a
490
401
  * database connection.
@@ -676,6 +587,7 @@ VALUE rb_connection_new(VALUE database, VALUE user, VALUE password, VALUE option
676
587
  }
677
588
 
678
589
 
590
+
679
591
  /**
680
592
  * This function is called to record the beginnings of a transactions against
681
593
  * a related connection.
@@ -760,7 +672,9 @@ void Init_Connection(VALUE module) {
760
672
  rb_define_method(cConnection, "start_transaction", startConnectionTransaction, 0);
761
673
  rb_define_method(cConnection, "to_s", connectionToString, 0);
762
674
  rb_define_method(cConnection, "execute", executeOnConnection, 2);
675
+ rb_define_method(cConnection, "execute_for", executeOnConnectionWithParams, 3);
763
676
  rb_define_method(cConnection, "execute_immediate", executeOnConnectionImmediate, 1);
677
+ rb_define_method(cConnection, "create_statement", createStatement, 1);
764
678
 
765
679
  rb_define_const(cConnection, "MARK_DATABASE_DAMAGED", INT2FIX(isc_dpb_damaged));
766
680
  rb_define_const(cConnection, "WRITE_POLICY", INT2FIX(isc_dpb_force_write));
@@ -55,8 +55,8 @@ static VALUE initializeFireRubyException(VALUE self, VALUE message) {
55
55
  }
56
56
 
57
57
  rb_iv_set(self, "@message", message);
58
- rb_iv_set(self, "@sql_code", 0);
59
- rb_iv_set(self, "@db_code", 0);
58
+ rb_iv_set(self, "@sql_code", INT2NUM(0));
59
+ rb_iv_set(self, "@db_code", INT2NUM(0));
60
60
 
61
61
  return(self);
62
62
  }
@@ -104,19 +104,31 @@ static VALUE getFireRubyExceptionMessage(VALUE self) {
104
104
 
105
105
 
106
106
  /**
107
- * This function decodes the contents of a Firebird ISC_STATUS array into a
108
- * String object.
107
+ * This function provides a means to programmatically create a new instance of
108
+ * the FireRubyException class.
109
+ *
110
+ * @param message A string containing the error message for the exception.
111
+ *
112
+ * @return A reference to a newly created FireRubyException object.
109
113
  *
110
- * @param status A pointer to the status array to be decoded.
111
- * @param prefix An initial message that may be added to the exception as
112
- * part of the decoding. Ignored if it is NULL or has zero
113
- * length.
114
+ */
115
+ VALUE rb_fireruby_exception_new(const char *message) {
116
+ return rb_funcall(cFireRubyException, rb_intern("new"), 1, rb_str_new2(message));
117
+ }
118
+
119
+
120
+ /**
121
+ * This function raises a new FireRuby exception.
114
122
  *
115
- * @return A reference to the full decode error message string.
123
+ * @param status A pointer to the Firebird status vector containing the error
124
+ * details.
125
+ * @param message A string containing a message to be prefixed to the error
126
+ * text generated by the decoding.
116
127
  *
117
128
  */
118
- VALUE decodeException(const ISC_STATUS *status, const char *prefix) {
119
- VALUE message = rb_str_new2(""),
129
+ void rb_fireruby_raise(const ISC_STATUS *status, const char *prefix) {
130
+ VALUE exception = rb_exc_new2(cFireRubyException, ""),
131
+ message = rb_str_new2(""),
120
132
  eol = rb_str_new2("\n");
121
133
  char text[512];
122
134
  int sqlCode = isc_sqlcode(status),
@@ -149,36 +161,10 @@ VALUE decodeException(const ISC_STATUS *status, const char *prefix) {
149
161
  rb_str_concat(message, rb_str_new2(text));
150
162
  }
151
163
 
152
- return(message);
153
- }
154
-
155
-
156
- /**
157
- * This function provides a means to programmatically create a new instance of
158
- * the FireRubyException class.
159
- *
160
- * @param message A string containing the error message for the exception.
161
- *
162
- * @return A reference to a newly created FireRubyException object.
163
- *
164
- */
165
- VALUE rb_fireruby_exception_new(const char *message) {
166
- return rb_funcall(cFireRubyException, rb_intern("new"), 1, rb_str_new2(message));
167
- }
168
-
169
-
170
- /**
171
- * This function raises a new FireRuby exception.
172
- *
173
- * @param status A pointer to the Firebird status vector containing the error
174
- * details.
175
- * @param message A string containing a message to be prefixed to the error
176
- * text generated by the decoding.
177
- *
178
- */
179
- void rb_fireruby_raise(const ISC_STATUS *status, const char *message) {
180
- VALUE text = decodeException(status, message);
181
- rb_raise(cFireRubyException, "%s", StringValuePtr(text));
164
+ rb_iv_set(exception, "@message", message);
165
+ rb_iv_set(exception, "@sql_code", INT2NUM(sqlCode));
166
+ rb_iv_set(exception, "@db_code", INT2NUM(dbCode));
167
+ rb_exc_raise(exception);
182
168
  }
183
169
 
184
170