ext/Statement.c in rubyfb-0.5.5 vs ext/Statement.c in rubyfb-0.5.6

- old
+ new

@@ -1,30 +1,30 @@ /*------------------------------------------------------------------------------ * Statement.c *----------------------------------------------------------------------------*/ /** * Copyright © Peter Wood, 2005 - * + * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at + * License. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ - * + * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specificlanguage governing rights and limitations under the License. - * + * * The Original Code is the FireRuby extension for the Ruby language. - * - * The Initial Developer of the Original Code is Peter Wood. All Rights + * + * The Initial Developer of the Original Code is Peter Wood. All Rights * Reserved. * * @author Peter Wood * @version 1.0 */ - + /* Includes. */ #include "Statement.h" #include "Common.h" #include "Connection.h" #include "Transaction.h" @@ -56,27 +56,25 @@ * @param klass A reference to the Statement Class object. * * @return A reference to the newly allocated Statement object. * */ -VALUE allocateStatement(VALUE klass) -{ - StatementHandle *statement = ALLOC(StatementHandle); - - if(statement == NULL) - { - rb_raise(rb_eNoMemError, - "Memory allocation failure allocating a statement."); - } +VALUE allocateStatement(VALUE klass) { + StatementHandle *statement = ALLOC(StatementHandle); - statement->handle = 0; - statement->type = -1; - statement->inputs = 0; - statement->dialect = 0; - statement->parameters = NULL; - - return(Data_Wrap_Struct(klass, NULL, statementFree, statement)); + if(statement == NULL) { + rb_raise(rb_eNoMemError, + "Memory allocation failure allocating a statement."); + } + + statement->handle = 0; + statement->type = -1; + statement->inputs = 0; + statement->dialect = 0; + statement->parameters = NULL; + + return(Data_Wrap_Struct(klass, NULL, statementFree, statement)); } /** * This function provides the initialize method for the Statement class. @@ -94,69 +92,56 @@ * * @return A reference to the newly initialized Statement object. * */ VALUE initializeStatement(VALUE self, VALUE connection, VALUE transaction, - VALUE sql, VALUE dialect) -{ - StatementHandle *statement = NULL; - short setting = 0; - VALUE value = Qnil; - - /* Validate the inputs. */ - if(TYPE(connection) == T_DATA && - RDATA(connection)->dfree == (RUBY_DATA_FUNC)connectionFree) - { - if(rb_funcall(connection, rb_intern("open?"), 0) == Qfalse) - { - rb_fireruby_raise(NULL, "Closed connection specified for statement."); - } - } - else - { - rb_fireruby_raise(NULL, "Invalid connection specified for statement."); - } + VALUE sql, VALUE dialect) { + StatementHandle *statement = NULL; + short setting = 0; + VALUE value = Qnil; - if(TYPE(transaction) == T_DATA && - RDATA(transaction)->dfree == (RUBY_DATA_FUNC)transactionFree) - { - if(rb_funcall(transaction, rb_intern("active?"), 0) == Qfalse) - { - rb_fireruby_raise(NULL, "Inactive transaction specified for statement."); - } - } - else - { - rb_fireruby_raise(NULL, "Invalid transaction specified for statement."); - } - - value = rb_funcall(dialect, rb_intern("to_i"), 0); - if(TYPE(value) == T_FIXNUM) - { - setting = FIX2INT(value); - if(setting < 1 || setting > 3) - { - rb_fireruby_raise(NULL, - "Invalid dialect value specified for statement. "\ - "The dialect value must be between 1 and 3."); - } - } - else - { + /* Validate the inputs. */ + if(TYPE(connection) == T_DATA && + RDATA(connection)->dfree == (RUBY_DATA_FUNC)connectionFree) { + if(rb_funcall(connection, rb_intern("open?"), 0) == Qfalse) { + rb_fireruby_raise(NULL, "Closed connection specified for statement."); + } + } else { + rb_fireruby_raise(NULL, "Invalid connection specified for statement."); + } + + if(TYPE(transaction) == T_DATA && + RDATA(transaction)->dfree == (RUBY_DATA_FUNC)transactionFree) { + if(rb_funcall(transaction, rb_intern("active?"), 0) == Qfalse) { + rb_fireruby_raise(NULL, "Inactive transaction specified for statement."); + } + } else { + rb_fireruby_raise(NULL, "Invalid transaction specified for statement."); + } + + value = rb_funcall(dialect, rb_intern("to_i"), 0); + if(TYPE(value) == T_FIXNUM) { + setting = FIX2INT(value); + if(setting < 1 || setting > 3) { rb_fireruby_raise(NULL, - "Invalid dialect value specified for statement. The "\ - "dialect value must be between 1 and 3."); - } - - Data_Get_Struct(self, StatementHandle, statement); - rb_iv_set(self, "@connection", connection); - rb_iv_set(self, "@transaction", transaction); - rb_iv_set(self, "@sql", rb_funcall(sql, rb_intern("to_s"), 0)); - rb_iv_set(self, "@dialect", value); - statement->dialect = setting; - - return(self); + "Invalid dialect value specified for statement. " \ + "The dialect value must be between 1 and 3."); + } + } else { + rb_fireruby_raise(NULL, + "Invalid dialect value specified for statement. The " \ + "dialect value must be between 1 and 3."); + } + + Data_Get_Struct(self, StatementHandle, statement); + rb_iv_set(self, "@connection", connection); + rb_iv_set(self, "@transaction", transaction); + rb_iv_set(self, "@sql", rb_funcall(sql, rb_intern("to_s"), 0)); + rb_iv_set(self, "@dialect", value); + statement->dialect = setting; + + return(self); } /** * This function provides the sql sttribute accessor method for the Statement @@ -165,13 +150,12 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to a String containing the SQL statement. * */ -VALUE getStatementSQL(VALUE self) -{ - return(rb_iv_get(self, "@sql")); +VALUE getStatementSQL(VALUE self) { + return(rb_iv_get(self, "@sql")); } /** * This function provides the connection sttribute accessor method for the @@ -180,13 +164,12 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to a Connection object. * */ -VALUE getStatementConnection(VALUE self) -{ - return(rb_iv_get(self, "@connection")); +VALUE getStatementConnection(VALUE self) { + return(rb_iv_get(self, "@connection")); } /** * This function provides the transaction sttribute accessor method for the @@ -195,13 +178,12 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to a Transaction object. * */ -VALUE getStatementTransaction(VALUE self) -{ - return(rb_iv_get(self, "@transaction")); +VALUE getStatementTransaction(VALUE self) { + return(rb_iv_get(self, "@transaction")); } /** * This function provides the dialect sttribute accessor method for the @@ -210,13 +192,12 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to an integer containing the SQL dialect setting. * */ -VALUE getStatementDialect(VALUE self) -{ - return(rb_iv_get(self, "@dialect")); +VALUE getStatementDialect(VALUE self) { + return(rb_iv_get(self, "@dialect")); } /** @@ -226,31 +207,29 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to an integer containing the SQL type details. * */ -VALUE getStatementType(VALUE self) -{ - StatementHandle *statement = NULL; - ConnectionHandle *connection = NULL; - TransactionHandle *transaction = NULL; - int outputs = 0; - VALUE tmp_str = Qnil; - - Data_Get_Struct(self, StatementHandle, statement); - Data_Get_Struct(rb_iv_get(self, "@connection"), ConnectionHandle, connection); - Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, transaction); - if(statement->handle == 0) - { - tmp_str = rb_iv_get(self, "@sql"); - prepare(&connection->handle, &transaction->handle, - StringValuePtr(tmp_str), &statement->handle, - statement->dialect, &statement->type, &statement->inputs, - &outputs); - } - - return(INT2FIX(statement->type)); +VALUE getStatementType(VALUE self) { + StatementHandle *statement = NULL; + ConnectionHandle *connection = NULL; + TransactionHandle *transaction = NULL; + int outputs = 0; + VALUE tmp_str = Qnil; + + Data_Get_Struct(self, StatementHandle, statement); + Data_Get_Struct(rb_iv_get(self, "@connection"), ConnectionHandle, connection); + Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, transaction); + if(statement->handle == 0) { + tmp_str = rb_iv_get(self, "@sql"); + prepare(&connection->handle, &transaction->handle, + StringValuePtr(tmp_str), &statement->handle, + statement->dialect, &statement->type, &statement->inputs, + &outputs); + } + + return(INT2FIX(statement->type)); } /** * This function provides the parameter count sttribute accessor method for the @@ -259,74 +238,70 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to an integer containing the statement parameter count. * */ -VALUE getStatementParameterCount(VALUE self) -{ - StatementHandle *statement = NULL; - - Data_Get_Struct(self, StatementHandle, statement); - if(statement->handle == 0) - { - getStatementType(self); - } - - return(INT2NUM(statement->inputs)); +VALUE getStatementParameterCount(VALUE self) { + StatementHandle *statement = NULL; + + Data_Get_Struct(self, StatementHandle, statement); + if(statement->handle == 0) { + getStatementType(self); + } + + return(INT2NUM(statement->inputs)); } /** * This method provides the execute method for the Statement class. * * @param self A reference to the Statement object to call the method on. * * @return One of a count of the number of rows affected by the SQL statement, - * a ResultSet object for a query or nil. + * a ResultSet object for a query or nil. * */ -VALUE executeStatement(VALUE self) -{ - VALUE result; - int type = FIX2INT(getStatementType(self)); - long affected = 0; - StatementHandle *statement = NULL; - TransactionHandle *transaction = NULL; - - switch(type) - { - case isc_info_sql_stmt_select : - case isc_info_sql_stmt_select_for_upd : - case isc_info_sql_stmt_exec_procedure : - result = rb_result_set_new(rb_iv_get(self, "@connection"), - rb_iv_get(self, "@transaction"), - rb_iv_get(self, "@sql"), - rb_iv_get(self, "@dialect"), - rb_ary_new()); - break; - - case isc_info_sql_stmt_insert : - case isc_info_sql_stmt_update : - case isc_info_sql_stmt_delete : - Data_Get_Struct(self, StatementHandle, statement); - Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, - transaction); - execute(&transaction->handle, &statement->handle, statement->dialect, - NULL, statement->type, &affected); - result = INT2NUM(affected); - break; - - default : - Data_Get_Struct(self, StatementHandle, statement); - Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, - transaction); - execute(&transaction->handle, &statement->handle, statement->dialect, - NULL, statement->type, &affected); - result = Qnil; - } - - return(result); +VALUE executeStatement(VALUE self) { + VALUE result; + int type = FIX2INT(getStatementType(self)); + long affected = 0; + StatementHandle *statement = NULL; + TransactionHandle *transaction = NULL; + + switch(type) { + case isc_info_sql_stmt_select: + case isc_info_sql_stmt_select_for_upd: + case isc_info_sql_stmt_exec_procedure: + result = rb_result_set_new(rb_iv_get(self, "@connection"), + rb_iv_get(self, "@transaction"), + rb_iv_get(self, "@sql"), + rb_iv_get(self, "@dialect"), + rb_ary_new()); + break; + + case isc_info_sql_stmt_insert: + case isc_info_sql_stmt_update: + case isc_info_sql_stmt_delete: + Data_Get_Struct(self, StatementHandle, statement); + Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, + transaction); + execute(&transaction->handle, &statement->handle, statement->dialect, + NULL, statement->type, &affected); + result = INT2NUM(affected); + break; + + default: + Data_Get_Struct(self, StatementHandle, statement); + Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, + transaction); + execute(&transaction->handle, &statement->handle, statement->dialect, + NULL, statement->type, &affected); + result = Qnil; + } + + return(result); } /** * This method provides the execute method for the Statement class. @@ -335,77 +310,69 @@ * on. * @param parameters An array containing the parameters to be used in * executing the statement. * * @return One of a count of the number of rows affected by the SQL statement, - * a ResultSet object for a query or nil. + * a ResultSet object for a query or nil. * */ -VALUE executeStatementFor(VALUE self, VALUE parameters) -{ - VALUE result = Qnil; - int type = FIX2INT(getStatementType(self)); - long affected = 0; - StatementHandle *statement = NULL; - TransactionHandle *transaction = NULL; - - if(type == isc_info_sql_stmt_select || - type == isc_info_sql_stmt_select_for_upd) - { - /* Execute the statement via a ResultSet object. */ - result = rb_result_set_new(rb_iv_get(self, "@connection"), - rb_iv_get(self, "@transaction"), - rb_iv_get(self, "@sql"), - rb_iv_get(self, "@dialect"), - parameters); - } - else - { - /* Check that sufficient parameters have been specified. */ - Data_Get_Struct(self, StatementHandle, statement); - if(statement->inputs > 0) - { - VALUE value = Qnil; - int size = 0; - - if(parameters == Qnil) - { - rb_fireruby_raise(NULL, - "Empty parameter list specified for statement."); - } - - value = rb_funcall(parameters, rb_intern("size"), 0); - size = TYPE(value) == T_FIXNUM ? FIX2INT(value) : NUM2INT(value); - if(size < statement->inputs) - { - rb_fireruby_raise(NULL, - "Insufficient parameters specified for statement."); - } - - /* Allocate the XSQLDA and populate it. */ - statement->parameters = allocateInXSQLDA(statement->inputs, - &statement->handle, - statement->dialect); - prepareDataArea(statement->parameters); - setParameters(statement->parameters, parameters, self); +VALUE executeStatementFor(VALUE self, VALUE parameters) { + VALUE result = Qnil; + int type = FIX2INT(getStatementType(self)); + long affected = 0; + StatementHandle *statement = NULL; + TransactionHandle *transaction = NULL; + + if(type == isc_info_sql_stmt_select || + type == isc_info_sql_stmt_select_for_upd) { + /* Execute the statement via a ResultSet object. */ + result = rb_result_set_new(rb_iv_get(self, "@connection"), + rb_iv_get(self, "@transaction"), + rb_iv_get(self, "@sql"), + rb_iv_get(self, "@dialect"), + parameters); + } else { + /* Check that sufficient parameters have been specified. */ + Data_Get_Struct(self, StatementHandle, statement); + if(statement->inputs > 0) { + VALUE value = Qnil; + int size = 0; + + if(parameters == Qnil) { + rb_fireruby_raise(NULL, + "Empty parameter list specified for statement."); } - - /* Execute the statement. */ - Data_Get_Struct(self, StatementHandle, statement); - Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, - transaction); - execute(&transaction->handle, &statement->handle, statement->dialect, - statement->parameters, statement->type, &affected); - if(type == isc_info_sql_stmt_insert || - type == isc_info_sql_stmt_update || - type == isc_info_sql_stmt_delete) - { - result = INT2NUM(affected); + + value = rb_funcall(parameters, rb_intern("size"), 0); + size = TYPE(value) == T_FIXNUM ? FIX2INT(value) : NUM2INT(value); + if(size < statement->inputs) { + rb_fireruby_raise(NULL, + "Insufficient parameters specified for statement."); } - } - - return(result); + + /* Allocate the XSQLDA and populate it. */ + statement->parameters = allocateInXSQLDA(statement->inputs, + &statement->handle, + statement->dialect); + prepareDataArea(statement->parameters); + setParameters(statement->parameters, parameters, self); + } + + /* Execute the statement. */ + Data_Get_Struct(self, StatementHandle, statement); + Data_Get_Struct(rb_iv_get(self, "@transaction"), TransactionHandle, + transaction); + execute(&transaction->handle, &statement->handle, statement->dialect, + statement->parameters, statement->type, &affected); + if(type == isc_info_sql_stmt_insert || + type == isc_info_sql_stmt_update || + type == isc_info_sql_stmt_delete) { + result = INT2NUM(affected); + } + } + + return(result); } /** @@ -414,31 +381,27 @@ * @param self A reference to the Statement object to call the method on. * * @return A reference to the newly closed Statement object. * */ -VALUE closeStatement(VALUE self) -{ - StatementHandle *statement = NULL; - - Data_Get_Struct(self, StatementHandle, statement); - if(statement->handle != 0) - { - ISC_STATUS status[20]; - - if(isc_dsql_free_statement(status, &statement->handle, DSQL_drop)) - { - rb_fireruby_raise(status, "Error closing statement."); - } - - if(statement->parameters != NULL) - { - releaseDataArea(statement->parameters); - } - } - - return(self); +VALUE closeStatement(VALUE self) { + StatementHandle *statement = NULL; + + Data_Get_Struct(self, StatementHandle, statement); + if(statement->handle != 0) { + ISC_STATUS status[ISC_STATUS_LENGTH]; + + if(isc_dsql_free_statement(status, &statement->handle, DSQL_drop)) { + rb_fireruby_raise(status, "Error closing statement."); + } + + if(statement->parameters != NULL) { + releaseDataArea(statement->parameters); + } + } + + return(self); } /** * This function prepares a Firebird SQL statement for execution. @@ -459,164 +422,150 @@ * the output columns for the SQL statement. * */ void prepare(isc_db_handle *connection, isc_tr_handle *transaction, char *sql, isc_stmt_handle *statement, short dialect, - int *type, int *inputs, int *outputs) -{ - ISC_STATUS status[20]; - XSQLDA *da = NULL; - char list[] = {isc_info_sql_stmt_type}, - info[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - - /* Prepare the statement. */ - if(isc_dsql_allocate_statement(status, connection, statement)) - { - rb_fireruby_raise(status, "Error allocating a SQL statement."); - } - - da = (XSQLDA *)ALLOC_N(char, XSQLDA_LENGTH(1)); - if(da == NULL) - { - rb_raise(rb_eNoMemError, - "Memory allocation failure preparing a statement."); - } - da->version = SQLDA_VERSION1; - da->sqln = 1; - if(isc_dsql_prepare(status, transaction, statement, 0, sql, dialect, - da)) - { - free(da); - rb_fireruby_raise(status, "Error preparing a SQL statement."); - } - *outputs = da->sqld; - - /* Get the parameter count. */ - if(isc_dsql_describe_bind(status, statement, dialect, da)) - { - free(da); - rb_fireruby_raise(status, "Error determining statement parameters."); - } - *inputs = da->sqld; - free(da); - - /* Get the statement type details. */ - if(isc_dsql_sql_info(status, statement, 1, list, 20, info) || - info[0] != isc_info_sql_stmt_type) - { - rb_fireruby_raise(status, "Error determining SQL statement type."); - } - *type = isc_vax_integer(&info[3], isc_vax_integer(&info[1], 2)); + int *type, int *inputs, int *outputs) { + ISC_STATUS status[ISC_STATUS_LENGTH]; + XSQLDA *da = NULL; + char list[] = {isc_info_sql_stmt_type}, + info[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + /* Prepare the statement. */ + if(isc_dsql_allocate_statement(status, connection, statement)) { + rb_fireruby_raise(status, "Error allocating a SQL statement."); + } + + da = (XSQLDA *)ALLOC_N(char, XSQLDA_LENGTH(1)); + if(da == NULL) { + rb_raise(rb_eNoMemError, + "Memory allocation failure preparing a statement."); + } + da->version = SQLDA_VERSION1; + da->sqln = 1; + if(isc_dsql_prepare(status, transaction, statement, 0, sql, dialect, + da)) { + free(da); + rb_fireruby_raise(status, "Error preparing a SQL statement."); + } + *outputs = da->sqld; + + /* Get the parameter count. */ + if(isc_dsql_describe_bind(status, statement, dialect, da)) { + free(da); + rb_fireruby_raise(status, "Error determining statement parameters."); + } + *inputs = da->sqld; + free(da); + + /* Get the statement type details. */ + if(isc_dsql_sql_info(status, statement, 1, list, 20, info) || + info[0] != isc_info_sql_stmt_type) { + rb_fireruby_raise(status, "Error determining SQL statement type."); + } + *type = isc_vax_integer(&info[3], isc_vax_integer(&info[1], 2)); } /** * This function executes a previously prepare SQL statement. * * @param transaction A pointer to the Firebird transaction handle to be used in * executing the statement. * @param statement A pointer to the Firebird statement handle to be used in * executing the statement. - * @param dialect Database dialect used in the statement - * + * @param dialect Database dialect used in the statement + * * @param parameters A pointer to the XSQLDA block that contains the input * parameters for the SQL statement. * @param type A integer containing the type details relating to the * statement being executed. * @param affected A pointer to a long integer that will be assigned a count * of rows affected by inserts, updates or deletes. * @param output A pointer to the XSQLDA block that will hold the output * data generated by the execution. */ void execute_2(isc_tr_handle *transaction, isc_stmt_handle *statement, - short dialect, XSQLDA *parameters, int type, long *affected, XSQLDA *output) -{ - ISC_STATUS status[20]; - ISC_STATUS execute_result; - - if(output) { - execute_result = isc_dsql_execute2(status, transaction, statement, dialect, parameters, output); - } else { - execute_result = isc_dsql_execute(status, transaction, statement, dialect, parameters); - } - if(execute_result) - { - rb_fireruby_raise(status, "Error executing SQL statement."); - } - - /* Check if a row count is needed. */ - if(type == isc_info_sql_stmt_update || type == isc_info_sql_stmt_delete || - type == isc_info_sql_stmt_insert) - { - int info = 0, - done = 0; - char items[] = {isc_info_sql_records}, - buffer[40], - *position = buffer + 3; + short dialect, XSQLDA *parameters, int type, long *affected, XSQLDA *output) { + ISC_STATUS status[ISC_STATUS_LENGTH]; + ISC_STATUS execute_result; - switch(type) - { - case isc_info_sql_stmt_update : - info = isc_info_req_update_count; - break; + if(output) { + execute_result = isc_dsql_execute2(status, transaction, statement, dialect, parameters, output); + } else { + execute_result = isc_dsql_execute(status, transaction, statement, dialect, parameters); + } + if(execute_result) { + rb_fireruby_raise(status, "Error executing SQL statement."); + } - case isc_info_sql_stmt_delete : - info = isc_info_req_delete_count; - break; + /* Check if a row count is needed. */ + if(type == isc_info_sql_stmt_update || type == isc_info_sql_stmt_delete || + type == isc_info_sql_stmt_insert) { + int info = 0, + done = 0; + char items[] = {isc_info_sql_records}, + buffer[40], + *position = buffer + 3; - case isc_info_sql_stmt_insert : - info = isc_info_req_insert_count; - break; + switch(type) { + case isc_info_sql_stmt_update: + info = isc_info_req_update_count; + break; + + case isc_info_sql_stmt_delete: + info = isc_info_req_delete_count; + break; + + case isc_info_sql_stmt_insert: + info = isc_info_req_insert_count; + break; + } + + if(isc_dsql_sql_info(status, statement, sizeof(items), items, + sizeof(buffer), buffer)) { + rb_fireruby_raise(status, "Error retrieving affected row count."); + } + + while(*position != isc_info_end && done == 0) { + char current = *position++; + long temp[] = {0, 0}; + + temp[0] = isc_vax_integer(position, 2); + position += 2; + temp[1] = isc_vax_integer(position, temp[0]); + position += temp[0]; + + if(current == info) { + *affected = temp[1]; + done = 1; } - - if(isc_dsql_sql_info(status, statement, sizeof(items), items, - sizeof(buffer), buffer)) - { - rb_fireruby_raise(status, "Error retrieving affected row count."); - } - - while(*position != isc_info_end && done == 0) - { - char current = *position++; - long temp[] = {0, 0}; - - temp[0] = isc_vax_integer(position, 2); - position += 2; - temp[1] = isc_vax_integer(position, temp[0]); - position += temp[0]; - - if(current == info) - { - *affected = temp[1]; - done = 1; - } - } - } + } + } } /** * This function executes a previously prepare SQL statement. * * @param transaction A pointer to the Firebird transaction handle to be used in * executing the statement. * @param statement A pointer to the Firebird statement handle to be used in * executing the statement. - * @param dialect Database dialect used in the statement - * + * @param dialect Database dialect used in the statement + * * @param parameters A pointer to the XSQLDA block that contains the input * parameters for the SQL statement. * @param type A integer containing the type details relating to the * statement being executed. * @param affected A pointer to a long integer that will be assigned a count * of rows affected by inserts, updates or deletes. */ void execute(isc_tr_handle *transaction, isc_stmt_handle *statement, - short dialect, XSQLDA *parameters, int type, long *affected) -{ - execute_2(transaction, statement, dialect, parameters, type, affected, NULL); + short dialect, XSQLDA *parameters, int type, long *affected) { + execute_2(transaction, statement, dialect, parameters, type, affected, NULL); } /** * This function provides a programmatic means of creating a Statement object. * @@ -631,17 +580,16 @@ * * @return A reference to the newly created Statement object. * */ VALUE rb_statement_new(VALUE connection, VALUE transaction, VALUE sql, - VALUE dialect) -{ - VALUE statement = allocateStatement(cStatement); - - initializeStatement(statement, connection, transaction, sql, dialect); - - return(statement); + VALUE dialect) { + VALUE statement = allocateStatement(cStatement); + + initializeStatement(statement, connection, transaction, sql, dialect); + + return(statement); } /** * This function provides a programmatic way of executing a Statement object @@ -650,13 +598,12 @@ * @param statement A reference to the statement object to be executed. * * @return A reference to the results of executing the statement. * */ -VALUE rb_execute_statement(VALUE statement) -{ - return(executeStatement(statement)); +VALUE rb_execute_statement(VALUE statement) { + return(executeStatement(statement)); } /** * This function provides a programmatic way of executing a Statement object @@ -667,13 +614,12 @@ * execution of the statement. * * @return A reference to the results of executing the statement. * */ -VALUE rb_execute_statement_for(VALUE statement, VALUE parameters) -{ - return(executeStatementFor(statement, parameters)); +VALUE rb_execute_statement_for(VALUE statement, VALUE parameters) { + return(executeStatementFor(statement, parameters)); } /** * This method retrieves the type information for a Statement object. @@ -681,25 +627,23 @@ * @param statement A reference to a Statement object. * * @return A reference to an integer containing the statement type details. * */ -VALUE rb_get_statement_type(VALUE statement) -{ - return(getStatementType(statement)); +VALUE rb_get_statement_type(VALUE statement) { + return(getStatementType(statement)); } /** * This function provides a programmatic means of closing a Statement object. * * @param statement A reference to the Statement object to be closed. * */ -void rb_statement_close(VALUE statement) -{ - closeStatement(statement); +void rb_statement_close(VALUE statement) { + closeStatement(statement); } /** * This function integrates with the Ruby garbage collector to release the @@ -707,29 +651,25 @@ * * @param handle A pointer to the StatementHandle structure for the Statement * object being collected. * */ -void statementFree(void *handle) -{ - if(handle != NULL) - { - StatementHandle *statement = (StatementHandle *)handle; - - if(statement->handle != 0) - { - ISC_STATUS status[20]; - - isc_dsql_free_statement(status, &statement->handle, DSQL_drop); - } - - if(statement->parameters) - { - releaseDataArea(statement->parameters); - } - free(statement); - } +void statementFree(void *handle) { + if(handle != NULL) { + StatementHandle *statement = (StatementHandle *)handle; + + if(statement->handle != 0) { + ISC_STATUS status[ISC_STATUS_LENGTH]; + + isc_dsql_free_statement(status, &statement->handle, DSQL_drop); + } + + if(statement->parameters) { + releaseDataArea(statement->parameters); + } + free(statement); + } } @@ -738,50 +678,49 @@ * The class is established under the module specified to the function. * * @param module A reference to the module to create the class within. * */ -void Init_Statement(VALUE module) -{ - cStatement = rb_define_class_under(module, "Statement", rb_cObject); - rb_define_alloc_func(cStatement, allocateStatement); - rb_define_method(cStatement, "initialize", initializeStatement, 4); - rb_define_method(cStatement, "initialize_copy", forbidObjectCopy, 1); - rb_define_method(cStatement, "sql", getStatementSQL, 0); - rb_define_method(cStatement, "connection", getStatementConnection, 0); - rb_define_method(cStatement, "transaction", getStatementTransaction, 0); - rb_define_method(cStatement, "dialect", getStatementDialect, 0); - rb_define_method(cStatement, "type", getStatementType, 0); - rb_define_method(cStatement, "execute", executeStatement, 0); - rb_define_method(cStatement, "execute_for", executeStatementFor, 1); - rb_define_method(cStatement, "close", closeStatement, 0); - rb_define_method(cStatement, "parameter_count", getStatementParameterCount, 0); - - rb_define_const(cStatement, "SELECT_STATEMENT", - INT2FIX(isc_info_sql_stmt_select)); - rb_define_const(cStatement, "INSERT_STATEMENT", - INT2FIX(isc_info_sql_stmt_insert)); - rb_define_const(cStatement, "UPDATE_STATEMENT", - INT2FIX(isc_info_sql_stmt_update)); - rb_define_const(cStatement, "DELETE_STATEMENT", - INT2FIX(isc_info_sql_stmt_delete)); - rb_define_const(cStatement, "DDL_STATEMENT", - INT2FIX(isc_info_sql_stmt_ddl)); - rb_define_const(cStatement, "GET_SEGMENT_STATEMENT", - INT2FIX(isc_info_sql_stmt_get_segment)); - rb_define_const(cStatement, "PUT_SEGMENT_STATEMENT", - INT2FIX(isc_info_sql_stmt_put_segment)); - rb_define_const(cStatement, "EXECUTE_PROCEDURE_STATEMENT", - INT2FIX(isc_info_sql_stmt_exec_procedure)); - rb_define_const(cStatement, "START_TRANSACTION_STATEMENT", - INT2FIX(isc_info_sql_stmt_start_trans)); - rb_define_const(cStatement, "COMMIT_STATEMENT", - INT2FIX(isc_info_sql_stmt_commit)); - rb_define_const(cStatement, "ROLLBACK_STATEMENT", - INT2FIX(isc_info_sql_stmt_rollback)); - rb_define_const(cStatement, "SELECT_FOR_UPDATE_STATEMENT", - INT2FIX(isc_info_sql_stmt_select_for_upd)); - rb_define_const(cStatement, "SET_GENERATOR_STATEMENT", - INT2FIX(isc_info_sql_stmt_set_generator)); - rb_define_const(cStatement, "SAVE_POINT_STATEMENT", - INT2FIX(isc_info_sql_stmt_savepoint)); +void Init_Statement(VALUE module) { + cStatement = rb_define_class_under(module, "Statement", rb_cObject); + rb_define_alloc_func(cStatement, allocateStatement); + rb_define_method(cStatement, "initialize", initializeStatement, 4); + rb_define_method(cStatement, "initialize_copy", forbidObjectCopy, 1); + rb_define_method(cStatement, "sql", getStatementSQL, 0); + rb_define_method(cStatement, "connection", getStatementConnection, 0); + rb_define_method(cStatement, "transaction", getStatementTransaction, 0); + rb_define_method(cStatement, "dialect", getStatementDialect, 0); + rb_define_method(cStatement, "type", getStatementType, 0); + rb_define_method(cStatement, "execute", executeStatement, 0); + rb_define_method(cStatement, "execute_for", executeStatementFor, 1); + rb_define_method(cStatement, "close", closeStatement, 0); + rb_define_method(cStatement, "parameter_count", getStatementParameterCount, 0); + + rb_define_const(cStatement, "SELECT_STATEMENT", + INT2FIX(isc_info_sql_stmt_select)); + rb_define_const(cStatement, "INSERT_STATEMENT", + INT2FIX(isc_info_sql_stmt_insert)); + rb_define_const(cStatement, "UPDATE_STATEMENT", + INT2FIX(isc_info_sql_stmt_update)); + rb_define_const(cStatement, "DELETE_STATEMENT", + INT2FIX(isc_info_sql_stmt_delete)); + rb_define_const(cStatement, "DDL_STATEMENT", + INT2FIX(isc_info_sql_stmt_ddl)); + rb_define_const(cStatement, "GET_SEGMENT_STATEMENT", + INT2FIX(isc_info_sql_stmt_get_segment)); + rb_define_const(cStatement, "PUT_SEGMENT_STATEMENT", + INT2FIX(isc_info_sql_stmt_put_segment)); + rb_define_const(cStatement, "EXECUTE_PROCEDURE_STATEMENT", + INT2FIX(isc_info_sql_stmt_exec_procedure)); + rb_define_const(cStatement, "START_TRANSACTION_STATEMENT", + INT2FIX(isc_info_sql_stmt_start_trans)); + rb_define_const(cStatement, "COMMIT_STATEMENT", + INT2FIX(isc_info_sql_stmt_commit)); + rb_define_const(cStatement, "ROLLBACK_STATEMENT", + INT2FIX(isc_info_sql_stmt_rollback)); + rb_define_const(cStatement, "SELECT_FOR_UPDATE_STATEMENT", + INT2FIX(isc_info_sql_stmt_select_for_upd)); + rb_define_const(cStatement, "SET_GENERATOR_STATEMENT", + INT2FIX(isc_info_sql_stmt_set_generator)); + rb_define_const(cStatement, "SAVE_POINT_STATEMENT", + INT2FIX(isc_info_sql_stmt_savepoint)); }