From 755a87332adccd3ad8d08bd16ad490e82b009496 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 10 Feb 2001 07:01:19 +0000 Subject: [PATCH] Run pgindent over ODBC source. We couldn't do this years ago because we weren't the master source. We are now, and it really needs it. --- src/interfaces/odbc/bind.c | 341 +-- src/interfaces/odbc/bind.h | 53 +- src/interfaces/odbc/columninfo.c | 91 +- src/interfaces/odbc/columninfo.h | 33 +- src/interfaces/odbc/connection.c | 1310 +++++----- src/interfaces/odbc/connection.h | 221 +- src/interfaces/odbc/convert.c | 1878 +++++++------- src/interfaces/odbc/convert.h | 73 +- src/interfaces/odbc/dlg_specific.c | 987 ++++---- src/interfaces/odbc/dlg_specific.h | 130 +- src/interfaces/odbc/drvconn.c | 342 +-- src/interfaces/odbc/environ.c | 731 +++--- src/interfaces/odbc/environ.h | 23 +- src/interfaces/odbc/execute.c | 617 +++-- src/interfaces/odbc/gpps.c | 348 ++- src/interfaces/odbc/gpps.h | 33 +- src/interfaces/odbc/info.c | 3630 +++++++++++++++------------- src/interfaces/odbc/iodbc.h | 128 +- src/interfaces/odbc/isql.h | 333 +-- src/interfaces/odbc/isqlext.h | 1330 +++++----- src/interfaces/odbc/lobj.c | 98 +- src/interfaces/odbc/lobj.h | 36 +- src/interfaces/odbc/misc.c | 147 +- src/interfaces/odbc/misc.h | 78 +- src/interfaces/odbc/options.c | 910 +++---- src/interfaces/odbc/parse.c | 572 +++-- src/interfaces/odbc/pgtypes.c | 1142 +++++---- src/interfaces/odbc/pgtypes.h | 127 +- src/interfaces/odbc/psqlodbc.c | 93 +- src/interfaces/odbc/psqlodbc.h | 156 +- src/interfaces/odbc/qresult.c | 521 ++-- src/interfaces/odbc/qresult.h | 127 +- src/interfaces/odbc/resource.h | 98 +- src/interfaces/odbc/results.c | 1190 +++++---- src/interfaces/odbc/setup.c | 604 ++--- src/interfaces/odbc/socket.c | 269 ++- src/interfaces/odbc/socket.h | 53 +- src/interfaces/odbc/statement.c | 745 +++--- src/interfaces/odbc/statement.h | 219 +- src/interfaces/odbc/tuple.c | 44 +- src/interfaces/odbc/tuple.h | 35 +- src/interfaces/odbc/tuplelist.c | 186 +- src/interfaces/odbc/tuplelist.h | 29 +- src/tools/pgindent/README | 2 +- 44 files changed, 10952 insertions(+), 9161 deletions(-) diff --git a/src/interfaces/odbc/bind.c b/src/interfaces/odbc/bind.c index ce25c4a1c3..5589db9737 100644 --- a/src/interfaces/odbc/bind.c +++ b/src/interfaces/odbc/bind.c @@ -1,14 +1,14 @@ -/* Module: bind.c +/* Module: bind.c * - * Description: This module contains routines related to binding - * columns and parameters. + * Description: This module contains routines related to binding + * columns and parameters. * - * Classes: BindInfoClass, ParameterInfoClass + * Classes: BindInfoClass, ParameterInfoClass * - * API functions: SQLBindParameter, SQLBindCol, SQLDescribeParam, SQLNumParams, - * SQLParamOptions(NI) + * API functions: SQLBindParameter, SQLBindCol, SQLDescribeParam, SQLNumParams, + * SQLParamOptions(NI) * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -33,39 +33,44 @@ #include "sqlext.h" #endif -/* Bind parameters on a statement handle */ - -RETCODE SQL_API SQLBindParameter( - HSTMT hstmt, - UWORD ipar, - SWORD fParamType, - SWORD fCType, - SWORD fSqlType, - UDWORD cbColDef, - SWORD ibScale, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR *pcbValue) +/* Bind parameters on a statement handle */ + +RETCODE SQL_API +SQLBindParameter( + HSTMT hstmt, + UWORD ipar, + SWORD fParamType, + SWORD fCType, + SWORD fSqlType, + UDWORD cbColDef, + SWORD ibScale, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue) { -StatementClass *stmt = (StatementClass *) hstmt; -static char *func="SQLBindParameter"; + StatementClass *stmt = (StatementClass *) hstmt; + static char *func = "SQLBindParameter"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if(stmt->parameters_allocated < ipar) { + if (stmt->parameters_allocated < ipar) + { ParameterInfoClass *old_parameters; - int i, old_parameters_allocated; + int i, + old_parameters_allocated; old_parameters = stmt->parameters; old_parameters_allocated = stmt->parameters_allocated; - stmt->parameters = (ParameterInfoClass *) malloc(sizeof(ParameterInfoClass)*(ipar)); - if ( ! stmt->parameters) { + stmt->parameters = (ParameterInfoClass *) malloc(sizeof(ParameterInfoClass) * (ipar)); + if (!stmt->parameters) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Could not allocate memory for statement parameters"; SC_log_error(func, "", stmt); @@ -75,18 +80,23 @@ static char *func="SQLBindParameter"; stmt->parameters_allocated = ipar; /* copy the old parameters over */ - for(i = 0; i < old_parameters_allocated; i++) { + for (i = 0; i < old_parameters_allocated; i++) + { /* a structure copy should work */ stmt->parameters[i] = old_parameters[i]; } /* get rid of the old parameters, if there were any */ - if(old_parameters) + if (old_parameters) free(old_parameters); - /* zero out the newly allocated parameters (in case they skipped some, */ + /* + * zero out the newly allocated parameters (in case they skipped + * some, + */ /* so we don't accidentally try to use them later) */ - for(; i < stmt->parameters_allocated; i++) { + for (; i < stmt->parameters_allocated; i++) + { stmt->parameters[i].buflen = 0; stmt->parameters[i].buffer = 0; stmt->parameters[i].used = 0; @@ -102,7 +112,8 @@ static char *func="SQLBindParameter"; } } - ipar--; /* use zero based column numbers for the below part */ + ipar--; /* use zero based column numbers for the + * below part */ /* store the given info */ stmt->parameters[ipar].buflen = cbValueMax; @@ -114,74 +125,84 @@ static char *func="SQLBindParameter"; stmt->parameters[ipar].precision = cbColDef; stmt->parameters[ipar].scale = ibScale; - /* If rebinding a parameter that had data-at-exec stuff in it, - then free that stuff - */ - if (stmt->parameters[ipar].EXEC_used) { + /* + * If rebinding a parameter that had data-at-exec stuff in it, then + * free that stuff + */ + if (stmt->parameters[ipar].EXEC_used) + { free(stmt->parameters[ipar].EXEC_used); stmt->parameters[ipar].EXEC_used = NULL; } - if (stmt->parameters[ipar].EXEC_buffer) { + if (stmt->parameters[ipar].EXEC_buffer) + { if (stmt->parameters[ipar].SQLType != SQL_LONGVARBINARY) free(stmt->parameters[ipar].EXEC_buffer); stmt->parameters[ipar].EXEC_buffer = NULL; } - /* Data at exec macro only valid for C char/binary data */ + /* Data at exec macro only valid for C char/binary data */ if ((fSqlType == SQL_LONGVARBINARY || fSqlType == SQL_LONGVARCHAR) && pcbValue && *pcbValue <= SQL_LEN_DATA_AT_EXEC_OFFSET) stmt->parameters[ipar].data_at_exec = TRUE; else stmt->parameters[ipar].data_at_exec = FALSE; - mylog("SQLBindParamater: ipar=%d, paramType=%d, fCType=%d, fSqlType=%d, cbColDef=%d, ibScale=%d, rgbValue=%d, *pcbValue = %d, data_at_exec = %d\n", ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, pcbValue ? *pcbValue: -777, stmt->parameters[ipar].data_at_exec); + mylog("SQLBindParamater: ipar=%d, paramType=%d, fCType=%d, fSqlType=%d, cbColDef=%d, ibScale=%d, rgbValue=%d, *pcbValue = %d, data_at_exec = %d\n", ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, pcbValue ? *pcbValue : -777, stmt->parameters[ipar].data_at_exec); return SQL_SUCCESS; } -/* - - - - - - - - - */ - -/* Associate a user-supplied buffer with a database column. */ -RETCODE SQL_API SQLBindCol( - HSTMT hstmt, - UWORD icol, - SWORD fCType, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR *pcbValue) +/* - - - - - - - - - */ + +/* Associate a user-supplied buffer with a database column. */ +RETCODE SQL_API +SQLBindCol( + HSTMT hstmt, + UWORD icol, + SWORD fCType, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue) { -StatementClass *stmt = (StatementClass *) hstmt; -static char *func="SQLBindCol"; + StatementClass *stmt = (StatementClass *) hstmt; + static char *func = "SQLBindCol"; + + mylog("%s: entering...\n", func); - mylog( "%s: entering...\n", func); - -mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol); + mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } SC_clear_error(stmt); - - if( stmt->status == STMT_EXECUTING) { + + if (stmt->status == STMT_EXECUTING) + { stmt->errormsg = "Can't bind columns while statement is still executing."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - /* If the bookmark column is being bound, then just save it */ - if (icol == 0) { + /* If the bookmark column is being bound, then just save it */ + if (icol == 0) + { - if (rgbValue == NULL) { + if (rgbValue == NULL) + { stmt->bookmark.buffer = NULL; stmt->bookmark.used = NULL; } - else { - /* Make sure it is the bookmark data type */ - if ( fCType != SQL_C_BOOKMARK) { + else + { + /* Make sure it is the bookmark data type */ + if (fCType != SQL_C_BOOKMARK) + { stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; SC_log_error(func, "", stmt); @@ -194,37 +215,42 @@ mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol); return SQL_SUCCESS; } - /* allocate enough bindings if not already done */ - /* Most likely, execution of a statement would have setup the */ - /* necessary bindings. But some apps call BindCol before any */ - /* statement is executed. */ - if ( icol > stmt->bindings_allocated) + /* allocate enough bindings if not already done */ + /* Most likely, execution of a statement would have setup the */ + /* necessary bindings. But some apps call BindCol before any */ + /* statement is executed. */ + if (icol > stmt->bindings_allocated) extend_bindings(stmt, icol); - /* check to see if the bindings were allocated */ - if ( ! stmt->bindings) { + /* check to see if the bindings were allocated */ + if (!stmt->bindings) + { stmt->errormsg = "Could not allocate memory for bindings."; stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - icol--; /* use zero based col numbers from here out */ + icol--; /* use zero based col numbers from here + * out */ - /* Reset for SQLGetData */ + /* Reset for SQLGetData */ stmt->bindings[icol].data_left = -1; - if (rgbValue == NULL) { + if (rgbValue == NULL) + { /* we have to unbind the column */ stmt->bindings[icol].buflen = 0; stmt->bindings[icol].buffer = NULL; - stmt->bindings[icol].used = NULL; + stmt->bindings[icol].used = NULL; stmt->bindings[icol].returntype = SQL_C_CHAR; - } else { + } + else + { /* ok, bind that column */ - stmt->bindings[icol].buflen = cbValueMax; - stmt->bindings[icol].buffer = rgbValue; - stmt->bindings[icol].used = pcbValue; + stmt->bindings[icol].buflen = cbValueMax; + stmt->bindings[icol].buffer = rgbValue; + stmt->bindings[icol].used = pcbValue; stmt->bindings[icol].returntype = fCType; mylog(" bound buffer[%d] = %u\n", icol, stmt->bindings[icol].buffer); @@ -233,34 +259,37 @@ mylog("**** SQLBindCol: stmt = %u, icol = %d\n", stmt, icol); return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Returns the description of a parameter marker. */ +/* Returns the description of a parameter marker. */ /* This function is listed as not being supported by SQLGetFunctions() because it is */ /* used to describe "parameter markers" (not bound parameters), in which case, */ /* the dbms should return info on the markers. Since Postgres doesn't support that, */ /* it is best to say this function is not supported and let the application assume a */ /* data type (most likely varchar). */ -RETCODE SQL_API SQLDescribeParam( - HSTMT hstmt, - UWORD ipar, - SWORD FAR *pfSqlType, - UDWORD FAR *pcbColDef, - SWORD FAR *pibScale, - SWORD FAR *pfNullable) +RETCODE SQL_API +SQLDescribeParam( + HSTMT hstmt, + UWORD ipar, + SWORD FAR * pfSqlType, + UDWORD FAR * pcbColDef, + SWORD FAR * pibScale, + SWORD FAR * pfNullable) { -StatementClass *stmt = (StatementClass *) hstmt; -static char *func = "SQLDescribeParam"; + StatementClass *stmt = (StatementClass *) hstmt; + static char *func = "SQLDescribeParam"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if( (ipar < 1) || (ipar > stmt->parameters_allocated) ) { + if ((ipar < 1) || (ipar > stmt->parameters_allocated)) + { stmt->errormsg = "Invalid parameter number for SQLDescribeParam."; stmt->errornumber = STMT_BAD_PARAMETER_NUMBER_ERROR; SC_log_error(func, "", stmt); @@ -269,41 +298,45 @@ static char *func = "SQLDescribeParam"; ipar--; - /* This implementation is not very good, since it is supposed to describe */ - /* parameter markers, not bound parameters. */ - if(pfSqlType) + /* + * This implementation is not very good, since it is supposed to + * describe + */ + /* parameter markers, not bound parameters. */ + if (pfSqlType) *pfSqlType = stmt->parameters[ipar].SQLType; - if(pcbColDef) + if (pcbColDef) *pcbColDef = stmt->parameters[ipar].precision; - if(pibScale) + if (pibScale) *pibScale = stmt->parameters[ipar].scale; - if(pfNullable) + if (pfNullable) *pfNullable = pgtype_nullable(stmt, stmt->parameters[ipar].paramType); return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Sets multiple values (arrays) for the set of parameter markers. */ +/* Sets multiple values (arrays) for the set of parameter markers. */ -RETCODE SQL_API SQLParamOptions( - HSTMT hstmt, - UDWORD crow, - UDWORD FAR *pirow) +RETCODE SQL_API +SQLParamOptions( + HSTMT hstmt, + UDWORD crow, + UDWORD FAR * pirow) { -static char *func = "SQLParamOptions"; + static char *func = "SQLParamOptions"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); return SQL_ERROR; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ /* This function should really talk to the dbms to determine the number of */ /* "parameter markers" (not bound parameters) in the statement. But, since */ @@ -312,43 +345,51 @@ static char *func = "SQLParamOptions"; /* like it does for SQLDescribeParam is that some applications don't care and try */ /* to call it anyway. */ /* If the statement does not have parameters, it should just return 0. */ -RETCODE SQL_API SQLNumParams( - HSTMT hstmt, - SWORD FAR *pcpar) +RETCODE SQL_API +SQLNumParams( + HSTMT hstmt, + SWORD FAR * pcpar) { -StatementClass *stmt = (StatementClass *) hstmt; -char in_quote = FALSE; -unsigned int i; -static char *func = "SQLNumParams"; + StatementClass *stmt = (StatementClass *) hstmt; + char in_quote = FALSE; + unsigned int i; + static char *func = "SQLNumParams"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if(!stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } if (pcpar) *pcpar = 0; - else { + else + { SC_log_error(func, "pcpar was null", stmt); return SQL_ERROR; } - if(!stmt->statement) { + if (!stmt->statement) + { /* no statement has been allocated */ stmt->errormsg = "SQLNumParams called with no statement ready."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; - } else { + } + else + { - for(i=0; i < strlen(stmt->statement); i++) { + for (i = 0; i < strlen(stmt->statement); i++) + { - if(stmt->statement[i] == '?' && !in_quote) + if (stmt->statement[i] == '?' && !in_quote) (*pcpar)++; - else { + else + { if (stmt->statement[i] == '\'') in_quote = (in_quote ? FALSE : TRUE); } @@ -359,20 +400,20 @@ static char *func = "SQLNumParams"; } /******************************************************************** - * Bindings Implementation + * Bindings Implementation */ BindInfoClass * create_empty_bindings(int num_columns) { -BindInfoClass *new_bindings; -int i; + BindInfoClass *new_bindings; + int i; - new_bindings = (BindInfoClass *)malloc(num_columns * sizeof(BindInfoClass)); - if(!new_bindings) { + new_bindings = (BindInfoClass *) malloc(num_columns * sizeof(BindInfoClass)); + if (!new_bindings) return 0; - } - for(i=0; i < num_columns; i++) { + for (i = 0; i < num_columns; i++) + { new_bindings[i].buflen = 0; new_bindings[i].buffer = NULL; new_bindings[i].used = NULL; @@ -383,23 +424,26 @@ int i; } void -extend_bindings(StatementClass *stmt, int num_columns) +extend_bindings(StatementClass * stmt, int num_columns) { -static char *func="extend_bindings"; -BindInfoClass *new_bindings; -int i; + static char *func = "extend_bindings"; + BindInfoClass *new_bindings; + int i; -mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func, stmt, stmt->bindings_allocated, num_columns); + mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func, stmt, stmt->bindings_allocated, num_columns); /* if we have too few, allocate room for more, and copy the old */ /* entries into the new structure */ - if(stmt->bindings_allocated < num_columns) { + if (stmt->bindings_allocated < num_columns) + { new_bindings = create_empty_bindings(num_columns); - if ( ! new_bindings) { - mylog("%s: unable to create %d new bindings from %d old bindings\n", func, num_columns, stmt->bindings_allocated); + if (!new_bindings) + { + mylog("%s: unable to create %d new bindings from %d old bindings\n", func, num_columns, stmt->bindings_allocated); - if (stmt->bindings) { + if (stmt->bindings) + { free(stmt->bindings); stmt->bindings = NULL; } @@ -407,8 +451,9 @@ mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func, return; } - if(stmt->bindings) { - for(i=0; ibindings_allocated; i++) + if (stmt->bindings) + { + for (i = 0; i < stmt->bindings_allocated; i++) new_bindings[i] = stmt->bindings[i]; free(stmt->bindings); @@ -417,14 +462,14 @@ mylog("%s: entering ... stmt=%u, bindings_allocated=%d, num_columns=%d\n", func, stmt->bindings = new_bindings; stmt->bindings_allocated = num_columns; - } - /* There is no reason to zero out extra bindings if there are */ - /* more than needed. If an app has allocated extra bindings, */ - /* let it worry about it by unbinding those columns. */ + } + /* There is no reason to zero out extra bindings if there are */ + /* more than needed. If an app has allocated extra bindings, */ + /* let it worry about it by unbinding those columns. */ - /* SQLBindCol(1..) ... SQLBindCol(10...) # got 10 bindings */ - /* SQLExecDirect(...) # returns 5 cols */ - /* SQLExecDirect(...) # returns 10 cols (now OK) */ + /* SQLBindCol(1..) ... SQLBindCol(10...) # got 10 bindings */ + /* SQLExecDirect(...) # returns 5 cols */ + /* SQLExecDirect(...) # returns 10 cols (now OK) */ mylog("exit extend_bindings\n"); } diff --git a/src/interfaces/odbc/bind.h b/src/interfaces/odbc/bind.h index 39e594f346..11ac37a0af 100644 --- a/src/interfaces/odbc/bind.h +++ b/src/interfaces/odbc/bind.h @@ -1,9 +1,9 @@ -/* File: bind.h +/* File: bind.h * - * Description: See "bind.c" + * Description: See "bind.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -15,33 +15,40 @@ /* * BindInfoClass -- stores information about a bound column */ -struct BindInfoClass_ { - Int4 buflen; /* size of buffer */ - Int4 data_left; /* amount of data left to read (SQLGetData) */ - char *buffer; /* pointer to the buffer */ - Int4 *used; /* used space in the buffer (for strings not counting the '\0') */ - Int2 returntype; /* kind of conversion to be applied when returning (SQL_C_DEFAULT, SQL_C_CHAR...) */ +struct BindInfoClass_ +{ + Int4 buflen; /* size of buffer */ + Int4 data_left; /* amount of data left to read + * (SQLGetData) */ + char *buffer; /* pointer to the buffer */ + Int4 *used; /* used space in the buffer (for strings + * not counting the '\0') */ + Int2 returntype; /* kind of conversion to be applied when + * returning (SQL_C_DEFAULT, + * SQL_C_CHAR...) */ }; /* * ParameterInfoClass -- stores information about a bound parameter */ -struct ParameterInfoClass_ { - Int4 buflen; - char *buffer; - Int4 *used; - Int2 paramType; - Int2 CType; - Int2 SQLType; - UInt4 precision; - Int2 scale; - Oid lobj_oid; - Int4 *EXEC_used; /* amount of data OR the oid of the large object */ - char *EXEC_buffer; /* the data or the FD of the large object */ - char data_at_exec; +struct ParameterInfoClass_ +{ + Int4 buflen; + char *buffer; + Int4 *used; + Int2 paramType; + Int2 CType; + Int2 SQLType; + UInt4 precision; + Int2 scale; + Oid lobj_oid; + Int4 *EXEC_used; /* amount of data OR the oid of the large + * object */ + char *EXEC_buffer; /* the data or the FD of the large object */ + char data_at_exec; }; BindInfoClass *create_empty_bindings(int num_columns); -void extend_bindings(StatementClass *stmt, int num_columns); +void extend_bindings(StatementClass * stmt, int num_columns); #endif diff --git a/src/interfaces/odbc/columninfo.c b/src/interfaces/odbc/columninfo.c index 75fdd9f4f6..4969846e14 100644 --- a/src/interfaces/odbc/columninfo.c +++ b/src/interfaces/odbc/columninfo.c @@ -1,13 +1,13 @@ -/* Module: columninfo.c +/* Module: columninfo.c * - * Description: This module contains routines related to - * reading and storing the field information from a query. + * Description: This module contains routines related to + * reading and storing the field information from a query. * - * Classes: ColumnInfoClass (Functions prefix: "CI_") + * Classes: ColumnInfoClass (Functions prefix: "CI_") * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -20,11 +20,12 @@ ColumnInfoClass * CI_Constructor() { -ColumnInfoClass *rv; + ColumnInfoClass *rv; rv = (ColumnInfoClass *) malloc(sizeof(ColumnInfoClass)); - if (rv) { + if (rv) + { rv->num_fields = 0; rv->name = NULL; rv->adtid = NULL; @@ -37,28 +38,28 @@ ColumnInfoClass *rv; } void -CI_Destructor(ColumnInfoClass *self) +CI_Destructor(ColumnInfoClass * self) { CI_free_memory(self); free(self); } -/* Read in field descriptions. - If self is not null, then also store the information. +/* Read in field descriptions. + If self is not null, then also store the information. If self is null, then just read, don't store. */ char -CI_read_fields(ColumnInfoClass *self, ConnectionClass *conn) +CI_read_fields(ColumnInfoClass * self, ConnectionClass * conn) { -Int2 lf; -int new_num_fields; -Oid new_adtid; -Int2 new_adtsize; -Int4 new_atttypmod = -1; -char new_field_name[MAX_MESSAGE_LEN+1]; -SocketClass *sock; -ConnInfo *ci; + Int2 lf; + int new_num_fields; + Oid new_adtid; + Int2 new_adtsize; + Int4 new_atttypmod = -1; + char new_field_name[MAX_MESSAGE_LEN + 1]; + SocketClass *sock; + ConnInfo *ci; sock = CC_get_socket(conn); ci = &conn->connInfo; @@ -68,24 +69,27 @@ ConnInfo *ci; mylog("num_fields = %d\n", new_num_fields); - if (self) { /* according to that allocate memory */ + if (self) + { /* according to that allocate memory */ CI_set_num_fields(self, new_num_fields); } /* now read in the descriptions */ - for(lf = 0; lf < new_num_fields; lf++) { + for (lf = 0; lf < new_num_fields; lf++) + { SOCK_get_string(sock, new_field_name, MAX_MESSAGE_LEN); new_adtid = (Oid) SOCK_get_int(sock, 4); new_adtsize = (Int2) SOCK_get_int(sock, 2); - /* If 6.4 protocol, then read the atttypmod field */ - if (PG_VERSION_GE(conn, 6.4)) { + /* If 6.4 protocol, then read the atttypmod field */ + if (PG_VERSION_GE(conn, 6.4)) + { mylog("READING ATTTYPMOD\n"); new_atttypmod = (Int4) SOCK_get_int(sock, 4); - /* Subtract the header length */ + /* Subtract the header length */ new_atttypmod -= 4; if (new_atttypmod < 0) new_atttypmod = -1; @@ -104,17 +108,18 @@ ConnInfo *ci; void -CI_free_memory(ColumnInfoClass *self) +CI_free_memory(ColumnInfoClass * self) { -register Int2 lf; -int num_fields = self->num_fields; + register Int2 lf; + int num_fields = self->num_fields; - for (lf = 0; lf < num_fields; lf++) { - if( self->name[lf]) - free (self->name[lf]); + for (lf = 0; lf < num_fields; lf++) + { + if (self->name[lf]) + free(self->name[lf]); } - /* Safe to call even if null */ + /* Safe to call even if null */ free(self->name); free(self->adtid); free(self->adtsize); @@ -124,35 +129,33 @@ int num_fields = self->num_fields; } void -CI_set_num_fields(ColumnInfoClass *self, int new_num_fields) +CI_set_num_fields(ColumnInfoClass * self, int new_num_fields) { - CI_free_memory(self); /* always safe to call */ + CI_free_memory(self); /* always safe to call */ self->num_fields = new_num_fields; - self->name = (char **) malloc (sizeof(char *) * self->num_fields); - self->adtid = (Oid *) malloc (sizeof(Oid) * self->num_fields); - self->adtsize = (Int2 *) malloc (sizeof(Int2) * self->num_fields); + self->name = (char **) malloc(sizeof(char *) * self->num_fields); + self->adtid = (Oid *) malloc(sizeof(Oid) * self->num_fields); + self->adtsize = (Int2 *) malloc(sizeof(Int2) * self->num_fields); self->display_size = (Int2 *) malloc(sizeof(Int2) * self->num_fields); self->atttypmod = (Int4 *) malloc(sizeof(Int4) * self->num_fields); } void -CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name, - Oid new_adtid, Int2 new_adtsize, Int4 new_atttypmod) +CI_set_field_info(ColumnInfoClass * self, int field_num, char *new_name, + Oid new_adtid, Int2 new_adtsize, Int4 new_atttypmod) { - + /* check bounds */ - if((field_num < 0) || (field_num >= self->num_fields)) { + if ((field_num < 0) || (field_num >= self->num_fields)) return; - } /* store the info */ - self->name[field_num] = strdup(new_name); + self->name[field_num] = strdup(new_name); self->adtid[field_num] = new_adtid; self->adtsize[field_num] = new_adtsize; self->atttypmod[field_num] = new_atttypmod; self->display_size[field_num] = 0; } - diff --git a/src/interfaces/odbc/columninfo.h b/src/interfaces/odbc/columninfo.h index 3ec1cc92d5..43b21473b7 100644 --- a/src/interfaces/odbc/columninfo.h +++ b/src/interfaces/odbc/columninfo.h @@ -1,9 +1,9 @@ -/* File: columninfo.h +/* File: columninfo.h * - * Description: See "columninfo.c" + * Description: See "columninfo.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -12,13 +12,14 @@ #include "psqlodbc.h" -struct ColumnInfoClass_ { - Int2 num_fields; - char **name; /* list of type names */ - Oid *adtid; /* list of type ids */ - Int2 *adtsize; /* list type sizes */ - Int2 *display_size; /* the display size (longest row) */ - Int4 *atttypmod; /* the length of bpchar/varchar */ +struct ColumnInfoClass_ +{ + Int2 num_fields; + char **name; /* list of type names */ + Oid *adtid; /* list of type ids */ + Int2 *adtsize; /* list type sizes */ + Int2 *display_size; /* the display size (longest row) */ + Int4 *atttypmod; /* the length of bpchar/varchar */ }; #define CI_get_num_fields(self) (self->num_fields) @@ -29,15 +30,15 @@ struct ColumnInfoClass_ { #define CI_get_atttypmod(self, col) (self->atttypmod[col]) ColumnInfoClass *CI_Constructor(void); -void CI_Destructor(ColumnInfoClass *self); -void CI_free_memory(ColumnInfoClass *self); -char CI_read_fields(ColumnInfoClass *self, ConnectionClass *conn); +void CI_Destructor(ColumnInfoClass * self); +void CI_free_memory(ColumnInfoClass * self); +char CI_read_fields(ColumnInfoClass * self, ConnectionClass * conn); /* functions for setting up the fields from within the program, */ /* without reading from a socket */ -void CI_set_num_fields(ColumnInfoClass *self, int new_num_fields); -void CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name, - Oid new_adtid, Int2 new_adtsize, Int4 atttypmod); +void CI_set_num_fields(ColumnInfoClass * self, int new_num_fields); +void CI_set_field_info(ColumnInfoClass * self, int field_num, char *new_name, + Oid new_adtid, Int2 new_adtsize, Int4 atttypmod); #endif diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c index cc09c4aa2f..aa283f4882 100644 --- a/src/interfaces/odbc/connection.c +++ b/src/interfaces/odbc/connection.c @@ -1,14 +1,14 @@ -/* Module: connection.c +/* Module: connection.c * - * Description: This module contains routines related to - * connecting to and disconnecting from the Postgres DBMS. + * Description: This module contains routines related to + * connecting to and disconnecting from the Postgres DBMS. * - * Classes: ConnectionClass (Functions prefix: "CC_") + * Classes: ConnectionClass (Functions prefix: "CC_") * - * API functions: SQLAllocConnect, SQLConnect, SQLDisconnect, SQLFreeConnect, - * SQLBrowseConnect(NI) + * API functions: SQLAllocConnect, SQLConnect, SQLDisconnect, SQLFreeConnect, + * SQLBrowseConnect(NI) * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -26,67 +26,73 @@ #include #endif -#define STMT_INCREMENT 16 /* how many statement holders to allocate at a time */ +#define STMT_INCREMENT 16 /* how many statement holders to allocate + * at a time */ #define PRN_NULLCHECK extern GLOBAL_VALUES globals; -RETCODE SQL_API SQLAllocConnect( - HENV henv, - HDBC FAR *phdbc) +RETCODE SQL_API +SQLAllocConnect( + HENV henv, + HDBC FAR * phdbc) { -EnvironmentClass *env = (EnvironmentClass *)henv; -ConnectionClass *conn; -static char *func="SQLAllocConnect"; + EnvironmentClass *env = (EnvironmentClass *) henv; + ConnectionClass *conn; + static char *func = "SQLAllocConnect"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); conn = CC_Constructor(); mylog("**** %s: henv = %u, conn = %u\n", func, henv, conn); - if( ! conn) { - env->errormsg = "Couldn't allocate memory for Connection object."; - env->errornumber = ENV_ALLOC_ERROR; + if (!conn) + { + env->errormsg = "Couldn't allocate memory for Connection object."; + env->errornumber = ENV_ALLOC_ERROR; *phdbc = SQL_NULL_HDBC; EN_log_error(func, "", env); - return SQL_ERROR; - } + return SQL_ERROR; + } - if ( ! EN_add_connection(env, conn)) { - env->errormsg = "Maximum number of connections exceeded."; - env->errornumber = ENV_ALLOC_ERROR; - CC_Destructor(conn); + if (!EN_add_connection(env, conn)) + { + env->errormsg = "Maximum number of connections exceeded."; + env->errornumber = ENV_ALLOC_ERROR; + CC_Destructor(conn); *phdbc = SQL_NULL_HDBC; EN_log_error(func, "", env); - return SQL_ERROR; - } + return SQL_ERROR; + } *phdbc = (HDBC) conn; - return SQL_SUCCESS; + return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLConnect( - HDBC hdbc, - UCHAR FAR *szDSN, - SWORD cbDSN, - UCHAR FAR *szUID, - SWORD cbUID, - UCHAR FAR *szAuthStr, - SWORD cbAuthStr) +RETCODE SQL_API +SQLConnect( + HDBC hdbc, + UCHAR FAR * szDSN, + SWORD cbDSN, + UCHAR FAR * szUID, + SWORD cbUID, + UCHAR FAR * szAuthStr, + SWORD cbAuthStr) { -ConnectionClass *conn = (ConnectionClass *) hdbc; -ConnInfo *ci; -static char *func = "SQLConnect"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + ConnInfo *ci; + static char *func = "SQLConnect"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if ( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -95,14 +101,15 @@ static char *func = "SQLConnect"; make_string(szDSN, cbDSN, ci->dsn); - /* get the values for the DSN from the registry */ + /* get the values for the DSN from the registry */ getDSNinfo(ci, CONN_OVERWRITE); - /* initialize pg_version from connInfo.protocol */ - CC_initialize_pg_version(conn); - - /* override values from DSN info with UID and authStr(pwd) - This only occurs if the values are actually there. - */ + /* initialize pg_version from connInfo.protocol */ + CC_initialize_pg_version(conn); + + /* + * override values from DSN info with UID and authStr(pwd) This only + * occurs if the values are actually there. + */ make_string(szUID, cbUID, ci->username); make_string(szAuthStr, cbAuthStr, ci->password); @@ -111,54 +118,59 @@ static char *func = "SQLConnect"; qlog("conn = %u, %s(DSN='%s', UID='%s', PWD='%s')\n", conn, func, ci->dsn, ci->username, ci->password); - if ( CC_connect(conn, FALSE) <= 0) { - /* Error messages are filled in */ + if (CC_connect(conn, FALSE) <= 0) + { + /* Error messages are filled in */ CC_log_error(func, "Error on CC_connect", conn); return SQL_ERROR; } - mylog( "%s: returning...\n", func); + mylog("%s: returning...\n", func); return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLBrowseConnect( - HDBC hdbc, - UCHAR FAR *szConnStrIn, - SWORD cbConnStrIn, - UCHAR FAR *szConnStrOut, - SWORD cbConnStrOutMax, - SWORD FAR *pcbConnStrOut) +RETCODE SQL_API +SQLBrowseConnect( + HDBC hdbc, + UCHAR FAR * szConnStrIn, + SWORD cbConnStrIn, + UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, + SWORD FAR * pcbConnStrOut) { -static char *func="SQLBrowseConnect"; + static char *func = "SQLBrowseConnect"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ /* Drop any hstmts open on hdbc and disconnect from database */ -RETCODE SQL_API SQLDisconnect( - HDBC hdbc) +RETCODE SQL_API +SQLDisconnect( + HDBC hdbc) { -ConnectionClass *conn = (ConnectionClass *) hdbc; -static char *func = "SQLDisconnect"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + static char *func = "SQLDisconnect"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if ( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } qlog("conn=%u, %s\n", conn, func); - if (conn->status == CONN_EXECUTING) { + if (conn->status == CONN_EXECUTING) + { conn->errornumber = CONN_IN_USE; conn->errormsg = "A transaction is currently being executed"; CC_log_error(func, "", conn); @@ -167,7 +179,7 @@ static char *func = "SQLDisconnect"; mylog("%s: about to CC_cleanup\n", func); - /* Close the connection and free statements */ + /* Close the connection and free statements */ CC_cleanup(conn); mylog("%s: done CC_cleanup\n", func); @@ -177,24 +189,27 @@ static char *func = "SQLDisconnect"; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLFreeConnect( - HDBC hdbc) +RETCODE SQL_API +SQLFreeConnect( + HDBC hdbc) { -ConnectionClass *conn = (ConnectionClass *) hdbc; -static char *func = "SQLFreeConnect"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + static char *func = "SQLFreeConnect"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); mylog("**** in %s: hdbc=%u\n", func, hdbc); - if ( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - /* Remove the connection from the environment */ - if ( ! EN_remove_connection(conn->henv, conn)) { + /* Remove the connection from the environment */ + if (!EN_remove_connection(conn->henv, conn)) + { conn->errornumber = CONN_IN_USE; conn->errormsg = "A transaction is currently being executed"; CC_log_error(func, "", conn); @@ -211,35 +226,37 @@ static char *func = "SQLFreeConnect"; /* * -* IMPLEMENTATION CONNECTION CLASS +* IMPLEMENTATION CONNECTION CLASS * */ -ConnectionClass *CC_Constructor() +ConnectionClass * +CC_Constructor() { -ConnectionClass *rv; + ConnectionClass *rv; - rv = (ConnectionClass *)malloc(sizeof(ConnectionClass)); + rv = (ConnectionClass *) malloc(sizeof(ConnectionClass)); - if (rv != NULL) { + if (rv != NULL) + { - rv->henv = NULL; /* not yet associated with an environment */ + rv->henv = NULL; /* not yet associated with an environment */ - rv->errormsg = NULL; - rv->errornumber = 0; + rv->errormsg = NULL; + rv->errornumber = 0; rv->errormsg_created = FALSE; - rv->status = CONN_NOT_CONNECTED; - rv->transact_status = CONN_IN_AUTOCOMMIT; /* autocommit by default */ + rv->status = CONN_NOT_CONNECTED; + rv->transact_status = CONN_IN_AUTOCOMMIT; /* autocommit by default */ memset(&rv->connInfo, 0, sizeof(ConnInfo)); rv->sock = SOCK_Constructor(); - if ( ! rv->sock) + if (!rv->sock) return NULL; - rv->stmts = (StatementClass **) malloc( sizeof(StatementClass *) * STMT_INCREMENT); - if ( ! rv->stmts) + rv->stmts = (StatementClass **) malloc(sizeof(StatementClass *) * STMT_INCREMENT); + if (!rv->stmts) return NULL; memset(rv->stmts, 0, sizeof(StatementClass *) * STMT_INCREMENT); @@ -259,18 +276,18 @@ ConnectionClass *rv; rv->pg_version_major = 0; rv->pg_version_minor = 0; - /* Initialize statement options to defaults */ - /* Statements under this conn will inherit these options */ + /* Initialize statement options to defaults */ + /* Statements under this conn will inherit these options */ InitializeStatementOptions(&rv->stmtOptions); - } - return rv; + } + return rv; } char -CC_Destructor(ConnectionClass *self) +CC_Destructor(ConnectionClass * self) { mylog("enter CC_Destructor, self=%u\n", self); @@ -278,22 +295,27 @@ CC_Destructor(ConnectionClass *self) if (self->status == CONN_EXECUTING) return 0; - CC_cleanup(self); /* cleanup socket and statements */ + CC_cleanup(self); /* cleanup socket and statements */ mylog("after CC_Cleanup\n"); - /* Free up statement holders */ - if (self->stmts) { + /* Free up statement holders */ + if (self->stmts) + { free(self->stmts); self->stmts = NULL; } mylog("after free statement holders\n"); - /* Free cached table info */ - if (self->col_info) { - int i; - for (i = 0; i < self->ntables; i++) { - if (self->col_info[i]->result) /* Free the SQLColumns result structure */ + /* Free cached table info */ + if (self->col_info) + { + int i; + + for (i = 0; i < self->ntables; i++) + { + if (self->col_info[i]->result) /* Free the SQLColumns + * result structure */ QR_Destructor(self->col_info[i]->result); free(self->col_info[i]); @@ -310,14 +332,16 @@ CC_Destructor(ConnectionClass *self) /* Return how many cursors are opened on this connection */ int -CC_cursor_count(ConnectionClass *self) +CC_cursor_count(ConnectionClass * self) { -StatementClass *stmt; -int i, count = 0; + StatementClass *stmt; + int i, + count = 0; mylog("CC_cursor_count: self=%u, num_stmts=%d\n", self, self->num_stmts); - for (i = 0; i < self->num_stmts; i++) { + for (i = 0; i < self->num_stmts; i++) + { stmt = self->stmts[i]; if (stmt && stmt->result && stmt->result->cursor) count++; @@ -328,22 +352,23 @@ int i, count = 0; return count; } -void -CC_clear_error(ConnectionClass *self) +void +CC_clear_error(ConnectionClass * self) { - self->errornumber = 0; - self->errormsg = NULL; + self->errornumber = 0; + self->errormsg = NULL; self->errormsg_created = FALSE; } /* Used to cancel a transaction */ /* We are almost always in the middle of a transaction. */ char -CC_abort(ConnectionClass *self) +CC_abort(ConnectionClass * self) { -QResultClass *res; + QResultClass *res; - if ( CC_is_in_trans(self)) { + if (CC_is_in_trans(self)) + { res = NULL; mylog("CC_abort: sending ABORT!\n"); @@ -363,10 +388,10 @@ QResultClass *res; /* This is called by SQLDisconnect also */ char -CC_cleanup(ConnectionClass *self) +CC_cleanup(ConnectionClass * self) { -int i; -StatementClass *stmt; + int i; + StatementClass *stmt; if (self->status == CONN_EXECUTING) return FALSE; @@ -381,28 +406,32 @@ StatementClass *stmt; mylog("after CC_abort\n"); - /* This actually closes the connection to the dbase */ - if (self->sock) { - SOCK_Destructor(self->sock); + /* This actually closes the connection to the dbase */ + if (self->sock) + { + SOCK_Destructor(self->sock); self->sock = NULL; } mylog("after SOCK destructor\n"); - /* Free all the stmts on this connection */ - for (i = 0; i < self->num_stmts; i++) { + /* Free all the stmts on this connection */ + for (i = 0; i < self->num_stmts; i++) + { stmt = self->stmts[i]; - if (stmt) { + if (stmt) + { stmt->hdbc = NULL; /* prevent any more dbase interactions */ SC_Destructor(stmt); self->stmts[i] = NULL; } } - /* Check for translation dll */ + /* Check for translation dll */ #ifdef WIN32 - if ( self->translation_handle) { - FreeLibrary (self->translation_handle); + if (self->translation_handle) + { + FreeLibrary(self->translation_handle); self->translation_handle = NULL; } #endif @@ -412,37 +441,40 @@ StatementClass *stmt; } int -CC_set_translation (ConnectionClass *self) +CC_set_translation(ConnectionClass * self) { #ifdef WIN32 - if (self->translation_handle != NULL) { - FreeLibrary (self->translation_handle); + if (self->translation_handle != NULL) + { + FreeLibrary(self->translation_handle); self->translation_handle = NULL; } if (self->connInfo.translation_dll[0] == 0) return TRUE; - self->translation_option = atoi (self->connInfo.translation_option); - self->translation_handle = LoadLibrary (self->connInfo.translation_dll); + self->translation_option = atoi(self->connInfo.translation_option); + self->translation_handle = LoadLibrary(self->connInfo.translation_dll); - if (self->translation_handle == NULL) { + if (self->translation_handle == NULL) + { self->errornumber = CONN_UNABLE_TO_LOAD_DLL; self->errormsg = "Could not load the translation DLL."; return FALSE; } self->DataSourceToDriver - = (DataSourceToDriverProc) GetProcAddress (self->translation_handle, + = (DataSourceToDriverProc) GetProcAddress(self->translation_handle, "SQLDataSourceToDriver"); self->DriverToDataSource - = (DriverToDataSourceProc) GetProcAddress (self->translation_handle, + = (DriverToDataSourceProc) GetProcAddress(self->translation_handle, "SQLDriverToDataSource"); - if (self->DataSourceToDriver == NULL || self->DriverToDataSource == NULL) { + if (self->DataSourceToDriver == NULL || self->DriverToDataSource == NULL) + { self->errornumber = CONN_UNABLE_TO_LOAD_DLL; self->errormsg = "Could not find translation DLL functions."; return FALSE; @@ -451,54 +483,57 @@ CC_set_translation (ConnectionClass *self) return TRUE; } -char -CC_connect(ConnectionClass *self, char do_password) +char +CC_connect(ConnectionClass * self, char do_password) { -StartupPacket sp; -QResultClass *res; -SocketClass *sock; -ConnInfo *ci = &(self->connInfo); -int areq = -1; -int beresp; -char msgbuffer[ERROR_MSG_LENGTH]; -char salt[2]; -static char *func="CC_connect"; + StartupPacket sp; + QResultClass *res; + SocketClass *sock; + ConnInfo *ci = &(self->connInfo); + int areq = -1; + int beresp; + char msgbuffer[ERROR_MSG_LENGTH]; + char salt[2]; + static char *func = "CC_connect"; mylog("%s: entering...\n", func); - if ( do_password) + if (do_password) sock = self->sock; /* already connected, just authenticate */ - else { + else + { qlog("Global Options: Version='%s', fetch=%d, socket=%d, unknown_sizes=%d, max_varchar_size=%d, max_longvarchar_size=%d\n", - POSTGRESDRIVERVERSION, - globals.fetch_max, - globals.socket_buffersize, - globals.unknown_sizes, - globals.max_varchar_size, - globals.max_longvarchar_size); + POSTGRESDRIVERVERSION, + globals.fetch_max, + globals.socket_buffersize, + globals.unknown_sizes, + globals.max_varchar_size, + globals.max_longvarchar_size); qlog(" disable_optimizer=%d, ksqo=%d, unique_index=%d, use_declarefetch=%d\n", - globals.disable_optimizer, - globals.ksqo, - globals.unique_index, - globals.use_declarefetch); + globals.disable_optimizer, + globals.ksqo, + globals.unique_index, + globals.use_declarefetch); qlog(" text_as_longvarchar=%d, unknowns_as_longvarchar=%d, bools_as_char=%d\n", - globals.text_as_longvarchar, - globals.unknowns_as_longvarchar, - globals.bools_as_char); + globals.text_as_longvarchar, + globals.unknowns_as_longvarchar, + globals.bools_as_char); qlog(" extra_systable_prefixes='%s', conn_settings='%s'\n", - globals.extra_systable_prefixes, - globals.conn_settings); + globals.extra_systable_prefixes, + globals.conn_settings); - if (self->status != CONN_NOT_CONNECTED) { + if (self->status != CONN_NOT_CONNECTED) + { self->errormsg = "Already connected."; self->errornumber = CONN_OPENDB_ERROR; return 0; } - if ( ci->server[0] == '\0' || ci->port[0] == '\0' || ci->database[0] == '\0') { + if (ci->server[0] == '\0' || ci->port[0] == '\0' || ci->database[0] == '\0') + { self->errornumber = CONN_INIREAD_ERROR; self->errormsg = "Missing server name, port, or database name in call to CC_connect."; return 0; @@ -506,15 +541,18 @@ static char *func="CC_connect"; mylog("CC_connect(): DSN = '%s', server = '%s', port = '%s', database = '%s', username = '%s', password='%s'\n", ci->dsn, ci->server, ci->port, ci->database, ci->username, ci->password); - /* If the socket was closed for some reason (like a SQLDisconnect, but no SQLFreeConnect - then create a socket now. - */ - if ( ! self->sock) { + /* + * If the socket was closed for some reason (like a SQLDisconnect, + * but no SQLFreeConnect then create a socket now. + */ + if (!self->sock) + { self->sock = SOCK_Constructor(); - if ( ! self->sock) { - self->errornumber = CONNECTION_SERVER_NOT_REACHED; - self->errormsg = "Could not open a socket to the server"; - return 0; + if (!self->sock) + { + self->errornumber = CONNECTION_SERVER_NOT_REACHED; + self->errormsg = "Could not open a socket to the server"; + return 0; } } @@ -523,7 +561,8 @@ static char *func="CC_connect"; mylog("connecting to the server socket...\n"); SOCK_connect_to(sock, (short) atoi(ci->port), ci->server); - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { mylog("connection to the server socket failed.\n"); self->errornumber = CONNECTION_SERVER_NOT_REACHED; self->errormsg = "Could not connect to the server"; @@ -536,7 +575,7 @@ static char *func="CC_connect"; mylog("sizeof startup packet = %d\n", sizeof(StartupPacket)); /* Send length of Authentication Block */ - SOCK_put_int(sock, 4+sizeof(StartupPacket), 4); + SOCK_put_int(sock, 4 + sizeof(StartupPacket), 4); sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_LATEST); @@ -548,7 +587,8 @@ static char *func="CC_connect"; mylog("sent the authentication block.\n"); - if (sock->errornumber != 0) { + if (sock->errornumber != 0) + { mylog("couldn't send the authentication block properly.\n"); self->errornumber = CONN_INVALID_AUTHENTICATION; self->errormsg = "Sending the authentication packet failed"; @@ -561,100 +601,107 @@ static char *func="CC_connect"; /* *************************************************** */ - /* Now get the authentication request from backend */ + /* Now get the authentication request from backend */ /* *************************************************** */ - do { + do + { if (do_password) beresp = 'R'; else beresp = SOCK_get_char(sock); - switch(beresp) { - case 'E': - mylog("auth got 'E'\n"); + switch (beresp) + { + case 'E': + mylog("auth got 'E'\n"); - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - self->errornumber = CONN_INVALID_AUTHENTICATION; - self->errormsg = msgbuffer; - qlog("ERROR from backend during authentication: '%s'\n", self->errormsg); - return 0; - case 'R': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + self->errornumber = CONN_INVALID_AUTHENTICATION; + self->errormsg = msgbuffer; + qlog("ERROR from backend during authentication: '%s'\n", self->errormsg); + return 0; + case 'R': - if (do_password) { - mylog("in 'R' do_password\n"); - areq = AUTH_REQ_PASSWORD; - do_password = FALSE; - } - else { - mylog("auth got 'R'\n"); + if (do_password) + { + mylog("in 'R' do_password\n"); + areq = AUTH_REQ_PASSWORD; + do_password = FALSE; + } + else + { + mylog("auth got 'R'\n"); - areq = SOCK_get_int(sock, 4); - if (areq == AUTH_REQ_CRYPT) - SOCK_get_n_char(sock, salt, 2); + areq = SOCK_get_int(sock, 4); + if (areq == AUTH_REQ_CRYPT) + SOCK_get_n_char(sock, salt, 2); - mylog("areq = %d\n", areq); - } - switch(areq) { - case AUTH_REQ_OK: - break; + mylog("areq = %d\n", areq); + } + switch (areq) + { + case AUTH_REQ_OK: + break; - case AUTH_REQ_KRB4: - self->errormsg = "Kerberos 4 authentication not supported"; - self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; - return 0; + case AUTH_REQ_KRB4: + self->errormsg = "Kerberos 4 authentication not supported"; + self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + return 0; - case AUTH_REQ_KRB5: - self->errormsg = "Kerberos 5 authentication not supported"; - self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; - return 0; + case AUTH_REQ_KRB5: + self->errormsg = "Kerberos 5 authentication not supported"; + self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + return 0; - case AUTH_REQ_PASSWORD: - mylog("in AUTH_REQ_PASSWORD\n"); + case AUTH_REQ_PASSWORD: + mylog("in AUTH_REQ_PASSWORD\n"); - if (ci->password[0] == '\0') { - self->errornumber = CONNECTION_NEED_PASSWORD; - self->errormsg = "A password is required for this connection."; - return -1; /* need password */ - } + if (ci->password[0] == '\0') + { + self->errornumber = CONNECTION_NEED_PASSWORD; + self->errormsg = "A password is required for this connection."; + return -1; /* need password */ + } - mylog("past need password\n"); + mylog("past need password\n"); - SOCK_put_int(sock, 4+strlen(ci->password)+1, 4); - SOCK_put_n_char(sock, ci->password, strlen(ci->password) + 1); - SOCK_flush_output(sock); + SOCK_put_int(sock, 4 + strlen(ci->password) + 1, 4); + SOCK_put_n_char(sock, ci->password, strlen(ci->password) + 1); + SOCK_flush_output(sock); - mylog("past flush\n"); - break; + mylog("past flush\n"); + break; - case AUTH_REQ_CRYPT: - self->errormsg = "Password crypt authentication not supported"; - self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; - return 0; + case AUTH_REQ_CRYPT: + self->errormsg = "Password crypt authentication not supported"; + self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + return 0; + default: + self->errormsg = "Unknown authentication type"; + self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + return 0; + } + break; default: - self->errormsg = "Unknown authentication type"; - self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + self->errormsg = "Unexpected protocol character during authentication"; + self->errornumber = CONN_INVALID_AUTHENTICATION; return 0; - } - break; - default: - self->errormsg = "Unexpected protocol character during authentication"; - self->errornumber = CONN_INVALID_AUTHENTICATION; - return 0; } - } while (areq != AUTH_REQ_OK); + } while (areq != AUTH_REQ_OK); - CC_clear_error(self); /* clear any password error */ + CC_clear_error(self); /* clear any password error */ /* send an empty query in order to find out whether the specified */ /* database really exists on the server machine */ mylog("sending an empty query...\n"); res = CC_send_query(self, " ", NULL); - if ( res == NULL || QR_get_status(res) != PGRES_EMPTY_QUERY) { + if (res == NULL || QR_get_status(res) != PGRES_EMPTY_QUERY) + { mylog("got no result from the empty query. (probably database does not exist)\n"); self->errornumber = CONNECTION_NO_SUCH_DATABASE; self->errormsg = "The database does not exist on the server\nor user authentication failed."; @@ -667,21 +714,25 @@ static char *func="CC_connect"; mylog("empty query seems to be OK.\n"); - CC_set_translation (self); + CC_set_translation(self); /**********************************************/ /******* Send any initial settings *********/ /**********************************************/ - /* Since these functions allocate statements, and since the connection is not - established yet, it would violate odbc state transition rules. Therefore, - these functions call the corresponding local function instead. - */ + /* + * Since these functions allocate statements, and since the connection + * is not established yet, it would violate odbc state transition + * rules. Therefore, these functions call the corresponding local + * function instead. + */ CC_send_settings(self); - CC_lookup_lo(self); /* a hack to get the oid of our large object oid type */ - CC_lookup_pg_version(self); /* Get PostgreSQL version for SQLGetInfo use */ + CC_lookup_lo(self); /* a hack to get the oid of our large + * object oid type */ + CC_lookup_pg_version(self); /* Get PostgreSQL version for SQLGetInfo + * use */ - CC_clear_error(self); /* clear any initial command errors */ + CC_clear_error(self); /* clear any initial command errors */ self->status = CONN_CONNECTED; mylog("%s: returning...\n", func); @@ -691,14 +742,16 @@ static char *func="CC_connect"; } char -CC_add_statement(ConnectionClass *self, StatementClass *stmt) +CC_add_statement(ConnectionClass * self, StatementClass * stmt) { -int i; + int i; mylog("CC_add_statement: self=%u, stmt=%u\n", self, stmt); - for (i = 0; i < self->num_stmts; i++) { - if ( ! self->stmts[i]) { + for (i = 0; i < self->num_stmts; i++) + { + if (!self->stmts[i]) + { stmt->hdbc = self; self->stmts[i] = stmt; return TRUE; @@ -706,8 +759,8 @@ int i; } /* no more room -- allocate more memory */ - self->stmts = (StatementClass **) realloc( self->stmts, sizeof(StatementClass *) * (STMT_INCREMENT + self->num_stmts)); - if ( ! self->stmts) + self->stmts = (StatementClass **) realloc(self->stmts, sizeof(StatementClass *) * (STMT_INCREMENT + self->num_stmts)); + if (!self->stmts) return FALSE; memset(&self->stmts[self->num_stmts], 0, sizeof(StatementClass *) * STMT_INCREMENT); @@ -720,13 +773,15 @@ int i; return TRUE; } -char -CC_remove_statement(ConnectionClass *self, StatementClass *stmt) +char +CC_remove_statement(ConnectionClass * self, StatementClass * stmt) { -int i; + int i; - for (i = 0; i < self->num_stmts; i++) { - if (self->stmts[i] == stmt && stmt->status != STMT_EXECUTING) { + for (i = 0; i < self->num_stmts; i++) + { + if (self->stmts[i] == stmt && stmt->status != STMT_EXECUTING) + { self->stmts[i] = NULL; return TRUE; } @@ -739,11 +794,11 @@ int i; error message with its socket error message. */ char * -CC_create_errormsg(ConnectionClass *self) +CC_create_errormsg(ConnectionClass * self) { -SocketClass *sock = self->sock; -int pos; -static char msg[4096]; + SocketClass *sock = self->sock; + int pos; + static char msg[4096]; mylog("enter CC_create_errormsg\n"); @@ -754,7 +809,8 @@ static char msg[4096]; mylog("msg = '%s'\n", msg); - if (sock && sock->errormsg && sock->errormsg[0] != '\0') { + if (sock && sock->errormsg && sock->errormsg[0] != '\0') + { pos = strlen(msg); sprintf(&msg[pos], ";\n%s", sock->errormsg); } @@ -764,20 +820,22 @@ static char msg[4096]; } -char -CC_get_error(ConnectionClass *self, int *number, char **message) +char +CC_get_error(ConnectionClass * self, int *number, char **message) { -int rv; + int rv; mylog("enter CC_get_error\n"); - /* Create a very informative errormsg if it hasn't been done yet. */ - if ( ! self->errormsg_created) { + /* Create a very informative errormsg if it hasn't been done yet. */ + if (!self->errormsg_created) + { self->errormsg = CC_create_errormsg(self); self->errormsg_created = TRUE; } - if (self->errornumber) { + if (self->errornumber) + { *number = self->errornumber; *message = self->errormsg; } @@ -796,25 +854,29 @@ int rv; needs to be re-filled). The "cursor" is used by SQLExecute to associate a statement handle as the cursor name - (i.e., C3326857) for SQL select statements. This cursor is then used in future + (i.e., C3326857) for SQL select statements. This cursor is then used in future 'declare cursor C3326857 for ...' and 'fetch 100 in C3326857' statements. */ QResultClass * -CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi) +CC_send_query(ConnectionClass * self, char *query, QueryInfo * qi) { -QResultClass *result_in, *res = NULL; -char swallow; -int id; -SocketClass *sock = self->sock; -static char msgbuffer[MAX_MESSAGE_LEN+1]; -char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont need static */ + QResultClass *result_in, + *res = NULL; + char swallow; + int id; + SocketClass *sock = self->sock; + static char msgbuffer[MAX_MESSAGE_LEN + 1]; + char cmdbuffer[MAX_MESSAGE_LEN + 1]; /* QR_set_command() dups + * this string so dont + * need static */ mylog("send_query(): conn=%u, query='%s'\n", self, query); qlog("conn=%u, query='%s'\n", self, query); /* Indicate that we are sending a query to the backend */ - if(strlen(query) > MAX_MESSAGE_LEN-2) { + if (strlen(query) > MAX_MESSAGE_LEN - 2) + { self->errornumber = CONNECTION_MSG_TOO_LONG; self->errormsg = "Query string is too long"; return NULL; @@ -823,7 +885,8 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont if ((NULL == query) || (query[0] == '\0')) return NULL; - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { self->errornumber = CONNECTION_COULD_NOT_SEND; self->errormsg = "Could not send Query to backend"; CC_set_no_trans(self); @@ -831,7 +894,8 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont } SOCK_put_char(sock, 'Q'); - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { self->errornumber = CONNECTION_COULD_NOT_SEND; self->errormsg = "Could not send Query to backend"; CC_set_no_trans(self); @@ -841,7 +905,8 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont SOCK_put_string(sock, query); SOCK_flush_output(sock); - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { self->errornumber = CONNECTION_COULD_NOT_SEND; self->errormsg = "Could not send Query to backend"; CC_set_no_trans(self); @@ -850,11 +915,13 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont mylog("send_query: done sending query\n"); - while(1) { + while (1) + { /* what type of message is coming now ? */ id = SOCK_get_char(sock); - if ((SOCK_get_errcode(sock) != 0) || (id == EOF)) { + if ((SOCK_get_errcode(sock) != 0) || (id == EOF)) + { self->errornumber = CONNECTION_NO_RESPONSE; self->errormsg = "No response from the backend"; if (res) @@ -867,211 +934,237 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont mylog("send_query: got id = '%c'\n", id); - switch (id) { - case 'A' : /* Asynchronous Messages are ignored */ - (void)SOCK_get_int(sock, 4); /* id of notification */ - SOCK_get_string(sock, msgbuffer, MAX_MESSAGE_LEN); - /* name of the relation the message comes from */ - break; - case 'C' : /* portal query command, no tuples returned */ - /* read in the return message from the backend */ - SOCK_get_string(sock, cmdbuffer, MAX_MESSAGE_LEN); - if (SOCK_get_errcode(sock) != 0) { - self->errornumber = CONNECTION_NO_RESPONSE; - self->errormsg = "No response from backend while receiving a portal query command"; - mylog("send_query: 'C' - %s\n", self->errormsg); - CC_set_no_trans(self); - return NULL; - } else { - - char clear = 0; - - mylog("send_query: ok - 'C' - %s\n", cmdbuffer); - - if (res == NULL) /* allow for "show" style notices */ - res = QR_Constructor(); - - mylog("send_query: setting cmdbuffer = '%s'\n", cmdbuffer); - - /* Only save the first command */ - QR_set_status(res, PGRES_COMMAND_OK); - QR_set_command(res, cmdbuffer); - - /* (Quotation from the original comments) - since backend may produce more than one result for some commands - we need to poll until clear - so we send an empty query, and keep reading out of the pipe - until an 'I' is received - */ - - SOCK_put_string(sock, "Q "); - SOCK_flush_output(sock); - - while( ! clear) { - id = SOCK_get_char(sock); - switch(id) { - case 'I': - (void) SOCK_get_char(sock); - clear = TRUE; - break; - case 'Z': - break; - case 'C': - SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); - qlog("Command response: '%s'\n", cmdbuffer); - break; - case 'N': - SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); - qlog("NOTICE from backend during clear: '%s'\n", cmdbuffer); - break; - case 'E': - SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); - qlog("ERROR from backend during clear: '%s'\n", cmdbuffer); - /* We must report this type of error as well - (practically for reference integrity violation - error reporting, from PostgreSQL 7.0). - (Zoltan Kovacs, 04/26/2000) - */ - self->errormsg = cmdbuffer; - if ( ! strncmp(self->errormsg, "FATAL", 5)) { - self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; - CC_set_no_trans(self); - } - else - self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; - QR_set_status(res, PGRES_NONFATAL_ERROR); - break; + switch (id) + { + case 'A': /* Asynchronous Messages are ignored */ + (void) SOCK_get_int(sock, 4); /* id of notification */ + SOCK_get_string(sock, msgbuffer, MAX_MESSAGE_LEN); + /* name of the relation the message comes from */ + break; + case 'C': /* portal query command, no tuples + * returned */ + /* read in the return message from the backend */ + SOCK_get_string(sock, cmdbuffer, MAX_MESSAGE_LEN); + if (SOCK_get_errcode(sock) != 0) + { + self->errornumber = CONNECTION_NO_RESPONSE; + self->errormsg = "No response from backend while receiving a portal query command"; + mylog("send_query: 'C' - %s\n", self->errormsg); + CC_set_no_trans(self); + return NULL; + } + else + { + + char clear = 0; + + mylog("send_query: ok - 'C' - %s\n", cmdbuffer); + + if (res == NULL) /* allow for "show" style notices */ + res = QR_Constructor(); + + mylog("send_query: setting cmdbuffer = '%s'\n", cmdbuffer); + + /* Only save the first command */ + QR_set_status(res, PGRES_COMMAND_OK); + QR_set_command(res, cmdbuffer); + + /* + * (Quotation from the original comments) since + * backend may produce more than one result for some + * commands we need to poll until clear so we send an + * empty query, and keep reading out of the pipe until + * an 'I' is received + */ + + SOCK_put_string(sock, "Q "); + SOCK_flush_output(sock); + + while (!clear) + { + id = SOCK_get_char(sock); + switch (id) + { + case 'I': + (void) SOCK_get_char(sock); + clear = TRUE; + break; + case 'Z': + break; + case 'C': + SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); + qlog("Command response: '%s'\n", cmdbuffer); + break; + case 'N': + SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); + qlog("NOTICE from backend during clear: '%s'\n", cmdbuffer); + break; + case 'E': + SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); + qlog("ERROR from backend during clear: '%s'\n", cmdbuffer); + + /* + * We must report this type of error as + * well (practically for reference + * integrity violation error reporting, + * from PostgreSQL 7.0). (Zoltan Kovacs, + * 04/26/2000) + */ + self->errormsg = cmdbuffer; + if (!strncmp(self->errormsg, "FATAL", 5)) + { + self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; + CC_set_no_trans(self); + } + else + self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; + QR_set_status(res, PGRES_NONFATAL_ERROR); + break; + } } + + mylog("send_query: returning res = %u\n", res); + return res; } - - mylog("send_query: returning res = %u\n", res); - return res; - } - case 'K': /* Secret key (6.4 protocol) */ - (void)SOCK_get_int(sock, 4); /* pid */ - (void)SOCK_get_int(sock, 4); /* key */ + case 'K': /* Secret key (6.4 protocol) */ + (void) SOCK_get_int(sock, 4); /* pid */ + (void) SOCK_get_int(sock, 4); /* key */ - break; - case 'Z': /* Backend is ready for new query (6.4) */ - break; - case 'N' : /* NOTICE: */ - SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); + break; + case 'Z': /* Backend is ready for new query (6.4) */ + break; + case 'N': /* NOTICE: */ + SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH); - res = QR_Constructor(); - QR_set_status(res, PGRES_NONFATAL_ERROR); - QR_set_notice(res, cmdbuffer); /* will dup this string */ + res = QR_Constructor(); + QR_set_status(res, PGRES_NONFATAL_ERROR); + QR_set_notice(res, cmdbuffer); /* will dup this string */ - mylog("~~~ NOTICE: '%s'\n", cmdbuffer); - qlog("NOTICE from backend during send_query: '%s'\n", cmdbuffer); + mylog("~~~ NOTICE: '%s'\n", cmdbuffer); + qlog("NOTICE from backend during send_query: '%s'\n", cmdbuffer); - continue; /* dont return a result -- continue reading */ + continue; /* dont return a result -- continue + * reading */ - case 'I' : /* The server sends an empty query */ + case 'I': /* The server sends an empty query */ /* There is a closing '\0' following the 'I', so we eat it */ - swallow = SOCK_get_char(sock); - if ((swallow != '\0') || SOCK_get_errcode(sock) != 0) { - self->errornumber = CONNECTION_BACKEND_CRAZY; - self->errormsg = "Unexpected protocol character from backend (send_query - I)"; - res = QR_Constructor(); - QR_set_status(res, PGRES_FATAL_ERROR); - return res; - } else { - /* We return the empty query */ - res = QR_Constructor(); - QR_set_status(res, PGRES_EMPTY_QUERY); - return res; - } - break; - case 'E' : - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - - /* Remove a newline */ - if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer)-1] == '\n') - msgbuffer[strlen(msgbuffer)-1] = '\0'; + swallow = SOCK_get_char(sock); + if ((swallow != '\0') || SOCK_get_errcode(sock) != 0) + { + self->errornumber = CONNECTION_BACKEND_CRAZY; + self->errormsg = "Unexpected protocol character from backend (send_query - I)"; + res = QR_Constructor(); + QR_set_status(res, PGRES_FATAL_ERROR); + return res; + } + else + { + /* We return the empty query */ + res = QR_Constructor(); + QR_set_status(res, PGRES_EMPTY_QUERY); + return res; + } + break; + case 'E': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - self->errormsg = msgbuffer; + /* Remove a newline */ + if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer) - 1] == '\n') + msgbuffer[strlen(msgbuffer) - 1] = '\0'; - mylog("send_query: 'E' - %s\n", self->errormsg); - qlog("ERROR from backend during send_query: '%s'\n", self->errormsg); + self->errormsg = msgbuffer; - /* We should report that an error occured. Zoltan */ - res = QR_Constructor(); + mylog("send_query: 'E' - %s\n", self->errormsg); + qlog("ERROR from backend during send_query: '%s'\n", self->errormsg); - if ( ! strncmp(self->errormsg, "FATAL", 5)) { - self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; - CC_set_no_trans(self); - QR_set_status(res, PGRES_FATAL_ERROR); - } - else { - self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; - QR_set_status(res, PGRES_NONFATAL_ERROR); - } + /* We should report that an error occured. Zoltan */ + res = QR_Constructor(); - return res; /* instead of NULL. Zoltan */ + if (!strncmp(self->errormsg, "FATAL", 5)) + { + self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; + CC_set_no_trans(self); + QR_set_status(res, PGRES_FATAL_ERROR); + } + else + { + self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; + QR_set_status(res, PGRES_NONFATAL_ERROR); + } - case 'P' : /* get the Portal name */ - SOCK_get_string(sock, msgbuffer, MAX_MESSAGE_LEN); - break; - case 'T': /* Tuple results start here */ - result_in = qi ? qi->result_in : NULL; + return res; /* instead of NULL. Zoltan */ - if ( result_in == NULL) { - result_in = QR_Constructor(); - mylog("send_query: 'T' no result_in: res = %u\n", result_in); - if ( ! result_in) { - self->errornumber = CONNECTION_COULD_NOT_RECEIVE; - self->errormsg = "Could not create result info in send_query."; - return NULL; - } + case 'P': /* get the Portal name */ + SOCK_get_string(sock, msgbuffer, MAX_MESSAGE_LEN); + break; + case 'T': /* Tuple results start here */ + result_in = qi ? qi->result_in : NULL; + + if (result_in == NULL) + { + result_in = QR_Constructor(); + mylog("send_query: 'T' no result_in: res = %u\n", result_in); + if (!result_in) + { + self->errornumber = CONNECTION_COULD_NOT_RECEIVE; + self->errormsg = "Could not create result info in send_query."; + return NULL; + } - if (qi) - QR_set_cache_size(result_in, qi->row_size); + if (qi) + QR_set_cache_size(result_in, qi->row_size); - if ( ! QR_fetch_tuples(result_in, self, qi ? qi->cursor : NULL)) { - self->errornumber = CONNECTION_COULD_NOT_RECEIVE; - self->errormsg = QR_get_message(result_in); - return NULL; + if (!QR_fetch_tuples(result_in, self, qi ? qi->cursor : NULL)) + { + self->errornumber = CONNECTION_COULD_NOT_RECEIVE; + self->errormsg = QR_get_message(result_in); + return NULL; + } } - } - else { /* next fetch, so reuse an existing result */ - if ( ! QR_fetch_tuples(result_in, NULL, NULL)) { - self->errornumber = CONNECTION_COULD_NOT_RECEIVE; - self->errormsg = QR_get_message(result_in); - return NULL; + else + { /* next fetch, so reuse an existing result */ + if (!QR_fetch_tuples(result_in, NULL, NULL)) + { + self->errornumber = CONNECTION_COULD_NOT_RECEIVE; + self->errormsg = QR_get_message(result_in); + return NULL; + } } - } - return result_in; - case 'D': /* Copy in command began successfully */ - res = QR_Constructor(); - QR_set_status(res, PGRES_COPY_IN); - return res; - case 'B': /* Copy out command began successfully */ - res = QR_Constructor(); - QR_set_status(res, PGRES_COPY_OUT); - return res; - default: - self->errornumber = CONNECTION_BACKEND_CRAZY; - self->errormsg = "Unexpected protocol character from backend (send_query)"; - CC_set_no_trans(self); + return result_in; + case 'D': /* Copy in command began successfully */ + res = QR_Constructor(); + QR_set_status(res, PGRES_COPY_IN); + return res; + case 'B': /* Copy out command began successfully */ + res = QR_Constructor(); + QR_set_status(res, PGRES_COPY_OUT); + return res; + default: + self->errornumber = CONNECTION_BACKEND_CRAZY; + self->errormsg = "Unexpected protocol character from backend (send_query)"; + CC_set_no_trans(self); - mylog("send_query: error - %s\n", self->errormsg); - return NULL; + mylog("send_query: error - %s\n", self->errormsg); + return NULL; } } } int -CC_send_function(ConnectionClass *self, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG *args, int nargs) +CC_send_function(ConnectionClass * self, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG * args, int nargs) { -char id, c, done; -SocketClass *sock = self->sock; -static char msgbuffer[MAX_MESSAGE_LEN+1]; -int i; + char id, + c, + done; + SocketClass *sock = self->sock; + static char msgbuffer[MAX_MESSAGE_LEN + 1]; + int i; mylog("send_function(): conn=%u, fnid=%d, result_is_int=%d, nargs=%d\n", self, fnid, result_is_int, nargs); - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { self->errornumber = CONNECTION_COULD_NOT_SEND; self->errormsg = "Could not send function to backend"; CC_set_no_trans(self); @@ -1079,24 +1172,26 @@ int i; } SOCK_put_string(sock, "F "); - if (SOCK_get_errcode(sock) != 0) { + if (SOCK_get_errcode(sock) != 0) + { self->errornumber = CONNECTION_COULD_NOT_SEND; self->errormsg = "Could not send function to backend"; CC_set_no_trans(self); return FALSE; } - SOCK_put_int(sock, fnid, 4); - SOCK_put_int(sock, nargs, 4); + SOCK_put_int(sock, fnid, 4); + SOCK_put_int(sock, nargs, 4); mylog("send_function: done sending function\n"); - for (i = 0; i < nargs; ++i) { + for (i = 0; i < nargs; ++i) + { mylog(" arg[%d]: len = %d, isint = %d, integer = %d, ptr = %u\n", i, args[i].len, args[i].isint, args[i].u.integer, args[i].u.ptr); SOCK_put_int(sock, args[i].len, 4); - if (args[i].isint) + if (args[i].isint) SOCK_put_int(sock, args[i].u.integer, 4); else SOCK_put_n_char(sock, (char *) args[i].u.ptr, args[i].len); @@ -1108,159 +1203,169 @@ int i; mylog(" after flush output\n"); done = FALSE; - while ( ! done) { + while (!done) + { id = SOCK_get_char(sock); mylog(" got id = %c\n", id); - switch(id) { - case 'V': - done = TRUE; - break; /* ok */ + switch (id) + { + case 'V': + done = TRUE; + break; /* ok */ - case 'N': - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - mylog("send_function(V): 'N' - %s\n", msgbuffer); - /* continue reading */ - break; + case 'N': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + mylog("send_function(V): 'N' - %s\n", msgbuffer); + /* continue reading */ + break; - case 'E': - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - self->errormsg = msgbuffer; + case 'E': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + self->errormsg = msgbuffer; - mylog("send_function(V): 'E' - %s\n", self->errormsg); - qlog("ERROR from backend during send_function: '%s'\n", self->errormsg); + mylog("send_function(V): 'E' - %s\n", self->errormsg); + qlog("ERROR from backend during send_function: '%s'\n", self->errormsg); - return FALSE; + return FALSE; - case 'Z': - break; + case 'Z': + break; - default: - self->errornumber = CONNECTION_BACKEND_CRAZY; - self->errormsg = "Unexpected protocol character from backend (send_function, args)"; - CC_set_no_trans(self); + default: + self->errornumber = CONNECTION_BACKEND_CRAZY; + self->errormsg = "Unexpected protocol character from backend (send_function, args)"; + CC_set_no_trans(self); - mylog("send_function: error - %s\n", self->errormsg); - return FALSE; + mylog("send_function: error - %s\n", self->errormsg); + return FALSE; } } id = SOCK_get_char(sock); - for (;;) { - switch (id) { - case 'G': /* function returned properly */ - mylog(" got G!\n"); + for (;;) + { + switch (id) + { + case 'G': /* function returned properly */ + mylog(" got G!\n"); - *actual_result_len = SOCK_get_int(sock, 4); - mylog(" actual_result_len = %d\n", *actual_result_len); + *actual_result_len = SOCK_get_int(sock, 4); + mylog(" actual_result_len = %d\n", *actual_result_len); - if (result_is_int) - *((int *) result_buf) = SOCK_get_int(sock, 4); - else - SOCK_get_n_char(sock, (char *) result_buf, *actual_result_len); + if (result_is_int) + *((int *) result_buf) = SOCK_get_int(sock, 4); + else + SOCK_get_n_char(sock, (char *) result_buf, *actual_result_len); - mylog(" after get result\n"); + mylog(" after get result\n"); - c = SOCK_get_char(sock); /* get the last '0' */ + c = SOCK_get_char(sock); /* get the last '0' */ - mylog(" after get 0\n"); + mylog(" after get 0\n"); - return TRUE; + return TRUE; - case 'E': - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - self->errormsg = msgbuffer; + case 'E': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + self->errormsg = msgbuffer; - mylog("send_function(G): 'E' - %s\n", self->errormsg); - qlog("ERROR from backend during send_function: '%s'\n", self->errormsg); + mylog("send_function(G): 'E' - %s\n", self->errormsg); + qlog("ERROR from backend during send_function: '%s'\n", self->errormsg); - return FALSE; + return FALSE; - case 'N': - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + case 'N': + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - mylog("send_function(G): 'N' - %s\n", msgbuffer); - qlog("NOTICE from backend during send_function: '%s'\n", msgbuffer); + mylog("send_function(G): 'N' - %s\n", msgbuffer); + qlog("NOTICE from backend during send_function: '%s'\n", msgbuffer); - continue; /* dont return a result -- continue reading */ + continue; /* dont return a result -- continue + * reading */ - case '0': /* empty result */ - return TRUE; + case '0': /* empty result */ + return TRUE; - default: - self->errornumber = CONNECTION_BACKEND_CRAZY; - self->errormsg = "Unexpected protocol character from backend (send_function, result)"; - CC_set_no_trans(self); + default: + self->errornumber = CONNECTION_BACKEND_CRAZY; + self->errormsg = "Unexpected protocol character from backend (send_function, result)"; + CC_set_no_trans(self); - mylog("send_function: error - %s\n", self->errormsg); - return FALSE; + mylog("send_function: error - %s\n", self->errormsg); + return FALSE; } } } char -CC_send_settings(ConnectionClass *self) +CC_send_settings(ConnectionClass * self) { - /* char ini_query[MAX_MESSAGE_LEN]; */ -ConnInfo *ci = &(self->connInfo); + /* char ini_query[MAX_MESSAGE_LEN]; */ + ConnInfo *ci = &(self->connInfo); + /* QResultClass *res; */ -HSTMT hstmt; -StatementClass *stmt; -RETCODE result; -char status = TRUE; -char *cs, *ptr; -static char *func="CC_send_settings"; + HSTMT hstmt; + StatementClass *stmt; + RETCODE result; + char status = TRUE; + char *cs, + *ptr; + static char *func = "CC_send_settings"; mylog("%s: entering...\n", func); -/* This function must use the local odbc API functions since the odbc state +/* This function must use the local odbc API functions since the odbc state has not transitioned to "connected" yet. */ - result = SQLAllocStmt( self, &hstmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(self, &hstmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) return FALSE; - } stmt = (StatementClass *) hstmt; - stmt->internal = TRUE; /* ensure no BEGIN/COMMIT/ABORT stuff */ + stmt->internal = TRUE; /* ensure no BEGIN/COMMIT/ABORT stuff */ - /* Set the Datestyle to the format the driver expects it to be in */ + /* Set the Datestyle to the format the driver expects it to be in */ result = SQLExecDirect(hstmt, "set DateStyle to 'ISO'", SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) status = FALSE; mylog("%s: result %d, status %d from set DateStyle\n", func, result, status); - /* Disable genetic optimizer based on global flag */ - if (globals.disable_optimizer) { + /* Disable genetic optimizer based on global flag */ + if (globals.disable_optimizer) + { result = SQLExecDirect(hstmt, "set geqo to 'OFF'", SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) status = FALSE; mylog("%s: result %d, status %d from set geqo\n", func, result, status); - + } - /* KSQO */ - if (globals.ksqo) { + /* KSQO */ + if (globals.ksqo) + { result = SQLExecDirect(hstmt, "set ksqo to 'ON'", SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) status = FALSE; mylog("%s: result %d, status %d from set ksqo\n", func, result, status); - + } - /* Global settings */ - if (globals.conn_settings[0] != '\0') { + /* Global settings */ + if (globals.conn_settings[0] != '\0') + { cs = strdup(globals.conn_settings); ptr = strtok(cs, ";"); - while (ptr) { + while (ptr) + { result = SQLExecDirect(hstmt, ptr, SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) status = FALSE; mylog("%s: result %d, status %d from '%s'\n", func, result, status, ptr); @@ -1270,14 +1375,16 @@ static char *func="CC_send_settings"; free(cs); } - - /* Per Datasource settings */ - if (ci->conn_settings[0] != '\0') { + + /* Per Datasource settings */ + if (ci->conn_settings[0] != '\0') + { cs = strdup(ci->conn_settings); ptr = strtok(cs, ";"); - while (ptr) { + while (ptr) + { result = SQLExecDirect(hstmt, ptr, SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) status = FALSE; mylog("%s: result %d, status %d from '%s'\n", func, result, status, ptr); @@ -1299,38 +1406,40 @@ static char *func="CC_send_settings"; will go away and the define 'PG_TYPE_LO' will be updated. */ void -CC_lookup_lo(ConnectionClass *self) +CC_lookup_lo(ConnectionClass * self) { -HSTMT hstmt; -StatementClass *stmt; -RETCODE result; -static char *func = "CC_lookup_lo"; + HSTMT hstmt; + StatementClass *stmt; + RETCODE result; + static char *func = "CC_lookup_lo"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); -/* This function must use the local odbc API functions since the odbc state +/* This function must use the local odbc API functions since the odbc state has not transitioned to "connected" yet. */ - result = SQLAllocStmt( self, &hstmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(self, &hstmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) return; - } stmt = (StatementClass *) hstmt; result = SQLExecDirect(hstmt, "select oid from pg_type where typname='" PG_TYPE_LO_NAME "'", SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } result = SQLFetch(hstmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } result = SQLGetData(hstmt, 1, SQL_C_SLONG, &self->lobj_type, sizeof(self->lobj_type), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } @@ -1346,53 +1455,57 @@ static char *func = "CC_lookup_lo"; h-inoue 01-2-2001 */ void -CC_initialize_pg_version(ConnectionClass *self) +CC_initialize_pg_version(ConnectionClass * self) { - strcpy(self->pg_version, self->connInfo.protocol); + strcpy(self->pg_version, self->connInfo.protocol); self->pg_version_number = (float) 6.4; self->pg_version_major = 6; self->pg_version_minor = 4; } + /* This function gets the version of PostgreSQL that we're connected to. - This is used to return the correct info in SQLGetInfo + This is used to return the correct info in SQLGetInfo DJP - 25-1-2001 */ void -CC_lookup_pg_version(ConnectionClass *self) +CC_lookup_pg_version(ConnectionClass * self) { -HSTMT hstmt; -StatementClass *stmt; -RETCODE result; -char szVersion[32]; -int major, minor; -static char *func = "CC_lookup_pg_version"; + HSTMT hstmt; + StatementClass *stmt; + RETCODE result; + char szVersion[32]; + int major, + minor; + static char *func = "CC_lookup_pg_version"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); -/* This function must use the local odbc API functions since the odbc state +/* This function must use the local odbc API functions since the odbc state has not transitioned to "connected" yet. */ - result = SQLAllocStmt( self, &hstmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(self, &hstmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) return; - } stmt = (StatementClass *) hstmt; - /* get the server's version if possible */ + /* get the server's version if possible */ result = SQLExecDirect(hstmt, "select version()", SQL_NTS); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } result = SQLFetch(hstmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } result = SQLGetData(hstmt, 1, SQL_C_CHAR, self->pg_version, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { SQLFreeStmt(hstmt, SQL_DROP); return; } @@ -1400,7 +1513,8 @@ static char *func = "CC_lookup_pg_version"; /* Extract the Major and Minor numbers from the string. */ /* This assumes the string starts 'Postgresql X.X' */ strcpy(szVersion, "0.0"); - if (sscanf(self->pg_version, "%*s %d.%d", &major, &minor) >= 2) { + if (sscanf(self->pg_version, "%*s %d.%d", &major, &minor) >= 2) + { sprintf(szVersion, "%d.%d", major, minor); self->pg_version_major = major; self->pg_version_minor = minor; @@ -1416,29 +1530,31 @@ static char *func = "CC_lookup_pg_version"; } void -CC_log_error(char *func, char *desc, ConnectionClass *self) +CC_log_error(char *func, char *desc, ConnectionClass * self) { #ifdef PRN_NULLCHECK #define nullcheck(a) (a ? a : "(NULL)") #endif - if (self) { - qlog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck (self->errormsg)); - mylog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck (self->errormsg)); + if (self) + { + qlog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck(self->errormsg)); + mylog("CONN ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck(self->errormsg)); qlog(" ------------------------------------------------------------\n"); qlog(" henv=%u, conn=%u, status=%u, num_stmts=%d\n", self->henv, self, self->status, self->num_stmts); qlog(" sock=%u, stmts=%u, lobj_type=%d\n", self->sock, self->stmts, self->lobj_type); qlog(" ---------------- Socket Info -------------------------------\n"); - if (self->sock) { - SocketClass *sock = self->sock; - qlog(" socket=%d, reverse=%d, errornumber=%d, errormsg='%s'\n", sock->socket, sock->reverse, sock->errornumber, nullcheck(sock->errormsg)); - qlog(" buffer_in=%u, buffer_out=%u\n", sock->buffer_in, sock->buffer_out); - qlog(" buffer_filled_in=%d, buffer_filled_out=%d, buffer_read_in=%d\n", sock->buffer_filled_in, sock->buffer_filled_out, sock->buffer_read_in); + if (self->sock) + { + SocketClass *sock = self->sock; + + qlog(" socket=%d, reverse=%d, errornumber=%d, errormsg='%s'\n", sock->socket, sock->reverse, sock->errornumber, nullcheck(sock->errormsg)); + qlog(" buffer_in=%u, buffer_out=%u\n", sock->buffer_in, sock->buffer_out); + qlog(" buffer_filled_in=%d, buffer_filled_out=%d, buffer_read_in=%d\n", sock->buffer_filled_in, sock->buffer_filled_out, sock->buffer_read_in); } } else qlog("INVALID CONNECTION HANDLE ERROR: func=%s, desc='%s'\n", func, desc); #undef PRN_NULLCHECK } - diff --git a/src/interfaces/odbc/connection.h b/src/interfaces/odbc/connection.h index 9169583e45..7bd22f0067 100644 --- a/src/interfaces/odbc/connection.h +++ b/src/interfaces/odbc/connection.h @@ -1,9 +1,9 @@ -/* File: connection.h +/* File: connection.h * - * Description: See "connection.c" + * Description: See "connection.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -27,12 +27,15 @@ #endif -typedef enum { - CONN_NOT_CONNECTED, /* Connection has not been established */ - CONN_CONNECTED, /* Connection is up and has been established */ - CONN_DOWN, /* Connection is broken */ - CONN_EXECUTING /* the connection is currently executing a statement */ -} CONN_Status; +typedef enum +{ + CONN_NOT_CONNECTED, /* Connection has not been established */ + CONN_CONNECTED, /* Connection is up and has been + * established */ + CONN_DOWN, /* Connection is broken */ + CONN_EXECUTING /* the connection is currently executing a + * statement */ +} CONN_Status; /* These errors have general sql error state */ #define CONNECTION_SERVER_NOT_REACHED 101 @@ -50,7 +53,7 @@ typedef enum { #define CONN_INIREAD_ERROR 201 #define CONN_OPENDB_ERROR 202 #define CONN_STMT_ALLOC_ERROR 203 -#define CONN_IN_USE 204 +#define CONN_IN_USE 204 #define CONN_UNSUPPORTED_OPTION 205 /* Used by SetConnectoption to indicate unsupported options */ #define CONN_INVALID_ARGUMENT_NO 206 @@ -110,38 +113,39 @@ typedef unsigned int ProtocolVersion; /* This startup packet is to support latest Postgres protocol */ typedef struct _StartupPacket { - ProtocolVersion protoVersion; - char database[SM_DATABASE]; - char user[SM_USER]; - char options[SM_OPTIONS]; - char unused[SM_UNUSED]; - char tty[SM_TTY]; + ProtocolVersion protoVersion; + char database[SM_DATABASE]; + char user[SM_USER]; + char options[SM_OPTIONS]; + char unused[SM_UNUSED]; + char tty[SM_TTY]; } StartupPacket; /* Structure to hold all the connection attributes for a specific connection (used for both registry and file, DSN and DRIVER) */ -typedef struct { - char dsn[MEDIUM_REGISTRY_LEN]; - char desc[MEDIUM_REGISTRY_LEN]; - char driver[MEDIUM_REGISTRY_LEN]; - char server[MEDIUM_REGISTRY_LEN]; - char database[MEDIUM_REGISTRY_LEN]; - char username[MEDIUM_REGISTRY_LEN]; - char password[MEDIUM_REGISTRY_LEN]; - char conn_settings[LARGE_REGISTRY_LEN]; - char protocol[SMALL_REGISTRY_LEN]; - char port[SMALL_REGISTRY_LEN]; - char onlyread[SMALL_REGISTRY_LEN]; - char fake_oid_index[SMALL_REGISTRY_LEN]; - char show_oid_column[SMALL_REGISTRY_LEN]; - char row_versioning[SMALL_REGISTRY_LEN]; - char show_system_tables[SMALL_REGISTRY_LEN]; - char translation_dll[MEDIUM_REGISTRY_LEN]; - char translation_option[SMALL_REGISTRY_LEN]; - char focus_password; -} ConnInfo; +typedef struct +{ + char dsn[MEDIUM_REGISTRY_LEN]; + char desc[MEDIUM_REGISTRY_LEN]; + char driver[MEDIUM_REGISTRY_LEN]; + char server[MEDIUM_REGISTRY_LEN]; + char database[MEDIUM_REGISTRY_LEN]; + char username[MEDIUM_REGISTRY_LEN]; + char password[MEDIUM_REGISTRY_LEN]; + char conn_settings[LARGE_REGISTRY_LEN]; + char protocol[SMALL_REGISTRY_LEN]; + char port[SMALL_REGISTRY_LEN]; + char onlyread[SMALL_REGISTRY_LEN]; + char fake_oid_index[SMALL_REGISTRY_LEN]; + char show_oid_column[SMALL_REGISTRY_LEN]; + char row_versioning[SMALL_REGISTRY_LEN]; + char show_system_tables[SMALL_REGISTRY_LEN]; + char translation_dll[MEDIUM_REGISTRY_LEN]; + char translation_option[SMALL_REGISTRY_LEN]; + char focus_password; +} ConnInfo; /* * Macros to compare the server's version with a specified version @@ -160,15 +164,15 @@ typedef struct { #define SERVER_VERSION_LE(conn, major, minor) (! SERVER_VERSION_GT(conn, major, minor)) #define SERVER_VERSION_LT(conn, major, minor) (! SERVER_VERSION_GE(conn, major, minor)) /*#if ! defined(HAVE_CONFIG_H) || defined(HAVE_STRINGIZE)*/ -#define STRING_AFTER_DOT(string) (strchr(#string, '.') + 1) +#define STRING_AFTER_DOT(string) (strchr(#string, '.') + 1) /*#else -#define STRING_AFTER_DOT(str) (strchr("str", '.') + 1) +#define STRING_AFTER_DOT(str) (strchr("str", '.') + 1) #endif*/ /* * Simplified macros to compare the server's version with a * specified version * Note: Never pass a variable as the second parameter. - * It must be a decimal constant of the form %d.%d . + * It must be a decimal constant of the form %d.%d . */ #define PG_VERSION_GT(conn, ver) \ (SERVER_VERSION_GT(conn, (int) ver, atoi(STRING_AFTER_DOT(ver)))) @@ -180,9 +184,10 @@ typedef struct { #define PG_VERSION_LT(conn, ver) (! PG_VERSION_GE(conn, ver)) /* This is used to store cached table information in the connection */ -struct col_info { - QResultClass *result; - char name[MAX_TABLE_LEN+1]; +struct col_info +{ + QResultClass *result; + char name[MAX_TABLE_LEN + 1]; }; /* Translation DLL entry points */ @@ -194,52 +199,58 @@ struct col_info { #define HINSTANCE void * #endif -typedef BOOL (FAR WINAPI *DataSourceToDriverProc) (UDWORD, - SWORD, - PTR, - SDWORD, - PTR, - SDWORD, - SDWORD FAR *, - UCHAR FAR *, - SWORD, - SWORD FAR *); - -typedef BOOL (FAR WINAPI *DriverToDataSourceProc) (UDWORD, - SWORD, - PTR, - SDWORD, - PTR, - SDWORD, - SDWORD FAR *, - UCHAR FAR *, - SWORD, - SWORD FAR *); +typedef BOOL(FAR WINAPI * DataSourceToDriverProc) (UDWORD, + SWORD, + PTR, + SDWORD, + PTR, + SDWORD, + SDWORD FAR *, + UCHAR FAR *, + SWORD, + SWORD FAR *); + +typedef BOOL(FAR WINAPI * DriverToDataSourceProc) (UDWORD, + SWORD, + PTR, + SDWORD, + PTR, + SDWORD, + SDWORD FAR *, + UCHAR FAR *, + SWORD, + SWORD FAR *); /******* The Connection handle ************/ -struct ConnectionClass_ { - HENV henv; /* environment this connection was created on */ +struct ConnectionClass_ +{ + HENV henv; /* environment this connection was created + * on */ StatementOptions stmtOptions; - char *errormsg; - int errornumber; - CONN_Status status; - ConnInfo connInfo; - StatementClass **stmts; - int num_stmts; - SocketClass *sock; - int lobj_type; - int ntables; - COL_INFO **col_info; - long translation_option; - HINSTANCE translation_handle; - DataSourceToDriverProc DataSourceToDriver; - DriverToDataSourceProc DriverToDataSource; - char transact_status; /* Is a transaction is currently in progress */ - char errormsg_created; /* has an informative error msg been created? */ - char pg_version[MAX_INFO_STRING]; /* Version of PostgreSQL we're connected to - DJP 25-1-2001 */ - float pg_version_number; - Int2 pg_version_major; - Int2 pg_version_minor; + char *errormsg; + int errornumber; + CONN_Status status; + ConnInfo connInfo; + StatementClass **stmts; + int num_stmts; + SocketClass *sock; + int lobj_type; + int ntables; + COL_INFO **col_info; + long translation_option; + HINSTANCE translation_handle; + DataSourceToDriverProc DataSourceToDriver; + DriverToDataSourceProc DriverToDataSource; + char transact_status;/* Is a transaction is currently in + * progress */ + char errormsg_created; /* has an informative error msg + * been created? */ + char pg_version[MAX_INFO_STRING]; /* Version of PostgreSQL + * we're connected to - + * DJP 25-1-2001 */ + float pg_version_number; + Int2 pg_version_major; + Int2 pg_version_minor; }; @@ -252,31 +263,31 @@ struct ConnectionClass_ { #define CC_is_onlyread(x) (x->connInfo.onlyread[0] == '1') -/* for CC_DSN_info */ +/* for CC_DSN_info */ #define CONN_DONT_OVERWRITE 0 -#define CONN_OVERWRITE 1 +#define CONN_OVERWRITE 1 /* prototypes */ ConnectionClass *CC_Constructor(void); -char CC_Destructor(ConnectionClass *self); -int CC_cursor_count(ConnectionClass *self); -char CC_cleanup(ConnectionClass *self); -char CC_abort(ConnectionClass *self); -int CC_set_translation (ConnectionClass *self); -char CC_connect(ConnectionClass *self, char do_password); -char CC_add_statement(ConnectionClass *self, StatementClass *stmt); -char CC_remove_statement(ConnectionClass *self, StatementClass *stmt); -char CC_get_error(ConnectionClass *self, int *number, char **message); -QResultClass *CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi); -void CC_clear_error(ConnectionClass *self); -char *CC_create_errormsg(ConnectionClass *self); -int CC_send_function(ConnectionClass *conn, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG *argv, int nargs); -char CC_send_settings(ConnectionClass *self); -void CC_lookup_lo(ConnectionClass *conn); -void CC_lookup_pg_version(ConnectionClass *conn); -void CC_initialize_pg_version(ConnectionClass *conn); -void CC_log_error(char *func, char *desc, ConnectionClass *self); +char CC_Destructor(ConnectionClass * self); +int CC_cursor_count(ConnectionClass * self); +char CC_cleanup(ConnectionClass * self); +char CC_abort(ConnectionClass * self); +int CC_set_translation(ConnectionClass * self); +char CC_connect(ConnectionClass * self, char do_password); +char CC_add_statement(ConnectionClass * self, StatementClass * stmt); +char CC_remove_statement(ConnectionClass * self, StatementClass * stmt); +char CC_get_error(ConnectionClass * self, int *number, char **message); +QResultClass *CC_send_query(ConnectionClass * self, char *query, QueryInfo * qi); +void CC_clear_error(ConnectionClass * self); +char *CC_create_errormsg(ConnectionClass * self); +int CC_send_function(ConnectionClass * conn, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG * argv, int nargs); +char CC_send_settings(ConnectionClass * self); +void CC_lookup_lo(ConnectionClass * conn); +void CC_lookup_pg_version(ConnectionClass * conn); +void CC_initialize_pg_version(ConnectionClass * conn); +void CC_log_error(char *func, char *desc, ConnectionClass * self); #endif diff --git a/src/interfaces/odbc/convert.c b/src/interfaces/odbc/convert.c index f033ce4b3f..8542936d5c 100644 --- a/src/interfaces/odbc/convert.c +++ b/src/interfaces/odbc/convert.c @@ -1,17 +1,17 @@ -/* Module: convert.c +/* Module: convert.c * - * Description: This module contains routines related to - * converting parameters and columns into requested data types. - * Parameters are converted from their SQL_C data types into - * the appropriate postgres type. Columns are converted from - * their postgres type (SQL type) into the appropriate SQL_C - * data type. + * Description: This module contains routines related to + * converting parameters and columns into requested data types. + * Parameters are converted from their SQL_C data types into + * the appropriate postgres type. Columns are converted from + * their postgres type (SQL type) into the appropriate SQL_C + * data type. * - * Classes: n/a + * Classes: n/a * * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -52,6 +52,7 @@ #endif #ifndef SCHAR typedef signed char SCHAR; + #endif #endif @@ -63,76 +64,76 @@ extern GLOBAL_VALUES globals; * http://www.merant.com/datadirect/download/docs/odbc16/Odbcref/rappc.htm * - thomas 2000-04-03 */ -char *mapFuncs[][2] = { -/* { "ASCII", "ascii" }, */ - { "CHAR", "ichar" }, - { "CONCAT", "textcat" }, +char *mapFuncs[][2] = { +/* { "ASCII", "ascii" }, */ + {"CHAR", "ichar"}, + {"CONCAT", "textcat"}, /* { "DIFFERENCE", "difference" }, */ -/* { "INSERT", "insert" }, */ - { "LCASE", "lower" }, - { "LEFT", "ltrunc" }, - { "LOCATE", "strpos" }, - { "LENGTH", "char_length"}, -/* { "LTRIM", "ltrim" }, */ - { "RIGHT", "rtrunc" }, -/* { "REPEAT", "repeat" }, */ -/* { "REPLACE", "replace" }, */ -/* { "RTRIM", "rtrim" }, */ -/* { "SOUNDEX", "soundex" }, */ - { "SUBSTRING", "substr" }, - { "UCASE", "upper" }, - -/* { "ABS", "abs" }, */ -/* { "ACOS", "acos" }, */ -/* { "ASIN", "asin" }, */ -/* { "ATAN", "atan" }, */ -/* { "ATAN2", "atan2" }, */ - { "CEILING", "ceil" }, -/* { "COS", "cos" }, */ -/* { "COT", "cot" }, */ -/* { "DEGREES", "degrees" }, */ -/* { "EXP", "exp" }, */ -/* { "FLOOR", "floor" }, */ - { "LOG", "ln" }, - { "LOG10", "log" }, -/* { "MOD", "mod" }, */ -/* { "PI", "pi" }, */ - { "POWER", "pow" }, -/* { "RADIANS", "radians" }, */ - { "RAND", "random" }, -/* { "ROUND", "round" }, */ -/* { "SIGN", "sign" }, */ -/* { "SIN", "sin" }, */ -/* { "SQRT", "sqrt" }, */ -/* { "TAN", "tan" }, */ - { "TRUNCATE", "trunc" }, - -/* { "CURDATE", "curdate" }, */ -/* { "CURTIME", "curtime" }, */ -/* { "DAYNAME", "dayname" }, */ +/* { "INSERT", "insert" }, */ + {"LCASE", "lower"}, + {"LEFT", "ltrunc"}, + {"LOCATE", "strpos"}, + {"LENGTH", "char_length"}, +/* { "LTRIM", "ltrim" }, */ + {"RIGHT", "rtrunc"}, +/* { "REPEAT", "repeat" }, */ +/* { "REPLACE", "replace" }, */ +/* { "RTRIM", "rtrim" }, */ +/* { "SOUNDEX", "soundex" }, */ + {"SUBSTRING", "substr"}, + {"UCASE", "upper"}, + +/* { "ABS", "abs" }, */ +/* { "ACOS", "acos" }, */ +/* { "ASIN", "asin" }, */ +/* { "ATAN", "atan" }, */ +/* { "ATAN2", "atan2" }, */ + {"CEILING", "ceil"}, +/* { "COS", "cos" }, */ +/* { "COT", "cot" }, */ +/* { "DEGREES", "degrees" }, */ +/* { "EXP", "exp" }, */ +/* { "FLOOR", "floor" }, */ + {"LOG", "ln"}, + {"LOG10", "log"}, +/* { "MOD", "mod" }, */ +/* { "PI", "pi" }, */ + {"POWER", "pow"}, +/* { "RADIANS", "radians" }, */ + {"RAND", "random"}, +/* { "ROUND", "round" }, */ +/* { "SIGN", "sign" }, */ +/* { "SIN", "sin" }, */ +/* { "SQRT", "sqrt" }, */ +/* { "TAN", "tan" }, */ + {"TRUNCATE", "trunc"}, + +/* { "CURDATE", "curdate" }, */ +/* { "CURTIME", "curtime" }, */ +/* { "DAYNAME", "dayname" }, */ /* { "DAYOFMONTH", "dayofmonth" }, */ -/* { "DAYOFWEEK", "dayofweek" }, */ -/* { "DAYOFYEAR", "dayofyear" }, */ -/* { "HOUR", "hour" }, */ -/* { "MINUTE", "minute" }, */ -/* { "MONTH", "month" }, */ -/* { "MONTHNAME", "monthname" }, */ -/* { "NOW", "now" }, */ -/* { "QUARTER", "quarter" }, */ -/* { "SECOND", "second" }, */ -/* { "WEEK", "week" }, */ -/* { "YEAR", "year" }, */ - -/* { "DATABASE", "database" }, */ - { "IFNULL", "coalesce" }, - { "USER", "odbc_user" }, - { 0, 0 } +/* { "DAYOFWEEK", "dayofweek" }, */ +/* { "DAYOFYEAR", "dayofyear" }, */ +/* { "HOUR", "hour" }, */ +/* { "MINUTE", "minute" }, */ +/* { "MONTH", "month" }, */ +/* { "MONTHNAME", "monthname" }, */ +/* { "NOW", "now" }, */ +/* { "QUARTER", "quarter" }, */ +/* { "SECOND", "second" }, */ +/* { "WEEK", "week" }, */ +/* { "YEAR", "year" }, */ + +/* { "DATABASE", "database" }, */ + {"IFNULL", "coalesce"}, + {"USER", "odbc_user"}, + {0, 0} }; -char *mapFunction(char *func); +char *mapFunction(char *func); unsigned int conv_from_octal(unsigned char *s); unsigned int conv_from_hex(unsigned char *s); -char *conv_to_octal(unsigned char val); +char *conv_to_octal(unsigned char val); /******** A Guide for date/time/timestamp conversions ************** @@ -144,47 +145,52 @@ char *conv_to_octal(unsigned char val); PG_TYPE_TIME SQL_C_DEFAULT SQL_C_TIME PG_TYPE_TIME SQL_C_TIME SQL_C_TIME PG_TYPE_TIME SQL_C_TIMESTAMP SQL_C_TIMESTAMP (date = current date) - PG_TYPE_ABSTIME SQL_C_DEFAULT SQL_C_TIMESTAMP - PG_TYPE_ABSTIME SQL_C_DATE SQL_C_DATE (time is truncated) - PG_TYPE_ABSTIME SQL_C_TIME SQL_C_TIME (date is truncated) - PG_TYPE_ABSTIME SQL_C_TIMESTAMP SQL_C_TIMESTAMP + PG_TYPE_ABSTIME SQL_C_DEFAULT SQL_C_TIMESTAMP + PG_TYPE_ABSTIME SQL_C_DATE SQL_C_DATE (time is truncated) + PG_TYPE_ABSTIME SQL_C_TIME SQL_C_TIME (date is truncated) + PG_TYPE_ABSTIME SQL_C_TIMESTAMP SQL_C_TIMESTAMP ******************************************************************************/ /* This is called by SQLFetch() */ int -copy_and_convert_field_bindinfo(StatementClass *stmt, Int4 field_type, void *value, int col) +copy_and_convert_field_bindinfo(StatementClass * stmt, Int4 field_type, void *value, int col) { -BindInfoClass *bic = &(stmt->bindings[col]); + BindInfoClass *bic = &(stmt->bindings[col]); - return copy_and_convert_field(stmt, field_type, value, (Int2)bic->returntype, (PTR)bic->buffer, - (SDWORD)bic->buflen, (SDWORD *)bic->used); + return copy_and_convert_field(stmt, field_type, value, (Int2) bic->returntype, (PTR) bic->buffer, + (SDWORD) bic->buflen, (SDWORD *) bic->used); } /* This is called by SQLGetData() */ int -copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 fCType, - PTR rgbValue, SDWORD cbValueMax, SDWORD *pcbValue) +copy_and_convert_field(StatementClass * stmt, Int4 field_type, void *value, Int2 fCType, + PTR rgbValue, SDWORD cbValueMax, SDWORD * pcbValue) { - Int4 len = 0, copy_len = 0; + Int4 len = 0, + copy_len = 0; SIMPLE_TIME st; - time_t t = time(NULL); - struct tm *tim; - int pcbValueOffset, rgbValueOffset; - char *rgbValueBindRow, *ptr; - int bind_row = stmt->bind_row; - int bind_size = stmt->options.bind_size; - int result = COPY_OK; - char tempBuf[TEXT_FIELD_SIZE+5]; + time_t t = time(NULL); + struct tm *tim; + int pcbValueOffset, + rgbValueOffset; + char *rgbValueBindRow, + *ptr; + int bind_row = stmt->bind_row; + int bind_size = stmt->options.bind_size; + int result = COPY_OK; + char tempBuf[TEXT_FIELD_SIZE + 5]; /* rgbValueOffset is *ONLY* for character and binary data */ /* pcbValueOffset is for computing any pcbValue location */ - if (bind_size > 0) { + if (bind_size > 0) + { pcbValueOffset = rgbValueOffset = (bind_size * bind_row); } - else { + else + { pcbValueOffset = bind_row * sizeof(SDWORD); rgbValueOffset = bind_row * cbValueMax; @@ -193,31 +199,33 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 memset(&st, 0, sizeof(SIMPLE_TIME)); - /* Initialize current date */ + /* Initialize current date */ tim = localtime(&t); st.m = tim->tm_mon + 1; st.d = tim->tm_mday; st.y = tim->tm_year + 1900; - mylog("copy_and_convert: field_type = %d, fctype = %d, value = '%s', cbValueMax=%d\n", field_type, fCType, (value==NULL)?"":value, cbValueMax); + mylog("copy_and_convert: field_type = %d, fctype = %d, value = '%s', cbValueMax=%d\n", field_type, fCType, (value == NULL) ? "" : value, cbValueMax); - if ( ! value) { - /* handle a null just by returning SQL_NULL_DATA in pcbValue, */ - /* and doing nothing to the buffer. */ - if(pcbValue) { + if (!value) + { + /* handle a null just by returning SQL_NULL_DATA in pcbValue, */ + /* and doing nothing to the buffer. */ + if (pcbValue) *(SDWORD *) ((char *) pcbValue + pcbValueOffset) = SQL_NULL_DATA; - } return COPY_OK; } - if (stmt->hdbc->DataSourceToDriver != NULL) { - int length = strlen (value); - stmt->hdbc->DataSourceToDriver (stmt->hdbc->translation_option, - SQL_CHAR, - value, length, - value, length, NULL, - NULL, 0, NULL); + if (stmt->hdbc->DataSourceToDriver != NULL) + { + int length = strlen(value); + + stmt->hdbc->DataSourceToDriver(stmt->hdbc->translation_option, + SQL_CHAR, + value, length, + value, length, NULL, + NULL, 0, NULL); } @@ -225,108 +233,128 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 First convert any specific postgres types into more useable data. - NOTE: Conversions from PG char/varchar of a date/time/timestamp - value to SQL_C_DATE,SQL_C_TIME, SQL_C_TIMESTAMP not supported + NOTE: Conversions from PG char/varchar of a date/time/timestamp + value to SQL_C_DATE,SQL_C_TIME, SQL_C_TIMESTAMP not supported *********************************************************************/ - switch(field_type) { - /* $$$ need to add parsing for date/time/timestamp strings in PG_TYPE_CHAR,VARCHAR $$$ */ - case PG_TYPE_DATE: - sscanf(value, "%4d-%2d-%2d", &st.y, &st.m, &st.d); - break; - - case PG_TYPE_TIME: - sscanf(value, "%2d:%2d:%2d", &st.hh, &st.mm, &st.ss); - break; - - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: - if (strnicmp(value, "invalid", 7) != 0) { - sscanf(value, "%4d-%2d-%2d %2d:%2d:%2d", &st.y, &st.m, &st.d, &st.hh, &st.mm, &st.ss); - - } else { /* The timestamp is invalid so set something conspicuous, like the epoch */ - t = 0; - tim = localtime(&t); - st.m = tim->tm_mon + 1; - st.d = tim->tm_mday; - st.y = tim->tm_year + 1900; - st.hh = tim->tm_hour; - st.mm = tim->tm_min; - st.ss = tim->tm_sec; - } - break; - - case PG_TYPE_BOOL: { /* change T/F to 1/0 */ - char *s = (char *) value; - if (s[0] == 'T' || s[0] == 't') - s[0] = '1'; - else - s[0] = '0'; - } - break; - - /* This is for internal use by SQLStatistics() */ - case PG_TYPE_INT2VECTOR: { - int nval, i; - char *vp; - /* this is an array of eight integers */ - short *short_array = (short *) ( (char *) rgbValue + rgbValueOffset); - - len = 16; - vp = value; - nval = 0; - for (i = 0; i < 8; i++) - { - if (sscanf(vp, "%hd", &short_array[i]) != 1) - break; + switch (field_type) + { - nval++; + /* + * $$$ need to add parsing for date/time/timestamp strings in + * PG_TYPE_CHAR,VARCHAR $$$ + */ + case PG_TYPE_DATE: + sscanf(value, "%4d-%2d-%2d", &st.y, &st.m, &st.d); + break; - /* skip the current token */ - while ((*vp != '\0') && (! isspace((unsigned char) *vp))) vp++; - /* and skip the space to the next token */ - while ((*vp != '\0') && (isspace((unsigned char) *vp))) vp++; - if (*vp == '\0') - break; - } + case PG_TYPE_TIME: + sscanf(value, "%2d:%2d:%2d", &st.hh, &st.mm, &st.ss); + break; - for (i = nval; i < 8; i++) - { - short_array[i] = 0; - } + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + if (strnicmp(value, "invalid", 7) != 0) + { + sscanf(value, "%4d-%2d-%2d %2d:%2d:%2d", &st.y, &st.m, &st.d, &st.hh, &st.mm, &st.ss); + + } + else + { /* The timestamp is invalid so set + * something conspicuous, like the epoch */ + t = 0; + tim = localtime(&t); + st.m = tim->tm_mon + 1; + st.d = tim->tm_mday; + st.y = tim->tm_year + 1900; + st.hh = tim->tm_hour; + st.mm = tim->tm_min; + st.ss = tim->tm_sec; + } + break; + + case PG_TYPE_BOOL: + { /* change T/F to 1/0 */ + char *s = (char *) value; + + if (s[0] == 'T' || s[0] == 't') + s[0] = '1'; + else + s[0] = '0'; + } + break; + + /* This is for internal use by SQLStatistics() */ + case PG_TYPE_INT2VECTOR: + { + int nval, + i; + char *vp; + + /* this is an array of eight integers */ + short *short_array = (short *) ((char *) rgbValue + rgbValueOffset); + + len = 16; + vp = value; + nval = 0; + for (i = 0; i < 8; i++) + { + if (sscanf(vp, "%hd", &short_array[i]) != 1) + break; + + nval++; + + /* skip the current token */ + while ((*vp != '\0') && (!isspace((unsigned char) *vp))) + vp++; + /* and skip the space to the next token */ + while ((*vp != '\0') && (isspace((unsigned char) *vp))) + vp++; + if (*vp == '\0') + break; + } + + for (i = nval; i < 8; i++) + short_array[i] = 0; #if 0 - sscanf(value, "%hd %hd %hd %hd %hd %hd %hd %hd", - &short_array[0], - &short_array[1], - &short_array[2], - &short_array[3], - &short_array[4], - &short_array[5], - &short_array[6], - &short_array[7]); + sscanf(value, "%hd %hd %hd %hd %hd %hd %hd %hd", + &short_array[0], + &short_array[1], + &short_array[2], + &short_array[3], + &short_array[4], + &short_array[5], + &short_array[6], + &short_array[7]); #endif - /* There is no corresponding fCType for this. */ - if(pcbValue) - *(SDWORD *) ((char *) pcbValue + pcbValueOffset) = len; + /* There is no corresponding fCType for this. */ + if (pcbValue) + *(SDWORD *) ((char *) pcbValue + pcbValueOffset) = len; - return COPY_OK; /* dont go any further or the data will be trashed */ - } + return COPY_OK; /* dont go any further or the data will be + * trashed */ + } - /* This is a large object OID, which is used to store LONGVARBINARY objects. */ - case PG_TYPE_LO: + /* + * This is a large object OID, which is used to store + * LONGVARBINARY objects. + */ + case PG_TYPE_LO: - return convert_lo( stmt, value, fCType, ((char *) rgbValue + rgbValueOffset), cbValueMax, (SDWORD *) ((char *) pcbValue + pcbValueOffset)); + return convert_lo(stmt, value, fCType, ((char *) rgbValue + rgbValueOffset), cbValueMax, (SDWORD *) ((char *) pcbValue + pcbValueOffset)); - default: + default: - if (field_type == stmt->hdbc->lobj_type) /* hack until permanent type available */ - return convert_lo( stmt, value, fCType, ((char *) rgbValue + rgbValueOffset), cbValueMax, (SDWORD *) ((char *) pcbValue + pcbValueOffset)); + if (field_type == stmt->hdbc->lobj_type) /* hack until permanent + * type available */ + return convert_lo(stmt, value, fCType, ((char *) rgbValue + rgbValueOffset), cbValueMax, (SDWORD *) ((char *) pcbValue + pcbValueOffset)); } - /* Change default into something useable */ - if (fCType == SQL_C_DEFAULT) { + /* Change default into something useable */ + if (fCType == SQL_C_DEFAULT) + { fCType = pgtype_to_ctype(stmt, field_type); mylog("copy_and_convert, SQL_C_DEFAULT: fCType = %d\n", fCType); @@ -335,297 +363,318 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 rgbValueBindRow = (char *) rgbValue + rgbValueOffset; - if(fCType == SQL_C_CHAR) { + if (fCType == SQL_C_CHAR) + { - /* Special character formatting as required */ - /* These really should return error if cbValueMax is not big enough. */ - switch(field_type) { - case PG_TYPE_DATE: - len = 10; - if (cbValueMax > len) - sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d", st.y, st.m, st.d); - break; + /* Special character formatting as required */ - case PG_TYPE_TIME: - len = 8; - if (cbValueMax > len) - sprintf(rgbValueBindRow, "%.2d:%.2d:%.2d", st.hh, st.mm, st.ss); - break; - - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: - len = 19; - if (cbValueMax > len) - sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", - st.y, st.m, st.d, st.hh, st.mm, st.ss); - break; + /* + * These really should return error if cbValueMax is not big + * enough. + */ + switch (field_type) + { + case PG_TYPE_DATE: + len = 10; + if (cbValueMax > len) + sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d", st.y, st.m, st.d); + break; - case PG_TYPE_BOOL: - len = 1; - if (cbValueMax > len) { - strcpy(rgbValueBindRow, value); - mylog("PG_TYPE_BOOL: rgbValueBindRow = '%s'\n", rgbValueBindRow); - } - break; + case PG_TYPE_TIME: + len = 8; + if (cbValueMax > len) + sprintf(rgbValueBindRow, "%.2d:%.2d:%.2d", st.hh, st.mm, st.ss); + break; - /* Currently, data is SILENTLY TRUNCATED for BYTEA and character data - types if there is not enough room in cbValueMax because the driver - can't handle multiple calls to SQLGetData for these, yet. Most likely, - the buffer passed in will be big enough to handle the maximum limit of - postgres, anyway. + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + len = 19; + if (cbValueMax > len) + sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", + st.y, st.m, st.d, st.hh, st.mm, st.ss); + break; - LongVarBinary types are handled correctly above, observing truncation - and all that stuff since there is essentially no limit on the large - object used to store those. - */ - case PG_TYPE_BYTEA: /* convert binary data to hex strings (i.e, 255 = "FF") */ - len = convert_pgbinary_to_char(value, rgbValueBindRow, cbValueMax); + case PG_TYPE_BOOL: + len = 1; + if (cbValueMax > len) + { + strcpy(rgbValueBindRow, value); + mylog("PG_TYPE_BOOL: rgbValueBindRow = '%s'\n", rgbValueBindRow); + } + break; - /***** THIS IS NOT PROPERLY IMPLEMENTED *****/ - break; + /* + * Currently, data is SILENTLY TRUNCATED for BYTEA and + * character data types if there is not enough room in + * cbValueMax because the driver can't handle multiple + * calls to SQLGetData for these, yet. Most likely, the + * buffer passed in will be big enough to handle the + * maximum limit of postgres, anyway. + * + * LongVarBinary types are handled correctly above, observing + * truncation and all that stuff since there is + * essentially no limit on the large object used to store + * those. + */ + case PG_TYPE_BYTEA:/* convert binary data to hex strings + * (i.e, 255 = "FF") */ + len = convert_pgbinary_to_char(value, rgbValueBindRow, cbValueMax); + + /***** THIS IS NOT PROPERLY IMPLEMENTED *****/ + break; - default: - /* convert linefeeds to carriage-return/linefeed */ - len = convert_linefeeds(value, tempBuf, sizeof(tempBuf)); - ptr = tempBuf; - - mylog("DEFAULT: len = %d, ptr = '%s'\n", len, ptr); - - if (stmt->current_col >= 0) { - if (stmt->bindings[stmt->current_col].data_left == 0) - return COPY_NO_DATA_FOUND; - else if (stmt->bindings[stmt->current_col].data_left > 0) { - ptr += len - stmt->bindings[stmt->current_col].data_left; - len = stmt->bindings[stmt->current_col].data_left; + default: + /* convert linefeeds to carriage-return/linefeed */ + len = convert_linefeeds(value, tempBuf, sizeof(tempBuf)); + ptr = tempBuf; + + mylog("DEFAULT: len = %d, ptr = '%s'\n", len, ptr); + + if (stmt->current_col >= 0) + { + if (stmt->bindings[stmt->current_col].data_left == 0) + return COPY_NO_DATA_FOUND; + else if (stmt->bindings[stmt->current_col].data_left > 0) + { + ptr += len - stmt->bindings[stmt->current_col].data_left; + len = stmt->bindings[stmt->current_col].data_left; + } + else + stmt->bindings[stmt->current_col].data_left = strlen(ptr); } - else - stmt->bindings[stmt->current_col].data_left = strlen(ptr); - } - if (cbValueMax > 0) { - - copy_len = (len >= cbValueMax) ? cbValueMax -1 : len; + if (cbValueMax > 0) + { + + copy_len = (len >= cbValueMax) ? cbValueMax - 1 : len; - /* Copy the data */ - strncpy_null(rgbValueBindRow, ptr, copy_len + 1); + /* Copy the data */ + strncpy_null(rgbValueBindRow, ptr, copy_len + 1); - /* Adjust data_left for next time */ - if (stmt->current_col >= 0) { - stmt->bindings[stmt->current_col].data_left -= copy_len; + /* Adjust data_left for next time */ + if (stmt->current_col >= 0) + stmt->bindings[stmt->current_col].data_left -= copy_len; } - } - /* Finally, check for truncation so that proper status can be returned */ - if ( len >= cbValueMax) - result = COPY_RESULT_TRUNCATED; + /* + * Finally, check for truncation so that proper status can + * be returned + */ + if (len >= cbValueMax) + result = COPY_RESULT_TRUNCATED; - mylog(" SQL_C_CHAR, default: len = %d, cbValueMax = %d, rgbValueBindRow = '%s'\n", len, cbValueMax, rgbValueBindRow); - break; + mylog(" SQL_C_CHAR, default: len = %d, cbValueMax = %d, rgbValueBindRow = '%s'\n", len, cbValueMax, rgbValueBindRow); + break; } - } else { + } + else + { - /* for SQL_C_CHAR, it's probably ok to leave currency symbols in. But - to convert to numeric types, it is necessary to get rid of those. - */ + /* + * for SQL_C_CHAR, it's probably ok to leave currency symbols in. + * But to convert to numeric types, it is necessary to get rid of + * those. + */ if (field_type == PG_TYPE_MONEY) convert_money(value); - switch(fCType) { - case SQL_C_DATE: - len = 6; - { - DATE_STRUCT *ds; - - if (bind_size > 0) { - ds = (DATE_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); - } else { - ds = (DATE_STRUCT *) rgbValue + bind_row; - } - ds->year = st.y; - ds->month = st.m; - ds->day = st.d; - } - break; + switch (fCType) + { + case SQL_C_DATE: + len = 6; + { + DATE_STRUCT *ds; + + if (bind_size > 0) + ds = (DATE_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); + else + ds = (DATE_STRUCT *) rgbValue + bind_row; + ds->year = st.y; + ds->month = st.m; + ds->day = st.d; + } + break; - case SQL_C_TIME: - len = 6; - { - TIME_STRUCT *ts; - - if (bind_size > 0) { - ts = (TIME_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); - } else { - ts = (TIME_STRUCT *) rgbValue + bind_row; - } - ts->hour = st.hh; - ts->minute = st.mm; - ts->second = st.ss; - } - break; + case SQL_C_TIME: + len = 6; + { + TIME_STRUCT *ts; + + if (bind_size > 0) + ts = (TIME_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); + else + ts = (TIME_STRUCT *) rgbValue + bind_row; + ts->hour = st.hh; + ts->minute = st.mm; + ts->second = st.ss; + } + break; - case SQL_C_TIMESTAMP: - len = 16; - { - TIMESTAMP_STRUCT *ts; - if (bind_size > 0) { - ts = (TIMESTAMP_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); - } else { - ts = (TIMESTAMP_STRUCT *) rgbValue + bind_row; - } - ts->year = st.y; - ts->month = st.m; - ts->day = st.d; - ts->hour = st.hh; - ts->minute = st.mm; - ts->second = st.ss; - ts->fraction = 0; - } - break; + case SQL_C_TIMESTAMP: + len = 16; + { + TIMESTAMP_STRUCT *ts; + + if (bind_size > 0) + ts = (TIMESTAMP_STRUCT *) ((char *) rgbValue + (bind_row * bind_size)); + else + ts = (TIMESTAMP_STRUCT *) rgbValue + bind_row; + ts->year = st.y; + ts->month = st.m; + ts->day = st.d; + ts->hour = st.hh; + ts->minute = st.mm; + ts->second = st.ss; + ts->fraction = 0; + } + break; - case SQL_C_BIT: - len = 1; - if (bind_size > 0) { - *(UCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); - } else { - *((UCHAR *)rgbValue + bind_row) = atoi(value); - } - /* mylog("SQL_C_BIT: val = %d, cb = %d, rgb=%d\n", atoi(value), cbValueMax, *((UCHAR *)rgbValue)); */ - break; + case SQL_C_BIT: + len = 1; + if (bind_size > 0) + *(UCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); + else + *((UCHAR *) rgbValue + bind_row) = atoi(value); - case SQL_C_STINYINT: - case SQL_C_TINYINT: - len = 1; - if (bind_size > 0) { - *(SCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); - } else { - *((SCHAR *) rgbValue + bind_row) = atoi(value); - } - break; + /* + * mylog("SQL_C_BIT: val = %d, cb = %d, rgb=%d\n", + * atoi(value), cbValueMax, *((UCHAR *)rgbValue)); + */ + break; - case SQL_C_UTINYINT: - len = 1; - if (bind_size > 0) { - *(UCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); - } else { - *((UCHAR *) rgbValue + bind_row) = atoi(value); - } - break; + case SQL_C_STINYINT: + case SQL_C_TINYINT: + len = 1; + if (bind_size > 0) + *(SCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); + else + *((SCHAR *) rgbValue + bind_row) = atoi(value); + break; - case SQL_C_FLOAT: - len = 4; - if (bind_size > 0) { - *(SFLOAT *) ((char *) rgbValue + (bind_row * bind_size)) = (float) atof(value); - } else { - *((SFLOAT *)rgbValue + bind_row) = (float) atof(value); - } - break; + case SQL_C_UTINYINT: + len = 1; + if (bind_size > 0) + *(UCHAR *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); + else + *((UCHAR *) rgbValue + bind_row) = atoi(value); + break; - case SQL_C_DOUBLE: - len = 8; - if (bind_size > 0) { - *(SDOUBLE *) ((char *) rgbValue + (bind_row * bind_size)) = atof(value); - } else { - *((SDOUBLE *)rgbValue + bind_row) = atof(value); - } - break; + case SQL_C_FLOAT: + len = 4; + if (bind_size > 0) + *(SFLOAT *) ((char *) rgbValue + (bind_row * bind_size)) = (float) atof(value); + else + *((SFLOAT *) rgbValue + bind_row) = (float) atof(value); + break; - case SQL_C_SSHORT: - case SQL_C_SHORT: - len = 2; - if (bind_size > 0) { - *(SWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); - } else { - *((SWORD *)rgbValue + bind_row) = atoi(value); - } - break; + case SQL_C_DOUBLE: + len = 8; + if (bind_size > 0) + *(SDOUBLE *) ((char *) rgbValue + (bind_row * bind_size)) = atof(value); + else + *((SDOUBLE *) rgbValue + bind_row) = atof(value); + break; - case SQL_C_USHORT: - len = 2; - if (bind_size > 0) { - *(UWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); - } else { - *((UWORD *)rgbValue + bind_row) = atoi(value); - } - break; + case SQL_C_SSHORT: + case SQL_C_SHORT: + len = 2; + if (bind_size > 0) + *(SWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); + else + *((SWORD *) rgbValue + bind_row) = atoi(value); + break; - case SQL_C_SLONG: - case SQL_C_LONG: - len = 4; - if (bind_size > 0) { - *(SDWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atol(value); - } else { - *((SDWORD *)rgbValue + bind_row) = atol(value); - } - break; + case SQL_C_USHORT: + len = 2; + if (bind_size > 0) + *(UWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atoi(value); + else + *((UWORD *) rgbValue + bind_row) = atoi(value); + break; - case SQL_C_ULONG: - len = 4; - if (bind_size > 0) { - *(UDWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atol(value); - } else { - *((UDWORD *)rgbValue + bind_row) = atol(value); - } - break; + case SQL_C_SLONG: + case SQL_C_LONG: + len = 4; + if (bind_size > 0) + *(SDWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atol(value); + else + *((SDWORD *) rgbValue + bind_row) = atol(value); + break; - case SQL_C_BINARY: + case SQL_C_ULONG: + len = 4; + if (bind_size > 0) + *(UDWORD *) ((char *) rgbValue + (bind_row * bind_size)) = atol(value); + else + *((UDWORD *) rgbValue + bind_row) = atol(value); + break; - /* truncate if necessary */ - /* convert octal escapes to bytes */ + case SQL_C_BINARY: - len = convert_from_pgbinary(value, tempBuf, sizeof(tempBuf)); - ptr = tempBuf; + /* truncate if necessary */ + /* convert octal escapes to bytes */ - if (stmt->current_col >= 0) { + len = convert_from_pgbinary(value, tempBuf, sizeof(tempBuf)); + ptr = tempBuf; - /* No more data left for this column */ - if (stmt->bindings[stmt->current_col].data_left == 0) - return COPY_NO_DATA_FOUND; + if (stmt->current_col >= 0) + { - /* Second (or more) call to SQLGetData so move the pointer */ - else if (stmt->bindings[stmt->current_col].data_left > 0) { - ptr += len - stmt->bindings[stmt->current_col].data_left; - len = stmt->bindings[stmt->current_col].data_left; - } + /* No more data left for this column */ + if (stmt->bindings[stmt->current_col].data_left == 0) + return COPY_NO_DATA_FOUND; - /* First call to SQLGetData so initialize data_left */ - else - stmt->bindings[stmt->current_col].data_left = len; + /* + * Second (or more) call to SQLGetData so move the + * pointer + */ + else if (stmt->bindings[stmt->current_col].data_left > 0) + { + ptr += len - stmt->bindings[stmt->current_col].data_left; + len = stmt->bindings[stmt->current_col].data_left; + } - } + /* First call to SQLGetData so initialize data_left */ + else + stmt->bindings[stmt->current_col].data_left = len; + + } - if (cbValueMax > 0) { - copy_len = (len > cbValueMax) ? cbValueMax : len; + if (cbValueMax > 0) + { + copy_len = (len > cbValueMax) ? cbValueMax : len; - /* Copy the data */ - memcpy(rgbValueBindRow, ptr, copy_len); + /* Copy the data */ + memcpy(rgbValueBindRow, ptr, copy_len); - /* Adjust data_left for next time */ - if (stmt->current_col >= 0) { - stmt->bindings[stmt->current_col].data_left -= copy_len; + /* Adjust data_left for next time */ + if (stmt->current_col >= 0) + stmt->bindings[stmt->current_col].data_left -= copy_len; } - } - /* Finally, check for truncation so that proper status can be returned */ - if ( len > cbValueMax) - result = COPY_RESULT_TRUNCATED; + /* + * Finally, check for truncation so that proper status can + * be returned + */ + if (len > cbValueMax) + result = COPY_RESULT_TRUNCATED; - mylog("SQL_C_BINARY: len = %d, copy_len = %d\n", len, copy_len); - break; - - default: - return COPY_UNSUPPORTED_TYPE; + mylog("SQL_C_BINARY: len = %d, copy_len = %d\n", len, copy_len); + break; + + default: + return COPY_UNSUPPORTED_TYPE; } } - /* store the length of what was copied, if there's a place for it */ - if(pcbValue) { - *(SDWORD *) ((char *)pcbValue + pcbValueOffset) = len; - } + /* store the length of what was copied, if there's a place for it */ + if (pcbValue) + *(SDWORD *) ((char *) pcbValue + pcbValueOffset) = len; return result; @@ -637,82 +686,98 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 This function no longer does any dynamic memory allocation! */ int -copy_statement_with_parameters(StatementClass *stmt) +copy_statement_with_parameters(StatementClass * stmt) { -static char *func="copy_statement_with_parameters"; -unsigned int opos, npos, oldstmtlen; -char param_string[128], tmp[256], cbuf[TEXT_FIELD_SIZE+5]; -int param_number; -Int2 param_ctype, param_sqltype; -char *old_statement = stmt->statement; -char *new_statement = stmt->stmt_with_params; -SIMPLE_TIME st; -time_t t = time(NULL); -struct tm *tim; -SDWORD used; -char *buffer, *buf; -char in_quote = FALSE; -Oid lobj_oid; -int lobj_fd, retval; - - - if ( ! old_statement) { + static char *func = "copy_statement_with_parameters"; + unsigned int opos, + npos, + oldstmtlen; + char param_string[128], + tmp[256], + cbuf[TEXT_FIELD_SIZE + 5]; + int param_number; + Int2 param_ctype, + param_sqltype; + char *old_statement = stmt->statement; + char *new_statement = stmt->stmt_with_params; + SIMPLE_TIME st; + time_t t = time(NULL); + struct tm *tim; + SDWORD used; + char *buffer, + *buf; + char in_quote = FALSE; + Oid lobj_oid; + int lobj_fd, + retval; + + + if (!old_statement) + { SC_log_error(func, "No statement string", stmt); return SQL_ERROR; } memset(&st, 0, sizeof(SIMPLE_TIME)); - /* Initialize current date */ + /* Initialize current date */ tim = localtime(&t); st.m = tim->tm_mon + 1; st.d = tim->tm_mday; st.y = tim->tm_year + 1900; - /* If the application hasn't set a cursor name, then generate one */ - if ( stmt->cursor_name[0] == '\0') + /* If the application hasn't set a cursor name, then generate one */ + if (stmt->cursor_name[0] == '\0') sprintf(stmt->cursor_name, "SQL_CUR%p", stmt); - /* For selects, prepend a declare cursor to the statement */ - if (stmt->statement_type == STMT_TYPE_SELECT && globals.use_declarefetch) { + /* For selects, prepend a declare cursor to the statement */ + if (stmt->statement_type == STMT_TYPE_SELECT && globals.use_declarefetch) + { sprintf(new_statement, "declare %s cursor for ", stmt->cursor_name); npos = strlen(new_statement); } - else { + else + { new_statement[0] = '0'; npos = 0; } - param_number = -1; + param_number = -1; oldstmtlen = strlen(old_statement); - for (opos = 0; opos < oldstmtlen; opos++) { + for (opos = 0; opos < oldstmtlen; opos++) + { - /* Squeeze carriage-return/linefeed pairs to linefeed only */ - if (old_statement[opos] == '\r' && opos+1 < oldstmtlen && - old_statement[opos+1] == '\n') { + /* Squeeze carriage-return/linefeed pairs to linefeed only */ + if (old_statement[opos] == '\r' && opos + 1 < oldstmtlen && + old_statement[opos + 1] == '\n') continue; - } - /* Handle literals (date, time, timestamp) and ODBC scalar functions */ - else if (old_statement[opos] == '{') { - char *esc; - char *begin = &old_statement[opos + 1]; - char *end = strchr(begin, '}'); + /* + * Handle literals (date, time, timestamp) and ODBC scalar + * functions + */ + else if (old_statement[opos] == '{') + { + char *esc; + char *begin = &old_statement[opos + 1]; + char *end = strchr(begin, '}'); - if ( ! end) + if (!end) continue; *end = '\0'; esc = convert_escape(begin); - if (esc) { + if (esc) + { memcpy(&new_statement[npos], esc, strlen(esc)); npos += strlen(esc); } - else { /* it's not a valid literal so just copy */ - *end = '}'; + else + { /* it's not a valid literal so just copy */ + *end = '}'; new_statement[npos++] = old_statement[opos]; continue; } @@ -724,12 +789,15 @@ int lobj_fd, retval; continue; } - /* Can you have parameter markers inside of quotes? I dont think so. - All the queries I've seen expect the driver to put quotes if needed. - */ + /* + * Can you have parameter markers inside of quotes? I dont think + * so. All the queries I've seen expect the driver to put quotes + * if needed. + */ else if (old_statement[opos] == '?' && !in_quote) - ; /* ok */ - else { + ; /* ok */ + else + { if (old_statement[opos] == '\'') in_quote = (in_quote ? FALSE : TRUE); @@ -740,363 +808,404 @@ int lobj_fd, retval; /****************************************************/ - /* Its a '?' parameter alright */ + /* Its a '?' parameter alright */ /****************************************************/ param_number++; - if (param_number >= stmt->parameters_allocated) + if (param_number >= stmt->parameters_allocated) break; - /* Assign correct buffers based on data at exec param or not */ - if ( stmt->parameters[param_number].data_at_exec) { + /* Assign correct buffers based on data at exec param or not */ + if (stmt->parameters[param_number].data_at_exec) + { used = stmt->parameters[param_number].EXEC_used ? *stmt->parameters[param_number].EXEC_used : SQL_NTS; buffer = stmt->parameters[param_number].EXEC_buffer; } - else { + else + { used = stmt->parameters[param_number].used ? *stmt->parameters[param_number].used : SQL_NTS; buffer = stmt->parameters[param_number].buffer; } - /* Handle NULL parameter data */ - if (used == SQL_NULL_DATA) { + /* Handle NULL parameter data */ + if (used == SQL_NULL_DATA) + { strcpy(&new_statement[npos], "NULL"); npos += 4; continue; } - /* If no buffer, and it's not null, then what the hell is it? - Just leave it alone then. - */ - if ( ! buffer) { + /* + * If no buffer, and it's not null, then what the hell is it? Just + * leave it alone then. + */ + if (!buffer) + { new_statement[npos++] = '?'; continue; } param_ctype = stmt->parameters[param_number].CType; param_sqltype = stmt->parameters[param_number].SQLType; - + mylog("copy_statement_with_params: from(fcType)=%d, to(fSqlType)=%d\n", param_ctype, param_sqltype); - + /* replace DEFAULT with something we can use */ - if(param_ctype == SQL_C_DEFAULT) + if (param_ctype == SQL_C_DEFAULT) param_ctype = sqltype_to_default_ctype(param_sqltype); buf = NULL; param_string[0] = '\0'; cbuf[0] = '\0'; - - /* Convert input C type to a neutral format */ - switch(param_ctype) { - case SQL_C_BINARY: - case SQL_C_CHAR: - buf = buffer; - break; - case SQL_C_DOUBLE: - sprintf(param_string, "%f", - *((SDOUBLE *) buffer)); - break; + /* Convert input C type to a neutral format */ + switch (param_ctype) + { + case SQL_C_BINARY: + case SQL_C_CHAR: + buf = buffer; + break; - case SQL_C_FLOAT: - sprintf(param_string, "%f", - *((SFLOAT *) buffer)); - break; + case SQL_C_DOUBLE: + sprintf(param_string, "%f", + *((SDOUBLE *) buffer)); + break; - case SQL_C_SLONG: - case SQL_C_LONG: - sprintf(param_string, "%ld", - *((SDWORD *) buffer)); - break; + case SQL_C_FLOAT: + sprintf(param_string, "%f", + *((SFLOAT *) buffer)); + break; - case SQL_C_SSHORT: - case SQL_C_SHORT: - sprintf(param_string, "%d", - *((SWORD *) buffer)); - break; + case SQL_C_SLONG: + case SQL_C_LONG: + sprintf(param_string, "%ld", + *((SDWORD *) buffer)); + break; - case SQL_C_STINYINT: - case SQL_C_TINYINT: - sprintf(param_string, "%d", - *((SCHAR *) buffer)); - break; + case SQL_C_SSHORT: + case SQL_C_SHORT: + sprintf(param_string, "%d", + *((SWORD *) buffer)); + break; - case SQL_C_ULONG: - sprintf(param_string, "%lu", - *((UDWORD *) buffer)); - break; + case SQL_C_STINYINT: + case SQL_C_TINYINT: + sprintf(param_string, "%d", + *((SCHAR *) buffer)); + break; - case SQL_C_USHORT: - sprintf(param_string, "%u", - *((UWORD *) buffer)); - break; + case SQL_C_ULONG: + sprintf(param_string, "%lu", + *((UDWORD *) buffer)); + break; - case SQL_C_UTINYINT: - sprintf(param_string, "%u", - *((UCHAR *) buffer)); - break; + case SQL_C_USHORT: + sprintf(param_string, "%u", + *((UWORD *) buffer)); + break; - case SQL_C_BIT: { - int i = *((UCHAR *) buffer); - - sprintf(param_string, "%d", i ? 1 : 0); - break; - } + case SQL_C_UTINYINT: + sprintf(param_string, "%u", + *((UCHAR *) buffer)); + break; - case SQL_C_DATE: { - DATE_STRUCT *ds = (DATE_STRUCT *) buffer; - st.m = ds->month; - st.d = ds->day; - st.y = ds->year; + case SQL_C_BIT: + { + int i = *((UCHAR *) buffer); - break; - } + sprintf(param_string, "%d", i ? 1 : 0); + break; + } - case SQL_C_TIME: { - TIME_STRUCT *ts = (TIME_STRUCT *) buffer; - st.hh = ts->hour; - st.mm = ts->minute; - st.ss = ts->second; + case SQL_C_DATE: + { + DATE_STRUCT *ds = (DATE_STRUCT *) buffer; - break; - } + st.m = ds->month; + st.d = ds->day; + st.y = ds->year; - case SQL_C_TIMESTAMP: { - TIMESTAMP_STRUCT *tss = (TIMESTAMP_STRUCT *) buffer; - st.m = tss->month; - st.d = tss->day; - st.y = tss->year; - st.hh = tss->hour; - st.mm = tss->minute; - st.ss = tss->second; + break; + } - mylog("m=%d,d=%d,y=%d,hh=%d,mm=%d,ss=%d\n", st.m, st.d, st.y, st.hh, st.mm, st.ss); + case SQL_C_TIME: + { + TIME_STRUCT *ts = (TIME_STRUCT *) buffer; - break; + st.hh = ts->hour; + st.mm = ts->minute; + st.ss = ts->second; - } - default: - /* error */ - stmt->errormsg = "Unrecognized C_parameter type in copy_statement_with_parameters"; - stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - new_statement[npos] = '\0'; /* just in case */ - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + break; + } - /* Now that the input data is in a neutral format, convert it to - the desired output format (sqltype) - */ + case SQL_C_TIMESTAMP: + { + TIMESTAMP_STRUCT *tss = (TIMESTAMP_STRUCT *) buffer; - switch(param_sqltype) { - case SQL_CHAR: - case SQL_VARCHAR: - case SQL_LONGVARCHAR: + st.m = tss->month; + st.d = tss->day; + st.y = tss->year; + st.hh = tss->hour; + st.mm = tss->minute; + st.ss = tss->second; - new_statement[npos++] = '\''; /* Open Quote */ + mylog("m=%d,d=%d,y=%d,hh=%d,mm=%d,ss=%d\n", st.m, st.d, st.y, st.hh, st.mm, st.ss); - /* it was a SQL_C_CHAR */ - if (buf) { - convert_special_chars(buf, &new_statement[npos], used); - npos += strlen(&new_statement[npos]); - } + break; - /* it was a numeric type */ - else if (param_string[0] != '\0') { - strcpy(&new_statement[npos], param_string); - npos += strlen(param_string); - } + } + default: + /* error */ + stmt->errormsg = "Unrecognized C_parameter type in copy_statement_with_parameters"; + stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + new_statement[npos] = '\0'; /* just in case */ + SC_log_error(func, "", stmt); + return SQL_ERROR; + } - /* it was date,time,timestamp -- use m,d,y,hh,mm,ss */ - else { - sprintf(tmp, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", - st.y, st.m, st.d, st.hh, st.mm, st.ss); + /* + * Now that the input data is in a neutral format, convert it to + * the desired output format (sqltype) + */ - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); - } + switch (param_sqltype) + { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: - new_statement[npos++] = '\''; /* Close Quote */ + new_statement[npos++] = '\''; /* Open Quote */ - break; + /* it was a SQL_C_CHAR */ + if (buf) + { + convert_special_chars(buf, &new_statement[npos], used); + npos += strlen(&new_statement[npos]); + } - case SQL_DATE: - if (buf) { /* copy char data to time */ - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + /* it was a numeric type */ + else if (param_string[0] != '\0') + { + strcpy(&new_statement[npos], param_string); + npos += strlen(param_string); + } - sprintf(tmp, "'%.4d-%.2d-%.2d'", st.y, st.m, st.d); + /* it was date,time,timestamp -- use m,d,y,hh,mm,ss */ + else + { + sprintf(tmp, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", + st.y, st.m, st.d, st.hh, st.mm, st.ss); - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); - break; + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + } - case SQL_TIME: - if (buf) { /* copy char data to time */ - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + new_statement[npos++] = '\''; /* Close Quote */ - sprintf(tmp, "'%.2d:%.2d:%.2d'", st.hh, st.mm, st.ss); + break; - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); - break; + case SQL_DATE: + if (buf) + { /* copy char data to time */ + my_strcpy(cbuf, sizeof(cbuf), buf, used); + parse_datetime(cbuf, &st); + } - case SQL_TIMESTAMP: + sprintf(tmp, "'%.4d-%.2d-%.2d'", st.y, st.m, st.d); - if (buf) { - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + break; - sprintf(tmp, "'%.4d-%.2d-%.2d %.2d:%.2d:%.2d'", - st.y, st.m, st.d, st.hh, st.mm, st.ss); + case SQL_TIME: + if (buf) + { /* copy char data to time */ + my_strcpy(cbuf, sizeof(cbuf), buf, used); + parse_datetime(cbuf, &st); + } - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); + sprintf(tmp, "'%.2d:%.2d:%.2d'", st.hh, st.mm, st.ss); - break; + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + break; - case SQL_BINARY: - case SQL_VARBINARY: /* non-ascii characters should be converted to octal */ - new_statement[npos++] = '\''; /* Open Quote */ + case SQL_TIMESTAMP: - mylog("SQL_VARBINARY: about to call convert_to_pgbinary, used = %d\n", used); + if (buf) + { + my_strcpy(cbuf, sizeof(cbuf), buf, used); + parse_datetime(cbuf, &st); + } - npos += convert_to_pgbinary(buf, &new_statement[npos], used); + sprintf(tmp, "'%.4d-%.2d-%.2d %.2d:%.2d:%.2d'", + st.y, st.m, st.d, st.hh, st.mm, st.ss); - new_statement[npos++] = '\''; /* Close Quote */ - - break; + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); - case SQL_LONGVARBINARY: + break; - if ( stmt->parameters[param_number].data_at_exec) { + case SQL_BINARY: + case SQL_VARBINARY:/* non-ascii characters should be + * converted to octal */ + new_statement[npos++] = '\''; /* Open Quote */ - lobj_oid = stmt->parameters[param_number].lobj_oid; + mylog("SQL_VARBINARY: about to call convert_to_pgbinary, used = %d\n", used); - } - else { - - /* begin transaction if needed */ - if(!CC_is_in_trans(stmt->hdbc)) { - QResultClass *res; - char ok; - - res = CC_send_query(stmt->hdbc, "BEGIN", NULL); - if (!res) { - stmt->errormsg = "Could not begin (in-line) a transaction"; - stmt->errornumber = STMT_EXEC_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } - ok = QR_command_successful(res); - QR_Destructor(res); - if (!ok) { - stmt->errormsg = "Could not begin (in-line) a transaction"; - stmt->errornumber = STMT_EXEC_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + npos += convert_to_pgbinary(buf, &new_statement[npos], used); - CC_set_in_trans(stmt->hdbc); - } + new_statement[npos++] = '\''; /* Close Quote */ - /* store the oid */ - lobj_oid = lo_creat(stmt->hdbc, INV_READ | INV_WRITE); - if (lobj_oid == 0) { - stmt->errornumber = STMT_EXEC_ERROR; - stmt->errormsg = "Couldnt create (in-line) large object."; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + break; - /* store the fd */ - lobj_fd = lo_open(stmt->hdbc, lobj_oid, INV_WRITE); - if ( lobj_fd < 0) { - stmt->errornumber = STMT_EXEC_ERROR; - stmt->errormsg = "Couldnt open (in-line) large object for writing."; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + case SQL_LONGVARBINARY: - retval = lo_write(stmt->hdbc, lobj_fd, buffer, used); + if (stmt->parameters[param_number].data_at_exec) + { - lo_close(stmt->hdbc, lobj_fd); + lobj_oid = stmt->parameters[param_number].lobj_oid; - /* commit transaction if needed */ - if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) { - QResultClass *res; - char ok; + } + else + { + + /* begin transaction if needed */ + if (!CC_is_in_trans(stmt->hdbc)) + { + QResultClass *res; + char ok; + + res = CC_send_query(stmt->hdbc, "BEGIN", NULL); + if (!res) + { + stmt->errormsg = "Could not begin (in-line) a transaction"; + stmt->errornumber = STMT_EXEC_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } + ok = QR_command_successful(res); + QR_Destructor(res); + if (!ok) + { + stmt->errormsg = "Could not begin (in-line) a transaction"; + stmt->errornumber = STMT_EXEC_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } + + CC_set_in_trans(stmt->hdbc); + } - res = CC_send_query(stmt->hdbc, "COMMIT", NULL); - if (!res) { - stmt->errormsg = "Could not commit (in-line) a transaction"; + /* store the oid */ + lobj_oid = lo_creat(stmt->hdbc, INV_READ | INV_WRITE); + if (lobj_oid == 0) + { stmt->errornumber = STMT_EXEC_ERROR; + stmt->errormsg = "Couldnt create (in-line) large object."; SC_log_error(func, "", stmt); return SQL_ERROR; } - ok = QR_command_successful(res); - QR_Destructor(res); - if (!ok) { - stmt->errormsg = "Could not commit (in-line) a transaction"; + + /* store the fd */ + lobj_fd = lo_open(stmt->hdbc, lobj_oid, INV_WRITE); + if (lobj_fd < 0) + { stmt->errornumber = STMT_EXEC_ERROR; + stmt->errormsg = "Couldnt open (in-line) large object for writing."; SC_log_error(func, "", stmt); return SQL_ERROR; } - CC_set_no_trans(stmt->hdbc); - } - } + retval = lo_write(stmt->hdbc, lobj_fd, buffer, used); - /* the oid of the large object -- just put that in for the - parameter marker -- the data has already been sent to the large object - */ - sprintf(param_string, "'%d'", lobj_oid); - strcpy(&new_statement[npos], param_string); - npos += strlen(param_string); + lo_close(stmt->hdbc, lobj_fd); - break; + /* commit transaction if needed */ + if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) + { + QResultClass *res; + char ok; - /* because of no conversion operator for bool and int4, SQL_BIT */ - /* must be quoted (0 or 1 is ok to use inside the quotes) */ + res = CC_send_query(stmt->hdbc, "COMMIT", NULL); + if (!res) + { + stmt->errormsg = "Could not commit (in-line) a transaction"; + stmt->errornumber = STMT_EXEC_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } + ok = QR_command_successful(res); + QR_Destructor(res); + if (!ok) + { + stmt->errormsg = "Could not commit (in-line) a transaction"; + stmt->errornumber = STMT_EXEC_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } - default: /* a numeric type or SQL_BIT */ - if (param_sqltype == SQL_BIT) - new_statement[npos++] = '\''; /* Open Quote */ + CC_set_no_trans(stmt->hdbc); + } + } - if (buf) { - my_strcpy(&new_statement[npos], sizeof(stmt->stmt_with_params) - npos, buf, used); - npos += strlen(&new_statement[npos]); - } - else { + /* + * the oid of the large object -- just put that in for the + * parameter marker -- the data has already been sent to + * the large object + */ + sprintf(param_string, "'%d'", lobj_oid); strcpy(&new_statement[npos], param_string); npos += strlen(param_string); - } - if (param_sqltype == SQL_BIT) - new_statement[npos++] = '\''; /* Close Quote */ + break; - break; + /* + * because of no conversion operator for bool and int4, + * SQL_BIT + */ + /* must be quoted (0 or 1 is ok to use inside the quotes) */ + + default: /* a numeric type or SQL_BIT */ + if (param_sqltype == SQL_BIT) + new_statement[npos++] = '\''; /* Open Quote */ + + if (buf) + { + my_strcpy(&new_statement[npos], sizeof(stmt->stmt_with_params) - npos, buf, used); + npos += strlen(&new_statement[npos]); + } + else + { + strcpy(&new_statement[npos], param_string); + npos += strlen(param_string); + } + + if (param_sqltype == SQL_BIT) + new_statement[npos++] = '\''; /* Close Quote */ + + break; } - } /* end, for */ + } /* end, for */ /* make sure new_statement is always null-terminated */ new_statement[npos] = '\0'; - if(stmt->hdbc->DriverToDataSource != NULL) { - int length = strlen (new_statement); - stmt->hdbc->DriverToDataSource (stmt->hdbc->translation_option, - SQL_CHAR, - new_statement, length, - new_statement, length, NULL, - NULL, 0, NULL); + if (stmt->hdbc->DriverToDataSource != NULL) + { + int length = strlen(new_statement); + + stmt->hdbc->DriverToDataSource(stmt->hdbc->translation_option, + SQL_CHAR, + new_statement, length, + new_statement, length, NULL, + NULL, 0, NULL); } @@ -1106,10 +1215,10 @@ int lobj_fd, retval; char * mapFunction(char *func) { -int i; + int i; for (i = 0; mapFuncs[i][0]; i++) - if ( ! stricmp(mapFuncs[i][0], func)) + if (!stricmp(mapFuncs[i][0], func)) return mapFuncs[i][1]; return NULL; @@ -1121,34 +1230,40 @@ int i; char * convert_escape(char *value) { -static char escape[1024]; -char key[33]; + static char escape[1024]; + char key[33]; /* Separate off the key, skipping leading and trailing whitespace */ - while ((*value != '\0') && isspace((unsigned char) *value)) value++; + while ((*value != '\0') && isspace((unsigned char) *value)) + value++; sscanf(value, "%32s", key); - while ((*value != '\0') && (! isspace((unsigned char) *value))) value++; - while ((*value != '\0') && isspace((unsigned char) *value)) value++; + while ((*value != '\0') && (!isspace((unsigned char) *value))) + value++; + while ((*value != '\0') && isspace((unsigned char) *value)) + value++; mylog("convert_escape: key='%s', val='%s'\n", key, value); - if ( (strcmp(key, "d") == 0) || - (strcmp(key, "t") == 0) || - (strcmp(key, "ts") == 0)) { + if ((strcmp(key, "d") == 0) || + (strcmp(key, "t") == 0) || + (strcmp(key, "ts") == 0)) + { /* Literal; return the escape part as-is */ - strncpy(escape, value, sizeof(escape)-1); + strncpy(escape, value, sizeof(escape) - 1); } - else if (strcmp(key, "fn") == 0) { - /* Function invocation - * Separate off the func name, - * skipping trailing whitespace. + else if (strcmp(key, "fn") == 0) + { + + /* + * Function invocation Separate off the func name, skipping + * trailing whitespace. */ - char *funcEnd = value; - char svchar; - char *mapFunc; + char *funcEnd = value; + char svchar; + char *mapFunc; while ((*funcEnd != '\0') && (*funcEnd != '(') && - (! isspace((unsigned char) *funcEnd))) + (!isspace((unsigned char) *funcEnd))) funcEnd++; svchar = *funcEnd; *funcEnd = '\0'; @@ -1157,28 +1272,33 @@ char key[33]; while ((*funcEnd != '\0') && isspace((unsigned char) *funcEnd)) funcEnd++; - /* We expect left parenthesis here, - * else return fn body as-is since it is - * one of those "function constants". + /* + * We expect left parenthesis here, else return fn body as-is + * since it is one of those "function constants". */ - if (*funcEnd != '(') { - strncpy(escape, value, sizeof(escape)-1); + if (*funcEnd != '(') + { + strncpy(escape, value, sizeof(escape) - 1); return escape; } mapFunc = mapFunction(key); - /* We could have mapFunction() return key if not in table... - * - thomas 2000-04-03 + + /* + * We could have mapFunction() return key if not in table... - + * thomas 2000-04-03 */ - if (mapFunc == NULL) { + if (mapFunc == NULL) + { /* If unrecognized function name, return fn body as-is */ - strncpy(escape, value, sizeof(escape)-1); + strncpy(escape, value, sizeof(escape) - 1); return escape; } /* copy mapped name and remaining input string */ strcpy(escape, mapFunc); - strncat(escape, funcEnd, sizeof(escape)-1-strlen(mapFunc)); + strncat(escape, funcEnd, sizeof(escape) - 1 - strlen(mapFunc)); } - else { + else + { /* Bogus key, leave untranslated */ return NULL; } @@ -1191,11 +1311,13 @@ char key[33]; char * convert_money(char *s) { -size_t i = 0, out = 0; + size_t i = 0, + out = 0; - for (i = 0; i < strlen(s); i++) { + for (i = 0; i < strlen(s); i++) + { if (s[i] == '$' || s[i] == ',' || s[i] == ')') - ; /* skip these characters */ + ; /* skip these characters */ else if (s[i] == '(') s[out++] = '-'; else @@ -1210,19 +1332,25 @@ size_t i = 0, out = 0; /* This function parses a character string for date/time info and fills in SIMPLE_TIME */ /* It does not zero out SIMPLE_TIME in case it is desired to initialize it with a value */ char -parse_datetime(char *buf, SIMPLE_TIME *st) +parse_datetime(char *buf, SIMPLE_TIME * st) { -int y,m,d,hh,mm,ss; -int nf; - + int y, + m, + d, + hh, + mm, + ss; + int nf; + y = m = d = hh = mm = ss = 0; - if (buf[4] == '-') /* year first */ - nf = sscanf(buf, "%4d-%2d-%2d %2d:%2d:%2d", &y,&m,&d,&hh,&mm,&ss); + if (buf[4] == '-') /* year first */ + nf = sscanf(buf, "%4d-%2d-%2d %2d:%2d:%2d", &y, &m, &d, &hh, &mm, &ss); else - nf = sscanf(buf, "%2d-%2d-%4d %2d:%2d:%2d", &m,&d,&y,&hh,&mm,&ss); + nf = sscanf(buf, "%2d-%2d-%4d %2d:%2d:%2d", &m, &d, &y, &hh, &mm, &ss); - if (nf == 5 || nf == 6) { + if (nf == 5 || nf == 6) + { st->y = y; st->m = m; st->d = d; @@ -1233,12 +1361,13 @@ int nf; return TRUE; } - if (buf[4] == '-') /* year first */ + if (buf[4] == '-') /* year first */ nf = sscanf(buf, "%4d-%2d-%2d", &y, &m, &d); else nf = sscanf(buf, "%2d-%2d-%4d", &m, &d, &y); - if (nf == 3) { + if (nf == 3) + { st->y = y; st->m = m; st->d = d; @@ -1247,7 +1376,8 @@ int nf; } nf = sscanf(buf, "%2d:%2d:%2d", &hh, &mm, &ss); - if (nf == 2 || nf == 3) { + if (nf == 2 || nf == 3) + { st->hh = hh; st->mm = mm; st->ss = ss; @@ -1262,12 +1392,16 @@ int nf; int convert_linefeeds(char *si, char *dst, size_t max) { -size_t i = 0, out = 0; + size_t i = 0, + out = 0; - for (i = 0; i < strlen(si) && out < max - 1; i++) { - if (si[i] == '\n') { - /* Only add the carriage-return if needed */ - if (i > 0 && si[i-1] == '\r') { + for (i = 0; i < strlen(si) && out < max - 1; i++) + { + if (si[i] == '\n') + { + /* Only add the carriage-return if needed */ + if (i > 0 && si[i - 1] == '\r') + { dst[out++] = si[i]; continue; } @@ -1282,15 +1416,17 @@ size_t i = 0, out = 0; return out; } -/* Change carriage-return/linefeed to just linefeed +/* Change carriage-return/linefeed to just linefeed Plus, escape any special characters. */ char * convert_special_chars(char *si, char *dst, int used) { -size_t i = 0, out = 0, max; -static char sout[TEXT_FIELD_SIZE+5]; -char *p; + size_t i = 0, + out = 0, + max; + static char sout[TEXT_FIELD_SIZE + 5]; + char *p; if (dst) p = dst; @@ -1304,8 +1440,9 @@ char *p; else max = used; - for (i = 0; i < max; i++) { - if (si[i] == '\r' && i+1 < strlen(si) && si[i+1] == '\n') + for (i = 0; i < max; i++) + { + if (si[i] == '\r' && i + 1 < strlen(si) && si[i + 1] == '\n') continue; else if (si[i] == '\'' || si[i] == '\\') p[out++] = '\\'; @@ -1329,11 +1466,11 @@ convert_pgbinary_to_char(char *value, char *rgbValue, int cbValueMax) unsigned int conv_from_octal(unsigned char *s) { -int i, y=0; + int i, + y = 0; - for (i = 1; i <= 3; i++) { - y += (s[i] - 48) * (int) pow(8, 3-i); - } + for (i = 1; i <= 3; i++) + y += (s[i] - 48) * (int) pow(8, 3 - i); return y; @@ -1342,18 +1479,21 @@ int i, y=0; unsigned int conv_from_hex(unsigned char *s) { -int i, y=0, val; + int i, + y = 0, + val; - for (i = 1; i <= 2; i++) { + for (i = 1; i <= 2; i++) + { - if (s[i] >= 'a' && s[i] <= 'f') - val = s[i] - 'a' + 10; - else if (s[i] >= 'A' && s[i] <= 'F') - val = s[i] - 'A' + 10; - else - val = s[i] - '0'; + if (s[i] >= 'a' && s[i] <= 'f') + val = s[i] - 'a' + 10; + else if (s[i] >= 'A' && s[i] <= 'F') + val = s[i] - 'A' + 10; + else + val = s[i] - '0'; - y += val * (int) pow(16, 2-i); + y += val * (int) pow(16, 2 - i); } return y; @@ -1363,23 +1503,24 @@ int i, y=0, val; int convert_from_pgbinary(unsigned char *value, unsigned char *rgbValue, int cbValueMax) { -size_t i; -int o=0; + size_t i; + int o = 0; - - for (i = 0; i < strlen(value); ) { - if (value[i] == '\\') { + + for (i = 0; i < strlen(value);) + { + if (value[i] == '\\') + { rgbValue[o] = conv_from_octal(&value[i]); i += 4; } - else { + else rgbValue[o] = value[i++]; - } mylog("convert_from_pgbinary: i=%d, rgbValue[%d] = %d, %c\n", i, o, rgbValue[o], rgbValue[o]); o++; } - rgbValue[o] = '\0'; /* extra protection */ + rgbValue[o] = '\0'; /* extra protection */ return o; } @@ -1388,14 +1529,15 @@ int o=0; char * conv_to_octal(unsigned char val) { -int i; -static char x[6]; + int i; + static char x[6]; x[0] = '\\'; x[1] = '\\'; x[5] = '\0'; - for (i = 4; i > 1; i--) { + for (i = 4; i > 1; i--) + { x[i] = (val & 7) + 48; val >>= 3; } @@ -1407,16 +1549,18 @@ static char x[6]; int convert_to_pgbinary(unsigned char *in, char *out, int len) { -int i, o=0; + int i, + o = 0; - for (i = 0; i < len; i++) { + for (i = 0; i < len; i++) + { mylog("convert_to_pgbinary: in[%d] = %d, %c\n", i, in[i], in[i]); - if ( isalnum(in[i]) || in[i] == ' ') { + if (isalnum(in[i]) || in[i] == ' ') out[o++] = in[i]; - } - else { - strcpy(&out[o], conv_to_octal(in[i])); + else + { + strcpy(&out[o], conv_to_octal(in[i])); o += 5; } @@ -1431,17 +1575,20 @@ int i, o=0; void encode(char *in, char *out) { - unsigned int i, o = 0; + unsigned int i, + o = 0; - for (i = 0; i < strlen(in); i++) { - if ( in[i] == '+') { + for (i = 0; i < strlen(in); i++) + { + if (in[i] == '+') + { sprintf(&out[o], "%%2B"); o += 3; } - else if ( isspace((unsigned char) in[i])) { + else if (isspace((unsigned char) in[i])) out[o++] = '+'; - } - else if ( ! isalnum((unsigned char) in[i])) { + else if (!isalnum((unsigned char) in[i])) + { sprintf(&out[o], "%%%02x", (unsigned char) in[i]); o += 3; } @@ -1455,14 +1602,17 @@ encode(char *in, char *out) void decode(char *in, char *out) { -unsigned int i, o = 0; + unsigned int i, + o = 0; - for (i = 0; i < strlen(in); i++) { + for (i = 0; i < strlen(in); i++) + { if (in[i] == '+') out[o++] = ' '; - else if (in[i] == '%') { + else if (in[i] == '%') + { sprintf(&out[o++], "%c", conv_from_hex(&in[i])); - i+=2; + i += 2; } else out[o++] = in[i]; @@ -1482,45 +1632,53 @@ unsigned int i, o = 0; CURRENTLY, ONLY LONGVARBINARY is handled, since that is the only data type currently mapped to a PG_TYPE_LO. But, if any other types - are desired to map to a large object (PG_TYPE_LO), then that would + are desired to map to a large object (PG_TYPE_LO), then that would need to be handled here. For example, LONGVARCHAR could possibly be mapped to PG_TYPE_LO someday, instead of PG_TYPE_TEXT as it is now. */ int -convert_lo(StatementClass *stmt, void *value, Int2 fCType, PTR rgbValue, - SDWORD cbValueMax, SDWORD *pcbValue) +convert_lo(StatementClass * stmt, void *value, Int2 fCType, PTR rgbValue, + SDWORD cbValueMax, SDWORD * pcbValue) { - Oid oid; - int retval, result, left = -1; + Oid oid; + int retval, + result, + left = -1; BindInfoClass *bindInfo = NULL; /* If using SQLGetData, then current_col will be set */ - if (stmt->current_col >= 0) { + if (stmt->current_col >= 0) + { bindInfo = &stmt->bindings[stmt->current_col]; left = bindInfo->data_left; } - /* if this is the first call for this column, - open the large object for reading - */ + /* + * if this is the first call for this column, open the large object + * for reading + */ - if ( ! bindInfo || bindInfo->data_left == -1) { + if (!bindInfo || bindInfo->data_left == -1) + { /* begin transaction if needed */ - if(!CC_is_in_trans(stmt->hdbc)) { + if (!CC_is_in_trans(stmt->hdbc)) + { QResultClass *res; - char ok; + char ok; res = CC_send_query(stmt->hdbc, "BEGIN", NULL); - if (!res) { + if (!res) + { stmt->errormsg = "Could not begin (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; } ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { stmt->errormsg = "Could not begin (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; @@ -1531,53 +1689,59 @@ convert_lo(StatementClass *stmt, void *value, Int2 fCType, PTR rgbValue, oid = atoi(value); stmt->lobj_fd = lo_open(stmt->hdbc, oid, INV_READ); - if (stmt->lobj_fd < 0) { + if (stmt->lobj_fd < 0) + { stmt->errornumber = STMT_EXEC_ERROR; stmt->errormsg = "Couldnt open large object for reading."; return COPY_GENERAL_ERROR; } - /* Get the size */ + /* Get the size */ retval = lo_lseek(stmt->hdbc, stmt->lobj_fd, 0L, SEEK_END); - if (retval >= 0) { + if (retval >= 0) + { left = lo_tell(stmt->hdbc, stmt->lobj_fd); if (bindInfo) bindInfo->data_left = left; - /* return to beginning */ + /* return to beginning */ lo_lseek(stmt->hdbc, stmt->lobj_fd, 0L, SEEK_SET); } } - if (left == 0) { + if (left == 0) return COPY_NO_DATA_FOUND; - } - if (stmt->lobj_fd < 0) { + if (stmt->lobj_fd < 0) + { stmt->errornumber = STMT_EXEC_ERROR; stmt->errormsg = "Large object FD undefined for multiple read."; return COPY_GENERAL_ERROR; } retval = lo_read(stmt->hdbc, stmt->lobj_fd, (char *) rgbValue, cbValueMax); - if (retval < 0) { + if (retval < 0) + { lo_close(stmt->hdbc, stmt->lobj_fd); /* commit transaction if needed */ - if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) { + if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) + { QResultClass *res; - char ok; + char ok; res = CC_send_query(stmt->hdbc, "COMMIT", NULL); - if (!res) { + if (!res) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; } ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; @@ -1602,27 +1766,31 @@ convert_lo(StatementClass *stmt, void *value, Int2 fCType, PTR rgbValue, *pcbValue = left < 0 ? SQL_NO_TOTAL : left; - if (bindInfo && bindInfo->data_left > 0) + if (bindInfo && bindInfo->data_left > 0) bindInfo->data_left -= retval; - if (! bindInfo || bindInfo->data_left == 0) { + if (!bindInfo || bindInfo->data_left == 0) + { lo_close(stmt->hdbc, stmt->lobj_fd); /* commit transaction if needed */ - if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) { + if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) + { QResultClass *res; - char ok; + char ok; res = CC_send_query(stmt->hdbc, "COMMIT", NULL); - if (!res) { + if (!res) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; } ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; return COPY_GENERAL_ERROR; @@ -1631,7 +1799,7 @@ convert_lo(StatementClass *stmt, void *value, Int2 fCType, PTR rgbValue, CC_set_no_trans(stmt->hdbc); } - stmt->lobj_fd = -1; /* prevent further reading */ + stmt->lobj_fd = -1; /* prevent further reading */ } diff --git a/src/interfaces/odbc/convert.h b/src/interfaces/odbc/convert.h index 7fd8254779..1660f8084f 100644 --- a/src/interfaces/odbc/convert.h +++ b/src/interfaces/odbc/convert.h @@ -1,9 +1,9 @@ -/* File: convert.h +/* File: convert.h * - * Description: See "convert.c" + * Description: See "convert.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -13,39 +13,40 @@ #include "psqlodbc.h" /* copy_and_convert results */ -#define COPY_OK 0 -#define COPY_UNSUPPORTED_TYPE 1 +#define COPY_OK 0 +#define COPY_UNSUPPORTED_TYPE 1 #define COPY_UNSUPPORTED_CONVERSION 2 -#define COPY_RESULT_TRUNCATED 3 -#define COPY_GENERAL_ERROR 4 -#define COPY_NO_DATA_FOUND 5 - -typedef struct { - int m; - int d; - int y; - int hh; - int mm; - int ss; -} SIMPLE_TIME; - -int copy_and_convert_field_bindinfo(StatementClass *stmt, Int4 field_type, void *value, int col); -int copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 fCType, - PTR rgbValue, SDWORD cbValueMax, SDWORD *pcbValue); - -int copy_statement_with_parameters(StatementClass *stmt); -char *convert_escape(char *value); -char *convert_money(char *s); -char parse_datetime(char *buf, SIMPLE_TIME *st); -int convert_linefeeds(char *s, char *dst, size_t max); -char *convert_special_chars(char *si, char *dst, int used); - -int convert_pgbinary_to_char(char *value, char *rgbValue, int cbValueMax); -int convert_from_pgbinary(unsigned char *value, unsigned char *rgbValue, int cbValueMax); -int convert_to_pgbinary(unsigned char *in, char *out, int len); -void encode(char *in, char *out); -void decode(char *in, char *out); -int convert_lo(StatementClass *stmt, void *value, Int2 fCType, PTR rgbValue, - SDWORD cbValueMax, SDWORD *pcbValue); +#define COPY_RESULT_TRUNCATED 3 +#define COPY_GENERAL_ERROR 4 +#define COPY_NO_DATA_FOUND 5 + +typedef struct +{ + int m; + int d; + int y; + int hh; + int mm; + int ss; +} SIMPLE_TIME; + +int copy_and_convert_field_bindinfo(StatementClass * stmt, Int4 field_type, void *value, int col); +int copy_and_convert_field(StatementClass * stmt, Int4 field_type, void *value, Int2 fCType, + PTR rgbValue, SDWORD cbValueMax, SDWORD * pcbValue); + +int copy_statement_with_parameters(StatementClass * stmt); +char *convert_escape(char *value); +char *convert_money(char *s); +char parse_datetime(char *buf, SIMPLE_TIME * st); +int convert_linefeeds(char *s, char *dst, size_t max); +char *convert_special_chars(char *si, char *dst, int used); + +int convert_pgbinary_to_char(char *value, char *rgbValue, int cbValueMax); +int convert_from_pgbinary(unsigned char *value, unsigned char *rgbValue, int cbValueMax); +int convert_to_pgbinary(unsigned char *in, char *out, int len); +void encode(char *in, char *out); +void decode(char *in, char *out); +int convert_lo(StatementClass * stmt, void *value, Int2 fCType, PTR rgbValue, + SDWORD cbValueMax, SDWORD * pcbValue); #endif diff --git a/src/interfaces/odbc/dlg_specific.c b/src/interfaces/odbc/dlg_specific.c index 2bbf46faea..5f8e276a0a 100644 --- a/src/interfaces/odbc/dlg_specific.c +++ b/src/interfaces/odbc/dlg_specific.c @@ -1,17 +1,17 @@ -/* Module: dlg_specific.c +/* Module: dlg_specific.c * - * Description: This module contains any specific code for handling - * dialog boxes such as driver/datasource options. Both the - * ConfigDSN() and the SQLDriverConnect() functions use - * functions in this module. If you were to add a new option - * to any dialog box, you would most likely only have to change - * things in here rather than in 2 separate places as before. + * Description: This module contains any specific code for handling + * dialog boxes such as driver/datasource options. Both the + * ConfigDSN() and the SQLDriverConnect() functions use + * functions in this module. If you were to add a new option + * to any dialog box, you would most likely only have to change + * things in here rather than in 2 separate places as before. * - * Classes: none + * Classes: none * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -20,14 +20,14 @@ #endif #ifndef WIN32 -# include -# include "gpps.h" -# define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f) -# define SQLWritePrivateProfileString(a,b,c,d) WritePrivateProfileString(a,b,c,d) -# ifndef HAVE_STRICMP -# define stricmp(s1,s2) strcasecmp(s1,s2) -# define strnicmp(s1,s2,n) strncasecmp(s1,s2,n) -# endif +#include +#include "gpps.h" +#define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f) +#define SQLWritePrivateProfileString(a,b,c,d) WritePrivateProfileString(a,b,c,d) +#ifndef HAVE_STRICMP +#define stricmp(s1,s2) strcasecmp(s1,s2) +#define strnicmp(s1,s2,n) strncasecmp(s1,s2,n) +#endif #endif #include "dlg_specific.h" @@ -47,10 +47,15 @@ extern GLOBAL_VALUES globals; #ifdef WIN32 void -SetDlgStuff(HWND hdlg, ConnInfo *ci) +SetDlgStuff(HWND hdlg, ConnInfo * ci) { - /* If driver attribute NOT present, then set the datasource name and description */ - if (ci->driver[0] == '\0') { + + /* + * If driver attribute NOT present, then set the datasource name and + * description + */ + if (ci->driver[0] == '\0') + { SetDlgItemText(hdlg, IDC_DSNAME, ci->dsn); SetDlgItemText(hdlg, IDC_DESC, ci->desc); } @@ -62,8 +67,8 @@ SetDlgStuff(HWND hdlg, ConnInfo *ci) SetDlgItemText(hdlg, IDC_PORT, ci->port); } -void -GetDlgStuff(HWND hdlg, ConnInfo *ci) +void +GetDlgStuff(HWND hdlg, ConnInfo * ci) { GetDlgItemText(hdlg, IDC_DESC, ci->desc, sizeof(ci->desc)); @@ -76,286 +81,296 @@ GetDlgStuff(HWND hdlg, ConnInfo *ci) -int CALLBACK driver_optionsProc(HWND hdlg, - WORD wMsg, - WPARAM wParam, - LPARAM lParam) +int CALLBACK +driver_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam) { - switch (wMsg) { - case WM_INITDIALOG: - - CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog); - CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer); - CheckDlgButton(hdlg, DRV_KSQO, globals.ksqo); - CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index); - CheckDlgButton(hdlg, DRV_READONLY, globals.onlyread); - CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, globals.use_declarefetch); - - /* Unknown (Default) Data Type sizes */ - switch(globals.unknown_sizes) { - case UNKNOWNS_AS_DONTKNOW: - CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1); - break; - case UNKNOWNS_AS_LONGEST: - CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1); - break; - case UNKNOWNS_AS_MAX: - default: - CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1); - break; - } - - CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, globals.text_as_longvarchar); - CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, globals.unknowns_as_longvarchar); - CheckDlgButton(hdlg, DRV_BOOLS_CHAR, globals.bools_as_char); - - CheckDlgButton(hdlg, DRV_PARSE, globals.parse); + switch (wMsg) + { + case WM_INITDIALOG: + + CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog); + CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer); + CheckDlgButton(hdlg, DRV_KSQO, globals.ksqo); + CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index); + CheckDlgButton(hdlg, DRV_READONLY, globals.onlyread); + CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, globals.use_declarefetch); + + /* Unknown (Default) Data Type sizes */ + switch (globals.unknown_sizes) + { + case UNKNOWNS_AS_DONTKNOW: + CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1); + break; + case UNKNOWNS_AS_LONGEST: + CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1); + break; + case UNKNOWNS_AS_MAX: + default: + CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1); + break; + } - CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, globals.cancel_as_freestmt); + CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, globals.text_as_longvarchar); + CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, globals.unknowns_as_longvarchar); + CheckDlgButton(hdlg, DRV_BOOLS_CHAR, globals.bools_as_char); - SetDlgItemInt(hdlg, DRV_CACHE_SIZE, globals.fetch_max, FALSE); - SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, globals.max_varchar_size, FALSE); - SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, globals.max_longvarchar_size, TRUE); + CheckDlgButton(hdlg, DRV_PARSE, globals.parse); - SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes); + CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, globals.cancel_as_freestmt); - /* Driver Connection Settings */ - SetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings); + SetDlgItemInt(hdlg, DRV_CACHE_SIZE, globals.fetch_max, FALSE); + SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, globals.max_varchar_size, FALSE); + SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, globals.max_longvarchar_size, TRUE); - break; + SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes); - case WM_COMMAND: - switch (GET_WM_COMMAND_ID(wParam, lParam)) { - case IDOK: + /* Driver Connection Settings */ + SetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings); - globals.commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG); - globals.disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER); - globals.ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO); - globals.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX); - globals.onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY); - globals.use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH); + break; - /* Unknown (Default) Data Type sizes */ - if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_MAX)) - globals.unknown_sizes = UNKNOWNS_AS_MAX; - else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_DONTKNOW)) - globals.unknown_sizes = UNKNOWNS_AS_DONTKNOW; - else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_LONGEST)) - globals.unknown_sizes = UNKNOWNS_AS_LONGEST; - else - globals.unknown_sizes = UNKNOWNS_AS_MAX; - - globals.text_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_TEXT_LONGVARCHAR); - globals.unknowns_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_UNKNOWNS_LONGVARCHAR); - globals.bools_as_char = IsDlgButtonChecked(hdlg, DRV_BOOLS_CHAR); - - globals.parse = IsDlgButtonChecked(hdlg, DRV_PARSE); - - globals.cancel_as_freestmt = IsDlgButtonChecked(hdlg, DRV_CANCELASFREESTMT); - - globals.fetch_max = GetDlgItemInt(hdlg, DRV_CACHE_SIZE, NULL, FALSE); - globals.max_varchar_size = GetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, NULL, FALSE); - globals.max_longvarchar_size= GetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, NULL, TRUE); /* allows for SQL_NO_TOTAL */ - - GetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, sizeof(globals.extra_systable_prefixes)); - - /* Driver Connection Settings */ - GetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings, sizeof(globals.conn_settings)); - - updateGlobals(); - - /* fall through */ - - case IDCANCEL: - EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); - return TRUE; - - case IDDEFAULTS: - CheckDlgButton(hdlg, DRV_COMMLOG, DEFAULT_COMMLOG); - CheckDlgButton(hdlg, DRV_OPTIMIZER, DEFAULT_OPTIMIZER); - CheckDlgButton(hdlg, DRV_KSQO, DEFAULT_KSQO); - CheckDlgButton(hdlg, DRV_UNIQUEINDEX, DEFAULT_UNIQUEINDEX); - CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY); - CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH); - - CheckDlgButton(hdlg, DRV_PARSE, DEFAULT_PARSE); - CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, DEFAULT_CANCELASFREESTMT); - - /* Unknown Sizes */ - CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 0); - CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 0); - CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 0); - switch(DEFAULT_UNKNOWNSIZES) { - case UNKNOWNS_AS_DONTKNOW: - CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1); - break; - case UNKNOWNS_AS_LONGEST: - CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1); - break; - case UNKNOWNS_AS_MAX: - CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1); - break; + case WM_COMMAND: + switch (GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK: + + globals.commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG); + globals.disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER); + globals.ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO); + globals.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX); + globals.onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY); + globals.use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH); + + /* Unknown (Default) Data Type sizes */ + if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_MAX)) + globals.unknown_sizes = UNKNOWNS_AS_MAX; + else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_DONTKNOW)) + globals.unknown_sizes = UNKNOWNS_AS_DONTKNOW; + else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_LONGEST)) + globals.unknown_sizes = UNKNOWNS_AS_LONGEST; + else + globals.unknown_sizes = UNKNOWNS_AS_MAX; + + globals.text_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_TEXT_LONGVARCHAR); + globals.unknowns_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_UNKNOWNS_LONGVARCHAR); + globals.bools_as_char = IsDlgButtonChecked(hdlg, DRV_BOOLS_CHAR); + + globals.parse = IsDlgButtonChecked(hdlg, DRV_PARSE); + + globals.cancel_as_freestmt = IsDlgButtonChecked(hdlg, DRV_CANCELASFREESTMT); + + globals.fetch_max = GetDlgItemInt(hdlg, DRV_CACHE_SIZE, NULL, FALSE); + globals.max_varchar_size = GetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, NULL, FALSE); + globals.max_longvarchar_size = GetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, NULL, TRUE); /* allows for + * SQL_NO_TOTAL */ + + GetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, sizeof(globals.extra_systable_prefixes)); + + /* Driver Connection Settings */ + GetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings, sizeof(globals.conn_settings)); + + updateGlobals(); + + /* fall through */ + + case IDCANCEL: + EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); + return TRUE; + + case IDDEFAULTS: + CheckDlgButton(hdlg, DRV_COMMLOG, DEFAULT_COMMLOG); + CheckDlgButton(hdlg, DRV_OPTIMIZER, DEFAULT_OPTIMIZER); + CheckDlgButton(hdlg, DRV_KSQO, DEFAULT_KSQO); + CheckDlgButton(hdlg, DRV_UNIQUEINDEX, DEFAULT_UNIQUEINDEX); + CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY); + CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH); + + CheckDlgButton(hdlg, DRV_PARSE, DEFAULT_PARSE); + CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, DEFAULT_CANCELASFREESTMT); + + /* Unknown Sizes */ + CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 0); + CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 0); + CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 0); + switch (DEFAULT_UNKNOWNSIZES) + { + case UNKNOWNS_AS_DONTKNOW: + CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1); + break; + case UNKNOWNS_AS_LONGEST: + CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1); + break; + case UNKNOWNS_AS_MAX: + CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1); + break; + } + + CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, DEFAULT_TEXTASLONGVARCHAR); + CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, DEFAULT_UNKNOWNSASLONGVARCHAR); + CheckDlgButton(hdlg, DRV_BOOLS_CHAR, DEFAULT_BOOLSASCHAR); + + SetDlgItemInt(hdlg, DRV_CACHE_SIZE, FETCH_MAX, FALSE); + SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, MAX_VARCHAR_SIZE, FALSE); + SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, TEXT_FIELD_SIZE, TRUE); + + SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, DEFAULT_EXTRASYSTABLEPREFIXES); + + /* Driver Connection Settings */ + SetDlgItemText(hdlg, DRV_CONNSETTINGS, ""); + + break; } - CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, DEFAULT_TEXTASLONGVARCHAR); - CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, DEFAULT_UNKNOWNSASLONGVARCHAR); - CheckDlgButton(hdlg, DRV_BOOLS_CHAR, DEFAULT_BOOLSASCHAR); - - SetDlgItemInt(hdlg, DRV_CACHE_SIZE, FETCH_MAX, FALSE); - SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, MAX_VARCHAR_SIZE, FALSE); - SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, TEXT_FIELD_SIZE, TRUE); - - SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, DEFAULT_EXTRASYSTABLEPREFIXES); - - /* Driver Connection Settings */ - SetDlgItemText(hdlg, DRV_CONNSETTINGS, ""); - - break; - } - } return FALSE; } -int CALLBACK ds_optionsProc(HWND hdlg, - WORD wMsg, - WPARAM wParam, - LPARAM lParam) +int CALLBACK +ds_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam) { -ConnInfo *ci; -char buf[128]; - - switch (wMsg) { - case WM_INITDIALOG: - ci = (ConnInfo *) lParam; - SetWindowLong(hdlg, DWL_USER, lParam); /* save for OK */ - - /* Change window caption */ - if (ci->driver[0]) - SetWindowText(hdlg, "Advanced Options (Connection)"); - else { - sprintf(buf, "Advanced Options (%s)", ci->dsn); - SetWindowText(hdlg, buf); - } + ConnInfo *ci; + char buf[128]; + + switch (wMsg) + { + case WM_INITDIALOG: + ci = (ConnInfo *) lParam; + SetWindowLong(hdlg, DWL_USER, lParam); /* save for OK */ + + /* Change window caption */ + if (ci->driver[0]) + SetWindowText(hdlg, "Advanced Options (Connection)"); + else + { + sprintf(buf, "Advanced Options (%s)", ci->dsn); + SetWindowText(hdlg, buf); + } - /* Readonly */ - CheckDlgButton(hdlg, DS_READONLY, atoi(ci->onlyread)); + /* Readonly */ + CheckDlgButton(hdlg, DS_READONLY, atoi(ci->onlyread)); - /* Protocol */ - CheckDlgButton(hdlg, DS_PG64, 1); + /* Protocol */ + CheckDlgButton(hdlg, DS_PG64, 1); - CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column)); - CheckDlgButton(hdlg, DS_FAKEOIDINDEX, atoi(ci->fake_oid_index)); - CheckDlgButton(hdlg, DS_ROWVERSIONING, atoi(ci->row_versioning)); - CheckDlgButton(hdlg, DS_SHOWSYSTEMTABLES, atoi(ci->show_system_tables)); + CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column)); + CheckDlgButton(hdlg, DS_FAKEOIDINDEX, atoi(ci->fake_oid_index)); + CheckDlgButton(hdlg, DS_ROWVERSIONING, atoi(ci->row_versioning)); + CheckDlgButton(hdlg, DS_SHOWSYSTEMTABLES, atoi(ci->show_system_tables)); - EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column)); + EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column)); - /* Datasource Connection Settings */ - SetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings); - break; + /* Datasource Connection Settings */ + SetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings); + break; - case WM_COMMAND: - switch (GET_WM_COMMAND_ID(wParam, lParam)) { - case DS_SHOWOIDCOLUMN: - mylog("WM_COMMAND: DS_SHOWOIDCOLUMN\n"); - EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN)); - return TRUE; + case WM_COMMAND: + switch (GET_WM_COMMAND_ID(wParam, lParam)) + { + case DS_SHOWOIDCOLUMN: + mylog("WM_COMMAND: DS_SHOWOIDCOLUMN\n"); + EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN)); + return TRUE; - case IDOK: + case IDOK: - ci = (ConnInfo *)GetWindowLong(hdlg, DWL_USER); - mylog("IDOK: got ci = %u\n", ci); + ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER); + mylog("IDOK: got ci = %u\n", ci); - /* Readonly */ - sprintf(ci->onlyread, "%d", IsDlgButtonChecked(hdlg, DS_READONLY)); + /* Readonly */ + sprintf(ci->onlyread, "%d", IsDlgButtonChecked(hdlg, DS_READONLY)); - /* Protocol */ - strcpy(ci->protocol, PG64); + /* Protocol */ + strcpy(ci->protocol, PG64); - sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES)); + sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES)); - sprintf(ci->row_versioning, "%d", IsDlgButtonChecked(hdlg, DS_ROWVERSIONING)); + sprintf(ci->row_versioning, "%d", IsDlgButtonChecked(hdlg, DS_ROWVERSIONING)); - /* OID Options*/ - sprintf(ci->fake_oid_index, "%d", IsDlgButtonChecked(hdlg, DS_FAKEOIDINDEX)); - sprintf(ci->show_oid_column, "%d", IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN)); + /* OID Options */ + sprintf(ci->fake_oid_index, "%d", IsDlgButtonChecked(hdlg, DS_FAKEOIDINDEX)); + sprintf(ci->show_oid_column, "%d", IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN)); - /* Datasource Connection Settings */ - GetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings, sizeof(ci->conn_settings)); + /* Datasource Connection Settings */ + GetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings, sizeof(ci->conn_settings)); - /* fall through */ + /* fall through */ - case IDCANCEL: - EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); - return TRUE; - } + case IDCANCEL: + EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); + return TRUE; + } } return FALSE; } -#endif /* WIN32 */ +#endif /* WIN32 */ void -makeConnectString(char *connect_string, ConnInfo *ci) +makeConnectString(char *connect_string, ConnInfo * ci) { -char got_dsn = (ci->dsn[0] != '\0'); -char encoded_conn_settings[LARGE_REGISTRY_LEN]; + char got_dsn = (ci->dsn[0] != '\0'); + char encoded_conn_settings[LARGE_REGISTRY_LEN]; - /* fundamental info */ + /* fundamental info */ sprintf(connect_string, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s", - got_dsn ? "DSN" : "DRIVER", - got_dsn ? ci->dsn : ci->driver, - ci->database, - ci->server, - ci->port, - ci->username, - ci->password); + got_dsn ? "DSN" : "DRIVER", + got_dsn ? ci->dsn : ci->driver, + ci->database, + ci->server, + ci->port, + ci->username, + ci->password); encode(ci->conn_settings, encoded_conn_settings); - /* extra info */ - sprintf(&connect_string[strlen(connect_string)], - ";READONLY=%s;PROTOCOL=%s;FAKEOIDINDEX=%s;SHOWOIDCOLUMN=%s;ROWVERSIONING=%s;SHOWSYSTEMTABLES=%s;CONNSETTINGS=%s", - ci->onlyread, - ci->protocol, - ci->fake_oid_index, - ci->show_oid_column, - ci->row_versioning, - ci->show_system_tables, - encoded_conn_settings); + /* extra info */ + sprintf(&connect_string[strlen(connect_string)], + ";READONLY=%s;PROTOCOL=%s;FAKEOIDINDEX=%s;SHOWOIDCOLUMN=%s;ROWVERSIONING=%s;SHOWSYSTEMTABLES=%s;CONNSETTINGS=%s", + ci->onlyread, + ci->protocol, + ci->fake_oid_index, + ci->show_oid_column, + ci->row_versioning, + ci->show_system_tables, + encoded_conn_settings); } void -copyAttributes(ConnInfo *ci, char *attribute, char *value) +copyAttributes(ConnInfo * ci, char *attribute, char *value) { - if(stricmp(attribute, "DSN") == 0) + if (stricmp(attribute, "DSN") == 0) strcpy(ci->dsn, value); - else if(stricmp(attribute, "driver") == 0) + else if (stricmp(attribute, "driver") == 0) strcpy(ci->driver, value); - else if(stricmp(attribute, INI_DATABASE) == 0) + else if (stricmp(attribute, INI_DATABASE) == 0) strcpy(ci->database, value); - else if(stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, "server") == 0) + else if (stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, "server") == 0) strcpy(ci->server, value); - else if(stricmp(attribute, INI_USER) == 0 || stricmp(attribute, "uid") == 0) + else if (stricmp(attribute, INI_USER) == 0 || stricmp(attribute, "uid") == 0) strcpy(ci->username, value); - else if(stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0) + else if (stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0) strcpy(ci->password, value); - else if(stricmp(attribute, INI_PORT) == 0) + else if (stricmp(attribute, INI_PORT) == 0) strcpy(ci->port, value); else if (stricmp(attribute, INI_READONLY) == 0) @@ -376,17 +391,18 @@ copyAttributes(ConnInfo *ci, char *attribute, char *value) else if (stricmp(attribute, INI_SHOWSYSTEMTABLES) == 0) strcpy(ci->show_system_tables, value); - else if (stricmp(attribute, INI_CONNSETTINGS) == 0) { + else if (stricmp(attribute, INI_CONNSETTINGS) == 0) + { decode(value, ci->conn_settings); /* strcpy(ci->conn_settings, value); */ } - mylog("copyAttributes: DSN='%s',server='%s',dbase='%s',user='%s',passwd='%s',port='%s',onlyread='%s',protocol='%s', conn_settings='%s')\n", ci->dsn, ci->server,ci->database,ci->username,ci->password,ci->port,ci->onlyread,ci->protocol,ci->conn_settings); + mylog("copyAttributes: DSN='%s',server='%s',dbase='%s',user='%s',passwd='%s',port='%s',onlyread='%s',protocol='%s', conn_settings='%s')\n", ci->dsn, ci->server, ci->database, ci->username, ci->password, ci->port, ci->onlyread, ci->protocol, ci->conn_settings); } void -getDSNdefaults(ConnInfo *ci) +getDSNdefaults(ConnInfo * ci) { if (ci->port[0] == '\0') strcpy(ci->port, DEFAULT_PORT); @@ -411,445 +427,460 @@ getDSNdefaults(ConnInfo *ci) } -void -getDSNinfo(ConnInfo *ci, char overwrite) +void +getDSNinfo(ConnInfo * ci, char overwrite) { -char *DSN = ci->dsn; -char encoded_conn_settings[LARGE_REGISTRY_LEN]; + char *DSN = ci->dsn; + char encoded_conn_settings[LARGE_REGISTRY_LEN]; /* If a driver keyword was present, then dont use a DSN and return. */ /* If DSN is null and no driver, then use the default datasource. */ - if ( DSN[0] == '\0') { - if ( ci->driver[0] != '\0') + if (DSN[0] == '\0') + { + if (ci->driver[0] != '\0') return; else strcpy(DSN, INI_DSN); } /* brute-force chop off trailing blanks... */ - while (*(DSN+strlen(DSN)-1) == ' ') *(DSN+strlen(DSN)-1) = '\0'; + while (*(DSN + strlen(DSN) - 1) == ' ') + *(DSN + strlen(DSN) - 1) = '\0'; - /* Proceed with getting info for the given DSN. */ + /* Proceed with getting info for the given DSN. */ - if ( ci->desc[0] == '\0' || overwrite) + if (ci->desc[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_KDESC, "", ci->desc, sizeof(ci->desc), ODBC_INI); - if ( ci->server[0] == '\0' || overwrite) + if (ci->server[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_SERVER, "", ci->server, sizeof(ci->server), ODBC_INI); - if ( ci->database[0] == '\0' || overwrite) - SQLGetPrivateProfileString(DSN, INI_DATABASE, "", ci->database, sizeof(ci->database), ODBC_INI); + if (ci->database[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_DATABASE, "", ci->database, sizeof(ci->database), ODBC_INI); - if ( ci->username[0] == '\0' || overwrite) + if (ci->username[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_USER, "", ci->username, sizeof(ci->username), ODBC_INI); - if ( ci->password[0] == '\0' || overwrite) + if (ci->password[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_PASSWORD, "", ci->password, sizeof(ci->password), ODBC_INI); - if ( ci->port[0] == '\0' || overwrite) + if (ci->port[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port), ODBC_INI); - if ( ci->onlyread[0] == '\0' || overwrite) + if (ci->onlyread[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->onlyread, sizeof(ci->onlyread), ODBC_INI); - if ( ci->show_oid_column[0] == '\0' || overwrite) + if (ci->show_oid_column[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_SHOWOIDCOLUMN, "", ci->show_oid_column, sizeof(ci->show_oid_column), ODBC_INI); - if ( ci->fake_oid_index[0] == '\0' || overwrite) + if (ci->fake_oid_index[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_FAKEOIDINDEX, "", ci->fake_oid_index, sizeof(ci->fake_oid_index), ODBC_INI); - if ( ci->row_versioning[0] == '\0' || overwrite) + if (ci->row_versioning[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_ROWVERSIONING, "", ci->row_versioning, sizeof(ci->row_versioning), ODBC_INI); - if ( ci->show_system_tables[0] == '\0' || overwrite) + if (ci->show_system_tables[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_SHOWSYSTEMTABLES, "", ci->show_system_tables, sizeof(ci->show_system_tables), ODBC_INI); - if ( ci->protocol[0] == '\0' || overwrite) + if (ci->protocol[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_PROTOCOL, "", ci->protocol, sizeof(ci->protocol), ODBC_INI); - if ( ci->conn_settings[0] == '\0' || overwrite) { + if (ci->conn_settings[0] == '\0' || overwrite) + { SQLGetPrivateProfileString(DSN, INI_CONNSETTINGS, "", encoded_conn_settings, sizeof(encoded_conn_settings), ODBC_INI); decode(encoded_conn_settings, ci->conn_settings); } - if ( ci->translation_dll[0] == '\0' || overwrite) + if (ci->translation_dll[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_TRANSLATIONDLL, "", ci->translation_dll, sizeof(ci->translation_dll), ODBC_INI); - if ( ci->translation_option[0] == '\0' || overwrite) + if (ci->translation_option[0] == '\0' || overwrite) SQLGetPrivateProfileString(DSN, INI_TRANSLATIONOPTION, "", ci->translation_option, sizeof(ci->translation_option), ODBC_INI); - /* Allow override of odbcinst.ini parameters here */ + /* Allow override of odbcinst.ini parameters here */ getGlobalDefaults(DSN, ODBC_INI, TRUE); - qlog("DSN info: DSN='%s',server='%s',port='%s',dbase='%s',user='%s',passwd='%s'\n", - DSN, - ci->server, - ci->port, - ci->database, - ci->username, - ci->password); + qlog("DSN info: DSN='%s',server='%s',port='%s',dbase='%s',user='%s',passwd='%s'\n", + DSN, + ci->server, + ci->port, + ci->database, + ci->username, + ci->password); qlog(" onlyread='%s',protocol='%s',showoid='%s',fakeoidindex='%s',showsystable='%s'\n", - ci->onlyread, - ci->protocol, - ci->show_oid_column, - ci->fake_oid_index, - ci->show_system_tables); + ci->onlyread, + ci->protocol, + ci->show_oid_column, + ci->fake_oid_index, + ci->show_system_tables); qlog(" conn_settings='%s'\n", - ci->conn_settings); + ci->conn_settings); qlog(" translation_dll='%s',translation_option='%s'\n", - ci->translation_dll, - ci->translation_option); + ci->translation_dll, + ci->translation_option); } /* This is for datasource based options only */ void -writeDSNinfo(ConnInfo *ci) +writeDSNinfo(ConnInfo * ci) { -char *DSN = ci->dsn; -char encoded_conn_settings[LARGE_REGISTRY_LEN]; - - encode(ci->conn_settings, encoded_conn_settings); - - SQLWritePrivateProfileString(DSN, - INI_KDESC, - ci->desc, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_DATABASE, - ci->database, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_SERVER, - ci->server, - ODBC_INI); + char *DSN = ci->dsn; + char encoded_conn_settings[LARGE_REGISTRY_LEN]; - SQLWritePrivateProfileString(DSN, - INI_PORT, - ci->port, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_USER, - ci->username, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_PASSWORD, - ci->password, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_READONLY, - ci->onlyread, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_SHOWOIDCOLUMN, - ci->show_oid_column, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_FAKEOIDINDEX, - ci->fake_oid_index, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_ROWVERSIONING, - ci->row_versioning, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_SHOWSYSTEMTABLES, - ci->show_system_tables, - ODBC_INI); - - SQLWritePrivateProfileString(DSN, - INI_PROTOCOL, - ci->protocol, - ODBC_INI); + encode(ci->conn_settings, encoded_conn_settings); - SQLWritePrivateProfileString(DSN, - INI_CONNSETTINGS, - encoded_conn_settings, - ODBC_INI); + SQLWritePrivateProfileString(DSN, + INI_KDESC, + ci->desc, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_DATABASE, + ci->database, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_SERVER, + ci->server, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_PORT, + ci->port, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_USER, + ci->username, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_PASSWORD, + ci->password, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_READONLY, + ci->onlyread, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_SHOWOIDCOLUMN, + ci->show_oid_column, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_FAKEOIDINDEX, + ci->fake_oid_index, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_ROWVERSIONING, + ci->row_versioning, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_SHOWSYSTEMTABLES, + ci->show_system_tables, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_PROTOCOL, + ci->protocol, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_CONNSETTINGS, + encoded_conn_settings, + ODBC_INI); } /* This function reads the ODBCINST.INI portion of the registry and gets any driver defaults. */ -void getGlobalDefaults(char *section, char *filename, char override) +void +getGlobalDefaults(char *section, char *filename, char override) { -char temp[256]; + char temp[256]; - /* Fetch Count is stored in driver section */ - SQLGetPrivateProfileString(section, INI_FETCH, "", - temp, sizeof(temp), filename); - if ( temp[0] ) { + /* Fetch Count is stored in driver section */ + SQLGetPrivateProfileString(section, INI_FETCH, "", + temp, sizeof(temp), filename); + if (temp[0]) + { globals.fetch_max = atoi(temp); - /* sanity check if using cursors */ + /* sanity check if using cursors */ if (globals.fetch_max <= 0) globals.fetch_max = FETCH_MAX; } - else if ( ! override) + else if (!override) globals.fetch_max = FETCH_MAX; - /* Socket Buffersize is stored in driver section */ - SQLGetPrivateProfileString(section, INI_SOCKET, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Socket Buffersize is stored in driver section */ + SQLGetPrivateProfileString(section, INI_SOCKET, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.socket_buffersize = atoi(temp); - else if ( ! override) + else if (!override) globals.socket_buffersize = SOCK_BUFFER_SIZE; - /* Debug is stored in the driver section */ - SQLGetPrivateProfileString(section, INI_DEBUG, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Debug is stored in the driver section */ + SQLGetPrivateProfileString(section, INI_DEBUG, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.debug = atoi(temp); - else if ( ! override) + else if (!override) globals.debug = DEFAULT_DEBUG; - /* CommLog is stored in the driver section */ - SQLGetPrivateProfileString(section, INI_COMMLOG, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* CommLog is stored in the driver section */ + SQLGetPrivateProfileString(section, INI_COMMLOG, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.commlog = atoi(temp); - else if ( ! override) + else if (!override) globals.commlog = DEFAULT_COMMLOG; - /* Optimizer is stored in the driver section only */ - SQLGetPrivateProfileString(section, INI_OPTIMIZER, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Optimizer is stored in the driver section only */ + SQLGetPrivateProfileString(section, INI_OPTIMIZER, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.disable_optimizer = atoi(temp); - else if ( ! override) + else if (!override) globals.disable_optimizer = DEFAULT_OPTIMIZER; - /* KSQO is stored in the driver section only */ - SQLGetPrivateProfileString(section, INI_KSQO, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* KSQO is stored in the driver section only */ + SQLGetPrivateProfileString(section, INI_KSQO, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.ksqo = atoi(temp); - else if ( ! override) + else if (!override) globals.ksqo = DEFAULT_KSQO; - /* Recognize Unique Index is stored in the driver section only */ - SQLGetPrivateProfileString(section, INI_UNIQUEINDEX, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Recognize Unique Index is stored in the driver section only */ + SQLGetPrivateProfileString(section, INI_UNIQUEINDEX, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.unique_index = atoi(temp); - else if ( ! override) + else if (!override) globals.unique_index = DEFAULT_UNIQUEINDEX; - /* Unknown Sizes is stored in the driver section only */ - SQLGetPrivateProfileString(section, INI_UNKNOWNSIZES, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Unknown Sizes is stored in the driver section only */ + SQLGetPrivateProfileString(section, INI_UNKNOWNSIZES, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.unknown_sizes = atoi(temp); - else if ( ! override) + else if (!override) globals.unknown_sizes = DEFAULT_UNKNOWNSIZES; - /* Lie about supported functions? */ - SQLGetPrivateProfileString(section, INI_LIE, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Lie about supported functions? */ + SQLGetPrivateProfileString(section, INI_LIE, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.lie = atoi(temp); - else if ( ! override) + else if (!override) globals.lie = DEFAULT_LIE; - /* Parse statements */ - SQLGetPrivateProfileString(section, INI_PARSE, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Parse statements */ + SQLGetPrivateProfileString(section, INI_PARSE, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.parse = atoi(temp); - else if ( ! override) + else if (!override) globals.parse = DEFAULT_PARSE; - /* SQLCancel calls SQLFreeStmt in Driver Manager */ - SQLGetPrivateProfileString(section, INI_CANCELASFREESTMT, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* SQLCancel calls SQLFreeStmt in Driver Manager */ + SQLGetPrivateProfileString(section, INI_CANCELASFREESTMT, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.cancel_as_freestmt = atoi(temp); - else if ( ! override) + else if (!override) globals.cancel_as_freestmt = DEFAULT_CANCELASFREESTMT; - /* UseDeclareFetch is stored in the driver section only */ - SQLGetPrivateProfileString(section, INI_USEDECLAREFETCH, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* UseDeclareFetch is stored in the driver section only */ + SQLGetPrivateProfileString(section, INI_USEDECLAREFETCH, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.use_declarefetch = atoi(temp); - else if ( ! override) + else if (!override) globals.use_declarefetch = DEFAULT_USEDECLAREFETCH; - /* Max Varchar Size */ - SQLGetPrivateProfileString(section, INI_MAXVARCHARSIZE, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Max Varchar Size */ + SQLGetPrivateProfileString(section, INI_MAXVARCHARSIZE, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.max_varchar_size = atoi(temp); - else if ( ! override) + else if (!override) globals.max_varchar_size = MAX_VARCHAR_SIZE; - /* Max TextField Size */ - SQLGetPrivateProfileString(section, INI_MAXLONGVARCHARSIZE, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Max TextField Size */ + SQLGetPrivateProfileString(section, INI_MAXLONGVARCHARSIZE, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.max_longvarchar_size = atoi(temp); - else if ( ! override) + else if (!override) globals.max_longvarchar_size = TEXT_FIELD_SIZE; - /* Text As LongVarchar */ - SQLGetPrivateProfileString(section, INI_TEXTASLONGVARCHAR, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Text As LongVarchar */ + SQLGetPrivateProfileString(section, INI_TEXTASLONGVARCHAR, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.text_as_longvarchar = atoi(temp); - else if ( ! override) + else if (!override) globals.text_as_longvarchar = DEFAULT_TEXTASLONGVARCHAR; - /* Unknowns As LongVarchar */ - SQLGetPrivateProfileString(section, INI_UNKNOWNSASLONGVARCHAR, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Unknowns As LongVarchar */ + SQLGetPrivateProfileString(section, INI_UNKNOWNSASLONGVARCHAR, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.unknowns_as_longvarchar = atoi(temp); - else if ( ! override) + else if (!override) globals.unknowns_as_longvarchar = DEFAULT_UNKNOWNSASLONGVARCHAR; - /* Bools As Char */ - SQLGetPrivateProfileString(section, INI_BOOLSASCHAR, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Bools As Char */ + SQLGetPrivateProfileString(section, INI_BOOLSASCHAR, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.bools_as_char = atoi(temp); - else if ( ! override) + else if (!override) globals.bools_as_char = DEFAULT_BOOLSASCHAR; - /* Extra Systable prefixes */ - /* Use @@@ to distinguish between blank extra prefixes and no key entry */ - SQLGetPrivateProfileString(section, INI_EXTRASYSTABLEPREFIXES, "@@@", - temp, sizeof(temp), filename); - if ( strcmp(temp, "@@@" )) + /* Extra Systable prefixes */ + + /* + * Use @@@ to distinguish between blank extra prefixes and no key + * entry + */ + SQLGetPrivateProfileString(section, INI_EXTRASYSTABLEPREFIXES, "@@@", + temp, sizeof(temp), filename); + if (strcmp(temp, "@@@")) strcpy(globals.extra_systable_prefixes, temp); - else if ( ! override) + else if (!override) strcpy(globals.extra_systable_prefixes, DEFAULT_EXTRASYSTABLEPREFIXES); mylog("globals.extra_systable_prefixes = '%s'\n", globals.extra_systable_prefixes); - /* Dont allow override of an override! */ - if ( ! override) { + /* Dont allow override of an override! */ + if (!override) + { - /* ConnSettings is stored in the driver section and per datasource for override */ - SQLGetPrivateProfileString(section, INI_CONNSETTINGS, "", - globals.conn_settings, sizeof(globals.conn_settings), filename); + /* + * ConnSettings is stored in the driver section and per datasource + * for override + */ + SQLGetPrivateProfileString(section, INI_CONNSETTINGS, "", + globals.conn_settings, sizeof(globals.conn_settings), filename); - /* Default state for future DSN's Readonly attribute */ - SQLGetPrivateProfileString(section, INI_READONLY, "", - temp, sizeof(temp), filename); - if ( temp[0] ) + /* Default state for future DSN's Readonly attribute */ + SQLGetPrivateProfileString(section, INI_READONLY, "", + temp, sizeof(temp), filename); + if (temp[0]) globals.onlyread = atoi(temp); else globals.onlyread = DEFAULT_READONLY; - /* Default state for future DSN's protocol attribute - This isn't a real driver option YET. This is more - intended for customization from the install. - */ - SQLGetPrivateProfileString(section, INI_PROTOCOL, "@@@", - temp, sizeof(temp), filename); - if ( strcmp(temp, "@@@" )) + /* + * Default state for future DSN's protocol attribute This isn't a + * real driver option YET. This is more intended for + * customization from the install. + */ + SQLGetPrivateProfileString(section, INI_PROTOCOL, "@@@", + temp, sizeof(temp), filename); + if (strcmp(temp, "@@@")) strcpy(globals.protocol, temp); - else + else strcpy(globals.protocol, DEFAULT_PROTOCOL); - + } } /* This function writes any global parameters (that can be manipulated) - to the ODBCINST.INI portion of the registry + to the ODBCINST.INI portion of the registry */ -void updateGlobals(void) +void +updateGlobals(void) { -char tmp[128]; + char tmp[128]; sprintf(tmp, "%d", globals.fetch_max); SQLWritePrivateProfileString(DBMS_NAME, - INI_FETCH, tmp, ODBCINST_INI); + INI_FETCH, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.commlog); SQLWritePrivateProfileString(DBMS_NAME, - INI_COMMLOG, tmp, ODBCINST_INI); + INI_COMMLOG, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.disable_optimizer); SQLWritePrivateProfileString(DBMS_NAME, - INI_OPTIMIZER, tmp, ODBCINST_INI); + INI_OPTIMIZER, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.ksqo); SQLWritePrivateProfileString(DBMS_NAME, - INI_KSQO, tmp, ODBCINST_INI); + INI_KSQO, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.unique_index); SQLWritePrivateProfileString(DBMS_NAME, - INI_UNIQUEINDEX, tmp, ODBCINST_INI); + INI_UNIQUEINDEX, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.onlyread); SQLWritePrivateProfileString(DBMS_NAME, - INI_READONLY, tmp, ODBCINST_INI); + INI_READONLY, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.use_declarefetch); SQLWritePrivateProfileString(DBMS_NAME, - INI_USEDECLAREFETCH, tmp, ODBCINST_INI); + INI_USEDECLAREFETCH, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.unknown_sizes); SQLWritePrivateProfileString(DBMS_NAME, - INI_UNKNOWNSIZES, tmp, ODBCINST_INI); + INI_UNKNOWNSIZES, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.text_as_longvarchar); SQLWritePrivateProfileString(DBMS_NAME, - INI_TEXTASLONGVARCHAR, tmp, ODBCINST_INI); + INI_TEXTASLONGVARCHAR, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.unknowns_as_longvarchar); SQLWritePrivateProfileString(DBMS_NAME, - INI_UNKNOWNSASLONGVARCHAR, tmp, ODBCINST_INI); + INI_UNKNOWNSASLONGVARCHAR, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.bools_as_char); SQLWritePrivateProfileString(DBMS_NAME, - INI_BOOLSASCHAR, tmp, ODBCINST_INI); + INI_BOOLSASCHAR, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.parse); SQLWritePrivateProfileString(DBMS_NAME, - INI_PARSE, tmp, ODBCINST_INI); + INI_PARSE, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.cancel_as_freestmt); SQLWritePrivateProfileString(DBMS_NAME, - INI_CANCELASFREESTMT, tmp, ODBCINST_INI); + INI_CANCELASFREESTMT, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.max_varchar_size); SQLWritePrivateProfileString(DBMS_NAME, - INI_MAXVARCHARSIZE, tmp, ODBCINST_INI); + INI_MAXVARCHARSIZE, tmp, ODBCINST_INI); sprintf(tmp, "%d", globals.max_longvarchar_size); SQLWritePrivateProfileString(DBMS_NAME, - INI_MAXLONGVARCHARSIZE, tmp, ODBCINST_INI); + INI_MAXLONGVARCHARSIZE, tmp, ODBCINST_INI); SQLWritePrivateProfileString(DBMS_NAME, - INI_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, ODBCINST_INI); + INI_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, ODBCINST_INI); SQLWritePrivateProfileString(DBMS_NAME, - INI_CONNSETTINGS, globals.conn_settings, ODBCINST_INI); + INI_CONNSETTINGS, globals.conn_settings, ODBCINST_INI); } diff --git a/src/interfaces/odbc/dlg_specific.h b/src/interfaces/odbc/dlg_specific.h index 5be8b4fa50..05486a34f1 100644 --- a/src/interfaces/odbc/dlg_specific.h +++ b/src/interfaces/odbc/dlg_specific.h @@ -1,9 +1,9 @@ -/* File: dlg_specific.h +/* File: dlg_specific.h * - * Description: See "dlg_specific.c" + * Description: See "dlg_specific.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -31,41 +31,49 @@ /* INI File Stuff */ #ifndef WIN32 -# define ODBC_INI ".odbc.ini" -# ifdef ODBCINSTDIR -# define ODBCINST_INI ODBCINSTDIR "/odbcinst.ini" -# else -# define ODBCINST_INI "/etc/odbcinst.ini" -# warning "location of odbcinst.ini file defaulted to /etc" -# endif -#else /* WIN32 */ -# define ODBC_INI "ODBC.INI" /* ODBC initialization file */ -# define ODBCINST_INI "ODBCINST.INI" /* ODBC Installation file */ -#endif /* WIN32 */ - - -#define INI_DSN DBMS_NAME /* Name of default Datasource in ini file (not used?) */ -#define INI_KDESC "Description" /* Data source description */ -#define INI_SERVER "Servername" /* Name of Server running the Postgres service */ -#define INI_PORT "Port" /* Port on which the Postmaster is listening */ -#define INI_DATABASE "Database" /* Database Name */ -#define INI_USER "Username" /* Default User Name */ -#define INI_PASSWORD "Password" /* Default Password */ -#define INI_DEBUG "Debug" /* Debug flag */ -#define INI_FETCH "Fetch" /* Fetch Max Count */ -#define INI_SOCKET "Socket" /* Socket buffer size */ -#define INI_READONLY "ReadOnly" /* Database is read only */ -#define INI_COMMLOG "CommLog" /* Communication to backend logging */ -#define INI_PROTOCOL "Protocol" /* What protocol (6.2) */ -#define INI_OPTIMIZER "Optimizer" /* Use backend genetic optimizer */ -#define INI_KSQO "Ksqo" /* Keyset query optimization */ -#define INI_CONNSETTINGS "ConnSettings" /* Anything to send to backend on successful connection */ -#define INI_UNIQUEINDEX "UniqueIndex" /* Recognize unique indexes */ -#define INI_UNKNOWNSIZES "UnknownSizes" /* How to handle unknown result set sizes */ +#define ODBC_INI ".odbc.ini" +#ifdef ODBCINSTDIR +#define ODBCINST_INI ODBCINSTDIR "/odbcinst.ini" +#else +#define ODBCINST_INI "/etc/odbcinst.ini" +#warning "location of odbcinst.ini file defaulted to /etc" +#endif +#else /* WIN32 */ +#define ODBC_INI "ODBC.INI" /* ODBC initialization file */ +#define ODBCINST_INI "ODBCINST.INI" /* ODBC Installation file */ +#endif /* WIN32 */ + + +#define INI_DSN DBMS_NAME /* Name of default Datasource in + * ini file (not used?) */ +#define INI_KDESC "Description" /* Data source description */ +#define INI_SERVER "Servername" /* Name of Server running the + * Postgres service */ +#define INI_PORT "Port"/* Port on which the Postmaster is + * listening */ +#define INI_DATABASE "Database" /* Database Name */ +#define INI_USER "Username" /* Default User Name */ +#define INI_PASSWORD "Password" /* Default Password */ +#define INI_DEBUG "Debug" /* Debug flag */ +#define INI_FETCH "Fetch" /* Fetch Max Count */ +#define INI_SOCKET "Socket" /* Socket buffer size */ +#define INI_READONLY "ReadOnly" /* Database is read only */ +#define INI_COMMLOG "CommLog" /* Communication to backend + * logging */ +#define INI_PROTOCOL "Protocol" /* What protocol (6.2) */ +#define INI_OPTIMIZER "Optimizer" /* Use backend genetic optimizer */ +#define INI_KSQO "Ksqo"/* Keyset query optimization */ +#define INI_CONNSETTINGS "ConnSettings" /* Anything to send to + * backend on successful + * connection */ +#define INI_UNIQUEINDEX "UniqueIndex" /* Recognize unique indexes */ +#define INI_UNKNOWNSIZES "UnknownSizes" /* How to handle unknown + * result set sizes */ #define INI_CANCELASFREESTMT "CancelAsFreeStmt" -#define INI_USEDECLAREFETCH "UseDeclareFetch" /* Use Declare/Fetch cursors */ +#define INI_USEDECLAREFETCH "UseDeclareFetch" /* Use Declare/Fetch + * cursors */ /* More ini stuff */ #define INI_TEXTASLONGVARCHAR "TextAsLongVarchar" @@ -82,15 +90,16 @@ #define INI_PARSE "Parse" #define INI_EXTRASYSTABLEPREFIXES "ExtraSysTablePrefixes" -#define INI_TRANSLATIONNAME "TranslationName" -#define INI_TRANSLATIONDLL "TranslationDLL" -#define INI_TRANSLATIONOPTION "TranslationOption" +#define INI_TRANSLATIONNAME "TranslationName" +#define INI_TRANSLATIONDLL "TranslationDLL" +#define INI_TRANSLATIONOPTION "TranslationOption" /* Connection Defaults */ #define DEFAULT_PORT "5432" #define DEFAULT_READONLY 1 -#define DEFAULT_PROTOCOL "6.4" /* the latest protocol is the default */ +#define DEFAULT_PROTOCOL "6.4" /* the latest protocol is + * the default */ #define DEFAULT_USEDECLAREFETCH 0 #define DEFAULT_TEXTASLONGVARCHAR 1 #define DEFAULT_UNKNOWNSASLONGVARCHAR 0 @@ -114,29 +123,30 @@ #define DEFAULT_EXTRASYSTABLEPREFIXES "dd_;" -/* prototypes */ -void getGlobalDefaults(char *section, char *filename, char override); +/* prototypes */ +void getGlobalDefaults(char *section, char *filename, char override); #ifdef WIN32 -void SetDlgStuff(HWND hdlg, ConnInfo *ci); -void GetDlgStuff(HWND hdlg, ConnInfo *ci); - -int CALLBACK driver_optionsProc(HWND hdlg, - WORD wMsg, - WPARAM wParam, - LPARAM lParam); -int CALLBACK ds_optionsProc(HWND hdlg, - WORD wMsg, - WPARAM wParam, - LPARAM lParam); -#endif /* WIN32 */ - -void updateGlobals(void); -void writeDSNinfo(ConnInfo *ci); -void getDSNdefaults(ConnInfo *ci); -void getDSNinfo(ConnInfo *ci, char overwrite); -void makeConnectString(char *connect_string, ConnInfo *ci); -void copyAttributes(ConnInfo *ci, char *attribute, char *value); +void SetDlgStuff(HWND hdlg, ConnInfo * ci); +void GetDlgStuff(HWND hdlg, ConnInfo * ci); + +int CALLBACK driver_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam); +int CALLBACK ds_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam); + +#endif /* WIN32 */ + +void updateGlobals(void); +void writeDSNinfo(ConnInfo * ci); +void getDSNdefaults(ConnInfo * ci); +void getDSNinfo(ConnInfo * ci, char overwrite); +void makeConnectString(char *connect_string, ConnInfo * ci); +void copyAttributes(ConnInfo * ci, char *attribute, char *value); #endif diff --git a/src/interfaces/odbc/drvconn.c b/src/interfaces/odbc/drvconn.c index cbc2546726..3ced0103f9 100644 --- a/src/interfaces/odbc/drvconn.c +++ b/src/interfaces/odbc/drvconn.c @@ -1,13 +1,13 @@ -/* Module: drvconn.c +/* Module: drvconn.c * - * Description: This module contains only routines related to - * implementing SQLDriverConnect. + * Description: This module contains only routines related to + * implementing SQLDriverConnect. * - * Classes: n/a + * Classes: n/a * - * API functions: SQLDriverConnect + * API functions: SQLDriverConnect * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -52,45 +52,50 @@ #include "dlg_specific.h" /* prototypes */ -void dconn_get_connect_attributes(UCHAR FAR *connect_string, ConnInfo *ci); +void dconn_get_connect_attributes(UCHAR FAR * connect_string, ConnInfo * ci); #ifdef WIN32 BOOL FAR PASCAL dconn_FDriverConnectProc(HWND hdlg, UINT wMsg, WPARAM wParam, LPARAM lParam); -RETCODE dconn_DoDialog(HWND hwnd, ConnInfo *ci); +RETCODE dconn_DoDialog(HWND hwnd, ConnInfo * ci); + +extern HINSTANCE NEAR s_hModule;/* Saved module handle. */ -extern HINSTANCE NEAR s_hModule; /* Saved module handle. */ #endif extern GLOBAL_VALUES globals; -RETCODE SQL_API SQLDriverConnect( - HDBC hdbc, - HWND hwnd, - UCHAR FAR *szConnStrIn, - SWORD cbConnStrIn, - UCHAR FAR *szConnStrOut, - SWORD cbConnStrOutMax, - SWORD FAR *pcbConnStrOut, - UWORD fDriverCompletion) +RETCODE SQL_API +SQLDriverConnect( + HDBC hdbc, + HWND hwnd, + UCHAR FAR * szConnStrIn, + SWORD cbConnStrIn, + UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, + SWORD FAR * pcbConnStrOut, + UWORD fDriverCompletion) { -static char *func = "SQLDriverConnect"; -ConnectionClass *conn = (ConnectionClass *) hdbc; -ConnInfo *ci; + static char *func = "SQLDriverConnect"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + ConnInfo *ci; + #ifdef WIN32 -RETCODE dialog_result; + RETCODE dialog_result; + #endif -RETCODE result; -char connStrIn[MAX_CONNECT_STRING]; -char connStrOut[MAX_CONNECT_STRING]; -int retval; -char password_required = FALSE; -int len = 0; + RETCODE result; + char connStrIn[MAX_CONNECT_STRING]; + char connStrOut[MAX_CONNECT_STRING]; + int retval; + char password_required = FALSE; + int len = 0; mylog("%s: entering...\n", func); - if ( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -102,17 +107,17 @@ int len = 0; ci = &(conn->connInfo); - /* Parse the connect string and fill in conninfo for this hdbc. */ + /* Parse the connect string and fill in conninfo for this hdbc. */ dconn_get_connect_attributes(connStrIn, ci); - /* If the ConnInfo in the hdbc is missing anything, */ - /* this function will fill them in from the registry (assuming */ - /* of course there is a DSN given -- if not, it does nothing!) */ + /* If the ConnInfo in the hdbc is missing anything, */ + /* this function will fill them in from the registry (assuming */ + /* of course there is a DSN given -- if not, it does nothing!) */ getDSNinfo(ci, CONN_DONT_OVERWRITE); - /* Fill in any default parameters if they are not there. */ + /* Fill in any default parameters if they are not there. */ getDSNdefaults(ci); - /* initialize pg_version */ + /* initialize pg_version */ CC_initialize_pg_version(conn); #ifdef WIN32 @@ -120,51 +125,54 @@ dialog: #endif ci->focus_password = password_required; - switch(fDriverCompletion) { + switch (fDriverCompletion) + { #ifdef WIN32 - case SQL_DRIVER_PROMPT: - dialog_result = dconn_DoDialog(hwnd, ci); - if(dialog_result != SQL_SUCCESS) { - return dialog_result; - } - break; + case SQL_DRIVER_PROMPT: + dialog_result = dconn_DoDialog(hwnd, ci); + if (dialog_result != SQL_SUCCESS) + return dialog_result; + break; - case SQL_DRIVER_COMPLETE_REQUIRED: + case SQL_DRIVER_COMPLETE_REQUIRED: - /* Fall through */ + /* Fall through */ - case SQL_DRIVER_COMPLETE: + case SQL_DRIVER_COMPLETE: - /* Password is not a required parameter. */ - if( ci->username[0] == '\0' || - ci->server[0] == '\0' || - ci->database[0] == '\0' || - ci->port[0] == '\0' || - password_required) { + /* Password is not a required parameter. */ + if (ci->username[0] == '\0' || + ci->server[0] == '\0' || + ci->database[0] == '\0' || + ci->port[0] == '\0' || + password_required) + { - dialog_result = dconn_DoDialog(hwnd, ci); - if(dialog_result != SQL_SUCCESS) { - return dialog_result; + dialog_result = dconn_DoDialog(hwnd, ci); + if (dialog_result != SQL_SUCCESS) + return dialog_result; } - } - break; + break; #else - case SQL_DRIVER_PROMPT: - case SQL_DRIVER_COMPLETE: - case SQL_DRIVER_COMPLETE_REQUIRED: + case SQL_DRIVER_PROMPT: + case SQL_DRIVER_COMPLETE: + case SQL_DRIVER_COMPLETE_REQUIRED: #endif - case SQL_DRIVER_NOPROMPT: - break; + case SQL_DRIVER_NOPROMPT: + break; } - /* Password is not a required parameter unless authentication asks for it. - For now, I think it's better to just let the application ask over and over until - a password is entered (the user can always hit Cancel to get out) - */ - if( ci->username[0] == '\0' || + /* + * Password is not a required parameter unless authentication asks for + * it. For now, I think it's better to just let the application ask + * over and over until a password is entered (the user can always hit + * Cancel to get out) + */ + if (ci->username[0] == '\0' || ci->server[0] == '\0' || - ci->database[0] == '\0' || - ci->port[0] == '\0') { + ci->database[0] == '\0' || + ci->port[0] == '\0') + { /* (password_required && ci->password[0] == '\0')) */ return SQL_NO_DATA_FOUND; @@ -173,12 +181,16 @@ dialog: /* do the actual connect */ retval = CC_connect(conn, password_required); - if (retval < 0) { /* need a password */ - if (fDriverCompletion == SQL_DRIVER_NOPROMPT) { + if (retval < 0) + { /* need a password */ + if (fDriverCompletion == SQL_DRIVER_NOPROMPT) + { CC_log_error(func, "Need password but Driver_NoPrompt", conn); - return SQL_ERROR; /* need a password but not allowed to prompt so error */ + return SQL_ERROR; /* need a password but not allowed to + * prompt so error */ } - else { + else + { #ifdef WIN32 password_required = TRUE; goto dialog; @@ -187,39 +199,44 @@ dialog: #endif } } - else if (retval == 0) { - /* error msg filled in above */ + else if (retval == 0) + { + /* error msg filled in above */ CC_log_error(func, "Error from CC_Connect", conn); return SQL_ERROR; } /*********************************************/ - /* Create the Output Connection String */ + /* Create the Output Connection String */ /*********************************************/ result = SQL_SUCCESS; makeConnectString(connStrOut, ci); len = strlen(connStrOut); - if(szConnStrOut) { - - /* Return the completed string to the caller. The correct method is to - only construct the connect string if a dialog was put up, otherwise, - it should just copy the connection input string to the output. - However, it seems ok to just always construct an output string. There - are possible bad side effects on working applications (Access) by - implementing the correct behavior, anyway. - */ + if (szConnStrOut) + { + + /* + * Return the completed string to the caller. The correct method + * is to only construct the connect string if a dialog was put up, + * otherwise, it should just copy the connection input string to + * the output. However, it seems ok to just always construct an + * output string. There are possible bad side effects on working + * applications (Access) by implementing the correct behavior, + * anyway. + */ strncpy_null(szConnStrOut, connStrOut, cbConnStrOutMax); - if (len >= cbConnStrOutMax) { + if (len >= cbConnStrOutMax) + { result = SQL_SUCCESS_WITH_INFO; conn->errornumber = CONN_TRUNCATED; conn->errormsg = "The buffer was too small for the result."; } } - if(pcbConnStrOut) + if (pcbConnStrOut) *pcbConnStrOut = len; mylog("szConnStrOut = '%s'\n", szConnStrOut); @@ -231,108 +248,117 @@ dialog: } #ifdef WIN32 -RETCODE dconn_DoDialog(HWND hwnd, ConnInfo *ci) +RETCODE +dconn_DoDialog(HWND hwnd, ConnInfo * ci) { -int dialog_result; + int dialog_result; -mylog("dconn_DoDialog: ci = %u\n", ci); + mylog("dconn_DoDialog: ci = %u\n", ci); - if(hwnd) { + if (hwnd) + { dialog_result = DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_CONFIG), - hwnd, dconn_FDriverConnectProc, (LPARAM) ci); - if(!dialog_result || (dialog_result == -1)) { + hwnd, dconn_FDriverConnectProc, (LPARAM) ci); + if (!dialog_result || (dialog_result == -1)) return SQL_NO_DATA_FOUND; - } else { + else return SQL_SUCCESS; - } } return SQL_ERROR; } -BOOL FAR PASCAL dconn_FDriverConnectProc( - HWND hdlg, - UINT wMsg, - WPARAM wParam, - LPARAM lParam) +BOOL FAR PASCAL +dconn_FDriverConnectProc( + HWND hdlg, + UINT wMsg, + WPARAM wParam, + LPARAM lParam) { -ConnInfo *ci; + ConnInfo *ci; - switch (wMsg) { - case WM_INITDIALOG: - ci = (ConnInfo *) lParam; + switch (wMsg) + { + case WM_INITDIALOG: + ci = (ConnInfo *) lParam; - /* Change the caption for the setup dialog */ - SetWindowText(hdlg, "PostgreSQL Connection"); + /* Change the caption for the setup dialog */ + SetWindowText(hdlg, "PostgreSQL Connection"); - SetWindowText(GetDlgItem(hdlg, IDC_DATASOURCE), "Connection"); + SetWindowText(GetDlgItem(hdlg, IDC_DATASOURCE), "Connection"); - /* Hide the DSN and description fields */ - ShowWindow(GetDlgItem(hdlg, IDC_DSNAMETEXT), SW_HIDE); - ShowWindow(GetDlgItem(hdlg, IDC_DSNAME), SW_HIDE); - ShowWindow(GetDlgItem(hdlg, IDC_DESCTEXT), SW_HIDE); - ShowWindow(GetDlgItem(hdlg, IDC_DESC), SW_HIDE); + /* Hide the DSN and description fields */ + ShowWindow(GetDlgItem(hdlg, IDC_DSNAMETEXT), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_DSNAME), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_DESCTEXT), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_DESC), SW_HIDE); - SetWindowLong(hdlg, DWL_USER, lParam);/* Save the ConnInfo for the "OK" */ + SetWindowLong(hdlg, DWL_USER, lParam); /* Save the ConnInfo for + * the "OK" */ - SetDlgStuff(hdlg, ci); + SetDlgStuff(hdlg, ci); - if (ci->database[0] == '\0') - ; /* default focus */ - else if (ci->server[0] == '\0') - SetFocus(GetDlgItem(hdlg, IDC_SERVER)); - else if (ci->port[0] == '\0') - SetFocus(GetDlgItem(hdlg, IDC_PORT)); - else if (ci->username[0] == '\0') - SetFocus(GetDlgItem(hdlg, IDC_USER)); - else if (ci->focus_password) - SetFocus(GetDlgItem(hdlg, IDC_PASSWORD)); + if (ci->database[0] == '\0') + ; /* default focus */ + else if (ci->server[0] == '\0') + SetFocus(GetDlgItem(hdlg, IDC_SERVER)); + else if (ci->port[0] == '\0') + SetFocus(GetDlgItem(hdlg, IDC_PORT)); + else if (ci->username[0] == '\0') + SetFocus(GetDlgItem(hdlg, IDC_USER)); + else if (ci->focus_password) + SetFocus(GetDlgItem(hdlg, IDC_PASSWORD)); - break; + break; - case WM_COMMAND: - switch (GET_WM_COMMAND_ID(wParam, lParam)) { - case IDOK: + case WM_COMMAND: + switch (GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK: - ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER); + ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER); - GetDlgStuff(hdlg, ci); + GetDlgStuff(hdlg, ci); - case IDCANCEL: - EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); - return TRUE; + case IDCANCEL: + EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); + return TRUE; - case IDC_DRIVER: + case IDC_DRIVER: - DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DRV), - hdlg, driver_optionsProc, (LPARAM) NULL); + DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DRV), + hdlg, driver_optionsProc, (LPARAM) NULL); - break; + break; - case IDC_DATASOURCE: + case IDC_DATASOURCE: - ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER); - DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DS), - hdlg, ds_optionsProc, (LPARAM) ci); + ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER); + DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DS), + hdlg, ds_optionsProc, (LPARAM) ci); - break; - } + break; + } } return FALSE; } -#endif /* WIN32 */ +#endif /* WIN32 */ -void dconn_get_connect_attributes(UCHAR FAR *connect_string, ConnInfo *ci) +void +dconn_get_connect_attributes(UCHAR FAR * connect_string, ConnInfo * ci) { -char *our_connect_string; -char *pair, *attribute, *value, *equals; -char *strtok_arg; + char *our_connect_string; + char *pair, + *attribute, + *value, + *equals; + char *strtok_arg; memset(ci, 0, sizeof(ConnInfo)); @@ -341,29 +367,28 @@ char *strtok_arg; mylog("our_connect_string = '%s'\n", our_connect_string); - while(1) { + while (1) + { pair = strtok(strtok_arg, ";"); - if(strtok_arg) { + if (strtok_arg) strtok_arg = 0; - } - if(!pair) { + if (!pair) break; - } equals = strchr(pair, '='); - if ( ! equals) + if (!equals) continue; *equals = '\0'; - attribute = pair; /* ex. DSN */ - value = equals + 1; /* ex. 'CEO co1' */ + attribute = pair; /* ex. DSN */ + value = equals + 1; /* ex. 'CEO co1' */ mylog("attribute = '%s', value = '%s'\n", attribute, value); - if( !attribute || !value) - continue; + if (!attribute || !value) + continue; - /* Copy the appropriate value to the conninfo */ + /* Copy the appropriate value to the conninfo */ copyAttributes(ci, attribute, value); } @@ -371,4 +396,3 @@ char *strtok_arg; free(our_connect_string); } - diff --git a/src/interfaces/odbc/environ.c b/src/interfaces/odbc/environ.c index 637b5fc160..d769234e44 100644 --- a/src/interfaces/odbc/environ.c +++ b/src/interfaces/odbc/environ.c @@ -1,14 +1,14 @@ -/* Module: environ.c +/* Module: environ.c * - * Description: This module contains routines related to - * the environment, such as storing connection handles, - * and returning errors. + * Description: This module contains routines related to + * the environment, such as storing connection handles, + * and returning errors. * - * Classes: EnvironmentClass (Functions prefix: "EN_") + * Classes: EnvironmentClass (Functions prefix: "EN_") * - * API functions: SQLAllocEnv, SQLFreeEnv, SQLError + * API functions: SQLAllocEnv, SQLFreeEnv, SQLError * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -22,31 +22,35 @@ ConnectionClass *conns[MAX_CONNECTIONS]; -RETCODE SQL_API SQLAllocEnv(HENV FAR *phenv) +RETCODE SQL_API +SQLAllocEnv(HENV FAR * phenv) { -static char *func = "SQLAllocEnv"; + static char *func = "SQLAllocEnv"; -mylog("**** in SQLAllocEnv ** \n"); + mylog("**** in SQLAllocEnv ** \n"); *phenv = (HENV) EN_Constructor(); - if ( ! *phenv) { + if (!*phenv) + { *phenv = SQL_NULL_HENV; EN_log_error(func, "Error allocating environment", NULL); return SQL_ERROR; } - + mylog("** exit SQLAllocEnv: phenv = %u **\n", *phenv); return SQL_SUCCESS; } -RETCODE SQL_API SQLFreeEnv(HENV henv) +RETCODE SQL_API +SQLFreeEnv(HENV henv) { -static char *func = "SQLFreeEnv"; -EnvironmentClass *env = (EnvironmentClass *) henv; + static char *func = "SQLFreeEnv"; + EnvironmentClass *env = (EnvironmentClass *) henv; -mylog("**** in SQLFreeEnv: env = %u ** \n", env); + mylog("**** in SQLFreeEnv: env = %u ** \n", env); - if (env && EN_Destructor(env)) { + if (env && EN_Destructor(env)) + { mylog(" ok\n"); return SQL_SUCCESS; } @@ -56,321 +60,349 @@ mylog("**** in SQLFreeEnv: env = %u ** \n", env); return SQL_ERROR; } -/* Returns the next SQL error information. */ - -RETCODE SQL_API SQLError( - HENV henv, - HDBC hdbc, - HSTMT hstmt, - UCHAR FAR *szSqlState, - SDWORD FAR *pfNativeError, - UCHAR FAR *szErrorMsg, - SWORD cbErrorMsgMax, - SWORD FAR *pcbErrorMsg) +/* Returns the next SQL error information. */ + +RETCODE SQL_API +SQLError( + HENV henv, + HDBC hdbc, + HSTMT hstmt, + UCHAR FAR * szSqlState, + SDWORD FAR * pfNativeError, + UCHAR FAR * szErrorMsg, + SWORD cbErrorMsgMax, + SWORD FAR * pcbErrorMsg) { -char *msg; -int status; - + char *msg; + int status; + mylog("**** SQLError: henv=%u, hdbc=%u, hstmt=%u\n", henv, hdbc, hstmt); - if (SQL_NULL_HSTMT != hstmt) { - /* CC: return an error of a hstmt */ - StatementClass *stmt = (StatementClass *) hstmt; - - if (SC_get_error(stmt, &status, &msg)) { + if (SQL_NULL_HSTMT != hstmt) + { + /* CC: return an error of a hstmt */ + StatementClass *stmt = (StatementClass *) hstmt; + + if (SC_get_error(stmt, &status, &msg)) + { mylog("SC_get_error: status = %d, msg = #%s#\n", status, msg); - if (NULL == msg) { - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; - } - if (NULL != pcbErrorMsg) - *pcbErrorMsg = (SWORD)strlen(msg); - - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - strncpy_null(szErrorMsg, msg, cbErrorMsgMax); - - if (NULL != pfNativeError) - *pfNativeError = status; - - if (NULL != szSqlState) - - switch (status) { - /* now determine the SQLSTATE to be returned */ - case STMT_TRUNCATED: - strcpy(szSqlState, "01004"); - /* data truncated */ - break; - case STMT_INFO_ONLY: - strcpy(szSqlState, "00000"); - /* just information that is returned, no error */ - break; - case STMT_BAD_ERROR: - strcpy(szSqlState, "08S01"); - /* communication link failure */ - break; - case STMT_CREATE_TABLE_ERROR: - strcpy(szSqlState, "S0001"); - /* table already exists */ - break; - case STMT_STATUS_ERROR: - case STMT_SEQUENCE_ERROR: - strcpy(szSqlState, "S1010"); - /* Function sequence error */ - break; - case STMT_NO_MEMORY_ERROR: - strcpy(szSqlState, "S1001"); - /* memory allocation failure */ - break; - case STMT_COLNUM_ERROR: - strcpy(szSqlState, "S1002"); - /* invalid column number */ - break; - case STMT_NO_STMTSTRING: - strcpy(szSqlState, "S1001"); - /* having no stmtstring is also a malloc problem */ - break; - case STMT_ERROR_TAKEN_FROM_BACKEND: - strcpy(szSqlState, "S1000"); - /* general error */ - break; - case STMT_INTERNAL_ERROR: - strcpy(szSqlState, "S1000"); - /* general error */ - break; - case STMT_ROW_OUT_OF_RANGE: - strcpy(szSqlState, "S1107"); - break; - - case STMT_OPERATION_CANCELLED: - strcpy(szSqlState, "S1008"); - break; - - case STMT_NOT_IMPLEMENTED_ERROR: - strcpy(szSqlState, "S1C00"); /* == 'driver not capable' */ - break; - case STMT_OPTION_OUT_OF_RANGE_ERROR: - strcpy(szSqlState, "S1092"); - break; - case STMT_BAD_PARAMETER_NUMBER_ERROR: - strcpy(szSqlState, "S1093"); - break; - case STMT_INVALID_COLUMN_NUMBER_ERROR: - strcpy(szSqlState, "S1002"); - break; - case STMT_RESTRICTED_DATA_TYPE_ERROR: - strcpy(szSqlState, "07006"); - break; - case STMT_INVALID_CURSOR_STATE_ERROR: - strcpy(szSqlState, "24000"); - break; - case STMT_OPTION_VALUE_CHANGED: - strcpy(szSqlState, "01S02"); - break; - case STMT_INVALID_CURSOR_NAME: - strcpy(szSqlState, "34000"); - break; - case STMT_NO_CURSOR_NAME: - strcpy(szSqlState, "S1015"); - break; - case STMT_INVALID_ARGUMENT_NO: - strcpy(szSqlState, "S1009"); - /* invalid argument value */ - break; - case STMT_INVALID_CURSOR_POSITION: - strcpy(szSqlState, "S1109"); - break; - - case STMT_VALUE_OUT_OF_RANGE: - strcpy(szSqlState, "22003"); - break; - - case STMT_OPERATION_INVALID: - strcpy(szSqlState, "S1011"); - break; - - case STMT_EXEC_ERROR: - default: - strcpy(szSqlState, "S1000"); - /* also a general error */ - break; - } - - mylog(" szSqlState = '%s', szError='%s'\n", szSqlState, szErrorMsg); - - } else { - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - + if (NULL == msg) + { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; + } + if (NULL != pcbErrorMsg) + *pcbErrorMsg = (SWORD) strlen(msg); + + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + strncpy_null(szErrorMsg, msg, cbErrorMsgMax); + + if (NULL != pfNativeError) + *pfNativeError = status; + + if (NULL != szSqlState) + + switch (status) + { + /* now determine the SQLSTATE to be returned */ + case STMT_TRUNCATED: + strcpy(szSqlState, "01004"); + /* data truncated */ + break; + case STMT_INFO_ONLY: + strcpy(szSqlState, "00000"); + /* just information that is returned, no error */ + break; + case STMT_BAD_ERROR: + strcpy(szSqlState, "08S01"); + /* communication link failure */ + break; + case STMT_CREATE_TABLE_ERROR: + strcpy(szSqlState, "S0001"); + /* table already exists */ + break; + case STMT_STATUS_ERROR: + case STMT_SEQUENCE_ERROR: + strcpy(szSqlState, "S1010"); + /* Function sequence error */ + break; + case STMT_NO_MEMORY_ERROR: + strcpy(szSqlState, "S1001"); + /* memory allocation failure */ + break; + case STMT_COLNUM_ERROR: + strcpy(szSqlState, "S1002"); + /* invalid column number */ + break; + case STMT_NO_STMTSTRING: + strcpy(szSqlState, "S1001"); + /* having no stmtstring is also a malloc problem */ + break; + case STMT_ERROR_TAKEN_FROM_BACKEND: + strcpy(szSqlState, "S1000"); + /* general error */ + break; + case STMT_INTERNAL_ERROR: + strcpy(szSqlState, "S1000"); + /* general error */ + break; + case STMT_ROW_OUT_OF_RANGE: + strcpy(szSqlState, "S1107"); + break; + + case STMT_OPERATION_CANCELLED: + strcpy(szSqlState, "S1008"); + break; + + case STMT_NOT_IMPLEMENTED_ERROR: + strcpy(szSqlState, "S1C00"); /* == 'driver not + * capable' */ + break; + case STMT_OPTION_OUT_OF_RANGE_ERROR: + strcpy(szSqlState, "S1092"); + break; + case STMT_BAD_PARAMETER_NUMBER_ERROR: + strcpy(szSqlState, "S1093"); + break; + case STMT_INVALID_COLUMN_NUMBER_ERROR: + strcpy(szSqlState, "S1002"); + break; + case STMT_RESTRICTED_DATA_TYPE_ERROR: + strcpy(szSqlState, "07006"); + break; + case STMT_INVALID_CURSOR_STATE_ERROR: + strcpy(szSqlState, "24000"); + break; + case STMT_OPTION_VALUE_CHANGED: + strcpy(szSqlState, "01S02"); + break; + case STMT_INVALID_CURSOR_NAME: + strcpy(szSqlState, "34000"); + break; + case STMT_NO_CURSOR_NAME: + strcpy(szSqlState, "S1015"); + break; + case STMT_INVALID_ARGUMENT_NO: + strcpy(szSqlState, "S1009"); + /* invalid argument value */ + break; + case STMT_INVALID_CURSOR_POSITION: + strcpy(szSqlState, "S1109"); + break; + + case STMT_VALUE_OUT_OF_RANGE: + strcpy(szSqlState, "22003"); + break; + + case STMT_OPERATION_INVALID: + strcpy(szSqlState, "S1011"); + break; + + case STMT_EXEC_ERROR: + default: + strcpy(szSqlState, "S1000"); + /* also a general error */ + break; + } + + mylog(" szSqlState = '%s', szError='%s'\n", szSqlState, szErrorMsg); + + } + else + { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + mylog(" returning NO_DATA_FOUND\n"); - return SQL_NO_DATA_FOUND; - } - return SQL_SUCCESS; - - } else if (SQL_NULL_HDBC != hdbc) { - ConnectionClass *conn = (ConnectionClass *) hdbc; - + return SQL_NO_DATA_FOUND; + } + return SQL_SUCCESS; + + } + else if (SQL_NULL_HDBC != hdbc) + { + ConnectionClass *conn = (ConnectionClass *) hdbc; + mylog("calling CC_get_error\n"); - if (CC_get_error(conn, &status, &msg)) { + if (CC_get_error(conn, &status, &msg)) + { mylog("CC_get_error: status = %d, msg = #%s#\n", status, msg); - if (NULL == msg) { - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; - } - - if (NULL != pcbErrorMsg) - *pcbErrorMsg = (SWORD)strlen(msg); - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - strncpy_null(szErrorMsg, msg, cbErrorMsgMax); - if (NULL != pfNativeError) - *pfNativeError = status; - - if (NULL != szSqlState) - switch(status) { - case STMT_OPTION_VALUE_CHANGED: - case CONN_OPTION_VALUE_CHANGED: - strcpy(szSqlState, "01S02"); - break; - case STMT_TRUNCATED: - case CONN_TRUNCATED: - strcpy(szSqlState, "01004"); - /* data truncated */ - break; - case CONN_INIREAD_ERROR: - strcpy(szSqlState, "IM002"); - /* data source not found */ - break; - case CONN_OPENDB_ERROR: - strcpy(szSqlState, "08001"); - /* unable to connect to data source */ - break; - case CONN_INVALID_AUTHENTICATION: - case CONN_AUTH_TYPE_UNSUPPORTED: - strcpy(szSqlState, "28000"); - break; - case CONN_STMT_ALLOC_ERROR: - strcpy(szSqlState, "S1001"); - /* memory allocation failure */ - break; - case CONN_IN_USE: - strcpy(szSqlState, "S1000"); - /* general error */ - break; - case CONN_UNSUPPORTED_OPTION: - strcpy(szSqlState, "IM001"); - /* driver does not support this function */ - case CONN_INVALID_ARGUMENT_NO: - strcpy(szSqlState, "S1009"); - /* invalid argument value */ - break; - case CONN_TRANSACT_IN_PROGRES: - strcpy(szSqlState, "S1010"); - /* when the user tries to switch commit mode in a transaction */ - /* -> function sequence error */ - break; - case CONN_NO_MEMORY_ERROR: - strcpy(szSqlState, "S1001"); - break; - case CONN_NOT_IMPLEMENTED_ERROR: - case STMT_NOT_IMPLEMENTED_ERROR: - strcpy(szSqlState, "S1C00"); - break; - - case CONN_VALUE_OUT_OF_RANGE: - case STMT_VALUE_OUT_OF_RANGE: - strcpy(szSqlState, "22003"); - break; - - default: - strcpy(szSqlState, "S1000"); - /* general error */ - break; - } - - } else { + if (NULL == msg) + { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; + } + + if (NULL != pcbErrorMsg) + *pcbErrorMsg = (SWORD) strlen(msg); + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + strncpy_null(szErrorMsg, msg, cbErrorMsgMax); + if (NULL != pfNativeError) + *pfNativeError = status; + + if (NULL != szSqlState) + switch (status) + { + case STMT_OPTION_VALUE_CHANGED: + case CONN_OPTION_VALUE_CHANGED: + strcpy(szSqlState, "01S02"); + break; + case STMT_TRUNCATED: + case CONN_TRUNCATED: + strcpy(szSqlState, "01004"); + /* data truncated */ + break; + case CONN_INIREAD_ERROR: + strcpy(szSqlState, "IM002"); + /* data source not found */ + break; + case CONN_OPENDB_ERROR: + strcpy(szSqlState, "08001"); + /* unable to connect to data source */ + break; + case CONN_INVALID_AUTHENTICATION: + case CONN_AUTH_TYPE_UNSUPPORTED: + strcpy(szSqlState, "28000"); + break; + case CONN_STMT_ALLOC_ERROR: + strcpy(szSqlState, "S1001"); + /* memory allocation failure */ + break; + case CONN_IN_USE: + strcpy(szSqlState, "S1000"); + /* general error */ + break; + case CONN_UNSUPPORTED_OPTION: + strcpy(szSqlState, "IM001"); + /* driver does not support this function */ + case CONN_INVALID_ARGUMENT_NO: + strcpy(szSqlState, "S1009"); + /* invalid argument value */ + break; + case CONN_TRANSACT_IN_PROGRES: + strcpy(szSqlState, "S1010"); + + /* + * when the user tries to switch commit mode in a + * transaction + */ + /* -> function sequence error */ + break; + case CONN_NO_MEMORY_ERROR: + strcpy(szSqlState, "S1001"); + break; + case CONN_NOT_IMPLEMENTED_ERROR: + case STMT_NOT_IMPLEMENTED_ERROR: + strcpy(szSqlState, "S1C00"); + break; + + case CONN_VALUE_OUT_OF_RANGE: + case STMT_VALUE_OUT_OF_RANGE: + strcpy(szSqlState, "22003"); + break; + + default: + strcpy(szSqlState, "S1000"); + /* general error */ + break; + } + + } + else + { mylog("CC_Get_error returned nothing.\n"); - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; - } - return SQL_SUCCESS; - - } else if (SQL_NULL_HENV != henv) { - EnvironmentClass *env = (EnvironmentClass *)henv; - if(EN_get_error(env, &status, &msg)) { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; + } + return SQL_SUCCESS; + + } + else if (SQL_NULL_HENV != henv) + { + EnvironmentClass *env = (EnvironmentClass *) henv; + + if (EN_get_error(env, &status, &msg)) + { mylog("EN_get_error: status = %d, msg = #%s#\n", status, msg); - if (NULL == msg) { - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; - } - - if (NULL != pcbErrorMsg) - *pcbErrorMsg = (SWORD)strlen(msg); - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - strncpy_null(szErrorMsg, msg, cbErrorMsgMax); - if (NULL != pfNativeError) - *pfNativeError = status; - - if(szSqlState) { - switch(status) { - case ENV_ALLOC_ERROR: - /* memory allocation failure */ - strcpy(szSqlState, "S1001"); - break; - default: - strcpy(szSqlState, "S1000"); - /* general error */ - break; - } - } - } else { - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; - } - - return SQL_SUCCESS; - } - - if (NULL != szSqlState) - strcpy(szSqlState, "00000"); - if (NULL != pcbErrorMsg) - *pcbErrorMsg = 0; - if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) - szErrorMsg[0] = '\0'; - - return SQL_NO_DATA_FOUND; + if (NULL == msg) + { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; + } + + if (NULL != pcbErrorMsg) + *pcbErrorMsg = (SWORD) strlen(msg); + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + strncpy_null(szErrorMsg, msg, cbErrorMsgMax); + if (NULL != pfNativeError) + *pfNativeError = status; + + if (szSqlState) + { + switch (status) + { + case ENV_ALLOC_ERROR: + /* memory allocation failure */ + strcpy(szSqlState, "S1001"); + break; + default: + strcpy(szSqlState, "S1000"); + /* general error */ + break; + } + } + } + else + { + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; + } + + return SQL_SUCCESS; + } + + if (NULL != szSqlState) + strcpy(szSqlState, "00000"); + if (NULL != pcbErrorMsg) + *pcbErrorMsg = 0; + if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0)) + szErrorMsg[0] = '\0'; + + return SQL_NO_DATA_FOUND; } @@ -382,25 +414,26 @@ int status; EnvironmentClass -*EN_Constructor(void) +* EN_Constructor(void) { -EnvironmentClass *rv; + EnvironmentClass *rv; - rv = (EnvironmentClass *) malloc(sizeof(EnvironmentClass)); - if( rv) { + rv = (EnvironmentClass *) malloc(sizeof(EnvironmentClass)); + if (rv) + { rv->errormsg = 0; rv->errornumber = 0; } - return rv; + return rv; } char -EN_Destructor(EnvironmentClass *self) +EN_Destructor(EnvironmentClass * self) { -int lf; -char rv = 1; + int lf; + char rv = 1; mylog("in EN_Destructor, self=%u\n", self); @@ -408,7 +441,8 @@ char rv = 1; /* the source--they should not be freed */ /* Free any connections belonging to this environment */ - for (lf = 0; lf < MAX_CONNECTIONS; lf++) { + for (lf = 0; lf < MAX_CONNECTIONS; lf++) + { if (conns[lf] && conns[lf]->henv == self) rv = rv && CC_Destructor(conns[lf]); } @@ -418,28 +452,31 @@ char rv = 1; } char -EN_get_error(EnvironmentClass *self, int *number, char **message) +EN_get_error(EnvironmentClass * self, int *number, char **message) { - if(self && self->errormsg && self->errornumber) { + if (self && self->errormsg && self->errornumber) + { *message = self->errormsg; *number = self->errornumber; self->errormsg = 0; self->errornumber = 0; return 1; - } else { - return 0; } + else + return 0; } char -EN_add_connection(EnvironmentClass *self, ConnectionClass *conn) +EN_add_connection(EnvironmentClass * self, ConnectionClass * conn) { -int i; + int i; -mylog("EN_add_connection: self = %u, conn = %u\n", self, conn); + mylog("EN_add_connection: self = %u, conn = %u\n", self, conn); - for (i = 0; i < MAX_CONNECTIONS; i++) { - if ( ! conns[i]) { + for (i = 0; i < MAX_CONNECTIONS; i++) + { + if (!conns[i]) + { conn->henv = self; conns[i] = conn; @@ -453,12 +490,13 @@ mylog("EN_add_connection: self = %u, conn = %u\n", self, conn); } char -EN_remove_connection(EnvironmentClass *self, ConnectionClass *conn) +EN_remove_connection(EnvironmentClass * self, ConnectionClass * conn) { -int i; + int i; for (i = 0; i < MAX_CONNECTIONS; i++) - if (conns[i] == conn && conns[i]->status != CONN_EXECUTING) { + if (conns[i] == conn && conns[i]->status != CONN_EXECUTING) + { conns[i] = NULL; return TRUE; } @@ -467,11 +505,10 @@ int i; } void -EN_log_error(char *func, char *desc, EnvironmentClass *self) +EN_log_error(char *func, char *desc, EnvironmentClass * self) { - if (self) { + if (self) qlog("ENVIRON ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, self->errormsg); - } else qlog("INVALID ENVIRON HANDLE ERROR: func=%s, desc='%s'\n", func, desc); } diff --git a/src/interfaces/odbc/environ.h b/src/interfaces/odbc/environ.h index 47018e7b38..7b208e7eae 100644 --- a/src/interfaces/odbc/environ.h +++ b/src/interfaces/odbc/environ.h @@ -1,9 +1,9 @@ -/* File: environ.h +/* File: environ.h * - * Description: See "environ.c" + * Description: See "environ.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -29,17 +29,18 @@ #define ENV_ALLOC_ERROR 1 /********** Environment Handle *************/ -struct EnvironmentClass_ { - char *errormsg; - int errornumber; +struct EnvironmentClass_ +{ + char *errormsg; + int errornumber; }; /* Environment prototypes */ EnvironmentClass *EN_Constructor(void); -char EN_Destructor(EnvironmentClass *self); -char EN_get_error(EnvironmentClass *self, int *number, char **message); -char EN_add_connection(EnvironmentClass *self, ConnectionClass *conn); -char EN_remove_connection(EnvironmentClass *self, ConnectionClass *conn); -void EN_log_error(char *func, char *desc, EnvironmentClass *self); +char EN_Destructor(EnvironmentClass * self); +char EN_get_error(EnvironmentClass * self, int *number, char **message); +char EN_add_connection(EnvironmentClass * self, ConnectionClass * conn); +char EN_remove_connection(EnvironmentClass * self, ConnectionClass * conn); +void EN_log_error(char *func, char *desc, EnvironmentClass * self); #endif diff --git a/src/interfaces/odbc/execute.c b/src/interfaces/odbc/execute.c index 57199f7396..229579708e 100644 --- a/src/interfaces/odbc/execute.c +++ b/src/interfaces/odbc/execute.c @@ -1,14 +1,14 @@ -/* Module: execute.c +/* Module: execute.c * - * Description: This module contains routines related to - * preparing and executing an SQL statement. + * Description: This module contains routines related to + * preparing and executing an SQL statement. * - * Classes: n/a + * Classes: n/a * - * API functions: SQLPrepare, SQLExecute, SQLExecDirect, SQLTransact, - * SQLCancel, SQLNativeSql, SQLParamData, SQLPutData + * API functions: SQLPrepare, SQLExecute, SQLExecDirect, SQLTransact, + * SQLCancel, SQLNativeSql, SQLParamData, SQLPutData * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -38,66 +38,74 @@ extern GLOBAL_VALUES globals; -/* Perform a Prepare on the SQL statement */ -RETCODE SQL_API SQLPrepare(HSTMT hstmt, - UCHAR FAR *szSqlStr, - SDWORD cbSqlStr) +/* Perform a Prepare on the SQL statement */ +RETCODE SQL_API +SQLPrepare(HSTMT hstmt, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStr) { -static char *func = "SQLPrepare"; -StatementClass *self = (StatementClass *) hstmt; + static char *func = "SQLPrepare"; + StatementClass *self = (StatementClass *) hstmt; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if ( ! self) { + if (!self) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - - /* According to the ODBC specs it is valid to call SQLPrepare mulitple times. - In that case, the bound SQL statement is replaced by the new one - */ - switch(self->status) { - case STMT_PREMATURE: - mylog("**** SQLPrepare: STMT_PREMATURE, recycle\n"); - SC_recycle_statement(self); /* recycle the statement, but do not remove parameter bindings */ - break; + /* + * According to the ODBC specs it is valid to call SQLPrepare mulitple + * times. In that case, the bound SQL statement is replaced by the new + * one + */ + + switch (self->status) + { + case STMT_PREMATURE: + mylog("**** SQLPrepare: STMT_PREMATURE, recycle\n"); + SC_recycle_statement(self); /* recycle the statement, but do + * not remove parameter bindings */ + break; - case STMT_FINISHED: - mylog("**** SQLPrepare: STMT_FINISHED, recycle\n"); - SC_recycle_statement(self); /* recycle the statement, but do not remove parameter bindings */ - break; + case STMT_FINISHED: + mylog("**** SQLPrepare: STMT_FINISHED, recycle\n"); + SC_recycle_statement(self); /* recycle the statement, but do + * not remove parameter bindings */ + break; - case STMT_ALLOCATED: - mylog("**** SQLPrepare: STMT_ALLOCATED, copy\n"); - self->status = STMT_READY; - break; + case STMT_ALLOCATED: + mylog("**** SQLPrepare: STMT_ALLOCATED, copy\n"); + self->status = STMT_READY; + break; - case STMT_READY: - mylog("**** SQLPrepare: STMT_READY, change SQL\n"); - break; + case STMT_READY: + mylog("**** SQLPrepare: STMT_READY, change SQL\n"); + break; - case STMT_EXECUTING: - mylog("**** SQLPrepare: STMT_EXECUTING, error!\n"); + case STMT_EXECUTING: + mylog("**** SQLPrepare: STMT_EXECUTING, error!\n"); - self->errornumber = STMT_SEQUENCE_ERROR; - self->errormsg = "SQLPrepare(): The handle does not point to a statement that is ready to be executed"; - SC_log_error(func, "", self); + self->errornumber = STMT_SEQUENCE_ERROR; + self->errormsg = "SQLPrepare(): The handle does not point to a statement that is ready to be executed"; + SC_log_error(func, "", self); - return SQL_ERROR; + return SQL_ERROR; - default: - self->errornumber = STMT_INTERNAL_ERROR; - self->errormsg = "An Internal Error has occured -- Unknown statement status."; - SC_log_error(func, "", self); - return SQL_ERROR; + default: + self->errornumber = STMT_INTERNAL_ERROR; + self->errormsg = "An Internal Error has occured -- Unknown statement status."; + SC_log_error(func, "", self); + return SQL_ERROR; } if (self->statement) free(self->statement); self->statement = make_string(szSqlStr, cbSqlStr, NULL); - if ( ! self->statement) { + if (!self->statement) + { self->errornumber = STMT_NO_MEMORY_ERROR; self->errormsg = "No memory available to store statement"; SC_log_error(func, "", self); @@ -107,8 +115,9 @@ StatementClass *self = (StatementClass *) hstmt; self->prepare = TRUE; self->statement_type = statement_type(self->statement); - /* Check if connection is onlyread (only selects are allowed) */ - if ( CC_is_onlyread(self->hdbc) && STMT_UPDATE(self)) { + /* Check if connection is onlyread (only selects are allowed) */ + if (CC_is_onlyread(self->hdbc) && STMT_UPDATE(self)) + { self->errornumber = STMT_EXEC_ERROR; self->errormsg = "Connection is readonly, only select statements are allowed."; SC_log_error(func, "", self); @@ -120,22 +129,24 @@ StatementClass *self = (StatementClass *) hstmt; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Performs the equivalent of SQLPrepare, followed by SQLExecute. */ +/* Performs the equivalent of SQLPrepare, followed by SQLExecute. */ -RETCODE SQL_API SQLExecDirect( - HSTMT hstmt, - UCHAR FAR *szSqlStr, - SDWORD cbSqlStr) +RETCODE SQL_API +SQLExecDirect( + HSTMT hstmt, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStr) { -StatementClass *stmt = (StatementClass *) hstmt; -RETCODE result; -static char *func = "SQLExecDirect"; + StatementClass *stmt = (StatementClass *) hstmt; + RETCODE result; + static char *func = "SQLExecDirect"; + + mylog("%s: entering...\n", func); - mylog( "%s: entering...\n", func); - - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -146,7 +157,8 @@ static char *func = "SQLExecDirect"; /* keep a copy of the un-parametrized statement, in case */ /* they try to execute this statement again */ stmt->statement = make_string(szSqlStr, cbSqlStr, NULL); - if ( ! stmt->statement) { + if (!stmt->statement) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "No memory available to store statement"; SC_log_error(func, "", stmt); @@ -160,19 +172,20 @@ static char *func = "SQLExecDirect"; /* If an SQLPrepare was performed prior to this, but was left in */ /* the premature state because an error occurred prior to SQLExecute */ /* then set the statement to finished so it can be recycled. */ - if ( stmt->status == STMT_PREMATURE ) + if (stmt->status == STMT_PREMATURE) stmt->status = STMT_FINISHED; stmt->statement_type = statement_type(stmt->statement); - /* Check if connection is onlyread (only selects are allowed) */ - if ( CC_is_onlyread(stmt->hdbc) && STMT_UPDATE(stmt)) { + /* Check if connection is onlyread (only selects are allowed) */ + if (CC_is_onlyread(stmt->hdbc) && STMT_UPDATE(stmt)) + { stmt->errornumber = STMT_EXEC_ERROR; stmt->errormsg = "Connection is readonly, only select statements are allowed."; SC_log_error(func, "", stmt); return SQL_ERROR; } - + mylog("%s: calling SQLExecute...\n", func); result = SQLExecute(hstmt); @@ -181,47 +194,55 @@ static char *func = "SQLExecDirect"; return result; } -/* Execute a prepared SQL statement */ -RETCODE SQL_API SQLExecute( - HSTMT hstmt) +/* Execute a prepared SQL statement */ +RETCODE SQL_API +SQLExecute( + HSTMT hstmt) { -static char *func="SQLExecute"; -StatementClass *stmt = (StatementClass *) hstmt; -ConnectionClass *conn; -int i, retval; + static char *func = "SQLExecute"; + StatementClass *stmt = (StatementClass *) hstmt; + ConnectionClass *conn; + int i, + retval; mylog("%s: entering...\n", func); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); mylog("%s: NULL statement so return SQL_INVALID_HANDLE\n", func); return SQL_INVALID_HANDLE; } - /* If the statement is premature, it means we already executed - it from an SQLPrepare/SQLDescribeCol type of scenario. So - just return success. - */ - if ( stmt->prepare && stmt->status == STMT_PREMATURE) { - stmt->status = STMT_FINISHED; - if (stmt->errormsg == NULL) { + /* + * If the statement is premature, it means we already executed it from + * an SQLPrepare/SQLDescribeCol type of scenario. So just return + * success. + */ + if (stmt->prepare && stmt->status == STMT_PREMATURE) + { + stmt->status = STMT_FINISHED; + if (stmt->errormsg == NULL) + { mylog("%s: premature statement but return SQL_SUCCESS\n", func); return SQL_SUCCESS; } - else { + else + { SC_log_error(func, "", stmt); mylog("%s: premature statement so return SQL_ERROR\n", func); return SQL_ERROR; } - } + } mylog("%s: clear errors...\n", func); SC_clear_error(stmt); conn = SC_get_conn(stmt); - if (conn->status == CONN_EXECUTING) { + if (conn->status == CONN_EXECUTING) + { stmt->errormsg = "Connection is already in use."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); @@ -229,7 +250,8 @@ int i, retval; return SQL_ERROR; } - if ( ! stmt->statement) { + if (!stmt->statement) + { stmt->errornumber = STMT_NO_STMTSTRING; stmt->errormsg = "This handle does not have a SQL statement stored in it"; SC_log_error(func, "", stmt); @@ -237,19 +259,22 @@ int i, retval; return SQL_ERROR; } - /* If SQLExecute is being called again, recycle the statement. - Note this should have been done by the application in a call - to SQLFreeStmt(SQL_CLOSE) or SQLCancel. - */ - if (stmt->status == STMT_FINISHED) { + /* + * If SQLExecute is being called again, recycle the statement. Note + * this should have been done by the application in a call to + * SQLFreeStmt(SQL_CLOSE) or SQLCancel. + */ + if (stmt->status == STMT_FINISHED) + { mylog("%s: recycling statement (should have been done by app)...\n", func); SC_recycle_statement(stmt); } - /* Check if the statement is in the correct state */ - if ((stmt->prepare && stmt->status != STMT_READY) || - (stmt->status != STMT_ALLOCATED && stmt->status != STMT_READY)) { - + /* Check if the statement is in the correct state */ + if ((stmt->prepare && stmt->status != STMT_READY) || + (stmt->status != STMT_ALLOCATED && stmt->status != STMT_READY)) + { + stmt->errornumber = STMT_STATUS_ERROR; stmt->errormsg = "The handle does not point to a statement that is ready to be executed"; SC_log_error(func, "", stmt); @@ -258,30 +283,37 @@ int i, retval; } - /* The bound parameters could have possibly changed since the last execute - of this statement? Therefore check for params and re-copy. - */ + /* + * The bound parameters could have possibly changed since the last + * execute of this statement? Therefore check for params and re-copy. + */ stmt->data_at_exec = -1; - for (i = 0; i < stmt->parameters_allocated; i++) { - /* Check for data at execution parameters */ - if ( stmt->parameters[i].data_at_exec == TRUE) { + for (i = 0; i < stmt->parameters_allocated; i++) + { + /* Check for data at execution parameters */ + if (stmt->parameters[i].data_at_exec == TRUE) + { if (stmt->data_at_exec < 0) stmt->data_at_exec = 1; else stmt->data_at_exec++; } } - /* If there are some data at execution parameters, return need data */ - /* SQLParamData and SQLPutData will be used to send params and execute the statement. */ + /* If there are some data at execution parameters, return need data */ + + /* + * SQLParamData and SQLPutData will be used to send params and execute + * the statement. + */ if (stmt->data_at_exec > 0) return SQL_NEED_DATA; mylog("%s: copying statement params: trans_status=%d, len=%d, stmt='%s'\n", func, conn->transact_status, strlen(stmt->statement), stmt->statement); - /* Create the statement with parameters substituted. */ + /* Create the statement with parameters substituted. */ retval = copy_statement_with_parameters(stmt); - if( retval != SQL_SUCCESS) + if (retval != SQL_SUCCESS) /* error msg passed from above */ return retval; @@ -295,125 +327,148 @@ int i, retval; -/* - - - - - - - - - */ -RETCODE SQL_API SQLTransact( - HENV henv, - HDBC hdbc, - UWORD fType) +/* - - - - - - - - - */ +RETCODE SQL_API +SQLTransact( + HENV henv, + HDBC hdbc, + UWORD fType) { -static char *func = "SQLTransact"; -extern ConnectionClass *conns[]; -ConnectionClass *conn; -QResultClass *res; -char ok, *stmt_string; -int lf; + static char *func = "SQLTransact"; + extern ConnectionClass *conns[]; + ConnectionClass *conn; + QResultClass *res; + char ok, + *stmt_string; + int lf; mylog("entering %s: hdbc=%u, henv=%u\n", func, hdbc, henv); - if (hdbc == SQL_NULL_HDBC && henv == SQL_NULL_HENV) { + if (hdbc == SQL_NULL_HDBC && henv == SQL_NULL_HENV) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - /* If hdbc is null and henv is valid, - it means transact all connections on that henv. - */ - if (hdbc == SQL_NULL_HDBC && henv != SQL_NULL_HENV) { - for (lf=0; lf henv == henv) - if ( SQLTransact(henv, (HDBC) conn, fType) != SQL_SUCCESS) + if (SQLTransact(henv, (HDBC) conn, fType) != SQL_SUCCESS) return SQL_ERROR; } - return SQL_SUCCESS; + return SQL_SUCCESS; } conn = (ConnectionClass *) hdbc; - if (fType == SQL_COMMIT) { + if (fType == SQL_COMMIT) + { stmt_string = "COMMIT"; - } else if (fType == SQL_ROLLBACK) { + } + else if (fType == SQL_ROLLBACK) + { stmt_string = "ROLLBACK"; - } else { + } + else + { conn->errornumber = CONN_INVALID_ARGUMENT_NO; - conn->errormsg ="SQLTransact can only be called with SQL_COMMIT or SQL_ROLLBACK as parameter"; + conn->errormsg = "SQLTransact can only be called with SQL_COMMIT or SQL_ROLLBACK as parameter"; CC_log_error(func, "", conn); return SQL_ERROR; - } + } - /* If manual commit and in transaction, then proceed. */ - if ( ! CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) { + /* If manual commit and in transaction, then proceed. */ + if (!CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) + { mylog("SQLTransact: sending on conn %d '%s'\n", conn, stmt_string); res = CC_send_query(conn, stmt_string, NULL); CC_set_no_trans(conn); - if ( ! res) { - /* error msg will be in the connection */ + if (!res) + { + /* error msg will be in the connection */ CC_log_error(func, "", conn); return SQL_ERROR; } - ok = QR_command_successful(res); + ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { CC_log_error(func, "", conn); return SQL_ERROR; } - } + } return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLCancel( - HSTMT hstmt) /* Statement to cancel. */ +RETCODE SQL_API +SQLCancel( + HSTMT hstmt) /* Statement to cancel. */ { -static char *func="SQLCancel"; -StatementClass *stmt = (StatementClass *) hstmt; -RETCODE result; + static char *func = "SQLCancel"; + StatementClass *stmt = (StatementClass *) hstmt; + RETCODE result; + #ifdef WIN32 -HMODULE hmodule; -FARPROC addr; + HMODULE hmodule; + FARPROC addr; + #endif - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - /* Check if this can handle canceling in the middle of a SQLPutData? */ - if ( ! stmt) { + /* Check if this can handle canceling in the middle of a SQLPutData? */ + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - /* Not in the middle of SQLParamData/SQLPutData so cancel like a close. */ - if (stmt->data_at_exec < 0) { + /* + * Not in the middle of SQLParamData/SQLPutData so cancel like a + * close. + */ + if (stmt->data_at_exec < 0) + { - /* MAJOR HACK for Windows to reset the driver manager's cursor state: - Because of what seems like a bug in the Odbc driver manager, - SQLCancel does not act like a SQLFreeStmt(CLOSE), as many - applications depend on this behavior. So, this - brute force method calls the driver manager's function on - behalf of the application. - */ + /* + * MAJOR HACK for Windows to reset the driver manager's cursor + * state: Because of what seems like a bug in the Odbc driver + * manager, SQLCancel does not act like a SQLFreeStmt(CLOSE), as + * many applications depend on this behavior. So, this brute + * force method calls the driver manager's function on behalf of + * the application. + */ #ifdef WIN32 - if (globals.cancel_as_freestmt) { + if (globals.cancel_as_freestmt) + { hmodule = GetModuleHandle("ODBC32"); addr = GetProcAddress(hmodule, "SQLFreeStmt"); - result = addr( (char *) (stmt->phstmt) - 96, SQL_CLOSE); - } - else { - result = SQLFreeStmt( hstmt, SQL_CLOSE); + result = addr((char *) (stmt->phstmt) - 96, SQL_CLOSE); } + else + result = SQLFreeStmt(hstmt, SQL_CLOSE); #else - result = SQLFreeStmt( hstmt, SQL_CLOSE); + result = SQLFreeStmt(hstmt, SQL_CLOSE); #endif mylog("SQLCancel: SQLFreeStmt returned %d\n", result); @@ -422,9 +477,13 @@ FARPROC addr; return SQL_SUCCESS; } - /* In the middle of SQLParamData/SQLPutData, so cancel that. */ - /* Note, any previous data-at-exec buffers will be freed in the recycle */ - /* if they call SQLExecDirect or SQLExecute again. */ + /* In the middle of SQLParamData/SQLPutData, so cancel that. */ + + /* + * Note, any previous data-at-exec buffers will be freed in the + * recycle + */ + /* if they call SQLExecDirect or SQLExecute again. */ stmt->data_at_exec = -1; stmt->current_exec_param = -1; @@ -434,29 +493,31 @@ FARPROC addr; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Returns the SQL string as modified by the driver. */ +/* Returns the SQL string as modified by the driver. */ /* Currently, just copy the input string without modification */ /* observing buffer limits and truncation. */ -RETCODE SQL_API SQLNativeSql( - HDBC hdbc, - UCHAR FAR *szSqlStrIn, - SDWORD cbSqlStrIn, - UCHAR FAR *szSqlStr, - SDWORD cbSqlStrMax, - SDWORD FAR *pcbSqlStr) +RETCODE SQL_API +SQLNativeSql( + HDBC hdbc, + UCHAR FAR * szSqlStrIn, + SDWORD cbSqlStrIn, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStrMax, + SDWORD FAR * pcbSqlStr) { -static char *func="SQLNativeSql"; -int len = 0; -char *ptr; -ConnectionClass *conn = (ConnectionClass *) hdbc; -RETCODE result; + static char *func = "SQLNativeSql"; + int len = 0; + char *ptr; + ConnectionClass *conn = (ConnectionClass *) hdbc; + RETCODE result; - mylog( "%s: entering...cbSqlStrIn=%d\n", func, cbSqlStrIn); + mylog("%s: entering...cbSqlStrIn=%d\n", func, cbSqlStrIn); ptr = (cbSqlStrIn == 0) ? "" : make_string(szSqlStrIn, cbSqlStrIn, NULL); - if ( ! ptr) { + if (!ptr) + { conn->errornumber = CONN_NO_MEMORY_ERROR; conn->errormsg = "No memory available to store native sql string"; CC_log_error(func, "", conn); @@ -466,10 +527,12 @@ RETCODE result; result = SQL_SUCCESS; len = strlen(ptr); - if (szSqlStr) { + if (szSqlStr) + { strncpy_null(szSqlStr, ptr, cbSqlStrMax); - if (len >= cbSqlStrMax) { + if (len >= cbSqlStrMax) + { result = SQL_SUCCESS_WITH_INFO; conn->errornumber = STMT_TRUNCATED; conn->errormsg = "The buffer was too small for the result."; @@ -481,39 +544,44 @@ RETCODE result; free(ptr); - return result; + return result; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Supplies parameter data at execution time. Used in conjuction with */ -/* SQLPutData. */ +/* Supplies parameter data at execution time. Used in conjuction with */ +/* SQLPutData. */ -RETCODE SQL_API SQLParamData( - HSTMT hstmt, - PTR FAR *prgbValue) +RETCODE SQL_API +SQLParamData( + HSTMT hstmt, + PTR FAR * prgbValue) { -static char *func = "SQLParamData"; -StatementClass *stmt = (StatementClass *) hstmt; -int i, retval; + static char *func = "SQLParamData"; + StatementClass *stmt = (StatementClass *) hstmt; + int i, + retval; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } mylog("%s: data_at_exec=%d, params_alloc=%d\n", func, stmt->data_at_exec, stmt->parameters_allocated); - if (stmt->data_at_exec < 0) { + if (stmt->data_at_exec < 0) + { stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "No execution-time parameters for this statement"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->data_at_exec > stmt->parameters_allocated) { + if (stmt->data_at_exec > stmt->parameters_allocated) + { stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "Too many execution-time parameters were present"; SC_log_error(func, "", stmt); @@ -521,16 +589,19 @@ int i, retval; } /* close the large object */ - if ( stmt->lobj_fd >= 0) { + if (stmt->lobj_fd >= 0) + { lo_close(stmt->hdbc, stmt->lobj_fd); /* commit transaction if needed */ - if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) { + if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) + { QResultClass *res; - char ok; + char ok; res = CC_send_query(stmt->hdbc, "COMMIT", NULL); - if (!res) { + if (!res) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", stmt); @@ -538,7 +609,8 @@ int i, retval; } ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", stmt); @@ -552,8 +624,9 @@ int i, retval; } - /* Done, now copy the params and then execute the statement */ - if (stmt->data_at_exec == 0) { + /* Done, now copy the params and then execute the statement */ + if (stmt->data_at_exec == 0) + { retval = copy_statement_with_parameters(stmt); if (retval != SQL_SUCCESS) return retval; @@ -563,14 +636,17 @@ int i, retval; return SC_execute(stmt); } - /* Set beginning param; if first time SQLParamData is called , start at 0. - Otherwise, start at the last parameter + 1. - */ - i = stmt->current_exec_param >= 0 ? stmt->current_exec_param+1 : 0; - - /* At least 1 data at execution parameter, so Fill in the token value */ - for ( ; i < stmt->parameters_allocated; i++) { - if (stmt->parameters[i].data_at_exec == TRUE) { + /* + * Set beginning param; if first time SQLParamData is called , start + * at 0. Otherwise, start at the last parameter + 1. + */ + i = stmt->current_exec_param >= 0 ? stmt->current_exec_param + 1 : 0; + + /* At least 1 data at execution parameter, so Fill in the token value */ + for (; i < stmt->parameters_allocated; i++) + { + if (stmt->parameters[i].data_at_exec == TRUE) + { stmt->data_at_exec--; stmt->current_exec_param = i; stmt->put_data = FALSE; @@ -582,31 +658,35 @@ int i, retval; return SQL_NEED_DATA; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Supplies parameter data at execution time. Used in conjunction with */ -/* SQLParamData. */ +/* Supplies parameter data at execution time. Used in conjunction with */ +/* SQLParamData. */ -RETCODE SQL_API SQLPutData( - HSTMT hstmt, - PTR rgbValue, - SDWORD cbValue) +RETCODE SQL_API +SQLPutData( + HSTMT hstmt, + PTR rgbValue, + SDWORD cbValue) { -static char *func = "SQLPutData"; -StatementClass *stmt = (StatementClass *) hstmt; -int old_pos, retval; -ParameterInfoClass *current_param; -char *buffer; + static char *func = "SQLPutData"; + StatementClass *stmt = (StatementClass *) hstmt; + int old_pos, + retval; + ParameterInfoClass *current_param; + char *buffer; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - - if (stmt->current_exec_param < 0) { + + if (stmt->current_exec_param < 0) + { stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "Previous call was not SQLPutData or SQLParamData"; SC_log_error(func, "", stmt); @@ -615,14 +695,16 @@ char *buffer; current_param = &(stmt->parameters[stmt->current_exec_param]); - if ( ! stmt->put_data) { /* first call */ + if (!stmt->put_data) + { /* first call */ mylog("SQLPutData: (1) cbValue = %d\n", cbValue); stmt->put_data = TRUE; current_param->EXEC_used = (SDWORD *) malloc(sizeof(SDWORD)); - if ( ! current_param->EXEC_used) { + if (!current_param->EXEC_used) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Out of memory in SQLPutData (1)"; SC_log_error(func, "", stmt); @@ -635,16 +717,19 @@ char *buffer; return SQL_SUCCESS; - /* Handle Long Var Binary with Large Objects */ - if ( current_param->SQLType == SQL_LONGVARBINARY) { + /* Handle Long Var Binary with Large Objects */ + if (current_param->SQLType == SQL_LONGVARBINARY) + { /* begin transaction if needed */ - if(!CC_is_in_trans(stmt->hdbc)) { + if (!CC_is_in_trans(stmt->hdbc)) + { QResultClass *res; - char ok; + char ok; res = CC_send_query(stmt->hdbc, "BEGIN", NULL); - if (!res) { + if (!res) + { stmt->errormsg = "Could not begin (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", stmt); @@ -652,7 +737,8 @@ char *buffer; } ok = QR_command_successful(res); QR_Destructor(res); - if (!ok) { + if (!ok) + { stmt->errormsg = "Could not begin (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", stmt); @@ -662,22 +748,24 @@ char *buffer; CC_set_in_trans(stmt->hdbc); } - /* store the oid */ + /* store the oid */ current_param->lobj_oid = lo_creat(stmt->hdbc, INV_READ | INV_WRITE); - if (current_param->lobj_oid == 0) { + if (current_param->lobj_oid == 0) + { stmt->errornumber = STMT_EXEC_ERROR; stmt->errormsg = "Couldnt create large object."; SC_log_error(func, "", stmt); return SQL_ERROR; } - /* major hack -- to allow convert to see somethings there */ - /* have to modify convert to handle this better */ + /* major hack -- to allow convert to see somethings there */ + /* have to modify convert to handle this better */ current_param->EXEC_buffer = (char *) ¤t_param->lobj_oid; - /* store the fd */ + /* store the fd */ stmt->lobj_fd = lo_open(stmt->hdbc, current_param->lobj_oid, INV_WRITE); - if ( stmt->lobj_fd < 0) { + if (stmt->lobj_fd < 0) + { stmt->errornumber = STMT_EXEC_ERROR; stmt->errormsg = "Couldnt open large object for writing."; SC_log_error(func, "", stmt); @@ -688,20 +776,26 @@ char *buffer; mylog("lo_write: cbValue=%d, wrote %d bytes\n", cbValue, retval); } - else { /* for handling text fields and small binaries */ + else + { /* for handling text fields and small + * binaries */ - if (cbValue == SQL_NTS) { + if (cbValue == SQL_NTS) + { current_param->EXEC_buffer = strdup(rgbValue); - if ( ! current_param->EXEC_buffer) { + if (!current_param->EXEC_buffer) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Out of memory in SQLPutData (2)"; SC_log_error(func, "", stmt); return SQL_ERROR; } } - else { + else + { current_param->EXEC_buffer = malloc(cbValue + 1); - if ( ! current_param->EXEC_buffer) { + if (!current_param->EXEC_buffer) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Out of memory in SQLPutData (2)"; SC_log_error(func, "", stmt); @@ -713,11 +807,13 @@ char *buffer; } } - else { /* calling SQLPutData more than once */ + else + { /* calling SQLPutData more than once */ mylog("SQLPutData: (>1) cbValue = %d\n", cbValue); - if (current_param->SQLType == SQL_LONGVARBINARY) { + if (current_param->SQLType == SQL_LONGVARBINARY) + { /* the large object fd is in EXEC_buffer */ retval = lo_write(stmt->hdbc, stmt->lobj_fd, rgbValue, cbValue); @@ -725,13 +821,17 @@ char *buffer; *current_param->EXEC_used += cbValue; - } else { + } + else + { buffer = current_param->EXEC_buffer; - if (cbValue == SQL_NTS) { + if (cbValue == SQL_NTS) + { buffer = realloc(buffer, strlen(buffer) + strlen(rgbValue) + 1); - if ( ! buffer) { + if (!buffer) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Out of memory in SQLPutData (3)"; SC_log_error(func, "", stmt); @@ -743,11 +843,12 @@ char *buffer; *current_param->EXEC_used = cbValue; - /* reassign buffer incase realloc moved it */ + /* reassign buffer incase realloc moved it */ current_param->EXEC_buffer = buffer; } - else if (cbValue > 0) { + else if (cbValue > 0) + { old_pos = *current_param->EXEC_used; @@ -757,7 +858,8 @@ char *buffer; /* dont lose the old pointer in case out of memory */ buffer = realloc(current_param->EXEC_buffer, *current_param->EXEC_used + 1); - if ( ! buffer) { + if (!buffer) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Out of memory in SQLPutData (3)"; SC_log_error(func, "", stmt); @@ -767,11 +869,12 @@ char *buffer; memcpy(&buffer[old_pos], rgbValue, cbValue); buffer[*current_param->EXEC_used] = '\0'; - /* reassign buffer incase realloc moved it */ + /* reassign buffer incase realloc moved it */ current_param->EXEC_buffer = buffer; - + } - else { + else + { SC_log_error(func, "bad cbValue", stmt); return SQL_ERROR; } diff --git a/src/interfaces/odbc/gpps.c b/src/interfaces/odbc/gpps.c index f14e95f2ce..6f69300965 100644 --- a/src/interfaces/odbc/gpps.c +++ b/src/interfaces/odbc/gpps.c @@ -13,7 +13,7 @@ #ifndef WIN32 #if HAVE_CONFIG_H -#include "config.h" /* produced by configure */ +#include "config.h" /* produced by configure */ #endif #include @@ -38,83 +38,87 @@ DWORD -GetPrivateProfileString(char *theSection, /* section name */ - char *theKey, /* search key name */ - char *theDefault, /* default value if not found */ - char *theReturnBuffer, /* return value stored here */ - size_t theReturnBufferLength, /* byte length of return buffer */ - char *theIniFileName) /* pathname of ini file to search */ +GetPrivateProfileString(char *theSection, /* section name */ + char *theKey, /* search key name */ + char *theDefault, /* default value if not + * found */ + char *theReturnBuffer, /* return value stored + * here */ + size_t theReturnBufferLength, /* byte length of return + * buffer */ + char *theIniFileName) /* pathname of ini file to + * search */ { - char buf[MAXPGPATH]; - char* ptr = 0; - FILE* aFile = 0; - size_t aLength; - char aLine[2048]; - char *aValue; - char *aStart; - char *aString; - size_t aLineLength; - size_t aReturnLength = 0; - - BOOL aSectionFound = FALSE; - BOOL aKeyFound = FALSE; - int j = 0; + char buf[MAXPGPATH]; + char *ptr = 0; + FILE *aFile = 0; + size_t aLength; + char aLine[2048]; + char *aValue; + char *aStart; + char *aString; + size_t aLineLength; + size_t aReturnLength = 0; + + BOOL aSectionFound = FALSE; + BOOL aKeyFound = FALSE; + int j = 0; j = strlen(theIniFileName) + 1; - ptr = (char*)getpwuid(getuid()); /* get user info */ + ptr = (char *) getpwuid(getuid()); /* get user info */ - if( ptr == NULL) + if (ptr == NULL) { - if( MAXPGPATH-1 < j ) - theIniFileName[MAXPGPATH-1] = '\0'; + if (MAXPGPATH - 1 < j) + theIniFileName[MAXPGPATH - 1] = '\0'; - sprintf(buf,"%s",theIniFileName); + sprintf(buf, "%s", theIniFileName); } - ptr = ((struct passwd*)ptr)->pw_dir; /* get user home dir */ - if( ptr == NULL || *ptr == '\0' ) + ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ + if (ptr == NULL || *ptr == '\0') ptr = "/home"; - /* This doesn't make it so we find an ini file but allows normal - * processing to continue further on down. The likelihood is that - * the file won't be found and thus the default value will be - * returned. - */ - if( MAXPGPATH-1 < strlen(ptr) + j ) + /* + * This doesn't make it so we find an ini file but allows normal + * processing to continue further on down. The likelihood is that the + * file won't be found and thus the default value will be returned. + */ + if (MAXPGPATH - 1 < strlen(ptr) + j) { - if( MAXPGPATH-1 < strlen(ptr) ) - ptr[MAXPGPATH-1] = '\0'; + if (MAXPGPATH - 1 < strlen(ptr)) + ptr[MAXPGPATH - 1] = '\0'; else - theIniFileName[MAXPGPATH-1-strlen(ptr)] = '\0'; + theIniFileName[MAXPGPATH - 1 - strlen(ptr)] = '\0'; } - sprintf( buf, "%s/%s",ptr,theIniFileName ); + sprintf(buf, "%s/%s", ptr, theIniFileName); - /* This code makes it so that a file in the users home dir - * overrides a the "default" file as passed in - */ - aFile = (FILE*)(buf ? fopen(buf, PG_BINARY_R) : NULL); - if(!aFile) { - sprintf(buf,"%s",theIniFileName); - aFile = (FILE*)(buf ? fopen(buf, PG_BINARY_R) : NULL); + /* + * This code makes it so that a file in the users home dir overrides a + * the "default" file as passed in + */ + aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); + if (!aFile) + { + sprintf(buf, "%s", theIniFileName); + aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); } aLength = (theDefault == NULL) ? 0 : strlen(theDefault); - if(theReturnBufferLength == 0 || theReturnBuffer == NULL) + if (theReturnBufferLength == 0 || theReturnBuffer == NULL) { - if(aFile) - { + if (aFile) fclose(aFile); - } return 0; } - if(aFile == NULL) + if (aFile == NULL) { /* no ini file specified, return the default */ - ++aLength; /* room for NULL char */ + ++aLength; /* room for NULL char */ aLength = theReturnBufferLength < aLength ? theReturnBufferLength : aLength; strncpy(theReturnBuffer, theDefault, aLength); @@ -123,86 +127,77 @@ GetPrivateProfileString(char *theSection, /* section name */ } - while(fgets(aLine, sizeof(aLine), aFile) != NULL) + while (fgets(aLine, sizeof(aLine), aFile) != NULL) { aLineLength = strlen(aLine); /* strip final '\n' */ - if(aLineLength > 0 && aLine[aLineLength - 1] == '\n') - { + if (aLineLength > 0 && aLine[aLineLength - 1] == '\n') aLine[aLineLength - 1] = '\0'; - } - switch(*aLine) + switch (*aLine) { - case ' ': /* blank line */ - case ';': /* comment line */ + case ' ': /* blank line */ + case ';': /* comment line */ continue; - break; + break; - case '[': /* section marker */ + case '[': /* section marker */ - if( (aString = strchr(aLine, ']')) ) + if ((aString = strchr(aLine, ']'))) { aStart = aLine + 1; aString--; - while (isspace((unsigned char) *aStart)) aStart++; - while (isspace((unsigned char) *aString)) aString--; - *(aString+1) = '\0'; + while (isspace((unsigned char) *aStart)) + aStart++; + while (isspace((unsigned char) *aString)) + aString--; + *(aString + 1) = '\0'; /* accept as matched if NULL key or exact match */ - if(!theSection || !strcmp(aStart, theSection)) - { + if (!theSection || !strcmp(aStart, theSection)) aSectionFound = TRUE; - } } - break; + break; default: /* try to match value keys if in proper section */ - if(aSectionFound) + if (aSectionFound) { /* try to match requested key */ - if( (aString = aValue = strchr(aLine, '=')) ) + if ((aString = aValue = strchr(aLine, '='))) { *aValue = '\0'; ++aValue; /* strip leading blanks in value field */ - while(*aValue == ' ' && aValue < aLine + sizeof(aLine)) - { + while (*aValue == ' ' && aValue < aLine + sizeof(aLine)) *aValue++ = '\0'; - } - if(aValue >= aLine + sizeof(aLine)) - { + if (aValue >= aLine + sizeof(aLine)) aValue = ""; - } } else - { aValue = ""; - } aStart = aLine; - while (isspace((unsigned char) *aStart)) aStart++; + while (isspace((unsigned char) *aStart)) + aStart++; /* strip trailing blanks from key */ - if(aString) + if (aString) { - while(--aString >= aStart && *aString == ' ') - { + while (--aString >= aStart && *aString == ' ') *aString = '\0'; - } } /* see if key is matched */ - if(theKey == NULL || !strcmp(theKey, aStart)) + if (theKey == NULL || !strcmp(theKey, aStart)) { /* matched -- first, terminate value part */ @@ -213,7 +208,7 @@ GetPrivateProfileString(char *theSection, /* section name */ aString = aValue + aLength - 1; - while(--aString > aValue && *aString == ' ') + while (--aString > aValue && *aString == ' ') { *aString = '\0'; --aLength; @@ -221,7 +216,7 @@ GetPrivateProfileString(char *theSection, /* section name */ /* unquote value if quoted */ - if(aLength >= 2 && aValue[0] == '"' && + if (aLength >= 2 && aValue[0] == '"' && aValue[aLength - 1] == '"') { /* string quoted with double quotes */ @@ -234,7 +229,7 @@ GetPrivateProfileString(char *theSection, /* section name */ { /* single quotes allowed also... */ - if(aLength >= 2 && aValue[0] == '\'' && + if (aLength >= 2 && aValue[0] == '\'' && aValue[aLength - 1] == '\'') { aValue[aLength - 1] = '\0'; @@ -246,23 +241,23 @@ GetPrivateProfileString(char *theSection, /* section name */ /* compute maximum length copyable */ aLineLength = (aLength < - theReturnBufferLength - aReturnLength) ? aLength : + theReturnBufferLength - aReturnLength) ? aLength : theReturnBufferLength - aReturnLength; /* do the copy to return buffer */ - if(aLineLength) + if (aLineLength) { strncpy(&theReturnBuffer[aReturnLength], - aValue, aLineLength); + aValue, aLineLength); aReturnLength += aLineLength; - if(aReturnLength < theReturnBufferLength) + if (aReturnLength < theReturnBufferLength) { theReturnBuffer[aReturnLength] = '\0'; ++aReturnLength; } } - if(aFile) + if (aFile) { fclose(aFile); aFile = NULL; @@ -272,17 +267,16 @@ GetPrivateProfileString(char *theSection, /* section name */ } } - break; + break; } } - if(aFile) - { + if (aFile) fclose(aFile); - } - if(!aKeyFound) { /* key wasn't found return default */ - ++aLength; /* room for NULL char */ + if (!aKeyFound) + { /* key wasn't found return default */ + ++aLength; /* room for NULL char */ aLength = theReturnBufferLength < aLength ? theReturnBufferLength : aLength; strncpy(theReturnBuffer, theDefault, aLength); @@ -293,10 +287,11 @@ GetPrivateProfileString(char *theSection, /* section name */ } DWORD -WritePrivateProfileString(char *theSection, /* section name */ - char *theKey, /* write key name */ - char *theBuffer, /* input buffer */ - char *theIniFileName) /* pathname of ini file to write */ +WritePrivateProfileString(char *theSection, /* section name */ + char *theKey, /* write key name */ + char *theBuffer, /* input buffer */ + char *theIniFileName) /* pathname of ini file to + * write */ { return 0; } @@ -307,69 +302,74 @@ WritePrivateProfileString(char *theSection, /* section name */ * I find out different. */ DWORD -WritePrivateProfileString(char *theSection, /* section name */ - char *theKey, /* write key name */ - char *theBuffer, /* input buffer */ - char *theIniFileName) /* pathname of ini file to write */ +WritePrivateProfileString(char *theSection, /* section name */ + char *theKey, /* write key name */ + char *theBuffer, /* input buffer */ + char *theIniFileName) /* pathname of ini file to + * write */ { - char buf[MAXPGPATH]; - char* ptr = 0; - FILE* aFile = 0; - size_t aLength; - char aLine[2048]; - char *aValue; - char *aString; - size_t aLineLength; - size_t aReturnLength = 0; - - BOOL aSectionFound = FALSE; - BOOL keyFound = FALSE; - int j = 0; + char buf[MAXPGPATH]; + char *ptr = 0; + FILE *aFile = 0; + size_t aLength; + char aLine[2048]; + char *aValue; + char *aString; + size_t aLineLength; + size_t aReturnLength = 0; + + BOOL aSectionFound = FALSE; + BOOL keyFound = FALSE; + int j = 0; /* If this isn't correct processing we'll change it later */ - if(theSection == NULL || theKey == NULL || theBuffer == NULL || - theIniFileName == NULL) return 0; + if (theSection == NULL || theKey == NULL || theBuffer == NULL || + theIniFileName == NULL) + return 0; aLength = strlen(theBuffer); - if(aLength == 0) return 0; + if (aLength == 0) + return 0; j = strlen(theIniFileName) + 1; - ptr = (char*)getpwuid(getuid()); /* get user info */ + ptr = (char *) getpwuid(getuid()); /* get user info */ - if( ptr == NULL) + if (ptr == NULL) { - if( MAXPGPATH-1 < j ) - theIniFileName[MAXPGPATH-1] = '\0'; + if (MAXPGPATH - 1 < j) + theIniFileName[MAXPGPATH - 1] = '\0'; - sprintf(buf,"%s",theIniFileName); + sprintf(buf, "%s", theIniFileName); } - ptr = ((struct passwd*)ptr)->pw_dir; /* get user home dir */ - if( ptr == NULL || *ptr == '\0' ) + ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ + if (ptr == NULL || *ptr == '\0') ptr = "/home"; /* This doesn't make it so we find an ini file but allows normal */ - /* processing to continue further on down. The likelihood is that */ + /* processing to continue further on down. The likelihood is that */ /* the file won't be found and thus the default value will be */ /* returned. */ /* */ - if( MAXPGPATH-1 < strlen(ptr) + j ) + if (MAXPGPATH - 1 < strlen(ptr) + j) { - if( MAXPGPATH-1 < strlen(ptr) ) - ptr[MAXPGPATH-1] = '\0'; + if (MAXPGPATH - 1 < strlen(ptr)) + ptr[MAXPGPATH - 1] = '\0'; else - theIniFileName[MAXPGPATH-1-strlen(ptr)] = '\0'; + theIniFileName[MAXPGPATH - 1 - strlen(ptr)] = '\0'; } - sprintf( buf, "%s/%s",ptr,theIniFileName ); + sprintf(buf, "%s/%s", ptr, theIniFileName); /* This code makes it so that a file in the users home dir */ - /* overrides a the "default" file as passed in */ + /* overrides a the "default" file as passed in */ /* */ - aFile = (FILE*)(buf ? fopen(buf, "r+") : NULL); - if(!aFile) { - sprintf(buf,"%s",theIniFileName); - aFile = (FILE*)(buf ? fopen(buf, "r+") : NULL); - if(!aFile) return 0; + aFile = (FILE *) (buf ? fopen(buf, "r+") : NULL); + if (!aFile) + { + sprintf(buf, "%s", theIniFileName); + aFile = (FILE *) (buf ? fopen(buf, "r+") : NULL); + if (!aFile) + return 0; } @@ -379,104 +379,92 @@ WritePrivateProfileString(char *theSection, /* section name */ /* exists we have to overwrite it. If it doesn't exist */ /* we just write a new line to the file. */ /* */ - while(fgets(aLine, sizeof(aLine), aFile) != NULL) + while (fgets(aLine, sizeof(aLine), aFile) != NULL) { aLineLength = strlen(aLine); /* strip final '\n' */ - if(aLineLength > 0 && aLine[aLineLength - 1] == '\n') - { + if (aLineLength > 0 && aLine[aLineLength - 1] == '\n') aLine[aLineLength - 1] = '\0'; - } - switch(*aLine) + switch (*aLine) { - case ' ': /* blank line */ - case ';': /* comment line */ + case ' ': /* blank line */ + case ';': /* comment line */ continue; - break; + break; - case '[': /* section marker */ + case '[': /* section marker */ - if( (aString = strchr(aLine, ']')) ) + if ((aString = strchr(aLine, ']'))) { *aString = '\0'; /* accept as matched if key exact match */ - if(!strcmp(aLine + 1, theSection)) - { + if (!strcmp(aLine + 1, theSection)) aSectionFound = TRUE; - } } - break; + break; default: /* try to match value keys if in proper section */ - if(aSectionFound) + if (aSectionFound) { /* try to match requested key */ - if( (aString = aValue = strchr(aLine, '=')) ) + if ((aString = aValue = strchr(aLine, '='))) { *aValue = '\0'; ++aValue; /* strip leading blanks in value field */ - while(*aValue == ' ' && aValue < aLine + sizeof(aLine)) - { + while (*aValue == ' ' && aValue < aLine + sizeof(aLine)) *aValue++ = '\0'; - } - if(aValue >= aLine + sizeof(aLine)) - { + if (aValue >= aLine + sizeof(aLine)) aValue = ""; - } } else - { aValue = ""; - } /* strip trailing blanks from key */ - if(aString) + if (aString) { - while(--aString >= aLine && *aString == ' ') - { + while (--aString >= aLine && *aString == ' ') *aString = '\0'; - } } /* see if key is matched */ - if(!strcmp(theKey, aLine)) + if (!strcmp(theKey, aLine)) { keyFound = TRUE; /* matched -- first, terminate value part */ /* overwrite current value */ - fseek(aFile,-aLineLength,SEEK_CUR); + fseek(aFile, -aLineLength, SEEK_CUR); /* overwrite key and value */ - sprintf(aLine,"%s = %s\n",theKey,theBuffer); - fputs(aLine,aFile); - } + sprintf(aLine, "%s = %s\n", theKey, theBuffer); + fputs(aLine, aFile); } } - - break; } + + break; } +} - if(!keyFound) { /* theKey wasn't in file so */ - if(aFile) - { +if (!keyFound) +{ /* theKey wasn't in file so */ + if (aFile) fclose(aFile); - } return aReturnLength > 0 ? aReturnLength - 1 : 0; } + #endif diff --git a/src/interfaces/odbc/gpps.h b/src/interfaces/odbc/gpps.h index c2c81965f0..03e2db9c44 100644 --- a/src/interfaces/odbc/gpps.h +++ b/src/interfaces/odbc/gpps.h @@ -13,25 +13,32 @@ #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -DWORD -GetPrivateProfileString(char *theSection, /* section name */ - char *theKey, /* search key name */ - char *theDefault, /* default value if not found */ - char *theReturnBuffer, /* return valuse stored here */ - size_t theBufferLength, /* byte length of return buffer */ - char *theIniFileName); /* pathname of ini file to search */ + DWORD + GetPrivateProfileString(char *theSection, /* section name */ + char *theKey, /* search key name */ + char *theDefault, /* default value if not + * found */ + char *theReturnBuffer, /* return valuse stored + * here */ + size_t theBufferLength, /* byte length of return + * buffer */ + char *theIniFileName); /* pathname of ini file + * to search */ -DWORD -WritePrivateProfileString(char *theSection, /* section name */ - char *theKey, /* write key name */ - char *theBuffer, /* input buffer */ - char *theIniFileName); /* pathname of ini file to write */ + DWORD + WritePrivateProfileString(char *theSection, /* section name */ + char *theKey, /* write key name */ + char *theBuffer, /* input buffer */ + char *theIniFileName); /* pathname of ini file + * to write */ #ifdef __cplusplus } + #endif #ifndef WIN32 diff --git a/src/interfaces/odbc/info.c b/src/interfaces/odbc/info.c index 9ee92c0687..f777a71707 100644 --- a/src/interfaces/odbc/info.c +++ b/src/interfaces/odbc/info.c @@ -1,17 +1,17 @@ -/* Module: info.c +/* Module: info.c * - * Description: This module contains routines related to - * ODBC informational functions. + * Description: This module contains routines related to + * ODBC informational functions. * - * Classes: n/a + * Classes: n/a * - * API functions: SQLGetInfo, SQLGetTypeInfo, SQLGetFunctions, - * SQLTables, SQLColumns, SQLStatistics, SQLSpecialColumns, - * SQLPrimaryKeys, SQLForeignKeys, - * SQLProcedureColumns(NI), SQLProcedures(NI), - * SQLTablePrivileges(NI), SQLColumnPrivileges(NI) + * API functions: SQLGetInfo, SQLGetTypeInfo, SQLGetFunctions, + * SQLTables, SQLColumns, SQLStatistics, SQLSpecialColumns, + * SQLPrimaryKeys, SQLForeignKeys, + * SQLProcedureColumns(NI), SQLProcedures(NI), + * SQLTablePrivileges(NI), SQLColumnPrivileges(NI) * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -30,7 +30,7 @@ #include #else #include -#include +#include #include #endif @@ -56,589 +56,636 @@ extern GLOBAL_VALUES globals; -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLGetInfo( - HDBC hdbc, - UWORD fInfoType, - PTR rgbInfoValue, - SWORD cbInfoValueMax, - SWORD FAR *pcbInfoValue) +RETCODE SQL_API +SQLGetInfo( + HDBC hdbc, + UWORD fInfoType, + PTR rgbInfoValue, + SWORD cbInfoValueMax, + SWORD FAR * pcbInfoValue) { -static char *func = "SQLGetInfo"; -ConnectionClass *conn = (ConnectionClass *) hdbc; -ConnInfo *ci; -char *p = NULL, tmp[MAX_INFO_STRING]; -int len = 0, value = 0; -RETCODE result; - - mylog( "%s: entering...fInfoType=%d\n", func, fInfoType); - - if ( ! conn) { + static char *func = "SQLGetInfo"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + ConnInfo *ci; + char *p = NULL, + tmp[MAX_INFO_STRING]; + int len = 0, + value = 0; + RETCODE result; + + mylog("%s: entering...fInfoType=%d\n", func, fInfoType); + + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } ci = &conn->connInfo; - switch (fInfoType) { - case SQL_ACCESSIBLE_PROCEDURES: /* ODBC 1.0 */ - p = "N"; - break; - - case SQL_ACCESSIBLE_TABLES: /* ODBC 1.0 */ - p = "N"; - break; - - case SQL_ACTIVE_CONNECTIONS: /* ODBC 1.0 */ - len = 2; - value = MAX_CONNECTIONS; - break; - - case SQL_ACTIVE_STATEMENTS: /* ODBC 1.0 */ - len = 2; - value = 0; - break; - - case SQL_ALTER_TABLE: /* ODBC 2.0 */ - len = 4; - value = SQL_AT_ADD_COLUMN; - break; - - case SQL_BOOKMARK_PERSISTENCE: /* ODBC 2.0 */ - /* very simple bookmark support */ - len = 4; - value = globals.use_declarefetch ? 0 : (SQL_BP_SCROLL); - break; - - case SQL_COLUMN_ALIAS: /* ODBC 2.0 */ - p = "N"; - break; - - case SQL_CONCAT_NULL_BEHAVIOR: /* ODBC 1.0 */ - len = 2; - value = SQL_CB_NON_NULL; - break; - - case SQL_CONVERT_BIGINT: - case SQL_CONVERT_BINARY: - case SQL_CONVERT_BIT: - case SQL_CONVERT_CHAR: - case SQL_CONVERT_DATE: - case SQL_CONVERT_DECIMAL: - case SQL_CONVERT_DOUBLE: - case SQL_CONVERT_FLOAT: - case SQL_CONVERT_INTEGER: - case SQL_CONVERT_LONGVARBINARY: - case SQL_CONVERT_LONGVARCHAR: - case SQL_CONVERT_NUMERIC: - case SQL_CONVERT_REAL: - case SQL_CONVERT_SMALLINT: - case SQL_CONVERT_TIME: - case SQL_CONVERT_TIMESTAMP: - case SQL_CONVERT_TINYINT: - case SQL_CONVERT_VARBINARY: - case SQL_CONVERT_VARCHAR: /* ODBC 1.0 */ - len = 4; - value = fInfoType; - break; - - case SQL_CONVERT_FUNCTIONS: /* ODBC 1.0 */ - len = 4; - value = 0; - break; - - case SQL_CORRELATION_NAME: /* ODBC 1.0 */ - - /* Saying no correlation name makes Query not work right. - value = SQL_CN_NONE; - */ - len = 2; - value = SQL_CN_ANY; - break; - - case SQL_CURSOR_COMMIT_BEHAVIOR: /* ODBC 1.0 */ - len = 2; - value = SQL_CB_CLOSE; - break; - - case SQL_CURSOR_ROLLBACK_BEHAVIOR: /* ODBC 1.0 */ - len = 2; - value = SQL_CB_CLOSE; - break; - - case SQL_DATA_SOURCE_NAME: /* ODBC 1.0 */ - p = CC_get_DSN(conn); - break; - - case SQL_DATA_SOURCE_READ_ONLY: /* ODBC 1.0 */ - p = CC_is_onlyread(conn) ? "Y" : "N"; - break; - - case SQL_DATABASE_NAME: /* Support for old ODBC 1.0 Apps */ - - /* Returning the database name causes problems in MS Query. - It generates query like: "SELECT DISTINCT a FROM byronncrap3 crap3" - - p = CC_get_database(conn); - */ - p = ""; - break; - - case SQL_DBMS_NAME: /* ODBC 1.0 */ - p = DBMS_NAME; - break; - - case SQL_DBMS_VER: /* ODBC 1.0 */ - /* The ODBC spec wants ##.##.#### ...whatever... so prepend the driver */ - /* version number to the dbms version string */ - sprintf(tmp, "%s %s", POSTGRESDRIVERVERSION, conn->pg_version); - p = tmp; - break; - - case SQL_DEFAULT_TXN_ISOLATION: /* ODBC 1.0 */ - len = 4; - value = SQL_TXN_READ_COMMITTED; /*SQL_TXN_SERIALIZABLE; */ - break; - - case SQL_DRIVER_NAME: /* ODBC 1.0 */ - p = DRIVER_FILE_NAME; - break; - - case SQL_DRIVER_ODBC_VER: - p = DRIVER_ODBC_VER; - break; - - case SQL_DRIVER_VER: /* ODBC 1.0 */ - p = POSTGRESDRIVERVERSION; - break; - - case SQL_EXPRESSIONS_IN_ORDERBY: /* ODBC 1.0 */ - p = "N"; - break; - - case SQL_FETCH_DIRECTION: /* ODBC 1.0 */ - len = 4; - value = globals.use_declarefetch ? (SQL_FD_FETCH_NEXT) : (SQL_FD_FETCH_NEXT | - SQL_FD_FETCH_FIRST | - SQL_FD_FETCH_LAST | - SQL_FD_FETCH_PRIOR | - SQL_FD_FETCH_ABSOLUTE | - SQL_FD_FETCH_RELATIVE | - SQL_FD_FETCH_BOOKMARK); - break; - - case SQL_FILE_USAGE: /* ODBC 2.0 */ - len = 2; - value = SQL_FILE_NOT_SUPPORTED; - break; - - case SQL_GETDATA_EXTENSIONS: /* ODBC 2.0 */ - len = 4; - value = (SQL_GD_ANY_COLUMN | SQL_GD_ANY_ORDER | SQL_GD_BOUND | SQL_GD_BLOCK); - break; - - case SQL_GROUP_BY: /* ODBC 2.0 */ - len = 2; - value = SQL_GB_GROUP_BY_EQUALS_SELECT; - break; - - case SQL_IDENTIFIER_CASE: /* ODBC 1.0 */ - /* are identifiers case-sensitive (yes, but only when quoted. If not quoted, they - default to lowercase) - */ - len = 2; - value = SQL_IC_LOWER; - break; - - case SQL_IDENTIFIER_QUOTE_CHAR: /* ODBC 1.0 */ - /* the character used to quote "identifiers" */ - p = PG_VERSION_LE(conn, 6.2) ? " " : "\""; - break; - - case SQL_KEYWORDS: /* ODBC 2.0 */ - p = ""; - break; - - case SQL_LIKE_ESCAPE_CLAUSE: /* ODBC 2.0 */ - /* is there a character that escapes '%' and '_' in a LIKE clause? - not as far as I can tell - */ - p = "N"; - break; - - case SQL_LOCK_TYPES: /* ODBC 2.0 */ - len = 4; - value = globals.lie ? (SQL_LCK_NO_CHANGE | SQL_LCK_EXCLUSIVE | SQL_LCK_UNLOCK) : SQL_LCK_NO_CHANGE; - break; - - case SQL_MAX_BINARY_LITERAL_LEN: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_MAX_CHAR_LITERAL_LEN: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_MAX_COLUMN_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = MAX_COLUMN_LEN; - break; - - case SQL_MAX_COLUMNS_IN_GROUP_BY: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_COLUMNS_IN_INDEX: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_COLUMNS_IN_ORDER_BY: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_COLUMNS_IN_SELECT: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_COLUMNS_IN_TABLE: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_CURSOR_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = MAX_CURSOR_LEN; - break; - - case SQL_MAX_INDEX_SIZE: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_MAX_OWNER_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_PROCEDURE_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_QUALIFIER_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_ROW_SIZE: /* ODBC 2.0 */ - len = 4; - if (PG_VERSION_GE(conn, 7.1)) { /* Large Rowa in 7.1+ */ - value = MAX_ROW_SIZE; - } else { /* Without the Toaster we're limited to the blocksize */ - value = BLCKSZ; - } - break; - - case SQL_MAX_ROW_SIZE_INCLUDES_LONG: /* ODBC 2.0 */ - /* does the preceding value include LONGVARCHAR and LONGVARBINARY - fields? Well, it does include longvarchar, but not longvarbinary. - */ - p = "Y"; - break; - - case SQL_MAX_STATEMENT_LEN: /* ODBC 2.0 */ - /* maybe this should be 0? */ - len = 4; - if (PG_VERSION_GE(conn, 7.0)) { /* Long Queries in 7.0+ */ - value = MAX_STATEMENT_LEN; - } else if (PG_VERSION_GE(conn, 6.5)) /* Prior to 7.0 we used 2*BLCKSZ */ - value = (2*BLCKSZ); - else /* Prior to 6.5 we used BLCKSZ */ - value = BLCKSZ; - - break; - - case SQL_MAX_TABLE_NAME_LEN: /* ODBC 1.0 */ - len = 2; - value = MAX_TABLE_LEN; - break; - - case SQL_MAX_TABLES_IN_SELECT: /* ODBC 2.0 */ - len = 2; - value = 0; - break; - - case SQL_MAX_USER_NAME_LEN: - len = 2; - value = 0; - break; - - case SQL_MULT_RESULT_SETS: /* ODBC 1.0 */ - /* Don't support multiple result sets but say yes anyway? */ - p = "Y"; - break; - - case SQL_MULTIPLE_ACTIVE_TXN: /* ODBC 1.0 */ - p = "Y"; - break; - - case SQL_NEED_LONG_DATA_LEN: /* ODBC 2.0 */ - /* Dont need the length, SQLPutData can handle any size and multiple calls */ - p = "N"; - break; - - case SQL_NON_NULLABLE_COLUMNS: /* ODBC 1.0 */ - len = 2; - value = SQL_NNC_NON_NULL; - break; - - case SQL_NULL_COLLATION: /* ODBC 2.0 */ - /* where are nulls sorted? */ - len = 2; - value = SQL_NC_END; - break; - - case SQL_NUMERIC_FUNCTIONS: /* ODBC 1.0 */ - len = 4; - value = 0; - break; - - case SQL_ODBC_API_CONFORMANCE: /* ODBC 1.0 */ - len = 2; - value = SQL_OAC_LEVEL1; - break; - - case SQL_ODBC_SAG_CLI_CONFORMANCE: /* ODBC 1.0 */ - len = 2; - value = SQL_OSCC_NOT_COMPLIANT; - break; - - case SQL_ODBC_SQL_CONFORMANCE: /* ODBC 1.0 */ - len = 2; - value = SQL_OSC_CORE; - break; - - case SQL_ODBC_SQL_OPT_IEF: /* ODBC 1.0 */ - p = "N"; - break; - - case SQL_OJ_CAPABILITIES: /* ODBC 2.01 */ - len = 4; - if (PG_VERSION_GE(conn, 7.1)) { /* OJs in 7.1+ */ - value = (SQL_OJ_LEFT | - SQL_OJ_RIGHT | - SQL_OJ_FULL | - SQL_OJ_NESTED | - SQL_OJ_NOT_ORDERED | - SQL_OJ_INNER | - SQL_OJ_ALL_COMPARISON_OPS); - } else { /* OJs not in <7.1 */ + switch (fInfoType) + { + case SQL_ACCESSIBLE_PROCEDURES: /* ODBC 1.0 */ + p = "N"; + break; + + case SQL_ACCESSIBLE_TABLES: /* ODBC 1.0 */ + p = "N"; + break; + + case SQL_ACTIVE_CONNECTIONS: /* ODBC 1.0 */ + len = 2; + value = MAX_CONNECTIONS; + break; + + case SQL_ACTIVE_STATEMENTS: /* ODBC 1.0 */ + len = 2; value = 0; - } - break; + break; + + case SQL_ALTER_TABLE: /* ODBC 2.0 */ + len = 4; + value = SQL_AT_ADD_COLUMN; + break; - case SQL_ORDER_BY_COLUMNS_IN_SELECT: /* ODBC 2.0 */ - p = (PG_VERSION_LE(conn, 6.3)) ? "Y" : "N"; - break; + case SQL_BOOKMARK_PERSISTENCE: /* ODBC 2.0 */ + /* very simple bookmark support */ + len = 4; + value = globals.use_declarefetch ? 0 : (SQL_BP_SCROLL); + break; + + case SQL_COLUMN_ALIAS: /* ODBC 2.0 */ + p = "N"; + break; + + case SQL_CONCAT_NULL_BEHAVIOR: /* ODBC 1.0 */ + len = 2; + value = SQL_CB_NON_NULL; + break; + + case SQL_CONVERT_BIGINT: + case SQL_CONVERT_BINARY: + case SQL_CONVERT_BIT: + case SQL_CONVERT_CHAR: + case SQL_CONVERT_DATE: + case SQL_CONVERT_DECIMAL: + case SQL_CONVERT_DOUBLE: + case SQL_CONVERT_FLOAT: + case SQL_CONVERT_INTEGER: + case SQL_CONVERT_LONGVARBINARY: + case SQL_CONVERT_LONGVARCHAR: + case SQL_CONVERT_NUMERIC: + case SQL_CONVERT_REAL: + case SQL_CONVERT_SMALLINT: + case SQL_CONVERT_TIME: + case SQL_CONVERT_TIMESTAMP: + case SQL_CONVERT_TINYINT: + case SQL_CONVERT_VARBINARY: + case SQL_CONVERT_VARCHAR: /* ODBC 1.0 */ + len = 4; + value = fInfoType; + break; + + case SQL_CONVERT_FUNCTIONS: /* ODBC 1.0 */ + len = 4; + value = 0; + break; + + case SQL_CORRELATION_NAME: /* ODBC 1.0 */ + + /* + * Saying no correlation name makes Query not work right. + * value = SQL_CN_NONE; + */ + len = 2; + value = SQL_CN_ANY; + break; + + case SQL_CURSOR_COMMIT_BEHAVIOR: /* ODBC 1.0 */ + len = 2; + value = SQL_CB_CLOSE; + break; + + case SQL_CURSOR_ROLLBACK_BEHAVIOR: /* ODBC 1.0 */ + len = 2; + value = SQL_CB_CLOSE; + break; + + case SQL_DATA_SOURCE_NAME: /* ODBC 1.0 */ + p = CC_get_DSN(conn); + break; + + case SQL_DATA_SOURCE_READ_ONLY: /* ODBC 1.0 */ + p = CC_is_onlyread(conn) ? "Y" : "N"; + break; + + case SQL_DATABASE_NAME:/* Support for old ODBC 1.0 Apps */ + + /* + * Returning the database name causes problems in MS Query. It + * generates query like: "SELECT DISTINCT a FROM byronncrap3 + * crap3" + * + * p = CC_get_database(conn); + */ + p = ""; + break; + + case SQL_DBMS_NAME: /* ODBC 1.0 */ + p = DBMS_NAME; + break; + + case SQL_DBMS_VER: /* ODBC 1.0 */ + + /* + * The ODBC spec wants ##.##.#### ...whatever... so prepend + * the driver + */ + /* version number to the dbms version string */ + sprintf(tmp, "%s %s", POSTGRESDRIVERVERSION, conn->pg_version); + p = tmp; + break; + + case SQL_DEFAULT_TXN_ISOLATION: /* ODBC 1.0 */ + len = 4; + value = SQL_TXN_READ_COMMITTED; /* SQL_TXN_SERIALIZABLE; */ + break; + + case SQL_DRIVER_NAME: /* ODBC 1.0 */ + p = DRIVER_FILE_NAME; + break; + + case SQL_DRIVER_ODBC_VER: + p = DRIVER_ODBC_VER; + break; + + case SQL_DRIVER_VER: /* ODBC 1.0 */ + p = POSTGRESDRIVERVERSION; + break; + + case SQL_EXPRESSIONS_IN_ORDERBY: /* ODBC 1.0 */ + p = "N"; + break; + + case SQL_FETCH_DIRECTION: /* ODBC 1.0 */ + len = 4; + value = globals.use_declarefetch ? (SQL_FD_FETCH_NEXT) : (SQL_FD_FETCH_NEXT | + SQL_FD_FETCH_FIRST | + SQL_FD_FETCH_LAST | + SQL_FD_FETCH_PRIOR | + SQL_FD_FETCH_ABSOLUTE | + SQL_FD_FETCH_RELATIVE | + SQL_FD_FETCH_BOOKMARK); + break; + + case SQL_FILE_USAGE: /* ODBC 2.0 */ + len = 2; + value = SQL_FILE_NOT_SUPPORTED; + break; + + case SQL_GETDATA_EXTENSIONS: /* ODBC 2.0 */ + len = 4; + value = (SQL_GD_ANY_COLUMN | SQL_GD_ANY_ORDER | SQL_GD_BOUND | SQL_GD_BLOCK); + break; + + case SQL_GROUP_BY: /* ODBC 2.0 */ + len = 2; + value = SQL_GB_GROUP_BY_EQUALS_SELECT; + break; + + case SQL_IDENTIFIER_CASE: /* ODBC 1.0 */ + + /* + * are identifiers case-sensitive (yes, but only when quoted. + * If not quoted, they default to lowercase) + */ + len = 2; + value = SQL_IC_LOWER; + break; + + case SQL_IDENTIFIER_QUOTE_CHAR: /* ODBC 1.0 */ + /* the character used to quote "identifiers" */ + p = PG_VERSION_LE(conn, 6.2) ? " " : "\""; + break; + + case SQL_KEYWORDS: /* ODBC 2.0 */ + p = ""; + break; + + case SQL_LIKE_ESCAPE_CLAUSE: /* ODBC 2.0 */ + + /* + * is there a character that escapes '%' and '_' in a LIKE + * clause? not as far as I can tell + */ + p = "N"; + break; + + case SQL_LOCK_TYPES: /* ODBC 2.0 */ + len = 4; + value = globals.lie ? (SQL_LCK_NO_CHANGE | SQL_LCK_EXCLUSIVE | SQL_LCK_UNLOCK) : SQL_LCK_NO_CHANGE; + break; + + case SQL_MAX_BINARY_LITERAL_LEN: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_MAX_CHAR_LITERAL_LEN: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_MAX_COLUMN_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = MAX_COLUMN_LEN; + break; + + case SQL_MAX_COLUMNS_IN_GROUP_BY: /* ODBC 2.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_COLUMNS_IN_INDEX: /* ODBC 2.0 */ + len = 2; + value = 0; + break; - case SQL_OUTER_JOINS: /* ODBC 1.0 */ - if (PG_VERSION_GE(conn, 7.1)) { /* OJs in 7.1+ */ + case SQL_MAX_COLUMNS_IN_ORDER_BY: /* ODBC 2.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_COLUMNS_IN_SELECT: /* ODBC 2.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_COLUMNS_IN_TABLE: /* ODBC 2.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_CURSOR_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = MAX_CURSOR_LEN; + break; + + case SQL_MAX_INDEX_SIZE: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_MAX_OWNER_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_PROCEDURE_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_QUALIFIER_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_ROW_SIZE: /* ODBC 2.0 */ + len = 4; + if (PG_VERSION_GE(conn, 7.1)) + { /* Large Rowa in 7.1+ */ + value = MAX_ROW_SIZE; + } + else + { /* Without the Toaster we're limited to + * the blocksize */ + value = BLCKSZ; + } + break; + + case SQL_MAX_ROW_SIZE_INCLUDES_LONG: /* ODBC 2.0 */ + + /* + * does the preceding value include LONGVARCHAR and + * LONGVARBINARY fields? Well, it does include longvarchar, + * but not longvarbinary. + */ p = "Y"; - } else { /* OJs not in <7.1 */ + break; + + case SQL_MAX_STATEMENT_LEN: /* ODBC 2.0 */ + /* maybe this should be 0? */ + len = 4; + if (PG_VERSION_GE(conn, 7.0)) + { /* Long Queries in 7.0+ */ + value = MAX_STATEMENT_LEN; + } + else if (PG_VERSION_GE(conn, 6.5)) /* Prior to 7.0 we used + * 2*BLCKSZ */ + value = (2 * BLCKSZ); + else +/* Prior to 6.5 we used BLCKSZ */ + value = BLCKSZ; + + break; + + case SQL_MAX_TABLE_NAME_LEN: /* ODBC 1.0 */ + len = 2; + value = MAX_TABLE_LEN; + break; + + case SQL_MAX_TABLES_IN_SELECT: /* ODBC 2.0 */ + len = 2; + value = 0; + break; + + case SQL_MAX_USER_NAME_LEN: + len = 2; + value = 0; + break; + + case SQL_MULT_RESULT_SETS: /* ODBC 1.0 */ + /* Don't support multiple result sets but say yes anyway? */ + p = "Y"; + break; + + case SQL_MULTIPLE_ACTIVE_TXN: /* ODBC 1.0 */ + p = "Y"; + break; + + case SQL_NEED_LONG_DATA_LEN: /* ODBC 2.0 */ + + /* + * Dont need the length, SQLPutData can handle any size and + * multiple calls + */ p = "N"; - } - break; - - case SQL_OWNER_TERM: /* ODBC 1.0 */ - p = "owner"; - break; - - case SQL_OWNER_USAGE: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_POS_OPERATIONS: /* ODBC 2.0 */ - len = 4; - value = globals.lie ? (SQL_POS_POSITION | SQL_POS_REFRESH | SQL_POS_UPDATE | SQL_POS_DELETE | SQL_POS_ADD) : (SQL_POS_POSITION | SQL_POS_REFRESH); - break; - - case SQL_POSITIONED_STATEMENTS: /* ODBC 2.0 */ - len = 4; - value = globals.lie ? (SQL_PS_POSITIONED_DELETE | - SQL_PS_POSITIONED_UPDATE | - SQL_PS_SELECT_FOR_UPDATE) : 0; - break; - - case SQL_PROCEDURE_TERM: /* ODBC 1.0 */ - p = "procedure"; - break; - - case SQL_PROCEDURES: /* ODBC 1.0 */ - p = "Y"; - break; - - case SQL_QUALIFIER_LOCATION: /* ODBC 2.0 */ - len = 2; - value = SQL_QL_START; - break; - - case SQL_QUALIFIER_NAME_SEPARATOR: /* ODBC 1.0 */ - p = ""; - break; - - case SQL_QUALIFIER_TERM: /* ODBC 1.0 */ - p = ""; - break; - - case SQL_QUALIFIER_USAGE: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_QUOTED_IDENTIFIER_CASE: /* ODBC 2.0 */ - /* are "quoted" identifiers case-sensitive? YES! */ - len = 2; - value = SQL_IC_SENSITIVE; - break; - - case SQL_ROW_UPDATES: /* ODBC 1.0 */ - /* Driver doesn't support keyset-driven or mixed cursors, so - not much point in saying row updates are supported - */ - p = globals.lie ? "Y" : "N"; - break; - - case SQL_SCROLL_CONCURRENCY: /* ODBC 1.0 */ - len = 4; - value = globals.lie ? (SQL_SCCO_READ_ONLY | - SQL_SCCO_LOCK | - SQL_SCCO_OPT_ROWVER | - SQL_SCCO_OPT_VALUES) : (SQL_SCCO_READ_ONLY); - break; - - case SQL_SCROLL_OPTIONS: /* ODBC 1.0 */ - len = 4; - value = globals.lie ? (SQL_SO_FORWARD_ONLY | - SQL_SO_STATIC | - SQL_SO_KEYSET_DRIVEN | - SQL_SO_DYNAMIC | - SQL_SO_MIXED) : (globals.use_declarefetch ? SQL_SO_FORWARD_ONLY : (SQL_SO_FORWARD_ONLY | SQL_SO_STATIC)); - break; - - case SQL_SEARCH_PATTERN_ESCAPE: /* ODBC 1.0 */ - p = ""; - break; - - case SQL_SERVER_NAME: /* ODBC 1.0 */ - p = CC_get_server(conn); - break; - - case SQL_SPECIAL_CHARACTERS: /* ODBC 2.0 */ - p = "_"; - break; - - case SQL_STATIC_SENSITIVITY: /* ODBC 2.0 */ - len = 4; - value = globals.lie ? (SQL_SS_ADDITIONS | SQL_SS_DELETIONS | SQL_SS_UPDATES) : 0; - break; - - case SQL_STRING_FUNCTIONS: /* ODBC 1.0 */ - len = 4; - value = (SQL_FN_STR_CONCAT | - SQL_FN_STR_LCASE | - SQL_FN_STR_LENGTH | - SQL_FN_STR_LOCATE | - SQL_FN_STR_LTRIM | - SQL_FN_STR_RTRIM | - SQL_FN_STR_SUBSTRING | - SQL_FN_STR_UCASE); - break; - - case SQL_SUBQUERIES: /* ODBC 2.0 */ - /* postgres 6.3 supports subqueries */ - len = 4; - value = (SQL_SQ_QUANTIFIED | - SQL_SQ_IN | - SQL_SQ_EXISTS | - SQL_SQ_COMPARISON); - break; - - case SQL_SYSTEM_FUNCTIONS: /* ODBC 1.0 */ - len = 4; - value = 0; - break; - - case SQL_TABLE_TERM: /* ODBC 1.0 */ - p = "table"; - break; - - case SQL_TIMEDATE_ADD_INTERVALS: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_TIMEDATE_DIFF_INTERVALS: /* ODBC 2.0 */ - len = 4; - value = 0; - break; - - case SQL_TIMEDATE_FUNCTIONS: /* ODBC 1.0 */ - len = 4; - value = (SQL_FN_TD_NOW); - break; - - case SQL_TXN_CAPABLE: /* ODBC 1.0 */ - /* Postgres can deal with create or drop table statements in a transaction */ - len = 2; - value = SQL_TC_ALL; - break; - - case SQL_TXN_ISOLATION_OPTION: /* ODBC 1.0 */ - len = 4; - value = SQL_TXN_READ_COMMITTED; /* SQL_TXN_SERIALIZABLE; */ - break; - - case SQL_UNION: /* ODBC 2.0 */ - /* unions with all supported in postgres 6.3 */ - len = 4; - value = (SQL_U_UNION | SQL_U_UNION_ALL); - break; - - case SQL_USER_NAME: /* ODBC 1.0 */ - p = CC_get_username(conn); - break; - - default: - /* unrecognized key */ - conn->errormsg = "Unrecognized key passed to SQLGetInfo."; - conn->errornumber = CONN_NOT_IMPLEMENTED_ERROR; - CC_log_error(func, "", conn); - return SQL_ERROR; - } + break; + + case SQL_NON_NULLABLE_COLUMNS: /* ODBC 1.0 */ + len = 2; + value = SQL_NNC_NON_NULL; + break; + + case SQL_NULL_COLLATION: /* ODBC 2.0 */ + /* where are nulls sorted? */ + len = 2; + value = SQL_NC_END; + break; + + case SQL_NUMERIC_FUNCTIONS: /* ODBC 1.0 */ + len = 4; + value = 0; + break; + + case SQL_ODBC_API_CONFORMANCE: /* ODBC 1.0 */ + len = 2; + value = SQL_OAC_LEVEL1; + break; + + case SQL_ODBC_SAG_CLI_CONFORMANCE: /* ODBC 1.0 */ + len = 2; + value = SQL_OSCC_NOT_COMPLIANT; + break; + + case SQL_ODBC_SQL_CONFORMANCE: /* ODBC 1.0 */ + len = 2; + value = SQL_OSC_CORE; + break; + + case SQL_ODBC_SQL_OPT_IEF: /* ODBC 1.0 */ + p = "N"; + break; + + case SQL_OJ_CAPABILITIES: /* ODBC 2.01 */ + len = 4; + if (PG_VERSION_GE(conn, 7.1)) + { /* OJs in 7.1+ */ + value = (SQL_OJ_LEFT | + SQL_OJ_RIGHT | + SQL_OJ_FULL | + SQL_OJ_NESTED | + SQL_OJ_NOT_ORDERED | + SQL_OJ_INNER | + SQL_OJ_ALL_COMPARISON_OPS); + } + else + { /* OJs not in <7.1 */ + value = 0; + } + break; + + case SQL_ORDER_BY_COLUMNS_IN_SELECT: /* ODBC 2.0 */ + p = (PG_VERSION_LE(conn, 6.3)) ? "Y" : "N"; + break; + + case SQL_OUTER_JOINS: /* ODBC 1.0 */ + if (PG_VERSION_GE(conn, 7.1)) + { /* OJs in 7.1+ */ + p = "Y"; + } + else + { /* OJs not in <7.1 */ + p = "N"; + } + break; + + case SQL_OWNER_TERM: /* ODBC 1.0 */ + p = "owner"; + break; + + case SQL_OWNER_USAGE: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_POS_OPERATIONS: /* ODBC 2.0 */ + len = 4; + value = globals.lie ? (SQL_POS_POSITION | SQL_POS_REFRESH | SQL_POS_UPDATE | SQL_POS_DELETE | SQL_POS_ADD) : (SQL_POS_POSITION | SQL_POS_REFRESH); + break; + + case SQL_POSITIONED_STATEMENTS: /* ODBC 2.0 */ + len = 4; + value = globals.lie ? (SQL_PS_POSITIONED_DELETE | + SQL_PS_POSITIONED_UPDATE | + SQL_PS_SELECT_FOR_UPDATE) : 0; + break; + + case SQL_PROCEDURE_TERM: /* ODBC 1.0 */ + p = "procedure"; + break; + + case SQL_PROCEDURES: /* ODBC 1.0 */ + p = "Y"; + break; + + case SQL_QUALIFIER_LOCATION: /* ODBC 2.0 */ + len = 2; + value = SQL_QL_START; + break; + + case SQL_QUALIFIER_NAME_SEPARATOR: /* ODBC 1.0 */ + p = ""; + break; + + case SQL_QUALIFIER_TERM: /* ODBC 1.0 */ + p = ""; + break; + + case SQL_QUALIFIER_USAGE: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_QUOTED_IDENTIFIER_CASE: /* ODBC 2.0 */ + /* are "quoted" identifiers case-sensitive? YES! */ + len = 2; + value = SQL_IC_SENSITIVE; + break; + + case SQL_ROW_UPDATES: /* ODBC 1.0 */ + + /* + * Driver doesn't support keyset-driven or mixed cursors, so + * not much point in saying row updates are supported + */ + p = globals.lie ? "Y" : "N"; + break; + + case SQL_SCROLL_CONCURRENCY: /* ODBC 1.0 */ + len = 4; + value = globals.lie ? (SQL_SCCO_READ_ONLY | + SQL_SCCO_LOCK | + SQL_SCCO_OPT_ROWVER | + SQL_SCCO_OPT_VALUES) : (SQL_SCCO_READ_ONLY); + break; + + case SQL_SCROLL_OPTIONS: /* ODBC 1.0 */ + len = 4; + value = globals.lie ? (SQL_SO_FORWARD_ONLY | + SQL_SO_STATIC | + SQL_SO_KEYSET_DRIVEN | + SQL_SO_DYNAMIC | + SQL_SO_MIXED) : (globals.use_declarefetch ? SQL_SO_FORWARD_ONLY : (SQL_SO_FORWARD_ONLY | SQL_SO_STATIC)); + break; + + case SQL_SEARCH_PATTERN_ESCAPE: /* ODBC 1.0 */ + p = ""; + break; + + case SQL_SERVER_NAME: /* ODBC 1.0 */ + p = CC_get_server(conn); + break; + + case SQL_SPECIAL_CHARACTERS: /* ODBC 2.0 */ + p = "_"; + break; + + case SQL_STATIC_SENSITIVITY: /* ODBC 2.0 */ + len = 4; + value = globals.lie ? (SQL_SS_ADDITIONS | SQL_SS_DELETIONS | SQL_SS_UPDATES) : 0; + break; + + case SQL_STRING_FUNCTIONS: /* ODBC 1.0 */ + len = 4; + value = (SQL_FN_STR_CONCAT | + SQL_FN_STR_LCASE | + SQL_FN_STR_LENGTH | + SQL_FN_STR_LOCATE | + SQL_FN_STR_LTRIM | + SQL_FN_STR_RTRIM | + SQL_FN_STR_SUBSTRING | + SQL_FN_STR_UCASE); + break; + + case SQL_SUBQUERIES: /* ODBC 2.0 */ + /* postgres 6.3 supports subqueries */ + len = 4; + value = (SQL_SQ_QUANTIFIED | + SQL_SQ_IN | + SQL_SQ_EXISTS | + SQL_SQ_COMPARISON); + break; + + case SQL_SYSTEM_FUNCTIONS: /* ODBC 1.0 */ + len = 4; + value = 0; + break; + + case SQL_TABLE_TERM: /* ODBC 1.0 */ + p = "table"; + break; + + case SQL_TIMEDATE_ADD_INTERVALS: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_TIMEDATE_DIFF_INTERVALS: /* ODBC 2.0 */ + len = 4; + value = 0; + break; + + case SQL_TIMEDATE_FUNCTIONS: /* ODBC 1.0 */ + len = 4; + value = (SQL_FN_TD_NOW); + break; + + case SQL_TXN_CAPABLE: /* ODBC 1.0 */ + + /* + * Postgres can deal with create or drop table statements in a + * transaction + */ + len = 2; + value = SQL_TC_ALL; + break; + + case SQL_TXN_ISOLATION_OPTION: /* ODBC 1.0 */ + len = 4; + value = SQL_TXN_READ_COMMITTED; /* SQL_TXN_SERIALIZABLE; */ + break; + + case SQL_UNION: /* ODBC 2.0 */ + /* unions with all supported in postgres 6.3 */ + len = 4; + value = (SQL_U_UNION | SQL_U_UNION_ALL); + break; + + case SQL_USER_NAME: /* ODBC 1.0 */ + p = CC_get_username(conn); + break; + + default: + /* unrecognized key */ + conn->errormsg = "Unrecognized key passed to SQLGetInfo."; + conn->errornumber = CONN_NOT_IMPLEMENTED_ERROR; + CC_log_error(func, "", conn); + return SQL_ERROR; + } result = SQL_SUCCESS; - mylog("SQLGetInfo: p='%s', len=%d, value=%d, cbMax=%d\n", p?p:"", len, value, cbInfoValueMax); + mylog("SQLGetInfo: p='%s', len=%d, value=%d, cbMax=%d\n", p ? p : "", len, value, cbInfoValueMax); - /* NOTE, that if rgbInfoValue is NULL, then no warnings or errors should - result and just pcbInfoValue is returned, which indicates what length - would be required if a real buffer had been passed in. - */ - if (p) { /* char/binary data */ + /* + * NOTE, that if rgbInfoValue is NULL, then no warnings or errors + * should result and just pcbInfoValue is returned, which indicates + * what length would be required if a real buffer had been passed in. + */ + if (p) + { /* char/binary data */ len = strlen(p); - if (rgbInfoValue) { - strncpy_null((char *)rgbInfoValue, p, (size_t)cbInfoValueMax); + if (rgbInfoValue) + { + strncpy_null((char *) rgbInfoValue, p, (size_t) cbInfoValueMax); - if (len >= cbInfoValueMax) { + if (len >= cbInfoValueMax) + { result = SQL_SUCCESS_WITH_INFO; conn->errornumber = STMT_TRUNCATED; conn->errormsg = "The buffer was too small for the result."; @@ -646,41 +693,46 @@ RETCODE result; } } - else { /* numeric data */ - - if (rgbInfoValue) { - - if (len == 2 ) - *((WORD *)rgbInfoValue) = (WORD) value; + else + { /* numeric data */ + + if (rgbInfoValue) + { + + if (len == 2) + *((WORD *) rgbInfoValue) = (WORD) value; else if (len == 4) - *((DWORD *)rgbInfoValue) = (DWORD) value; + *((DWORD *) rgbInfoValue) = (DWORD) value; } } - if (pcbInfoValue) + if (pcbInfoValue) *pcbInfoValue = len; return result; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLGetTypeInfo( - HSTMT hstmt, - SWORD fSqlType) +RETCODE SQL_API +SQLGetTypeInfo( + HSTMT hstmt, + SWORD fSqlType) { -static char *func = "SQLGetTypeInfo"; -StatementClass *stmt = (StatementClass *) hstmt; -TupleNode *row; -int i; + static char *func = "SQLGetTypeInfo"; + StatementClass *stmt = (StatementClass *) hstmt; + TupleNode *row; + int i; + /* Int4 type; */ -Int4 pgType; -Int2 sqlType; + Int4 pgType; + Int2 sqlType; mylog("%s: entering...fSqlType = %d\n", func, fSqlType); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -688,7 +740,8 @@ Int2 sqlType; stmt->manual_result = TRUE; stmt->result = QR_Constructor(); - if( ! stmt->result) { + if (!stmt->result) + { SC_log_error(func, "Error creating result.", stmt); return SQL_ERROR; } @@ -712,13 +765,15 @@ Int2 sqlType; QR_set_field_info(stmt->result, 13, "MINIMUM_SCALE", PG_TYPE_INT2, 2); QR_set_field_info(stmt->result, 14, "MAXIMUM_SCALE", PG_TYPE_INT2, 2); - for(i=0, sqlType = sqlTypes[0]; sqlType; sqlType = sqlTypes[++i]) { + for (i = 0, sqlType = sqlTypes[0]; sqlType; sqlType = sqlTypes[++i]) + { pgType = sqltype_to_pgtype(sqlType); - if (fSqlType == SQL_ALL_TYPES || fSqlType == sqlType) { - row = (TupleNode *)malloc(sizeof(TupleNode) + (15 - 1)*sizeof(TupleField)); + if (fSqlType == SQL_ALL_TYPES || fSqlType == sqlType) + { + row = (TupleNode *) malloc(sizeof(TupleNode) + (15 - 1) * sizeof(TupleField)); - /* These values can't be NULL */ + /* These values can't be NULL */ set_tuplefield_string(&row->tuple[0], pgtype_to_name(stmt, pgType)); set_tuplefield_int2(&row->tuple[1], (Int2) sqlType); set_tuplefield_int2(&row->tuple[6], pgtype_nullable(stmt, pgType)); @@ -726,10 +781,13 @@ Int2 sqlType; set_tuplefield_int2(&row->tuple[8], pgtype_searchable(stmt, pgType)); set_tuplefield_int2(&row->tuple[10], pgtype_money(stmt, pgType)); - /* Localized data-source dependent data type name (always NULL) */ - set_tuplefield_null(&row->tuple[12]); + /* + * Localized data-source dependent data type name (always + * NULL) + */ + set_tuplefield_null(&row->tuple[12]); - /* These values can be NULL */ + /* These values can be NULL */ set_nullfield_int4(&row->tuple[2], pgtype_precision(stmt, pgType, PG_STATIC, PG_STATIC)); set_nullfield_string(&row->tuple[3], pgtype_literal_prefix(stmt, pgType)); set_nullfield_string(&row->tuple[4], pgtype_literal_suffix(stmt, pgType)); @@ -744,30 +802,34 @@ Int2 sqlType; } - stmt->status = STMT_FINISHED; - stmt->currTuple = -1; + stmt->status = STMT_FINISHED; + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; - return SQL_SUCCESS; + return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLGetFunctions( - HDBC hdbc, - UWORD fFunction, - UWORD FAR *pfExists) +RETCODE SQL_API +SQLGetFunctions( + HDBC hdbc, + UWORD fFunction, + UWORD FAR * pfExists) { -static char *func="SQLGetFunctions"; + static char *func = "SQLGetFunctions"; - mylog( "%s: entering...\n", func); + mylog("%s: entering...\n", func); - if (fFunction == SQL_API_ALL_FUNCTIONS) { + if (fFunction == SQL_API_ALL_FUNCTIONS) + { - if (globals.lie) { - int i; - memset(pfExists, 0, sizeof(UWORD)*100); + if (globals.lie) + { + int i; + + memset(pfExists, 0, sizeof(UWORD) * 100); pfExists[SQL_API_SQLALLOCENV] = TRUE; pfExists[SQL_API_SQLFREEENV] = TRUE; @@ -776,179 +838,309 @@ static char *func="SQLGetFunctions"; for (i = SQL_EXT_API_START; i <= SQL_EXT_API_LAST; i++) pfExists[i] = TRUE; } - else { - memset(pfExists, 0, sizeof(UWORD)*100); + else + { + memset(pfExists, 0, sizeof(UWORD) * 100); /* ODBC core functions */ - pfExists[SQL_API_SQLALLOCCONNECT] = TRUE; - pfExists[SQL_API_SQLALLOCENV] = TRUE; - pfExists[SQL_API_SQLALLOCSTMT] = TRUE; - pfExists[SQL_API_SQLBINDCOL] = TRUE; - pfExists[SQL_API_SQLCANCEL] = TRUE; - pfExists[SQL_API_SQLCOLATTRIBUTES] = TRUE; - pfExists[SQL_API_SQLCONNECT] = TRUE; - pfExists[SQL_API_SQLDESCRIBECOL] = TRUE; /* partial */ - pfExists[SQL_API_SQLDISCONNECT] = TRUE; - pfExists[SQL_API_SQLERROR] = TRUE; - pfExists[SQL_API_SQLEXECDIRECT] = TRUE; - pfExists[SQL_API_SQLEXECUTE] = TRUE; - pfExists[SQL_API_SQLFETCH] = TRUE; - pfExists[SQL_API_SQLFREECONNECT] = TRUE; - pfExists[SQL_API_SQLFREEENV] = TRUE; - pfExists[SQL_API_SQLFREESTMT] = TRUE; - pfExists[SQL_API_SQLGETCURSORNAME] = TRUE; - pfExists[SQL_API_SQLNUMRESULTCOLS] = TRUE; - pfExists[SQL_API_SQLPREPARE] = TRUE; /* complete? */ - pfExists[SQL_API_SQLROWCOUNT] = TRUE; - pfExists[SQL_API_SQLSETCURSORNAME] = TRUE; - pfExists[SQL_API_SQLSETPARAM] = FALSE; /* odbc 1.0 */ - pfExists[SQL_API_SQLTRANSACT] = TRUE; + pfExists[SQL_API_SQLALLOCCONNECT] = TRUE; + pfExists[SQL_API_SQLALLOCENV] = TRUE; + pfExists[SQL_API_SQLALLOCSTMT] = TRUE; + pfExists[SQL_API_SQLBINDCOL] = TRUE; + pfExists[SQL_API_SQLCANCEL] = TRUE; + pfExists[SQL_API_SQLCOLATTRIBUTES] = TRUE; + pfExists[SQL_API_SQLCONNECT] = TRUE; + pfExists[SQL_API_SQLDESCRIBECOL] = TRUE; /* partial */ + pfExists[SQL_API_SQLDISCONNECT] = TRUE; + pfExists[SQL_API_SQLERROR] = TRUE; + pfExists[SQL_API_SQLEXECDIRECT] = TRUE; + pfExists[SQL_API_SQLEXECUTE] = TRUE; + pfExists[SQL_API_SQLFETCH] = TRUE; + pfExists[SQL_API_SQLFREECONNECT] = TRUE; + pfExists[SQL_API_SQLFREEENV] = TRUE; + pfExists[SQL_API_SQLFREESTMT] = TRUE; + pfExists[SQL_API_SQLGETCURSORNAME] = TRUE; + pfExists[SQL_API_SQLNUMRESULTCOLS] = TRUE; + pfExists[SQL_API_SQLPREPARE] = TRUE; /* complete? */ + pfExists[SQL_API_SQLROWCOUNT] = TRUE; + pfExists[SQL_API_SQLSETCURSORNAME] = TRUE; + pfExists[SQL_API_SQLSETPARAM] = FALSE; /* odbc 1.0 */ + pfExists[SQL_API_SQLTRANSACT] = TRUE; /* ODBC level 1 functions */ - pfExists[SQL_API_SQLBINDPARAMETER] = TRUE; - pfExists[SQL_API_SQLCOLUMNS] = TRUE; - pfExists[SQL_API_SQLDRIVERCONNECT] = TRUE; - pfExists[SQL_API_SQLGETCONNECTOPTION] = TRUE; /* partial */ - pfExists[SQL_API_SQLGETDATA] = TRUE; - pfExists[SQL_API_SQLGETFUNCTIONS] = TRUE; - pfExists[SQL_API_SQLGETINFO] = TRUE; - pfExists[SQL_API_SQLGETSTMTOPTION] = TRUE; /* partial */ - pfExists[SQL_API_SQLGETTYPEINFO] = TRUE; - pfExists[SQL_API_SQLPARAMDATA] = TRUE; - pfExists[SQL_API_SQLPUTDATA] = TRUE; - pfExists[SQL_API_SQLSETCONNECTOPTION] = TRUE; /* partial */ - pfExists[SQL_API_SQLSETSTMTOPTION] = TRUE; - pfExists[SQL_API_SQLSPECIALCOLUMNS] = TRUE; - pfExists[SQL_API_SQLSTATISTICS] = TRUE; - pfExists[SQL_API_SQLTABLES] = TRUE; + pfExists[SQL_API_SQLBINDPARAMETER] = TRUE; + pfExists[SQL_API_SQLCOLUMNS] = TRUE; + pfExists[SQL_API_SQLDRIVERCONNECT] = TRUE; + pfExists[SQL_API_SQLGETCONNECTOPTION] = TRUE; /* partial */ + pfExists[SQL_API_SQLGETDATA] = TRUE; + pfExists[SQL_API_SQLGETFUNCTIONS] = TRUE; + pfExists[SQL_API_SQLGETINFO] = TRUE; + pfExists[SQL_API_SQLGETSTMTOPTION] = TRUE; /* partial */ + pfExists[SQL_API_SQLGETTYPEINFO] = TRUE; + pfExists[SQL_API_SQLPARAMDATA] = TRUE; + pfExists[SQL_API_SQLPUTDATA] = TRUE; + pfExists[SQL_API_SQLSETCONNECTOPTION] = TRUE; /* partial */ + pfExists[SQL_API_SQLSETSTMTOPTION] = TRUE; + pfExists[SQL_API_SQLSPECIALCOLUMNS] = TRUE; + pfExists[SQL_API_SQLSTATISTICS] = TRUE; + pfExists[SQL_API_SQLTABLES] = TRUE; /* ODBC level 2 functions */ - pfExists[SQL_API_SQLBROWSECONNECT] = FALSE; + pfExists[SQL_API_SQLBROWSECONNECT] = FALSE; pfExists[SQL_API_SQLCOLUMNPRIVILEGES] = FALSE; - pfExists[SQL_API_SQLDATASOURCES] = FALSE; /* only implemented by DM */ - pfExists[SQL_API_SQLDESCRIBEPARAM] = FALSE; /* not properly implemented */ - pfExists[SQL_API_SQLDRIVERS] = FALSE; /* only implemented by DM */ - pfExists[SQL_API_SQLEXTENDEDFETCH] = TRUE; - pfExists[SQL_API_SQLFOREIGNKEYS] = TRUE; - pfExists[SQL_API_SQLMORERESULTS] = TRUE; - pfExists[SQL_API_SQLNATIVESQL] = TRUE; - pfExists[SQL_API_SQLNUMPARAMS] = TRUE; - pfExists[SQL_API_SQLPARAMOPTIONS] = FALSE; - pfExists[SQL_API_SQLPRIMARYKEYS] = TRUE; + pfExists[SQL_API_SQLDATASOURCES] = FALSE; /* only implemented by + * DM */ + pfExists[SQL_API_SQLDESCRIBEPARAM] = FALSE; /* not properly + * implemented */ + pfExists[SQL_API_SQLDRIVERS] = FALSE; /* only implemented by + * DM */ + pfExists[SQL_API_SQLEXTENDEDFETCH] = TRUE; + pfExists[SQL_API_SQLFOREIGNKEYS] = TRUE; + pfExists[SQL_API_SQLMORERESULTS] = TRUE; + pfExists[SQL_API_SQLNATIVESQL] = TRUE; + pfExists[SQL_API_SQLNUMPARAMS] = TRUE; + pfExists[SQL_API_SQLPARAMOPTIONS] = FALSE; + pfExists[SQL_API_SQLPRIMARYKEYS] = TRUE; pfExists[SQL_API_SQLPROCEDURECOLUMNS] = FALSE; - pfExists[SQL_API_SQLPROCEDURES] = FALSE; - pfExists[SQL_API_SQLSETPOS] = TRUE; - pfExists[SQL_API_SQLSETSCROLLOPTIONS] = TRUE; /* odbc 1.0 */ - pfExists[SQL_API_SQLTABLEPRIVILEGES] = FALSE; + pfExists[SQL_API_SQLPROCEDURES] = FALSE; + pfExists[SQL_API_SQLSETPOS] = TRUE; + pfExists[SQL_API_SQLSETSCROLLOPTIONS] = TRUE; /* odbc 1.0 */ + pfExists[SQL_API_SQLTABLEPRIVILEGES] = FALSE; } - } else { + } + else + { if (globals.lie) *pfExists = TRUE; - else { - - switch(fFunction) { - case SQL_API_SQLALLOCCONNECT: *pfExists = TRUE; break; - case SQL_API_SQLALLOCENV: *pfExists = TRUE; break; - case SQL_API_SQLALLOCSTMT: *pfExists = TRUE; break; - case SQL_API_SQLBINDCOL: *pfExists = TRUE; break; - case SQL_API_SQLCANCEL: *pfExists = TRUE; break; - case SQL_API_SQLCOLATTRIBUTES: *pfExists = TRUE; break; - case SQL_API_SQLCONNECT: *pfExists = TRUE; break; - case SQL_API_SQLDESCRIBECOL: *pfExists = TRUE; break; /* partial */ - case SQL_API_SQLDISCONNECT: *pfExists = TRUE; break; - case SQL_API_SQLERROR: *pfExists = TRUE; break; - case SQL_API_SQLEXECDIRECT: *pfExists = TRUE; break; - case SQL_API_SQLEXECUTE: *pfExists = TRUE; break; - case SQL_API_SQLFETCH: *pfExists = TRUE; break; - case SQL_API_SQLFREECONNECT: *pfExists = TRUE; break; - case SQL_API_SQLFREEENV: *pfExists = TRUE; break; - case SQL_API_SQLFREESTMT: *pfExists = TRUE; break; - case SQL_API_SQLGETCURSORNAME: *pfExists = TRUE; break; - case SQL_API_SQLNUMRESULTCOLS: *pfExists = TRUE; break; - case SQL_API_SQLPREPARE: *pfExists = TRUE; break; - case SQL_API_SQLROWCOUNT: *pfExists = TRUE; break; - case SQL_API_SQLSETCURSORNAME: *pfExists = TRUE; break; - case SQL_API_SQLSETPARAM: *pfExists = FALSE; break; /* odbc 1.0 */ - case SQL_API_SQLTRANSACT: *pfExists = TRUE; break; - - /* ODBC level 1 functions */ - case SQL_API_SQLBINDPARAMETER: *pfExists = TRUE; break; - case SQL_API_SQLCOLUMNS: *pfExists = TRUE; break; - case SQL_API_SQLDRIVERCONNECT: *pfExists = TRUE; break; - case SQL_API_SQLGETCONNECTOPTION: *pfExists = TRUE; break; /* partial */ - case SQL_API_SQLGETDATA: *pfExists = TRUE; break; - case SQL_API_SQLGETFUNCTIONS: *pfExists = TRUE; break; - case SQL_API_SQLGETINFO: *pfExists = TRUE; break; - case SQL_API_SQLGETSTMTOPTION: *pfExists = TRUE; break; /* partial */ - case SQL_API_SQLGETTYPEINFO: *pfExists = TRUE; break; - case SQL_API_SQLPARAMDATA: *pfExists = TRUE; break; - case SQL_API_SQLPUTDATA: *pfExists = TRUE; break; - case SQL_API_SQLSETCONNECTOPTION: *pfExists = TRUE; break; /* partial */ - case SQL_API_SQLSETSTMTOPTION: *pfExists = TRUE; break; - case SQL_API_SQLSPECIALCOLUMNS: *pfExists = TRUE; break; - case SQL_API_SQLSTATISTICS: *pfExists = TRUE; break; - case SQL_API_SQLTABLES: *pfExists = TRUE; break; - - /* ODBC level 2 functions */ - case SQL_API_SQLBROWSECONNECT: *pfExists = FALSE; break; - case SQL_API_SQLCOLUMNPRIVILEGES: *pfExists = FALSE; break; - case SQL_API_SQLDATASOURCES: *pfExists = FALSE; break; /* only implemented by DM */ - case SQL_API_SQLDESCRIBEPARAM: *pfExists = FALSE; break; /* not properly implemented */ - case SQL_API_SQLDRIVERS: *pfExists = FALSE; break; /* only implemented by DM */ - case SQL_API_SQLEXTENDEDFETCH: *pfExists = TRUE; break; - case SQL_API_SQLFOREIGNKEYS: *pfExists = TRUE; break; - case SQL_API_SQLMORERESULTS: *pfExists = TRUE; break; - case SQL_API_SQLNATIVESQL: *pfExists = TRUE; break; - case SQL_API_SQLNUMPARAMS: *pfExists = TRUE; break; - case SQL_API_SQLPARAMOPTIONS: *pfExists = FALSE; break; - case SQL_API_SQLPRIMARYKEYS: *pfExists = TRUE; break; - case SQL_API_SQLPROCEDURECOLUMNS: *pfExists = FALSE; break; - case SQL_API_SQLPROCEDURES: *pfExists = FALSE; break; - case SQL_API_SQLSETPOS: *pfExists = TRUE; break; - case SQL_API_SQLSETSCROLLOPTIONS: *pfExists = TRUE; break; /* odbc 1.0 */ - case SQL_API_SQLTABLEPRIVILEGES: *pfExists = FALSE; break; + else + { + + switch (fFunction) + { + case SQL_API_SQLALLOCCONNECT: + *pfExists = TRUE; + break; + case SQL_API_SQLALLOCENV: + *pfExists = TRUE; + break; + case SQL_API_SQLALLOCSTMT: + *pfExists = TRUE; + break; + case SQL_API_SQLBINDCOL: + *pfExists = TRUE; + break; + case SQL_API_SQLCANCEL: + *pfExists = TRUE; + break; + case SQL_API_SQLCOLATTRIBUTES: + *pfExists = TRUE; + break; + case SQL_API_SQLCONNECT: + *pfExists = TRUE; + break; + case SQL_API_SQLDESCRIBECOL: + *pfExists = TRUE; + break; /* partial */ + case SQL_API_SQLDISCONNECT: + *pfExists = TRUE; + break; + case SQL_API_SQLERROR: + *pfExists = TRUE; + break; + case SQL_API_SQLEXECDIRECT: + *pfExists = TRUE; + break; + case SQL_API_SQLEXECUTE: + *pfExists = TRUE; + break; + case SQL_API_SQLFETCH: + *pfExists = TRUE; + break; + case SQL_API_SQLFREECONNECT: + *pfExists = TRUE; + break; + case SQL_API_SQLFREEENV: + *pfExists = TRUE; + break; + case SQL_API_SQLFREESTMT: + *pfExists = TRUE; + break; + case SQL_API_SQLGETCURSORNAME: + *pfExists = TRUE; + break; + case SQL_API_SQLNUMRESULTCOLS: + *pfExists = TRUE; + break; + case SQL_API_SQLPREPARE: + *pfExists = TRUE; + break; + case SQL_API_SQLROWCOUNT: + *pfExists = TRUE; + break; + case SQL_API_SQLSETCURSORNAME: + *pfExists = TRUE; + break; + case SQL_API_SQLSETPARAM: + *pfExists = FALSE; + break; /* odbc 1.0 */ + case SQL_API_SQLTRANSACT: + *pfExists = TRUE; + break; + + /* ODBC level 1 functions */ + case SQL_API_SQLBINDPARAMETER: + *pfExists = TRUE; + break; + case SQL_API_SQLCOLUMNS: + *pfExists = TRUE; + break; + case SQL_API_SQLDRIVERCONNECT: + *pfExists = TRUE; + break; + case SQL_API_SQLGETCONNECTOPTION: + *pfExists = TRUE; + break; /* partial */ + case SQL_API_SQLGETDATA: + *pfExists = TRUE; + break; + case SQL_API_SQLGETFUNCTIONS: + *pfExists = TRUE; + break; + case SQL_API_SQLGETINFO: + *pfExists = TRUE; + break; + case SQL_API_SQLGETSTMTOPTION: + *pfExists = TRUE; + break; /* partial */ + case SQL_API_SQLGETTYPEINFO: + *pfExists = TRUE; + break; + case SQL_API_SQLPARAMDATA: + *pfExists = TRUE; + break; + case SQL_API_SQLPUTDATA: + *pfExists = TRUE; + break; + case SQL_API_SQLSETCONNECTOPTION: + *pfExists = TRUE; + break; /* partial */ + case SQL_API_SQLSETSTMTOPTION: + *pfExists = TRUE; + break; + case SQL_API_SQLSPECIALCOLUMNS: + *pfExists = TRUE; + break; + case SQL_API_SQLSTATISTICS: + *pfExists = TRUE; + break; + case SQL_API_SQLTABLES: + *pfExists = TRUE; + break; + + /* ODBC level 2 functions */ + case SQL_API_SQLBROWSECONNECT: + *pfExists = FALSE; + break; + case SQL_API_SQLCOLUMNPRIVILEGES: + *pfExists = FALSE; + break; + case SQL_API_SQLDATASOURCES: + *pfExists = FALSE; + break; /* only implemented by DM */ + case SQL_API_SQLDESCRIBEPARAM: + *pfExists = FALSE; + break; /* not properly implemented */ + case SQL_API_SQLDRIVERS: + *pfExists = FALSE; + break; /* only implemented by DM */ + case SQL_API_SQLEXTENDEDFETCH: + *pfExists = TRUE; + break; + case SQL_API_SQLFOREIGNKEYS: + *pfExists = TRUE; + break; + case SQL_API_SQLMORERESULTS: + *pfExists = TRUE; + break; + case SQL_API_SQLNATIVESQL: + *pfExists = TRUE; + break; + case SQL_API_SQLNUMPARAMS: + *pfExists = TRUE; + break; + case SQL_API_SQLPARAMOPTIONS: + *pfExists = FALSE; + break; + case SQL_API_SQLPRIMARYKEYS: + *pfExists = TRUE; + break; + case SQL_API_SQLPROCEDURECOLUMNS: + *pfExists = FALSE; + break; + case SQL_API_SQLPROCEDURES: + *pfExists = FALSE; + break; + case SQL_API_SQLSETPOS: + *pfExists = TRUE; + break; + case SQL_API_SQLSETSCROLLOPTIONS: + *pfExists = TRUE; + break; /* odbc 1.0 */ + case SQL_API_SQLTABLEPRIVILEGES: + *pfExists = FALSE; + break; } } - } + } - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLTables( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szTableType, - SWORD cbTableType) +RETCODE SQL_API +SQLTables( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szTableType, + SWORD cbTableType) { -static char *func = "SQLTables"; -StatementClass *stmt = (StatementClass *) hstmt; -StatementClass *tbl_stmt; -TupleNode *row; -HSTMT htbl_stmt; -RETCODE result; -char *tableType; -char tables_query[STD_STATEMENT_LEN]; -char table_name[MAX_INFO_STRING], table_owner[MAX_INFO_STRING], relkind_or_hasrules[MAX_INFO_STRING]; -ConnectionClass *conn; -ConnInfo *ci; -char *prefix[32], prefixes[MEDIUM_REGISTRY_LEN]; -char *table_type[32], table_types[MAX_INFO_STRING]; -char show_system_tables, show_regular_tables, show_views; -char regular_table, view, systable; -int i; - -mylog("%s: entering...stmt=%u\n", func, stmt); - - if( ! stmt) { + static char *func = "SQLTables"; + StatementClass *stmt = (StatementClass *) hstmt; + StatementClass *tbl_stmt; + TupleNode *row; + HSTMT htbl_stmt; + RETCODE result; + char *tableType; + char tables_query[STD_STATEMENT_LEN]; + char table_name[MAX_INFO_STRING], + table_owner[MAX_INFO_STRING], + relkind_or_hasrules[MAX_INFO_STRING]; + ConnectionClass *conn; + ConnInfo *ci; + char *prefix[32], + prefixes[MEDIUM_REGISTRY_LEN]; + char *table_type[32], + table_types[MAX_INFO_STRING]; + char show_system_tables, + show_regular_tables, + show_views; + char regular_table, + view, + systable; + int i; + + mylog("%s: entering...stmt=%u\n", func, stmt); + + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -959,8 +1151,9 @@ mylog("%s: entering...stmt=%u\n", func, stmt); conn = (ConnectionClass *) (stmt->hdbc); ci = &stmt->hdbc->connInfo; - result = SQLAllocStmt( stmt->hdbc, &htbl_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &htbl_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for SQLTables result."; SC_log_error(func, "", stmt); @@ -969,14 +1162,17 @@ mylog("%s: entering...stmt=%u\n", func, stmt); tbl_stmt = (StatementClass *) htbl_stmt; /* ********************************************************************** */ - /* Create the query to find out the tables */ + /* Create the query to find out the tables */ /* ********************************************************************** */ - if (PG_VERSION_GE(conn, 7.1)) { /* view is represented by its relkind since 7.1 */ + if (PG_VERSION_GE(conn, 7.1)) + { /* view is represented by its relkind + * since 7.1 */ strcpy(tables_query, "select relname, usename, relkind from pg_class, pg_user"); strcat(tables_query, " where relkind in ('r', 'v')"); } - else { + else + { strcpy(tables_query, "select relname, usename, relhasrules from pg_class, pg_user"); strcat(tables_query, " where relkind = 'r'"); } @@ -985,58 +1181,64 @@ mylog("%s: entering...stmt=%u\n", func, stmt); my_strcat(tables_query, " and relname like '%.*s'", szTableName, cbTableName); - /* Parse the extra systable prefix */ + /* Parse the extra systable prefix */ strcpy(prefixes, globals.extra_systable_prefixes); i = 0; prefix[i] = strtok(prefixes, ";"); - while (prefix[i] && i<32) { + while (prefix[i] && i < 32) + { prefix[++i] = strtok(NULL, ";"); } - /* Parse the desired table types to return */ + /* Parse the desired table types to return */ show_system_tables = FALSE; show_regular_tables = FALSE; show_views = FALSE; - /* make_string mallocs memory */ + /* make_string mallocs memory */ tableType = make_string(szTableType, cbTableType, NULL); - if (tableType) { + if (tableType) + { strcpy(table_types, tableType); free(tableType); i = 0; table_type[i] = strtok(table_types, ","); - while (table_type[i] && i<32) { + while (table_type[i] && i < 32) table_type[++i] = strtok(NULL, ","); - } - /* Check for desired table types to return */ + /* Check for desired table types to return */ i = 0; - while (table_type[i]) { - if ( strstr(table_type[i], "SYSTEM TABLE")) + while (table_type[i]) + { + if (strstr(table_type[i], "SYSTEM TABLE")) show_system_tables = TRUE; - else if ( strstr(table_type[i], "TABLE")) + else if (strstr(table_type[i], "TABLE")) show_regular_tables = TRUE; - else if ( strstr(table_type[i], "VIEW")) + else if (strstr(table_type[i], "VIEW")) show_views = TRUE; i++; } } - else { + else + { show_regular_tables = TRUE; show_views = TRUE; } - /* If not interested in SYSTEM TABLES then filter them out - to save some time on the query. If treating system tables - as regular tables, then dont filter either. - */ - if ( ! atoi(ci->show_system_tables) && ! show_system_tables) { + /* + * If not interested in SYSTEM TABLES then filter them out to save + * some time on the query. If treating system tables as regular + * tables, then dont filter either. + */ + if (!atoi(ci->show_system_tables) && !show_system_tables) + { strcat(tables_query, " and relname !~ '^" POSTGRES_SYS_PREFIX); - /* Also filter out user-defined system table types */ + /* Also filter out user-defined system table types */ i = 0; - while(prefix[i]) { + while (prefix[i]) + { strcat(tables_query, "|^"); strcat(tables_query, prefix[i]); i++; @@ -1047,8 +1249,9 @@ mylog("%s: entering...stmt=%u\n", func, stmt); /* match users */ - if (PG_VERSION_LT(conn, 7.1)) /* filter out large objects in older versions */ - strcat(tables_query, " and relname !~ '^xinv[0-9]+'"); + if (PG_VERSION_LT(conn, 7.1)) /* filter out large objects in + * older versions */ + strcat(tables_query, " and relname !~ '^xinv[0-9]+'"); strcat(tables_query, " and usesysid = relowner"); strcat(tables_query, " order by relname"); @@ -1056,7 +1259,8 @@ mylog("%s: entering...stmt=%u\n", func, stmt); /* ********************************************************************** */ result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -1064,37 +1268,41 @@ mylog("%s: entering...stmt=%u\n", func, stmt); return SQL_ERROR; } - result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR, - table_name, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR, + table_name, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(htbl_stmt, 2, SQL_C_CHAR, - table_owner, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(htbl_stmt, 2, SQL_C_CHAR, + table_owner, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } - result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR, - relkind_or_hasrules, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + return SQL_ERROR; + } + result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR, + relkind_or_hasrules, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } stmt->result = QR_Constructor(); - if(!stmt->result) { + if (!stmt->result) + { stmt->errormsg = "Couldn't allocate memory for SQLTables result."; stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); @@ -1103,9 +1311,13 @@ mylog("%s: entering...stmt=%u\n", func, stmt); } /* the binding structure for a statement is not set up until */ - /* a statement is actually executed, so we'll have to do this ourselves. */ + + /* + * a statement is actually executed, so we'll have to do this + * ourselves. + */ extend_bindings(stmt, 5); - + /* set the field names */ QR_set_num_fields(stmt->result, 5); QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); @@ -1116,23 +1328,28 @@ mylog("%s: entering...stmt=%u\n", func, stmt); /* add the tuples */ result = SQLFetch(htbl_stmt); - while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) { + while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) + { - /* Determine if this table name is a system table. - If treating system tables as regular tables, then - no need to do this test. - */ + /* + * Determine if this table name is a system table. If treating + * system tables as regular tables, then no need to do this test. + */ systable = FALSE; - if( ! atoi(ci->show_system_tables)) { + if (!atoi(ci->show_system_tables)) + { - if ( strncmp(table_name, POSTGRES_SYS_PREFIX, strlen(POSTGRES_SYS_PREFIX)) == 0) + if (strncmp(table_name, POSTGRES_SYS_PREFIX, strlen(POSTGRES_SYS_PREFIX)) == 0) systable = TRUE; - else { /* Check extra system table prefixes */ + else + { /* Check extra system table prefixes */ i = 0; - while (prefix[i]) { + while (prefix[i]) + { mylog("table_name='%s', prefix[%d]='%s'\n", table_name, i, prefix[i]); - if (strncmp(table_name, prefix[i], strlen(prefix[i])) == 0) { + if (strncmp(table_name, prefix[i], strlen(prefix[i])) == 0) + { systable = TRUE; break; } @@ -1141,24 +1358,29 @@ mylog("%s: entering...stmt=%u\n", func, stmt); } } - /* Determine if the table name is a view */ - if (PG_VERSION_GE(conn, 7.1)) /* view is represented by its relkind since 7.1 */ + /* Determine if the table name is a view */ + if (PG_VERSION_GE(conn, 7.1)) /* view is represented by its + * relkind since 7.1 */ view = (relkind_or_hasrules[0] == 'v'); else view = (relkind_or_hasrules[0] == '1'); - /* It must be a regular table */ - regular_table = ( ! systable && ! view); + /* It must be a regular table */ + regular_table = (!systable && !view); + + /* Include the row in the result set if meets all criteria */ - /* Include the row in the result set if meets all criteria */ - /* NOTE: Unsupported table types (i.e., LOCAL TEMPORARY, ALIAS, etc) - will return nothing */ - if ( (systable && show_system_tables) || - (view && show_views) || - (regular_table && show_regular_tables)) { + /* + * NOTE: Unsupported table types (i.e., LOCAL TEMPORARY, ALIAS, + * etc) will return nothing + */ + if ((systable && show_system_tables) || + (view && show_views) || + (regular_table && show_regular_tables)) + { - row = (TupleNode *)malloc(sizeof(TupleNode) + (5 - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + (5 - 1) * sizeof(TupleField)); set_tuplefield_string(&row->tuple[0], ""); @@ -1178,8 +1400,9 @@ mylog("%s: entering...stmt=%u\n", func, stmt); QR_add_tuple(stmt->result, row); } result = SQLFetch(htbl_stmt); - } - if(result != SQL_NO_DATA_FOUND) { + } + if (result != SQL_NO_DATA_FOUND) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -1204,36 +1427,48 @@ mylog("%s: entering...stmt=%u\n", func, stmt); -RETCODE SQL_API SQLColumns( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szColumnName, - SWORD cbColumnName) +RETCODE SQL_API +SQLColumns( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szColumnName, + SWORD cbColumnName) { -static char *func = "SQLColumns"; -StatementClass *stmt = (StatementClass *) hstmt; -TupleNode *row; -HSTMT hcol_stmt; -StatementClass *col_stmt; -char columns_query[STD_STATEMENT_LEN]; -RETCODE result; -char table_owner[MAX_INFO_STRING], table_name[MAX_INFO_STRING], field_name[MAX_INFO_STRING], field_type_name[MAX_INFO_STRING]; -Int2 field_number, result_cols, scale; -Int4 field_type, the_type, field_length, mod_length, precision; -char useStaticPrecision; -char not_null[MAX_INFO_STRING], relhasrules[MAX_INFO_STRING]; -ConnInfo *ci; -ConnectionClass *conn; + static char *func = "SQLColumns"; + StatementClass *stmt = (StatementClass *) hstmt; + TupleNode *row; + HSTMT hcol_stmt; + StatementClass *col_stmt; + char columns_query[STD_STATEMENT_LEN]; + RETCODE result; + char table_owner[MAX_INFO_STRING], + table_name[MAX_INFO_STRING], + field_name[MAX_INFO_STRING], + field_type_name[MAX_INFO_STRING]; + Int2 field_number, + result_cols, + scale; + Int4 field_type, + the_type, + field_length, + mod_length, + precision; + char useStaticPrecision; + char not_null[MAX_INFO_STRING], + relhasrules[MAX_INFO_STRING]; + ConnInfo *ci; + ConnectionClass *conn; mylog("%s: entering...stmt=%u\n", func, stmt); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -1245,13 +1480,17 @@ ConnectionClass *conn; ci = &stmt->hdbc->connInfo; /* ********************************************************************** */ - /* Create the query to find out the columns (Note: pre 6.3 did not have the atttypmod field) */ + + /* + * Create the query to find out the columns (Note: pre 6.3 did not + * have the atttypmod field) + */ /* ********************************************************************** */ sprintf(columns_query, "select u.usename, c.relname, a.attname, a.atttypid" - ", t.typname, a.attnum, a.attlen, %s, a.attnotnull, c.relhasrules" + ", t.typname, a.attnum, a.attlen, %s, a.attnotnull, c.relhasrules" " from pg_user u, pg_class c, pg_attribute a, pg_type t" " where u.usesysid = c.relowner" - " and c.oid= a.attrelid and a.atttypid = t.oid and (a.attnum > 0)", + " and c.oid= a.attrelid and a.atttypid = t.oid and (a.attnum > 0)", PG_VERSION_LE(conn, 6.2) ? "a.attlen" : "a.atttypmod"); my_strcat(columns_query, " and c.relname like '%.*s'", szTableName, cbTableName); @@ -1260,186 +1499,206 @@ ConnectionClass *conn; /* give the output in the order the columns were defined */ /* when the table was created */ - strcat(columns_query, " order by attnum"); - /* ********************************************************************** */ + strcat(columns_query, " order by attnum"); + /* ********************************************************************** */ - result = SQLAllocStmt( stmt->hdbc, &hcol_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &hcol_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for SQLColumns result."; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } col_stmt = (StatementClass *) hcol_stmt; mylog("SQLColumns: hcol_stmt = %u, col_stmt = %u\n", hcol_stmt, col_stmt); - result = SQLExecDirect(hcol_stmt, columns_query, - strlen(columns_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLExecDirect(hcol_stmt, columns_query, + strlen(columns_query)); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(hcol_stmt); stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR, - table_owner, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR, + table_owner, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 2, SQL_C_CHAR, - table_name, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 2, SQL_C_CHAR, + table_name, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 3, SQL_C_CHAR, - field_name, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 3, SQL_C_CHAR, + field_name, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 4, SQL_C_LONG, - &field_type, 4, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 4, SQL_C_LONG, + &field_type, 4, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 5, SQL_C_CHAR, - field_type_name, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 5, SQL_C_CHAR, + field_type_name, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 6, SQL_C_SHORT, - &field_number, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 6, SQL_C_SHORT, + &field_number, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 7, SQL_C_LONG, - &field_length, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 7, SQL_C_LONG, + &field_length, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 8, SQL_C_LONG, - &mod_length, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 8, SQL_C_LONG, + &mod_length, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 9, SQL_C_CHAR, - not_null, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 9, SQL_C_CHAR, + not_null, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 10, SQL_C_CHAR, - relhasrules, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 10, SQL_C_CHAR, + relhasrules, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - stmt->result = QR_Constructor(); - if(!stmt->result) { + stmt->result = QR_Constructor(); + if (!stmt->result) + { stmt->errormsg = "Couldn't allocate memory for SQLColumns result."; - stmt->errornumber = STMT_NO_MEMORY_ERROR; + stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } + + /* the binding structure for a statement is not set up until */ - /* the binding structure for a statement is not set up until */ - /* a statement is actually executed, so we'll have to do this ourselves. */ + /* + * a statement is actually executed, so we'll have to do this + * ourselves. + */ result_cols = 14; - extend_bindings(stmt, result_cols); - - /* set the field names */ - QR_set_num_fields(stmt->result, result_cols); - QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 3, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 4, "DATA_TYPE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 5, "TYPE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 6, "PRECISION", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 7, "LENGTH", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 8, "SCALE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 9, "RADIX", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 10, "NULLABLE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 11, "REMARKS", PG_TYPE_TEXT, 254); - - /* User defined fields */ - QR_set_field_info(stmt->result, 12, "DISPLAY_SIZE", PG_TYPE_INT4, 4); + extend_bindings(stmt, result_cols); + + /* set the field names */ + QR_set_num_fields(stmt->result, result_cols); + QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 3, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 4, "DATA_TYPE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 5, "TYPE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 6, "PRECISION", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 7, "LENGTH", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 8, "SCALE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 9, "RADIX", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 10, "NULLABLE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 11, "REMARKS", PG_TYPE_TEXT, 254); + + /* User defined fields */ + QR_set_field_info(stmt->result, 12, "DISPLAY_SIZE", PG_TYPE_INT4, 4); QR_set_field_info(stmt->result, 13, "FIELD_TYPE", PG_TYPE_INT4, 4); - + result = SQLFetch(hcol_stmt); - /* Only show oid if option AND there are other columns AND - it's not being called by SQLStatistics . - Always show OID if it's a system table - */ + /* + * Only show oid if option AND there are other columns AND it's not + * being called by SQLStatistics . Always show OID if it's a system + * table + */ - if (result != SQL_ERROR && ! stmt->internal) { + if (result != SQL_ERROR && !stmt->internal) + { - if (relhasrules[0] != '1' && - (atoi(ci->show_oid_column) || - strncmp(table_name, POSTGRES_SYS_PREFIX, strlen(POSTGRES_SYS_PREFIX)) == 0)) { + if (relhasrules[0] != '1' && + (atoi(ci->show_oid_column) || + strncmp(table_name, POSTGRES_SYS_PREFIX, strlen(POSTGRES_SYS_PREFIX)) == 0)) + { - /* For OID fields */ + /* For OID fields */ the_type = PG_TYPE_OID; - row = (TupleNode *)malloc(sizeof(TupleNode) + - (result_cols - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + + (result_cols - 1) * sizeof(TupleField)); set_tuplefield_string(&row->tuple[0], ""); /* see note in SQLTables() */ - /* set_tuplefield_string(&row->tuple[1], table_owner); */ + /* set_tuplefield_string(&row->tuple[1], table_owner); */ set_tuplefield_string(&row->tuple[1], ""); set_tuplefield_string(&row->tuple[2], table_name); set_tuplefield_string(&row->tuple[3], "oid"); @@ -1462,64 +1721,69 @@ ConnectionClass *conn; } - while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) { - row = (TupleNode *)malloc(sizeof(TupleNode) + - (result_cols - 1) * sizeof(TupleField)); - - - set_tuplefield_string(&row->tuple[0], ""); - /* see note in SQLTables() */ - /* set_tuplefield_string(&row->tuple[1], table_owner); */ - set_tuplefield_string(&row->tuple[1], ""); - set_tuplefield_string(&row->tuple[2], table_name); - set_tuplefield_string(&row->tuple[3], field_name); - set_tuplefield_int2(&row->tuple[4], pgtype_to_sqltype(stmt, field_type)); - set_tuplefield_string(&row->tuple[5], field_type_name); - + while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) + { + row = (TupleNode *) malloc(sizeof(TupleNode) + + (result_cols - 1) * sizeof(TupleField)); - /* Some Notes about Postgres Data Types: - VARCHAR - the length is stored in the pg_attribute.atttypmod field - BPCHAR - the length is also stored as varchar is - - NUMERIC - the scale is stored in atttypmod as follows: - precision = ((atttypmod - VARHDRSZ) >> 16) & 0xffff - scale = (atttypmod - VARHDRSZ) & 0xffff - - - */ + set_tuplefield_string(&row->tuple[0], ""); + /* see note in SQLTables() */ + /* set_tuplefield_string(&row->tuple[1], table_owner); */ + set_tuplefield_string(&row->tuple[1], ""); + set_tuplefield_string(&row->tuple[2], table_name); + set_tuplefield_string(&row->tuple[3], field_name); + set_tuplefield_int2(&row->tuple[4], pgtype_to_sqltype(stmt, field_type)); + set_tuplefield_string(&row->tuple[5], field_type_name); + + + /* + * Some Notes about Postgres Data Types: + * + * VARCHAR - the length is stored in the pg_attribute.atttypmod field + * BPCHAR - the length is also stored as varchar is + * + * NUMERIC - the scale is stored in atttypmod as follows: precision = + * ((atttypmod - VARHDRSZ) >> 16) & 0xffff scale = (atttypmod + * - VARHDRSZ) & 0xffff + * + * + */ qlog("SQLColumns: table='%s',field_name='%s',type=%d,sqltype=%d,name='%s'\n", - table_name,field_name,field_type,pgtype_to_sqltype,field_type_name); + table_name, field_name, field_type, pgtype_to_sqltype, field_type_name); useStaticPrecision = TRUE; - if (field_type == PG_TYPE_NUMERIC) { + if (field_type == PG_TYPE_NUMERIC) + { if (mod_length >= 4) - mod_length -= 4; /* the length is in atttypmod - 4 */ + mod_length -= 4;/* the length is in atttypmod - 4 */ - if (mod_length >= 0) { + if (mod_length >= 0) + { useStaticPrecision = FALSE; precision = (mod_length >> 16) & 0xffff; scale = mod_length & 0xffff; - mylog("SQLColumns: field type is NUMERIC: field_type = %d, mod_length=%d, precision=%d, scale=%d\n", field_type, mod_length, precision, scale ); + mylog("SQLColumns: field type is NUMERIC: field_type = %d, mod_length=%d, precision=%d, scale=%d\n", field_type, mod_length, precision, scale); - set_tuplefield_int4(&row->tuple[7], precision + 2); /* sign+dec.point */ + set_tuplefield_int4(&row->tuple[7], precision + 2); /* sign+dec.point */ set_tuplefield_int4(&row->tuple[6], precision); - set_tuplefield_int4(&row->tuple[12], precision + 2); /* sign+dec.point */ + set_tuplefield_int4(&row->tuple[12], precision + 2); /* sign+dec.point */ set_nullfield_int2(&row->tuple[8], scale); } } - if((field_type == PG_TYPE_VARCHAR) || - (field_type == PG_TYPE_BPCHAR)) { + if ((field_type == PG_TYPE_VARCHAR) || + (field_type == PG_TYPE_BPCHAR)) + { useStaticPrecision = FALSE; if (mod_length >= 4) - mod_length -= 4; /* the length is in atttypmod - 4 */ + mod_length -= 4;/* the length is in atttypmod - 4 */ if (mod_length > globals.max_varchar_size || mod_length <= 0) mod_length = globals.max_varchar_size; @@ -1530,44 +1794,47 @@ ConnectionClass *conn; set_tuplefield_int4(&row->tuple[6], mod_length); set_tuplefield_int4(&row->tuple[12], mod_length); set_nullfield_int2(&row->tuple[8], pgtype_scale(stmt, field_type, PG_STATIC)); - } - - if (useStaticPrecision) { + } + + if (useStaticPrecision) + { mylog("SQLColumns: field type is OTHER: field_type = %d, pgtype_length = %d\n", field_type, pgtype_length(stmt, field_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&row->tuple[7], pgtype_length(stmt, field_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&row->tuple[7], pgtype_length(stmt, field_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[6], pgtype_precision(stmt, field_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, field_type, PG_STATIC, PG_STATIC)); set_nullfield_int2(&row->tuple[8], pgtype_scale(stmt, field_type, PG_STATIC)); - } + } set_nullfield_int2(&row->tuple[9], pgtype_radix(stmt, field_type)); set_tuplefield_int2(&row->tuple[10], (Int2) (not_null[0] == '1' ? SQL_NO_NULLS : pgtype_nullable(stmt, field_type))); set_tuplefield_string(&row->tuple[11], ""); set_tuplefield_int4(&row->tuple[13], field_type); - QR_add_tuple(stmt->result, row); + QR_add_tuple(stmt->result, row); - result = SQLFetch(hcol_stmt); + result = SQLFetch(hcol_stmt); - } - if(result != SQL_NO_DATA_FOUND) { + } + if (result != SQL_NO_DATA_FOUND) + { stmt->errormsg = SC_create_errormsg(hcol_stmt); stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - /* Put the row version column at the end so it might not be */ - /* mistaken for a key field. */ - if ( relhasrules[0] != '1' && ! stmt->internal && atoi(ci->row_versioning)) { - /* For Row Versioning fields */ + /* Put the row version column at the end so it might not be */ + /* mistaken for a key field. */ + if (relhasrules[0] != '1' && !stmt->internal && atoi(ci->row_versioning)) + { + /* For Row Versioning fields */ the_type = PG_TYPE_INT4; - row = (TupleNode *)malloc(sizeof(TupleNode) + - (result_cols - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + + (result_cols - 1) * sizeof(TupleField)); set_tuplefield_string(&row->tuple[0], ""); set_tuplefield_string(&row->tuple[1], ""); @@ -1589,115 +1856,122 @@ ConnectionClass *conn; /* also, things need to think that this statement is finished so */ /* the results can be retrieved. */ - stmt->status = STMT_FINISHED; + stmt->status = STMT_FINISHED; - /* set up the current tuple pointer for SQLFetch */ - stmt->currTuple = -1; + /* set up the current tuple pointer for SQLFetch */ + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; SQLFreeStmt(hcol_stmt, SQL_DROP); mylog("SQLColumns(): EXIT, stmt=%u\n", stmt); - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLSpecialColumns( - HSTMT hstmt, - UWORD fColType, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UWORD fScope, - UWORD fNullable) +RETCODE SQL_API +SQLSpecialColumns( + HSTMT hstmt, + UWORD fColType, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UWORD fScope, + UWORD fNullable) { -static char *func = "SQLSpecialColumns"; -TupleNode *row; -StatementClass *stmt = (StatementClass *) hstmt; -ConnInfo *ci; -HSTMT hcol_stmt; -StatementClass *col_stmt; -char columns_query[STD_STATEMENT_LEN]; -RETCODE result; -char relhasrules[MAX_INFO_STRING]; + static char *func = "SQLSpecialColumns"; + TupleNode *row; + StatementClass *stmt = (StatementClass *) hstmt; + ConnInfo *ci; + HSTMT hcol_stmt; + StatementClass *col_stmt; + char columns_query[STD_STATEMENT_LEN]; + RETCODE result; + char relhasrules[MAX_INFO_STRING]; -mylog("%s: entering...stmt=%u\n", func, stmt); + mylog("%s: entering...stmt=%u\n", func, stmt); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; - } + return SQL_INVALID_HANDLE; + } ci = &stmt->hdbc->connInfo; stmt->manual_result = TRUE; /* ********************************************************************** */ - /* Create the query to find out if this is a view or not... */ + /* Create the query to find out if this is a view or not... */ /* ********************************************************************** */ sprintf(columns_query, "select c.relhasrules " - "from pg_user u, pg_class c where " - "u.usesysid = c.relowner"); + "from pg_user u, pg_class c where " + "u.usesysid = c.relowner"); my_strcat(columns_query, " and c.relname like '%.*s'", szTableName, cbTableName); my_strcat(columns_query, " and u.usename like '%.*s'", szTableOwner, cbTableOwner); - result = SQLAllocStmt( stmt->hdbc, &hcol_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &hcol_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for SQLSpecialColumns result."; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } col_stmt = (StatementClass *) hcol_stmt; mylog("SQLSpecialColumns: hcol_stmt = %u, col_stmt = %u\n", hcol_stmt, col_stmt); - result = SQLExecDirect(hcol_stmt, columns_query, - strlen(columns_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLExecDirect(hcol_stmt, columns_query, + strlen(columns_query)); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(hcol_stmt); stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR, - relhasrules, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hcol_stmt, 1, SQL_C_CHAR, + relhasrules, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } result = SQLFetch(hcol_stmt); SQLFreeStmt(hcol_stmt, SQL_DROP); - stmt->result = QR_Constructor(); - extend_bindings(stmt, 8); - - QR_set_num_fields(stmt->result, 8); - QR_set_field_info(stmt->result, 0, "SCOPE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 1, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 2, "DATA_TYPE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 3, "TYPE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 4, "PRECISION", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 5, "LENGTH", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 6, "SCALE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 7, "PSEUDO_COLUMN", PG_TYPE_INT2, 2); - - if ( relhasrules[0] != '1' ) { + stmt->result = QR_Constructor(); + extend_bindings(stmt, 8); + + QR_set_num_fields(stmt->result, 8); + QR_set_field_info(stmt->result, 0, "SCOPE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 1, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 2, "DATA_TYPE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 3, "TYPE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 4, "PRECISION", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 5, "LENGTH", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 6, "SCALE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 7, "PSEUDO_COLUMN", PG_TYPE_INT2, 2); + + if (relhasrules[0] != '1') + { /* use the oid value for the rowid */ - if(fColType == SQL_BEST_ROWID) { - row = (TupleNode *)malloc(sizeof(TupleNode) + (8 - 1) * sizeof(TupleField)); + if (fColType == SQL_BEST_ROWID) + { + row = (TupleNode *) malloc(sizeof(TupleNode) + (8 - 1) * sizeof(TupleField)); set_tuplefield_int2(&row->tuple[0], SQL_SCOPE_SESSION); set_tuplefield_string(&row->tuple[1], "oid"); @@ -1710,12 +1984,15 @@ mylog("%s: entering...stmt=%u\n", func, stmt); QR_add_tuple(stmt->result, row); - } else if(fColType == SQL_ROWVER) { + } + else if (fColType == SQL_ROWVER) + { - Int2 the_type = PG_TYPE_INT4; + Int2 the_type = PG_TYPE_INT4; - if (atoi(ci->row_versioning)) { - row = (TupleNode *)malloc(sizeof(TupleNode) + (8 - 1) * sizeof(TupleField)); + if (atoi(ci->row_versioning)) + { + row = (TupleNode *) malloc(sizeof(TupleNode) + (8 - 1) * sizeof(TupleField)); set_tuplefield_null(&row->tuple[0]); set_tuplefield_string(&row->tuple[1], "xmin"); @@ -1733,103 +2010,116 @@ mylog("%s: entering...stmt=%u\n", func, stmt); - stmt->status = STMT_FINISHED; - stmt->currTuple = -1; + stmt->status = STMT_FINISHED; + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; mylog("SQLSpecialColumns(): EXIT, stmt=%u\n", stmt); - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLStatistics( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UWORD fUnique, - UWORD fAccuracy) +RETCODE SQL_API +SQLStatistics( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UWORD fUnique, + UWORD fAccuracy) { -static char *func="SQLStatistics"; -StatementClass *stmt = (StatementClass *) hstmt; -char index_query[STD_STATEMENT_LEN]; -HSTMT hindx_stmt; -RETCODE result; -char *table_name; -char index_name[MAX_INFO_STRING]; -short fields_vector[8]; -char isunique[10], isclustered[10]; -SDWORD index_name_len, fields_vector_len; -TupleNode *row; -int i; -HSTMT hcol_stmt; -StatementClass *col_stmt, *indx_stmt; -char column_name[MAX_INFO_STRING], relhasrules[MAX_INFO_STRING]; -char **column_names = 0; -Int4 column_name_len; -int total_columns = 0; -char error = TRUE; -ConnInfo *ci; -char buf[256]; - -mylog("%s: entering...stmt=%u\n", func, stmt); - - if( ! stmt) { + static char *func = "SQLStatistics"; + StatementClass *stmt = (StatementClass *) hstmt; + char index_query[STD_STATEMENT_LEN]; + HSTMT hindx_stmt; + RETCODE result; + char *table_name; + char index_name[MAX_INFO_STRING]; + short fields_vector[8]; + char isunique[10], + isclustered[10]; + SDWORD index_name_len, + fields_vector_len; + TupleNode *row; + int i; + HSTMT hcol_stmt; + StatementClass *col_stmt, + *indx_stmt; + char column_name[MAX_INFO_STRING], + relhasrules[MAX_INFO_STRING]; + char **column_names = 0; + Int4 column_name_len; + int total_columns = 0; + char error = TRUE; + ConnInfo *ci; + char buf[256]; + + mylog("%s: entering...stmt=%u\n", func, stmt); + + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; - } + return SQL_INVALID_HANDLE; + } stmt->manual_result = TRUE; stmt->errormsg_created = TRUE; ci = &stmt->hdbc->connInfo; - stmt->result = QR_Constructor(); - if(!stmt->result) { - stmt->errormsg = "Couldn't allocate memory for SQLStatistics result."; - stmt->errornumber = STMT_NO_MEMORY_ERROR; + stmt->result = QR_Constructor(); + if (!stmt->result) + { + stmt->errormsg = "Couldn't allocate memory for SQLStatistics result."; + stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } - - /* the binding structure for a statement is not set up until */ - /* a statement is actually executed, so we'll have to do this ourselves. */ - extend_bindings(stmt, 13); - - /* set the field names */ - QR_set_num_fields(stmt->result, 13); - QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 3, "NON_UNIQUE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 4, "INDEX_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 5, "INDEX_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 6, "TYPE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 7, "SEQ_IN_INDEX", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 8, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 9, "COLLATION", PG_TYPE_CHAR, 1); - QR_set_field_info(stmt->result, 10, "CARDINALITY", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 11, "PAGES", PG_TYPE_INT4, 4); - QR_set_field_info(stmt->result, 12, "FILTER_CONDITION", PG_TYPE_TEXT, MAX_INFO_STRING); - - - /* only use the table name... the owner should be redundant, and */ - /* we never use qualifiers. */ + return SQL_ERROR; + } + + /* the binding structure for a statement is not set up until */ + + /* + * a statement is actually executed, so we'll have to do this + * ourselves. + */ + extend_bindings(stmt, 13); + + /* set the field names */ + QR_set_num_fields(stmt->result, 13); + QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 3, "NON_UNIQUE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 4, "INDEX_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 5, "INDEX_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 6, "TYPE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 7, "SEQ_IN_INDEX", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 8, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 9, "COLLATION", PG_TYPE_CHAR, 1); + QR_set_field_info(stmt->result, 10, "CARDINALITY", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 11, "PAGES", PG_TYPE_INT4, 4); + QR_set_field_info(stmt->result, 12, "FILTER_CONDITION", PG_TYPE_TEXT, MAX_INFO_STRING); + + + /* only use the table name... the owner should be redundant, and */ + /* we never use qualifiers. */ table_name = make_string(szTableName, cbTableName, NULL); - if ( ! table_name) { - stmt->errormsg = "No table name passed to SQLStatistics."; - stmt->errornumber = STMT_INTERNAL_ERROR; + if (!table_name) + { + stmt->errormsg = "No table name passed to SQLStatistics."; + stmt->errornumber = STMT_INTERNAL_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } /* we need to get a list of the field names first, */ /* so we can return them later. */ - result = SQLAllocStmt( stmt->hdbc, &hcol_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &hcol_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = "SQLAllocStmt failed in SQLStatistics for columns."; stmt->errornumber = STMT_NO_MEMORY_ERROR; goto SEEYA; @@ -1837,23 +2127,27 @@ mylog("%s: entering...stmt=%u\n", func, stmt); col_stmt = (StatementClass *) hcol_stmt; - /* "internal" prevents SQLColumns from returning the oid if it is being shown. - This would throw everything off. - */ + /* + * "internal" prevents SQLColumns from returning the oid if it is + * being shown. This would throw everything off. + */ col_stmt->internal = TRUE; - result = SQLColumns(hcol_stmt, "", 0, "", 0, - table_name, (SWORD) strlen(table_name), "", 0); + result = SQLColumns(hcol_stmt, "", 0, "", 0, + table_name, (SWORD) strlen(table_name), "", 0); col_stmt->internal = FALSE; - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = col_stmt->errormsg; /* "SQLColumns failed in SQLStatistics."; */ - stmt->errornumber = col_stmt->errornumber; /* STMT_EXEC_ERROR; */ - SQLFreeStmt(hcol_stmt, SQL_DROP); - goto SEEYA; + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = col_stmt->errormsg; /* "SQLColumns failed in + * SQLStatistics."; */ + stmt->errornumber = col_stmt->errornumber; /* STMT_EXEC_ERROR; */ + SQLFreeStmt(hcol_stmt, SQL_DROP); + goto SEEYA; } result = SQLBindCol(hcol_stmt, 4, SQL_C_CHAR, - column_name, MAX_INFO_STRING, &column_name_len); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + column_name, MAX_INFO_STRING, &column_name_len); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = col_stmt->errormsg; stmt->errornumber = col_stmt->errornumber; SQLFreeStmt(hcol_stmt, SQL_DROP); @@ -1862,38 +2156,43 @@ mylog("%s: entering...stmt=%u\n", func, stmt); } result = SQLFetch(hcol_stmt); - while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) { + while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) + { total_columns++; - column_names = - (char **)realloc(column_names, - total_columns * sizeof(char *)); - column_names[total_columns-1] = - (char *)malloc(strlen(column_name)+1); - strcpy(column_names[total_columns-1], column_name); + column_names = + (char **) realloc(column_names, + total_columns * sizeof(char *)); + column_names[total_columns - 1] = + (char *) malloc(strlen(column_name) + 1); + strcpy(column_names[total_columns - 1], column_name); mylog("SQLStatistics: column_name = '%s'\n", column_name); result = SQLFetch(hcol_stmt); } - if(result != SQL_NO_DATA_FOUND || total_columns == 0) { - stmt->errormsg = SC_create_errormsg(hcol_stmt); /* "Couldn't get column names in SQLStatistics."; */ - stmt->errornumber = col_stmt->errornumber; - SQLFreeStmt(hcol_stmt, SQL_DROP); - goto SEEYA; + if (result != SQL_NO_DATA_FOUND || total_columns == 0) + { + stmt->errormsg = SC_create_errormsg(hcol_stmt); /* "Couldn't get column + * names in + * SQLStatistics."; */ + stmt->errornumber = col_stmt->errornumber; + SQLFreeStmt(hcol_stmt, SQL_DROP); + goto SEEYA; } - + SQLFreeStmt(hcol_stmt, SQL_DROP); /* get a list of indexes on this table */ - result = SQLAllocStmt( stmt->hdbc, &hindx_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &hindx_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = "SQLAllocStmt failed in SQLStatistics for indices."; stmt->errornumber = STMT_NO_MEMORY_ERROR; goto SEEYA; - } + } indx_stmt = (StatementClass *) hindx_stmt; sprintf(index_query, "select c.relname, i.indkey, i.indisunique" @@ -1902,69 +2201,83 @@ mylog("%s: entering...stmt=%u\n", func, stmt); " where c.oid = i.indexrelid and d.relname = '%s'" " and d.oid = i.indrelid", table_name); - result = SQLExecDirect(hindx_stmt, index_query, strlen(index_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "Couldn't execute index query (w/SQLExecDirect) in SQLStatistics."; */ + result = SQLExecDirect(hindx_stmt, index_query, strlen(index_query)); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "Couldn't execute + * index query + * (w/SQLExecDirect) in + * SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); - goto SEEYA; + goto SEEYA; - } + } - /* bind the index name column */ - result = SQLBindCol(hindx_stmt, 1, SQL_C_CHAR, - index_name, MAX_INFO_STRING, &index_name_len); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column in SQLStatistics."; */ + /* bind the index name column */ + result = SQLBindCol(hindx_stmt, 1, SQL_C_CHAR, + index_name, MAX_INFO_STRING, &index_name_len); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column + * in SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); - goto SEEYA; - - } - /* bind the vector column */ - result = SQLBindCol(hindx_stmt, 2, SQL_C_DEFAULT, - fields_vector, 16, &fields_vector_len); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column in SQLStatistics."; */ + goto SEEYA; + + } + /* bind the vector column */ + result = SQLBindCol(hindx_stmt, 2, SQL_C_DEFAULT, + fields_vector, 16, &fields_vector_len); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column + * in SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); goto SEEYA; - } - /* bind the "is unique" column */ - result = SQLBindCol(hindx_stmt, 3, SQL_C_CHAR, - isunique, sizeof(isunique), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column in SQLStatistics."; */ + } + /* bind the "is unique" column */ + result = SQLBindCol(hindx_stmt, 3, SQL_C_CHAR, + isunique, sizeof(isunique), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column + * in SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); goto SEEYA; - } + } - /* bind the "is clustered" column */ - result = SQLBindCol(hindx_stmt, 4, SQL_C_CHAR, - isclustered, sizeof(isclustered), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { - stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column in SQLStatistics."; */ + /* bind the "is clustered" column */ + result = SQLBindCol(hindx_stmt, 4, SQL_C_CHAR, + isclustered, sizeof(isclustered), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column + * in SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); goto SEEYA; - } + } - result = SQLBindCol(hindx_stmt, 5, SQL_C_CHAR, - relhasrules, MAX_INFO_STRING, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(hindx_stmt, 5, SQL_C_CHAR, + relhasrules, MAX_INFO_STRING, NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = indx_stmt->errormsg; stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); - goto SEEYA; - } + goto SEEYA; + } - /* fake index of OID */ - if ( relhasrules[0] != '1' && atoi(ci->show_oid_column) && atoi(ci->fake_oid_index)) { - row = (TupleNode *)malloc(sizeof(TupleNode) + - (13 - 1) * sizeof(TupleField)); + /* fake index of OID */ + if (relhasrules[0] != '1' && atoi(ci->show_oid_column) && atoi(ci->fake_oid_index)) + { + row = (TupleNode *) malloc(sizeof(TupleNode) + + (13 - 1) * sizeof(TupleField)); /* no table qualifier */ set_tuplefield_string(&row->tuple[0], ""); @@ -1974,14 +2287,17 @@ mylog("%s: entering...stmt=%u\n", func, stmt); /* non-unique index? */ set_tuplefield_int2(&row->tuple[3], (Int2) (globals.unique_index ? FALSE : TRUE)); - + /* no index qualifier */ set_tuplefield_string(&row->tuple[4], ""); sprintf(buf, "%s_idx_fake_oid", table_name); set_tuplefield_string(&row->tuple[5], buf); - /* Clustered index? I think non-clustered should be type OTHER not HASHED */ + /* + * Clustered index? I think non-clustered should be type OTHER + * not HASHED + */ set_tuplefield_int2(&row->tuple[6], (Int2) SQL_INDEX_OTHER); set_tuplefield_int2(&row->tuple[7], (Int2) 1); @@ -1994,18 +2310,21 @@ mylog("%s: entering...stmt=%u\n", func, stmt); QR_add_tuple(stmt->result, row); } - result = SQLFetch(hindx_stmt); - while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) { + result = SQLFetch(hindx_stmt); + while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) + { - /* If only requesting unique indexs, then just return those. */ - if (fUnique == SQL_INDEX_ALL || - (fUnique == SQL_INDEX_UNIQUE && atoi(isunique))) { + /* If only requesting unique indexs, then just return those. */ + if (fUnique == SQL_INDEX_ALL || + (fUnique == SQL_INDEX_UNIQUE && atoi(isunique))) + { i = 0; /* add a row in this table for each field in the index */ - while(i < 8 && fields_vector[i] != 0) { + while (i < 8 && fields_vector[i] != 0) + { - row = (TupleNode *)malloc(sizeof(TupleNode) + - (13 - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + + (13 - 1) * sizeof(TupleField)); /* no table qualifier */ set_tuplefield_string(&row->tuple[0], ""); @@ -2018,26 +2337,32 @@ mylog("%s: entering...stmt=%u\n", func, stmt); set_tuplefield_int2(&row->tuple[3], (Int2) (atoi(isunique) ? FALSE : TRUE)); else set_tuplefield_int2(&row->tuple[3], TRUE); - + /* no index qualifier */ set_tuplefield_string(&row->tuple[4], ""); set_tuplefield_string(&row->tuple[5], index_name); - /* Clustered index? I think non-clustered should be type OTHER not HASHED */ + /* + * Clustered index? I think non-clustered should be type + * OTHER not HASHED + */ set_tuplefield_int2(&row->tuple[6], (Int2) (atoi(isclustered) ? SQL_INDEX_CLUSTERED : SQL_INDEX_OTHER)); - set_tuplefield_int2(&row->tuple[7], (Int2) (i+1)); + set_tuplefield_int2(&row->tuple[7], (Int2) (i + 1)); - if(fields_vector[i] == OID_ATTNUM) { + if (fields_vector[i] == OID_ATTNUM) + { set_tuplefield_string(&row->tuple[8], "oid"); mylog("SQLStatistics: column name = oid\n"); } - else if(fields_vector[i] < 0 || fields_vector[i] > total_columns) { + else if (fields_vector[i] < 0 || fields_vector[i] > total_columns) + { set_tuplefield_string(&row->tuple[8], "UNKNOWN"); mylog("SQLStatistics: column name = UNKNOWN\n"); } - else { - set_tuplefield_string(&row->tuple[8], column_names[fields_vector[i]-1]); - mylog("SQLStatistics: column name = '%s'\n", column_names[fields_vector[i]-1]); + else + { + set_tuplefield_string(&row->tuple[8], column_names[fields_vector[i] - 1]); + mylog("SQLStatistics: column name = '%s'\n", column_names[fields_vector[i] - 1]); } set_tuplefield_string(&row->tuple[9], "A"); @@ -2050,23 +2375,25 @@ mylog("%s: entering...stmt=%u\n", func, stmt); } } - result = SQLFetch(hindx_stmt); - } - if(result != SQL_NO_DATA_FOUND) { - stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "SQLFetch failed in SQLStatistics."; */ + result = SQLFetch(hindx_stmt); + } + if (result != SQL_NO_DATA_FOUND) + { + stmt->errormsg = SC_create_errormsg(hindx_stmt); /* "SQLFetch failed in + * SQLStatistics."; */ stmt->errornumber = indx_stmt->errornumber; SQLFreeStmt(hindx_stmt, SQL_DROP); goto SEEYA; - } + } SQLFreeStmt(hindx_stmt, SQL_DROP); /* also, things need to think that this statement is finished so */ /* the results can be retrieved. */ - stmt->status = STMT_FINISHED; + stmt->status = STMT_FINISHED; - /* set up the current tuple pointer for SQLFetch */ - stmt->currTuple = -1; + /* set up the current tuple pointer for SQLFetch */ + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; @@ -2075,14 +2402,14 @@ mylog("%s: entering...stmt=%u\n", func, stmt); SEEYA: /* These things should be freed on any error ALSO! */ free(table_name); - for(i = 0; i < total_columns; i++) { + for (i = 0; i < total_columns; i++) free(column_names[i]); - } - free(column_names); + free(column_names); mylog("SQLStatistics(): EXIT, %s, stmt=%u\n", error ? "error" : "success", stmt); - if (error) { + if (error) + { SC_log_error(func, "", stmt); return SQL_ERROR; } @@ -2090,99 +2417,109 @@ SEEYA: return SQL_SUCCESS; } -RETCODE SQL_API SQLColumnPrivileges( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szColumnName, - SWORD cbColumnName) +RETCODE SQL_API +SQLColumnPrivileges( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szColumnName, + SWORD cbColumnName) { -static char *func="SQLColumnPrivileges"; + static char *func = "SQLColumnPrivileges"; mylog("%s: entering...\n", func); /* Neither Access or Borland care about this. */ SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); - return SQL_ERROR; + return SQL_ERROR; } /* SQLPrimaryKeys() * Retrieve the primary key columns for the specified table. */ -RETCODE SQL_API SQLPrimaryKeys( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName) +RETCODE SQL_API +SQLPrimaryKeys( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName) { -static char *func = "SQLPrimaryKeys"; -StatementClass *stmt = (StatementClass *) hstmt; -TupleNode *row; -RETCODE result; -int seq = 0; -HSTMT htbl_stmt; -StatementClass *tbl_stmt; -char tables_query[STD_STATEMENT_LEN]; -char attname[MAX_INFO_STRING]; -SDWORD attname_len; -char pktab[MAX_TABLE_LEN + 1]; -Int2 result_cols; + static char *func = "SQLPrimaryKeys"; + StatementClass *stmt = (StatementClass *) hstmt; + TupleNode *row; + RETCODE result; + int seq = 0; + HSTMT htbl_stmt; + StatementClass *tbl_stmt; + char tables_query[STD_STATEMENT_LEN]; + char attname[MAX_INFO_STRING]; + SDWORD attname_len; + char pktab[MAX_TABLE_LEN + 1]; + Int2 result_cols; mylog("%s: entering...stmt=%u\n", func, stmt); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; - } + return SQL_INVALID_HANDLE; + } stmt->manual_result = TRUE; stmt->errormsg_created = TRUE; - stmt->result = QR_Constructor(); - if(!stmt->result) { - stmt->errormsg = "Couldn't allocate memory for SQLPrimaryKeys result."; - stmt->errornumber = STMT_NO_MEMORY_ERROR; + stmt->result = QR_Constructor(); + if (!stmt->result) + { + stmt->errormsg = "Couldn't allocate memory for SQLPrimaryKeys result."; + stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } + + /* the binding structure for a statement is not set up until */ - /* the binding structure for a statement is not set up until */ - /* a statement is actually executed, so we'll have to do this ourselves. */ + /* + * a statement is actually executed, so we'll have to do this + * ourselves. + */ result_cols = 6; - extend_bindings(stmt, result_cols); - - /* set the field names */ - QR_set_num_fields(stmt->result, result_cols); - QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 3, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 4, "KEY_SEQ", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 5, "PK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - - - result = SQLAllocStmt( stmt->hdbc, &htbl_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + extend_bindings(stmt, result_cols); + + /* set the field names */ + QR_set_num_fields(stmt->result, result_cols); + QR_set_field_info(stmt->result, 0, "TABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 1, "TABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 2, "TABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 3, "COLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 4, "KEY_SEQ", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 5, "PK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + + + result = SQLAllocStmt(stmt->hdbc, &htbl_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for Primary Key result."; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } tbl_stmt = (StatementClass *) htbl_stmt; pktab[0] = '\0'; make_string(szTableName, cbTableName, pktab); - if ( pktab[0] == '\0') { + if (pktab[0] == '\0') + { stmt->errormsg = "No Table specified to SQLPrimaryKeys."; - stmt->errornumber = STMT_INTERNAL_ERROR; + stmt->errornumber = STMT_INTERNAL_ERROR; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); return SQL_ERROR; @@ -2191,12 +2528,13 @@ Int2 result_cols; #if 0 sprintf(tables_query, "select distinct on (attnum) a2.attname, a2.attnum from pg_attribute a1, pg_attribute a2, pg_class c, pg_index i where c.relname = '%s_pkey' AND c.oid = i.indexrelid AND a1.attrelid = c.oid AND a2.attrelid = c.oid AND (i.indkey[0] = a1.attnum OR i.indkey[1] = a1.attnum OR i.indkey[2] = a1.attnum OR i.indkey[3] = a1.attnum OR i.indkey[4] = a1.attnum OR i.indkey[5] = a1.attnum OR i.indkey[6] = a1.attnum OR i.indkey[7] = a1.attnum) order by a2.attnum", pktab); #else - /* Simplified query to remove assumptions about - * number of possible index columns. - * Courtesy of Tom Lane - thomas 2000-03-21 + + /* + * Simplified query to remove assumptions about number of possible + * index columns. Courtesy of Tom Lane - thomas 2000-03-21 */ sprintf(tables_query, "select ta.attname, ia.attnum" - " from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i" + " from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i" " where c.relname = '%s_pkey'" " AND c.oid = i.indexrelid" " AND ia.attrelid = i.indexrelid" @@ -2208,174 +2546,200 @@ Int2 result_cols; mylog("SQLPrimaryKeys: tables_query='%s'\n", tables_query); - result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query)); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR, - attname, MAX_INFO_STRING, &attname_len); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR, + attname, MAX_INFO_STRING, &attname_len); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } - result = SQLFetch(htbl_stmt); + result = SQLFetch(htbl_stmt); - while((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) { + while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) + { - row = (TupleNode *)malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); - set_tuplefield_null(&row->tuple[0]); + set_tuplefield_null(&row->tuple[0]); - /* I have to hide the table owner from Access, otherwise it - * insists on referring to the table as 'owner.table'. - * (this is valid according to the ODBC SQL grammar, but - * Postgres won't support it.) + /* + * I have to hide the table owner from Access, otherwise it + * insists on referring to the table as 'owner.table'. (this is + * valid according to the ODBC SQL grammar, but Postgres won't + * support it.) */ - set_tuplefield_string(&row->tuple[1], ""); - set_tuplefield_string(&row->tuple[2], pktab); - set_tuplefield_string(&row->tuple[3], attname); + set_tuplefield_string(&row->tuple[1], ""); + set_tuplefield_string(&row->tuple[2], pktab); + set_tuplefield_string(&row->tuple[3], attname); set_tuplefield_int2(&row->tuple[4], (Int2) (++seq)); set_tuplefield_null(&row->tuple[5]); - QR_add_tuple(stmt->result, row); + QR_add_tuple(stmt->result, row); mylog(">> primaryKeys: pktab = '%s', attname = '%s', seq = %d\n", pktab, attname, seq); - result = SQLFetch(htbl_stmt); - } + result = SQLFetch(htbl_stmt); + } - if(result != SQL_NO_DATA_FOUND) { + if (result != SQL_NO_DATA_FOUND) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); SQLFreeStmt(htbl_stmt, SQL_DROP); - return SQL_ERROR; - } + return SQL_ERROR; + } SQLFreeStmt(htbl_stmt, SQL_DROP); /* also, things need to think that this statement is finished so */ /* the results can be retrieved. */ - stmt->status = STMT_FINISHED; + stmt->status = STMT_FINISHED; - /* set up the current tuple pointer for SQLFetch */ - stmt->currTuple = -1; + /* set up the current tuple pointer for SQLFetch */ + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; mylog("SQLPrimaryKeys(): EXIT, stmt=%u\n", stmt); - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLForeignKeys( - HSTMT hstmt, - UCHAR FAR * szPkTableQualifier, - SWORD cbPkTableQualifier, - UCHAR FAR * szPkTableOwner, - SWORD cbPkTableOwner, - UCHAR FAR * szPkTableName, - SWORD cbPkTableName, - UCHAR FAR * szFkTableQualifier, - SWORD cbFkTableQualifier, - UCHAR FAR * szFkTableOwner, - SWORD cbFkTableOwner, - UCHAR FAR * szFkTableName, - SWORD cbFkTableName) +RETCODE SQL_API +SQLForeignKeys( + HSTMT hstmt, + UCHAR FAR * szPkTableQualifier, + SWORD cbPkTableQualifier, + UCHAR FAR * szPkTableOwner, + SWORD cbPkTableOwner, + UCHAR FAR * szPkTableName, + SWORD cbPkTableName, + UCHAR FAR * szFkTableQualifier, + SWORD cbFkTableQualifier, + UCHAR FAR * szFkTableOwner, + SWORD cbFkTableOwner, + UCHAR FAR * szFkTableName, + SWORD cbFkTableName) { -static char *func = "SQLForeignKeys"; -StatementClass *stmt = (StatementClass *) hstmt; -TupleNode *row; -HSTMT htbl_stmt, hpkey_stmt; -StatementClass *tbl_stmt; -RETCODE result, keyresult; -char tables_query[STD_STATEMENT_LEN]; -char trig_deferrable[2]; -char trig_initdeferred[2]; -char trig_args[1024]; -char upd_rule[MAX_TABLE_LEN], del_rule[MAX_TABLE_LEN]; -char pk_table_needed[MAX_TABLE_LEN + 1]; -char fk_table_needed[MAX_TABLE_LEN + 1]; -char *pkey_ptr, *fkey_ptr, *pk_table, *fk_table; -int i, j, k, num_keys; -SWORD trig_nargs, upd_rule_type=0, del_rule_type=0; + static char *func = "SQLForeignKeys"; + StatementClass *stmt = (StatementClass *) hstmt; + TupleNode *row; + HSTMT htbl_stmt, + hpkey_stmt; + StatementClass *tbl_stmt; + RETCODE result, + keyresult; + char tables_query[STD_STATEMENT_LEN]; + char trig_deferrable[2]; + char trig_initdeferred[2]; + char trig_args[1024]; + char upd_rule[MAX_TABLE_LEN], + del_rule[MAX_TABLE_LEN]; + char pk_table_needed[MAX_TABLE_LEN + 1]; + char fk_table_needed[MAX_TABLE_LEN + 1]; + char *pkey_ptr, + *fkey_ptr, + *pk_table, + *fk_table; + int i, + j, + k, + num_keys; + SWORD trig_nargs, + upd_rule_type = 0, + del_rule_type = 0; + #if (ODBCVER >= 0x0300) -SWORD defer_type; + SWORD defer_type; + #endif -char pkey[MAX_INFO_STRING]; -Int2 result_cols; + char pkey[MAX_INFO_STRING]; + Int2 result_cols; mylog("%s: entering...stmt=%u\n", func, stmt); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; - } - + return SQL_INVALID_HANDLE; + } + stmt->manual_result = TRUE; stmt->errormsg_created = TRUE; - stmt->result = QR_Constructor(); - if(!stmt->result) { + stmt->result = QR_Constructor(); + if (!stmt->result) + { stmt->errormsg = "Couldn't allocate memory for SQLForeignKeys result."; - stmt->errornumber = STMT_NO_MEMORY_ERROR; + stmt->errornumber = STMT_NO_MEMORY_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } + + /* the binding structure for a statement is not set up until */ - /* the binding structure for a statement is not set up until */ - /* a statement is actually executed, so we'll have to do this ourselves. */ + /* + * a statement is actually executed, so we'll have to do this + * ourselves. + */ result_cols = 14; - extend_bindings(stmt, result_cols); - - /* set the field names */ - QR_set_num_fields(stmt->result, result_cols); - QR_set_field_info(stmt->result, 0, "PKTABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 1, "PKTABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 2, "PKTABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 3, "PKCOLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 4, "FKTABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 5, "FKTABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 6, "FKTABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 7, "FKCOLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 8, "KEY_SEQ", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 9, "UPDATE_RULE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 10, "DELETE_RULE", PG_TYPE_INT2, 2); - QR_set_field_info(stmt->result, 11, "FK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 12, "PK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); - QR_set_field_info(stmt->result, 13, "TRIGGER_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + extend_bindings(stmt, result_cols); + + /* set the field names */ + QR_set_num_fields(stmt->result, result_cols); + QR_set_field_info(stmt->result, 0, "PKTABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 1, "PKTABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 2, "PKTABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 3, "PKCOLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 4, "FKTABLE_QUALIFIER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 5, "FKTABLE_OWNER", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 6, "FKTABLE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 7, "FKCOLUMN_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 8, "KEY_SEQ", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 9, "UPDATE_RULE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 10, "DELETE_RULE", PG_TYPE_INT2, 2); + QR_set_field_info(stmt->result, 11, "FK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 12, "PK_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); + QR_set_field_info(stmt->result, 13, "TRIGGER_NAME", PG_TYPE_TEXT, MAX_INFO_STRING); #if (ODBCVER >= 0x0300) QR_set_field_info(stmt->result, 14, "DEFERRABILITY", PG_TYPE_INT2, 2); -#endif /* ODBCVER >= 0x0300 */ +#endif /* ODBCVER >= 0x0300 */ - /* also, things need to think that this statement is finished so */ - /* the results can be retrieved. */ - stmt->status = STMT_FINISHED; + /* also, things need to think that this statement is finished so */ + /* the results can be retrieved. */ + stmt->status = STMT_FINISHED; - /* set up the current tuple pointer for SQLFetch */ - stmt->currTuple = -1; + /* set up the current tuple pointer for SQLFetch */ + stmt->currTuple = -1; stmt->rowset_start = -1; stmt->current_col = -1; - result = SQLAllocStmt( stmt->hdbc, &htbl_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &htbl_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for SQLForeignKeys result."; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } tbl_stmt = (StatementClass *) htbl_stmt; @@ -2385,53 +2749,57 @@ Int2 result_cols; make_string(szPkTableName, cbPkTableName, pk_table_needed); make_string(szFkTableName, cbFkTableName, fk_table_needed); - /* Case #2 -- Get the foreign keys in the specified table (fktab) that - refer to the primary keys of other table(s). - */ - if (fk_table_needed[0] != '\0') { + /* + * Case #2 -- Get the foreign keys in the specified table (fktab) that + * refer to the primary keys of other table(s). + */ + if (fk_table_needed[0] != '\0') + { mylog("%s: entering Foreign Key Case #2", func); sprintf(tables_query, "SELECT pt.tgargs, " - " pt.tgnargs, " - " pt.tgdeferrable, " - " pt.tginitdeferred, " - " pg_proc.proname, " - " pg_proc_1.proname " - "FROM pg_class pc, " - " pg_proc pg_proc, " - " pg_proc pg_proc_1, " - " pg_trigger pg_trigger, " - " pg_trigger pg_trigger_1, " - " pg_proc pp, " - " pg_trigger pt " - "WHERE pt.tgrelid = pc.oid " - "AND pp.oid = pt.tgfoid " - "AND pg_trigger.tgconstrrelid = pc.oid " - "AND pg_proc.oid = pg_trigger.tgfoid " - "AND pg_trigger_1.tgfoid = pg_proc_1.oid " - "AND pg_trigger_1.tgconstrrelid = pc.oid " - "AND ((pc.relname='%s') " - "AND (pp.proname LIKE '%%ins') " - "AND (pg_proc.proname LIKE '%%upd') " - "AND (pg_proc_1.proname LIKE '%%del') " - "AND (pg_trigger.tgrelid=pt.tgconstrrelid) " - "AND (pg_trigger.tgconstrname=pt.tgconstrname) " - "AND (pg_trigger_1.tgrelid=pt.tgconstrrelid) " - "AND (pg_trigger_1.tgconstrname=pt.tgconstrname))", - fk_table_needed); + " pt.tgnargs, " + " pt.tgdeferrable, " + " pt.tginitdeferred, " + " pg_proc.proname, " + " pg_proc_1.proname " + "FROM pg_class pc, " + " pg_proc pg_proc, " + " pg_proc pg_proc_1, " + " pg_trigger pg_trigger, " + " pg_trigger pg_trigger_1, " + " pg_proc pp, " + " pg_trigger pt " + "WHERE pt.tgrelid = pc.oid " + "AND pp.oid = pt.tgfoid " + "AND pg_trigger.tgconstrrelid = pc.oid " + "AND pg_proc.oid = pg_trigger.tgfoid " + "AND pg_trigger_1.tgfoid = pg_proc_1.oid " + "AND pg_trigger_1.tgconstrrelid = pc.oid " + "AND ((pc.relname='%s') " + "AND (pp.proname LIKE '%%ins') " + "AND (pg_proc.proname LIKE '%%upd') " + "AND (pg_proc_1.proname LIKE '%%del') " + "AND (pg_trigger.tgrelid=pt.tgconstrrelid) " + "AND (pg_trigger.tgconstrname=pt.tgconstrname) " + "AND (pg_trigger_1.tgrelid=pt.tgconstrrelid) " + "AND (pg_trigger_1.tgconstrname=pt.tgconstrname))", + fk_table_needed); result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); - SQLFreeStmt(htbl_stmt, SQL_DROP); + SQLFreeStmt(htbl_stmt, SQL_DROP); return SQL_ERROR; } result = SQLBindCol(htbl_stmt, 1, SQL_C_BINARY, trig_args, sizeof(trig_args), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2441,7 +2809,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 2, SQL_C_SHORT, &trig_nargs, 0, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2450,8 +2819,9 @@ Int2 result_cols; } result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR, - trig_deferrable, sizeof(trig_deferrable), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + trig_deferrable, sizeof(trig_deferrable), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2460,8 +2830,9 @@ Int2 result_cols; } result = SQLBindCol(htbl_stmt, 4, SQL_C_CHAR, - trig_initdeferred, sizeof(trig_initdeferred), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + trig_initdeferred, sizeof(trig_initdeferred), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2471,7 +2842,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 5, SQL_C_CHAR, upd_rule, sizeof(upd_rule), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2481,7 +2853,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 6, SQL_C_CHAR, del_rule, sizeof(del_rule), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2493,7 +2866,8 @@ Int2 result_cols; if (result == SQL_NO_DATA_FOUND) return SQL_SUCCESS; - if(result != SQL_SUCCESS) { + if (result != SQL_SUCCESS) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2501,8 +2875,9 @@ Int2 result_cols; return SQL_ERROR; } - keyresult = SQLAllocStmt( stmt->hdbc, &hpkey_stmt); - if((keyresult != SQL_SUCCESS) && (keyresult != SQL_SUCCESS_WITH_INFO)) { + keyresult = SQLAllocStmt(stmt->hdbc, &hpkey_stmt); + if ((keyresult != SQL_SUCCESS) && (keyresult != SQL_SUCCESS_WITH_INFO)) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't allocate statement for SQLForeignKeys (pkeys) result."; SC_log_error(func, "", stmt); @@ -2510,8 +2885,9 @@ Int2 result_cols; } keyresult = SQLBindCol(hpkey_stmt, 4, SQL_C_CHAR, - pkey, sizeof(pkey), NULL); - if (keyresult != SQL_SUCCESS) { + pkey, sizeof(pkey), NULL); + if (keyresult != SQL_SUCCESS) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't bindcol for primary keys for SQLForeignKeys result."; SC_log_error(func, "", stmt); @@ -2519,31 +2895,35 @@ Int2 result_cols; return SQL_ERROR; } - while (result == SQL_SUCCESS) { + while (result == SQL_SUCCESS) + { - /* Compute the number of keyparts. */ + /* Compute the number of keyparts. */ num_keys = (trig_nargs - 4) / 2; mylog("Foreign Key Case#2: trig_nargs = %d, num_keys = %d\n", trig_nargs, num_keys); pk_table = trig_args; - /* Get to the PK Table Name */ + /* Get to the PK Table Name */ for (k = 0; k < 2; k++) pk_table += strlen(pk_table) + 1; - /* If there is a pk table specified, then check it. */ - if (pk_table_needed[0] != '\0') { + /* If there is a pk table specified, then check it. */ + if (pk_table_needed[0] != '\0') + { - /* If it doesn't match, then continue */ - if ( strcmp(pk_table, pk_table_needed)) { + /* If it doesn't match, then continue */ + if (strcmp(pk_table, pk_table_needed)) + { result = SQLFetch(htbl_stmt); continue; } } keyresult = SQLPrimaryKeys(hpkey_stmt, NULL, 0, NULL, 0, pk_table, SQL_NTS); - if (keyresult != SQL_SUCCESS) { + if (keyresult != SQL_SUCCESS) + { stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->errormsg = "Couldn't get primary keys for SQLForeignKeys result."; SC_log_error(func, "", stmt); @@ -2552,77 +2932,77 @@ Int2 result_cols; } - /* Check that the key listed is the primary key */ + /* Check that the key listed is the primary key */ keyresult = SQLFetch(hpkey_stmt); - /* Get to first primary key */ + /* Get to first primary key */ pkey_ptr = trig_args; for (i = 0; i < 5; i++) pkey_ptr += strlen(pkey_ptr) + 1; - for (k = 0; k < num_keys; k++) { + for (k = 0; k < num_keys; k++) + { mylog("%s: pkey_ptr='%s', pkey='%s'\n", func, pkey_ptr, pkey); - if ( keyresult != SQL_SUCCESS || strcmp(pkey_ptr, pkey)) { + if (keyresult != SQL_SUCCESS || strcmp(pkey_ptr, pkey)) + { num_keys = 0; break; } - /* Get to next primary key */ + /* Get to next primary key */ for (k = 0; k < 2; k++) pkey_ptr += strlen(pkey_ptr) + 1; keyresult = SQLFetch(hpkey_stmt); } - /* Set to first fk column */ + /* Set to first fk column */ fkey_ptr = trig_args; for (k = 0; k < 4; k++) fkey_ptr += strlen(fkey_ptr) + 1; /* Set update and delete actions for foreign keys */ - if (!strcmp(upd_rule, "RI_FKey_cascade_upd")) { + if (!strcmp(upd_rule, "RI_FKey_cascade_upd")) upd_rule_type = SQL_CASCADE; - } else if (!strcmp(upd_rule, "RI_FKey_noaction_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_noaction_upd")) upd_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_restrict_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_restrict_upd")) upd_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_setdefault_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_setdefault_upd")) upd_rule_type = SQL_SET_DEFAULT; - } else if (!strcmp(upd_rule, "RI_FKey_setnull_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_setnull_upd")) upd_rule_type = SQL_SET_NULL; - } - - if (!strcmp(upd_rule, "RI_FKey_cascade_del")) { + + if (!strcmp(upd_rule, "RI_FKey_cascade_del")) del_rule_type = SQL_CASCADE; - } else if (!strcmp(upd_rule, "RI_FKey_noaction_del")) { + else if (!strcmp(upd_rule, "RI_FKey_noaction_del")) del_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_restrict_del")) { + else if (!strcmp(upd_rule, "RI_FKey_restrict_del")) del_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_setdefault_del")) { + else if (!strcmp(upd_rule, "RI_FKey_setdefault_del")) del_rule_type = SQL_SET_DEFAULT; - } else if (!strcmp(upd_rule, "RI_FKey_setnull_del")) { + else if (!strcmp(upd_rule, "RI_FKey_setnull_del")) del_rule_type = SQL_SET_NULL; - } #if (ODBCVER >= 0x0300) /* Set deferrability type */ - if (!strcmp(trig_initdeferred, "y")) { + if (!strcmp(trig_initdeferred, "y")) defer_type = SQL_INITIALLY_DEFERRED; - } else if (!strcmp(trig_deferrable, "y")) { + else if (!strcmp(trig_deferrable, "y")) defer_type = SQL_INITIALLY_IMMEDIATE; - } else { + else defer_type = SQL_NOT_DEFERRABLE; - } -#endif /* ODBCVER >= 0x0300 */ +#endif /* ODBCVER >= 0x0300 */ - /* Get to first primary key */ + /* Get to first primary key */ pkey_ptr = trig_args; for (i = 0; i < 5; i++) pkey_ptr += strlen(pkey_ptr) + 1; - for (k = 0; k < num_keys; k++) { + for (k = 0; k < num_keys; k++) + { - row = (TupleNode *)malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); mylog("%s: pk_table = '%s', pkey_ptr = '%s'\n", func, pk_table, pkey_ptr); set_tuplefield_null(&row->tuple[0]); @@ -2645,12 +3025,13 @@ Int2 result_cols; set_tuplefield_string(&row->tuple[13], trig_args); #if (ODBCVER >= 0x0300) set_tuplefield_int2(&row->tuple[14], defer_type); -#endif /* ODBCVER >= 0x0300 */ +#endif /* ODBCVER >= 0x0300 */ QR_add_tuple(stmt->result, row); /* next primary/foreign key */ - for (i = 0; i < 2; i++) { + for (i = 0; i < 2; i++) + { fkey_ptr += strlen(fkey_ptr) + 1; pkey_ptr += strlen(pkey_ptr) + 1; } @@ -2661,53 +3042,58 @@ Int2 result_cols; SQLFreeStmt(hpkey_stmt, SQL_DROP); } - /* Case #1 -- Get the foreign keys in other tables that refer to the primary key - in the specified table (pktab). i.e., Who points to me? - */ - else if (pk_table_needed[0] != '\0') { + /* + * Case #1 -- Get the foreign keys in other tables that refer to the + * primary key in the specified table (pktab). i.e., Who points to + * me? + */ + else if (pk_table_needed[0] != '\0') + { sprintf(tables_query, "SELECT pg_trigger.tgargs, " - " pg_trigger.tgnargs, " - " pg_trigger.tgdeferrable, " - " pg_trigger.tginitdeferred, " - " pg_proc.proname, " - " pg_proc_1.proname " - "FROM pg_class pg_class, " - " pg_class pg_class_1, " - " pg_class pg_class_2, " - " pg_proc pg_proc, " - " pg_proc pg_proc_1, " - " pg_trigger pg_trigger, " - " pg_trigger pg_trigger_1, " - " pg_trigger pg_trigger_2 " - "WHERE pg_trigger.tgconstrrelid = pg_class.oid " - " AND pg_trigger.tgrelid = pg_class_1.oid " - " AND pg_trigger_1.tgfoid = pg_proc_1.oid " - " AND pg_trigger_1.tgconstrrelid = pg_class_1.oid " - " AND pg_trigger_2.tgconstrrelid = pg_class_2.oid " - " AND pg_trigger_2.tgfoid = pg_proc.oid " - " AND pg_class_2.oid = pg_trigger.tgrelid " - " AND (" - " (pg_class.relname='%s') " - " AND (pg_proc.proname Like '%%upd') " - " AND (pg_proc_1.proname Like '%%del')" - " AND (pg_trigger_1.tgrelid = pg_trigger.tgconstrrelid) " - " AND (pg_trigger_2.tgrelid = pg_trigger.tgconstrrelid) " - " )", + " pg_trigger.tgnargs, " + " pg_trigger.tgdeferrable, " + " pg_trigger.tginitdeferred, " + " pg_proc.proname, " + " pg_proc_1.proname " + "FROM pg_class pg_class, " + " pg_class pg_class_1, " + " pg_class pg_class_2, " + " pg_proc pg_proc, " + " pg_proc pg_proc_1, " + " pg_trigger pg_trigger, " + " pg_trigger pg_trigger_1, " + " pg_trigger pg_trigger_2 " + "WHERE pg_trigger.tgconstrrelid = pg_class.oid " + " AND pg_trigger.tgrelid = pg_class_1.oid " + " AND pg_trigger_1.tgfoid = pg_proc_1.oid " + " AND pg_trigger_1.tgconstrrelid = pg_class_1.oid " + " AND pg_trigger_2.tgconstrrelid = pg_class_2.oid " + " AND pg_trigger_2.tgfoid = pg_proc.oid " + " AND pg_class_2.oid = pg_trigger.tgrelid " + " AND (" + " (pg_class.relname='%s') " + " AND (pg_proc.proname Like '%%upd') " + " AND (pg_proc_1.proname Like '%%del')" + " AND (pg_trigger_1.tgrelid = pg_trigger.tgconstrrelid) " + " AND (pg_trigger_2.tgrelid = pg_trigger.tgconstrrelid) " + " )", pk_table_needed); result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query)); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); - SQLFreeStmt(htbl_stmt, SQL_DROP); + SQLFreeStmt(htbl_stmt, SQL_DROP); return SQL_ERROR; } result = SQLBindCol(htbl_stmt, 1, SQL_C_BINARY, trig_args, sizeof(trig_args), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2717,7 +3103,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 2, SQL_C_SHORT, &trig_nargs, 0, NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2726,8 +3113,9 @@ Int2 result_cols; } result = SQLBindCol(htbl_stmt, 3, SQL_C_CHAR, - trig_deferrable, sizeof(trig_deferrable), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + trig_deferrable, sizeof(trig_deferrable), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2736,8 +3124,9 @@ Int2 result_cols; } result = SQLBindCol(htbl_stmt, 4, SQL_C_CHAR, - trig_initdeferred, sizeof(trig_initdeferred), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + trig_initdeferred, sizeof(trig_initdeferred), NULL); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2747,7 +3136,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 5, SQL_C_CHAR, upd_rule, sizeof(upd_rule), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2757,7 +3147,8 @@ Int2 result_cols; result = SQLBindCol(htbl_stmt, 6, SQL_C_CHAR, del_rule, sizeof(del_rule), NULL); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = tbl_stmt->errormsg; stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2769,7 +3160,8 @@ Int2 result_cols; if (result == SQL_NO_DATA_FOUND) return SQL_SUCCESS; - if(result != SQL_SUCCESS) { + if (result != SQL_SUCCESS) + { stmt->errormsg = SC_create_errormsg(htbl_stmt); stmt->errornumber = tbl_stmt->errornumber; SC_log_error(func, "", stmt); @@ -2777,79 +3169,78 @@ Int2 result_cols; return SQL_ERROR; } - while (result == SQL_SUCCESS) { + while (result == SQL_SUCCESS) + { - /* Calculate the number of key parts */ + /* Calculate the number of key parts */ num_keys = (trig_nargs - 4) / 2;; - /* Handle action (i.e., 'cascade', 'restrict', 'setnull') */ - if (!strcmp(upd_rule, "RI_FKey_cascade_upd")) { + /* Handle action (i.e., 'cascade', 'restrict', 'setnull') */ + if (!strcmp(upd_rule, "RI_FKey_cascade_upd")) upd_rule_type = SQL_CASCADE; - } else if (!strcmp(upd_rule, "RI_FKey_noaction_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_noaction_upd")) upd_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_restrict_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_restrict_upd")) upd_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_setdefault_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_setdefault_upd")) upd_rule_type = SQL_SET_DEFAULT; - } else if (!strcmp(upd_rule, "RI_FKey_setnull_upd")) { + else if (!strcmp(upd_rule, "RI_FKey_setnull_upd")) upd_rule_type = SQL_SET_NULL; - } - - if (!strcmp(upd_rule, "RI_FKey_cascade_del")) { + + if (!strcmp(upd_rule, "RI_FKey_cascade_del")) del_rule_type = SQL_CASCADE; - } else if (!strcmp(upd_rule, "RI_FKey_noaction_del")) { + else if (!strcmp(upd_rule, "RI_FKey_noaction_del")) del_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_restrict_del")) { + else if (!strcmp(upd_rule, "RI_FKey_restrict_del")) del_rule_type = SQL_NO_ACTION; - } else if (!strcmp(upd_rule, "RI_FKey_setdefault_del")) { + else if (!strcmp(upd_rule, "RI_FKey_setdefault_del")) del_rule_type = SQL_SET_DEFAULT; - } else if (!strcmp(upd_rule, "RI_FKey_setnull_del")) { + else if (!strcmp(upd_rule, "RI_FKey_setnull_del")) del_rule_type = SQL_SET_NULL; - } #if (ODBCVER >= 0x0300) /* Set deferrability type */ - if (!strcmp(trig_initdeferred, "y")) { + if (!strcmp(trig_initdeferred, "y")) defer_type = SQL_INITIALLY_DEFERRED; - } else if (!strcmp(trig_deferrable, "y")) { + else if (!strcmp(trig_deferrable, "y")) defer_type = SQL_INITIALLY_IMMEDIATE; - } else { + else defer_type = SQL_NOT_DEFERRABLE; - } -#endif /* ODBCVER >= 0x0300 */ +#endif /* ODBCVER >= 0x0300 */ mylog("Foreign Key Case#1: trig_nargs = %d, num_keys = %d\n", trig_nargs, num_keys); - /* Get to first primary key */ + /* Get to first primary key */ pkey_ptr = trig_args; for (i = 0; i < 5; i++) pkey_ptr += strlen(pkey_ptr) + 1; - /* Get to first foreign table */ + /* Get to first foreign table */ fk_table = trig_args; fk_table += strlen(fk_table) + 1; /* Get to first foreign key */ fkey_ptr = trig_args; - for (k = 0; k < 4; k++) + for (k = 0; k < 4; k++) fkey_ptr += strlen(fkey_ptr) + 1; - for (k = 0; k < num_keys; k++) { + for (k = 0; k < num_keys; k++) + { mylog("pkey_ptr = '%s', fk_table = '%s', fkey_ptr = '%s'\n", pkey_ptr, fk_table, fkey_ptr); - row = (TupleNode *)malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); + row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) * sizeof(TupleField)); mylog("pk_table_needed = '%s', pkey_ptr = '%s'\n", pk_table_needed, pkey_ptr); - set_tuplefield_null(&row->tuple[0]); - set_tuplefield_string(&row->tuple[1], ""); + set_tuplefield_null(&row->tuple[0]); + set_tuplefield_string(&row->tuple[1], ""); set_tuplefield_string(&row->tuple[2], pk_table_needed); set_tuplefield_string(&row->tuple[3], pkey_ptr); mylog("fk_table = '%s', fkey_ptr = '%s'\n", fk_table, fkey_ptr); - set_tuplefield_null(&row->tuple[4]); - set_tuplefield_string(&row->tuple[5], ""); + set_tuplefield_null(&row->tuple[4]); + set_tuplefield_string(&row->tuple[5], ""); set_tuplefield_string(&row->tuple[6], fk_table); set_tuplefield_string(&row->tuple[7], fkey_ptr); @@ -2859,20 +3250,21 @@ Int2 result_cols; set_nullfield_int2(&row->tuple[9], (Int2) upd_rule_type); set_nullfield_int2(&row->tuple[10], (Int2) del_rule_type); - set_tuplefield_null(&row->tuple[11]); - set_tuplefield_null(&row->tuple[12]); + set_tuplefield_null(&row->tuple[11]); + set_tuplefield_null(&row->tuple[12]); set_tuplefield_string(&row->tuple[13], trig_args); #if (ODBCVER >= 0x0300) mylog("defer_type = '%s'", defer_type); set_tuplefield_int2(&row->tuple[14], defer_type); -#endif /* ODBCVER >= 0x0300 */ +#endif /* ODBCVER >= 0x0300 */ QR_add_tuple(stmt->result, row); - /* next primary/foreign key */ - for (j = 0; j < 2; j++) { + /* next primary/foreign key */ + for (j = 0; j < 2; j++) + { pkey_ptr += strlen(pkey_ptr) + 1; fkey_ptr += strlen(fkey_ptr) + 1; } @@ -2880,8 +3272,9 @@ Int2 result_cols; result = SQLFetch(htbl_stmt); } - } - else { + } + else + { stmt->errormsg = "No tables specified to SQLForeignKeys."; stmt->errornumber = STMT_INTERNAL_ERROR; SC_log_error(func, "", stmt); @@ -2892,60 +3285,63 @@ Int2 result_cols; SQLFreeStmt(htbl_stmt, SQL_DROP); mylog("SQLForeignKeys(): EXIT, stmt=%u\n", stmt); - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLProcedureColumns( - HSTMT hstmt, - UCHAR FAR * szProcQualifier, - SWORD cbProcQualifier, - UCHAR FAR * szProcOwner, - SWORD cbProcOwner, - UCHAR FAR * szProcName, - SWORD cbProcName, - UCHAR FAR * szColumnName, - SWORD cbColumnName) +RETCODE SQL_API +SQLProcedureColumns( + HSTMT hstmt, + UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, + UCHAR FAR * szProcOwner, + SWORD cbProcOwner, + UCHAR FAR * szProcName, + SWORD cbProcName, + UCHAR FAR * szColumnName, + SWORD cbColumnName) { -static char *func="SQLProcedureColumns"; + static char *func = "SQLProcedureColumns"; mylog("%s: entering...\n", func); SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); - return SQL_ERROR; + return SQL_ERROR; } -RETCODE SQL_API SQLProcedures( - HSTMT hstmt, - UCHAR FAR * szProcQualifier, - SWORD cbProcQualifier, - UCHAR FAR * szProcOwner, - SWORD cbProcOwner, - UCHAR FAR * szProcName, - SWORD cbProcName) +RETCODE SQL_API +SQLProcedures( + HSTMT hstmt, + UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, + UCHAR FAR * szProcOwner, + SWORD cbProcOwner, + UCHAR FAR * szProcName, + SWORD cbProcName) { -static char *func="SQLProcedures"; + static char *func = "SQLProcedures"; mylog("%s: entering...\n", func); SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); - return SQL_ERROR; + return SQL_ERROR; } -RETCODE SQL_API SQLTablePrivileges( - HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName) +RETCODE SQL_API +SQLTablePrivileges( + HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName) { -static char *func="SQLTablePrivileges"; + static char *func = "SQLTablePrivileges"; mylog("%s: entering...\n", func); SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); - return SQL_ERROR; + return SQL_ERROR; } diff --git a/src/interfaces/odbc/iodbc.h b/src/interfaces/odbc/iodbc.h index ab6a6015ad..ef3df399a6 100644 --- a/src/interfaces/odbc/iodbc.h +++ b/src/interfaces/odbc/iodbc.h @@ -1,66 +1,66 @@ -#ifndef _IODBC_H -#define _IODBC_H - -# if !defined(WIN32) && !defined(WIN32_SYSTEM) -# define _UNIX_ - -# include -# include - -# define MEM_ALLOC(size) (malloc((size_t)(size))) -# define MEM_FREE(ptr) {if(ptr) free(ptr);} - -# define STRCPY(t, s) (strcpy((char*)(t), (char*)(s))) -# define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n))) -# define STRCAT(t, s) (strcat((char*)(t), (char*)(s))) -# define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n))) -# define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0) -# define STRLEN(str) ((str)? strlen((char*)(str)):0) - -# define EXPORT -# define CALLBACK -# define FAR - - typedef signed short SSHOR; - typedef short WORD; - typedef long DWORD; - - typedef WORD WPARAM; - typedef DWORD LPARAM; - typedef void* HWND; - typedef int BOOL; - -# endif /* _UNIX_ */ - -# if defined(WIN32) || defined(WIN32_SYSTEM) - -# include -# include - -# ifdef _MSVC_ -# define MEM_ALLOC(size) (fmalloc((size_t)(size))) -# define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0)) -# define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s))) -# define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n))) -# define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0) -# define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0) -# endif - -# ifdef _BORLAND_ -# define MEM_ALLOC(size) (farmalloc((unsigned long)(size)) -# define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0) -# define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s))) -# define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n))) -# define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0) -# define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0) -# endif - -# endif /* WIN32 */ - -# define SYSERR (-1) - -# ifndef NULL -# define NULL ((void FAR*)0UL) -# endif +#ifndef _IODBC_H +#define _IODBC_H + +#if !defined(WIN32) && !defined(WIN32_SYSTEM) +#define _UNIX_ + +#include +#include + +#define MEM_ALLOC(size) (malloc((size_t)(size))) +#define MEM_FREE(ptr) {if(ptr) free(ptr);} + +#define STRCPY(t, s) (strcpy((char*)(t), (char*)(s))) +#define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n))) +#define STRCAT(t, s) (strcat((char*)(t), (char*)(s))) +#define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n))) +#define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0) +#define STRLEN(str) ((str)? strlen((char*)(str)):0) + +#define EXPORT +#define CALLBACK +#define FAR + +typedef signed short SSHOR; +typedef short WORD; +typedef long DWORD; + +typedef WORD WPARAM; +typedef DWORD LPARAM; +typedef void *HWND; +typedef int BOOL; + +#endif /* _UNIX_ */ + +#if defined(WIN32) || defined(WIN32_SYSTEM) + +#include +#include + +#ifdef _MSVC_ +#define MEM_ALLOC(size) (fmalloc((size_t)(size))) +#define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0)) +#define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s))) +#define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n))) +#define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0) +#define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0) +#endif + +#ifdef _BORLAND_ +#define MEM_ALLOC(size) (farmalloc((unsigned long)(size)) +#define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0) +#define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s))) +#define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n))) +#define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0) +#define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0) +#endif + +#endif /* WIN32 */ + +#define SYSERR (-1) + +#ifndef NULL +#define NULL ((void FAR*)0UL) +#endif #endif diff --git a/src/interfaces/odbc/isql.h b/src/interfaces/odbc/isql.h index deeddd3db0..de50b89248 100644 --- a/src/interfaces/odbc/isql.h +++ b/src/interfaces/odbc/isql.h @@ -2,97 +2,97 @@ * include path to be used to create ODBC compliant applications. */ #ifndef _INTRINSIC_SQL_H -# define _INTRINSIC_SQL_H +#define _INTRINSIC_SQL_H -typedef unsigned char UCHAR; -typedef long int SDWORD; -typedef short int SWORD; -typedef unsigned long int UDWORD; -typedef unsigned short int UWORD; +typedef unsigned char UCHAR; +typedef long int SDWORD; +typedef short int SWORD; +typedef unsigned long int UDWORD; +typedef unsigned short int UWORD; -typedef void FAR* PTR; +typedef void FAR *PTR; -typedef void FAR* HENV; -typedef void FAR* HDBC; -typedef void FAR* HSTMT; +typedef void FAR *HENV; +typedef void FAR *HDBC; +typedef void FAR *HSTMT; -typedef signed short RETCODE; +typedef signed short RETCODE; -# ifdef WIN32 -# define SQL_API __stdcall -# else -# define SQL_API EXPORT CALLBACK -# endif +#ifdef WIN32 +#define SQL_API __stdcall +#else +#define SQL_API EXPORT CALLBACK +#endif -# define ODBCVER 0x0250 +#define ODBCVER 0x0250 -# define SQL_MAX_MESSAGE_LENGTH 512 -# define SQL_MAX_DSN_LENGTH 32 +#define SQL_MAX_MESSAGE_LENGTH 512 +#define SQL_MAX_DSN_LENGTH 32 /* return code */ -# define SQL_INVALID_HANDLE (-2) -# define SQL_ERROR (-1) -# define SQL_SUCCESS 0 -# define SQL_SUCCESS_WITH_INFO 1 -# define SQL_NO_DATA_FOUND 100 +#define SQL_INVALID_HANDLE (-2) +#define SQL_ERROR (-1) +#define SQL_SUCCESS 0 +#define SQL_SUCCESS_WITH_INFO 1 +#define SQL_NO_DATA_FOUND 100 /* standard SQL datatypes (agree with ANSI type numbering) */ -# define SQL_CHAR 1 -# define SQL_NUMERIC 2 -# define SQL_DECIMAL 3 -# define SQL_INTEGER 4 -# define SQL_SMALLINT 5 -# define SQL_FLOAT 6 -# define SQL_REAL 7 -# define SQL_DOUBLE 8 -# define SQL_VARCHAR 12 - -# define SQL_TYPE_MIN SQL_CHAR -# define SQL_TYPE_NULL 0 -# define SQL_TYPE_MAX SQL_VARCHAR +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#define SQL_VARCHAR 12 + +#define SQL_TYPE_MIN SQL_CHAR +#define SQL_TYPE_NULL 0 +#define SQL_TYPE_MAX SQL_VARCHAR /* C to SQL datatype mapping */ -# define SQL_C_CHAR SQL_CHAR -# define SQL_C_LONG SQL_INTEGER -# define SQL_C_SHORT SQL_SMALLINT -# define SQL_C_FLOAT SQL_REAL -# define SQL_C_DOUBLE SQL_DOUBLE -# define SQL_C_DEFAULT 99 +#define SQL_C_CHAR SQL_CHAR +#define SQL_C_LONG SQL_INTEGER +#define SQL_C_SHORT SQL_SMALLINT +#define SQL_C_FLOAT SQL_REAL +#define SQL_C_DOUBLE SQL_DOUBLE +#define SQL_C_DEFAULT 99 -# define SQL_NO_NULLS 0 -# define SQL_NULLABLE 1 -# define SQL_NULLABLE_UNKNOWN 2 +#define SQL_NO_NULLS 0 +#define SQL_NULLABLE 1 +#define SQL_NULLABLE_UNKNOWN 2 /* some special length values */ -# define SQL_NULL_DATA (-1) -# define SQL_DATA_AT_EXEC (-2) -# define SQL_NTS (-3) +#define SQL_NULL_DATA (-1) +#define SQL_DATA_AT_EXEC (-2) +#define SQL_NTS (-3) /* SQLFreeStmt flag values */ -# define SQL_CLOSE 0 -# define SQL_DROP 1 -# define SQL_UNBIND 2 -# define SQL_RESET_PARAMS 3 +#define SQL_CLOSE 0 +#define SQL_DROP 1 +#define SQL_UNBIND 2 +#define SQL_RESET_PARAMS 3 /* SQLTransact flag values */ -# define SQL_COMMIT 0 -# define SQL_ROLLBACK 1 +#define SQL_COMMIT 0 +#define SQL_ROLLBACK 1 /* SQLColAttributes flag values */ -# define SQL_COLUMN_COUNT 0 -# define SQL_COLUMN_LABEL 18 -# define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL -# define SQL_COLUMN_DRIVER_START 1000 +#define SQL_COLUMN_COUNT 0 +#define SQL_COLUMN_LABEL 18 +#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL +#define SQL_COLUMN_DRIVER_START 1000 -# define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT +#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT /* Null handles */ -# define SQL_NULL_HENV 0 -# define SQL_NULL_HDBC 0 -# define SQL_NULL_HSTMT 0 +#define SQL_NULL_HENV 0 +#define SQL_NULL_HDBC 0 +#define SQL_NULL_HSTMT 0 /* All code below has been added to the original isql.h coming from iodbc */ -typedef unsigned char BYTE; +typedef unsigned char BYTE; /* More SQLColAttributes flag values */ #define SQL_COLUMN_NAME 1 @@ -116,9 +116,9 @@ typedef unsigned char BYTE; /* SQLColAttributes Searchable flags */ #define SQL_UNSEARCHABLE 0 #define SQL_LIKE_ONLY 1 -#define SQL_ALL_EXCEPT_LIKE 2 +#define SQL_ALL_EXCEPT_LIKE 2 #define SQL_SEARCHABLE 3 -#define SQL_PRED_SEARCHABLE SQL_SEARCHABLE +#define SQL_PRED_SEARCHABLE SQL_SEARCHABLE /* SQLColAttributes Updateable flags */ #define SQL_ATTR_READONLY 0 @@ -126,112 +126,113 @@ typedef unsigned char BYTE; #define SQL_ATTR_READWRITE_UNKNOWN 2 /* - * function prototypes previously not contained in isql.h + * function prototypes previously not contained in isql.h */ #ifdef __cplusplus -extern "C" +extern "C" { #endif -RETCODE SQL_API SQLAllocConnect (HENV henv, - HDBC FAR * phdbc); -RETCODE SQL_API SQLAllocEnv (HENV FAR * phenv); -RETCODE SQL_API SQLAllocStmt (HDBC hdbc, - HSTMT FAR * phstmt); -RETCODE SQL_API SQLBindCol (HSTMT hstmt, - UWORD icol, - SWORD fCType, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR * pcbValue); - -RETCODE SQL_API SQLCancel (HSTMT hstmt); - -RETCODE SQL_API SQLColAttributes (HSTMT hstmt, - UWORD icol, - UWORD fDescType, - PTR rgbDesc, - SWORD cbDescMax, - SWORD FAR * pcbDesc, - SDWORD FAR * pfDesc); - -RETCODE SQL_API SQLConnect (HDBC hdbc, - UCHAR FAR * szDSN, - SWORD cbDSN, - UCHAR FAR * szUID, - SWORD cbUID, - UCHAR FAR * szAuthStr, - SWORD cbAuthStr); - -RETCODE SQL_API SQLDescribeCol (HSTMT hstmt, - UWORD icol, - UCHAR FAR * szColName, - SWORD cbColNameMax, - SWORD FAR * pcbColName, - SWORD FAR * pfSqlType, - UDWORD FAR * pcbColDef, - SWORD FAR * pibScale, - SWORD FAR * pfNullable); - -RETCODE SQL_API SQLDisconnect (HDBC hdbc); - -RETCODE SQL_API SQLError (HENV henv, - HDBC hdbc, - HSTMT hstmt, - UCHAR FAR * szSqlState, - SDWORD FAR * pfNativeError, - UCHAR FAR * szErrorMsg, - SWORD cbErrorMsgMax, - SWORD FAR * pcbErrorMsg); - -RETCODE SQL_API SQLExecDirect (HSTMT hstmt, - UCHAR FAR * szSqlStr, - SDWORD cbSqlStr); - -RETCODE SQL_API SQLExecute (HSTMT hstmt); - -RETCODE SQL_API SQLFetch (HSTMT hstmt); - -RETCODE SQL_API SQLFreeConnect (HDBC hdbc); - -RETCODE SQL_API SQLFreeEnv (HENV henv); - -RETCODE SQL_API SQLFreeStmt (HSTMT hstmt, - UWORD fOption); - -RETCODE SQL_API SQLGetCursorName (HSTMT hstmt, - UCHAR FAR * szCursor, - SWORD cbCursorMax, - SWORD FAR * pcbCursor); - -RETCODE SQL_API SQLNumResultCols (HSTMT hstmt, - SWORD FAR * pccol); - -RETCODE SQL_API SQLPrepare (HSTMT hstmt, - UCHAR FAR * szSqlStr, - SDWORD cbSqlStr); - -RETCODE SQL_API SQLRowCount (HSTMT hstmt, - SDWORD FAR * pcrow); - -RETCODE SQL_API SQLSetCursorName (HSTMT hstmt, - UCHAR FAR * szCursor, - SWORD cbCursor); - -RETCODE SQL_API SQLTransact (HENV henv, - HDBC hdbc, - UWORD fType); - -RETCODE SQL_API SQLSetParam (HSTMT hstmt, - UWORD ipar, - SWORD fCType, - SWORD fSqlType, - UDWORD cbColDef, - SWORD ibScale, - PTR rgbValue, - SDWORD FAR * pcbValue); + RETCODE SQL_API SQLAllocConnect(HENV henv, + HDBC FAR * phdbc); + RETCODE SQL_API SQLAllocEnv(HENV FAR * phenv); + RETCODE SQL_API SQLAllocStmt(HDBC hdbc, + HSTMT FAR * phstmt); + RETCODE SQL_API SQLBindCol(HSTMT hstmt, + UWORD icol, + SWORD fCType, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue); + + RETCODE SQL_API SQLCancel(HSTMT hstmt); + + RETCODE SQL_API SQLColAttributes(HSTMT hstmt, + UWORD icol, + UWORD fDescType, + PTR rgbDesc, + SWORD cbDescMax, + SWORD FAR * pcbDesc, + SDWORD FAR * pfDesc); + + RETCODE SQL_API SQLConnect(HDBC hdbc, + UCHAR FAR * szDSN, + SWORD cbDSN, + UCHAR FAR * szUID, + SWORD cbUID, + UCHAR FAR * szAuthStr, + SWORD cbAuthStr); + + RETCODE SQL_API SQLDescribeCol(HSTMT hstmt, + UWORD icol, + UCHAR FAR * szColName, + SWORD cbColNameMax, + SWORD FAR * pcbColName, + SWORD FAR * pfSqlType, + UDWORD FAR * pcbColDef, + SWORD FAR * pibScale, + SWORD FAR * pfNullable); + + RETCODE SQL_API SQLDisconnect(HDBC hdbc); + + RETCODE SQL_API SQLError(HENV henv, + HDBC hdbc, + HSTMT hstmt, + UCHAR FAR * szSqlState, + SDWORD FAR * pfNativeError, + UCHAR FAR * szErrorMsg, + SWORD cbErrorMsgMax, + SWORD FAR * pcbErrorMsg); + + RETCODE SQL_API SQLExecDirect(HSTMT hstmt, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStr); + + RETCODE SQL_API SQLExecute(HSTMT hstmt); + + RETCODE SQL_API SQLFetch(HSTMT hstmt); + + RETCODE SQL_API SQLFreeConnect(HDBC hdbc); + + RETCODE SQL_API SQLFreeEnv(HENV henv); + + RETCODE SQL_API SQLFreeStmt(HSTMT hstmt, + UWORD fOption); + + RETCODE SQL_API SQLGetCursorName(HSTMT hstmt, + UCHAR FAR * szCursor, + SWORD cbCursorMax, + SWORD FAR * pcbCursor); + + RETCODE SQL_API SQLNumResultCols(HSTMT hstmt, + SWORD FAR * pccol); + + RETCODE SQL_API SQLPrepare(HSTMT hstmt, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStr); + + RETCODE SQL_API SQLRowCount(HSTMT hstmt, + SDWORD FAR * pcrow); + + RETCODE SQL_API SQLSetCursorName(HSTMT hstmt, + UCHAR FAR * szCursor, + SWORD cbCursor); + + RETCODE SQL_API SQLTransact(HENV henv, + HDBC hdbc, + UWORD fType); + + RETCODE SQL_API SQLSetParam(HSTMT hstmt, + UWORD ipar, + SWORD fCType, + SWORD fSqlType, + UDWORD cbColDef, + SWORD ibScale, + PTR rgbValue, + SDWORD FAR * pcbValue); #ifdef __cplusplus } + +#endif #endif -#endif diff --git a/src/interfaces/odbc/isqlext.h b/src/interfaces/odbc/isqlext.h index b14b15af19..06bace95d4 100644 --- a/src/interfaces/odbc/isqlext.h +++ b/src/interfaces/odbc/isqlext.h @@ -2,213 +2,213 @@ * missing function prototypes and appropriate #defines. It is designed * to be a drop in replacement for isqlext.h from iodbc. */ -#ifndef _INTRINSIC_SQLEXT_H -# define _INTRINSIC_SQLEXT_H +#ifndef _INTRINSIC_SQLEXT_H +#define _INTRINSIC_SQLEXT_H -# include "isql.h" +#include "isql.h" -# define SQL_STILL_EXECUTING 2 -# define SQL_NEED_DATA 99 +#define SQL_STILL_EXECUTING 2 +#define SQL_NEED_DATA 99 /* extend SQL datatypes */ -# define SQL_DATE 9 -# define SQL_TIME 10 -# define SQL_TIMESTAMP 11 -# define SQL_LONGVARCHAR (-1) -# define SQL_BINARY (-2) -# define SQL_VARBINARY (-3) -# define SQL_LONGVARBINARY (-4) -# define SQL_BIGINT (-5) -# define SQL_TINYINT (-6) -# define SQL_BIT (-7) /* conflict with SQL3 ??? */ -# define SQL_TYPE_DRIVER_START (-80) +#define SQL_DATE 9 +#define SQL_TIME 10 +#define SQL_TIMESTAMP 11 +#define SQL_LONGVARCHAR (-1) +#define SQL_BINARY (-2) +#define SQL_VARBINARY (-3) +#define SQL_LONGVARBINARY (-4) +#define SQL_BIGINT (-5) +#define SQL_TINYINT (-6) +#define SQL_BIT (-7) /* conflict with SQL3 ??? */ +#define SQL_TYPE_DRIVER_START (-80) /* C to SQL datatype mapping */ -# define SQL_C_DATE SQL_DATE -# define SQL_C_TIME SQL_TIME -# define SQL_C_TIMESTAMP SQL_TIMESTAMP -# define SQL_C_BINARY SQL_BINARY -# define SQL_C_BIT SQL_BIT -# define SQL_C_TINYINT SQL_TINYINT - -# define SQL_SIGNED_OFFSET (-20) -# define SQL_UNSIGNED_OFFSET (-22) - -# define SQL_C_SLONG (SQL_C_LONG + SQL_SIGNED_OFFSET) -# define SQL_C_SSHORT (SQL_C_SHORT + SQL_SIGNED_OFFSET) -# define SQL_C_STINYINT (SQL_TINYINT + SQL_SIGNED_OFFSET) -# define SQL_C_ULONG (SQL_C_LONG + SQL_UNSIGNED_OFFSET) -# define SQL_C_USHORT (SQL_C_SHORT + SQL_UNSIGNED_OFFSET) -# define SQL_C_UTINYINT (SQL_TINYINT + SQL_UNSIGNED_OFFSET) -# define SQL_C_BOOKMARK SQL_C_ULONG - -# if defined(SQL_TYPE_MIN) -# undef SQL_TYPE_MIN -# define SQL_TYPE_MIN SQL_BIT -/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then, - * SQL_TYPE_MIN need to be defined as SQL_TINYINT +#define SQL_C_DATE SQL_DATE +#define SQL_C_TIME SQL_TIME +#define SQL_C_TIMESTAMP SQL_TIMESTAMP +#define SQL_C_BINARY SQL_BINARY +#define SQL_C_BIT SQL_BIT +#define SQL_C_TINYINT SQL_TINYINT + +#define SQL_SIGNED_OFFSET (-20) +#define SQL_UNSIGNED_OFFSET (-22) + +#define SQL_C_SLONG (SQL_C_LONG + SQL_SIGNED_OFFSET) +#define SQL_C_SSHORT (SQL_C_SHORT + SQL_SIGNED_OFFSET) +#define SQL_C_STINYINT (SQL_TINYINT + SQL_SIGNED_OFFSET) +#define SQL_C_ULONG (SQL_C_LONG + SQL_UNSIGNED_OFFSET) +#define SQL_C_USHORT (SQL_C_SHORT + SQL_UNSIGNED_OFFSET) +#define SQL_C_UTINYINT (SQL_TINYINT + SQL_UNSIGNED_OFFSET) +#define SQL_C_BOOKMARK SQL_C_ULONG + +#if defined(SQL_TYPE_MIN) +#undef SQL_TYPE_MIN +#define SQL_TYPE_MIN SQL_BIT +/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then, + * SQL_TYPE_MIN need to be defined as SQL_TINYINT * (i.e. -6). */ -# endif +#endif -# define SQL_ALL_TYPES 0 +#define SQL_ALL_TYPES 0 /* SQLDriverConnect flag values */ -# define SQL_DRIVER_NOPROMPT 0 -# define SQL_DRIVER_COMPLETE 1 -# define SQL_DRIVER_PROMPT 2 -# define SQL_DRIVER_COMPLETE_REQUIRED 3 +#define SQL_DRIVER_NOPROMPT 0 +#define SQL_DRIVER_COMPLETE 1 +#define SQL_DRIVER_PROMPT 2 +#define SQL_DRIVER_COMPLETE_REQUIRED 3 /* SQLSetParam extensions */ -# define SQL_DEFAULT_PARAM (-5) -# define SQL_IGNORE (-6) +#define SQL_DEFAULT_PARAM (-5) +#define SQL_IGNORE (-6) /* function number for SQLGetFunctions and _iodbcdm_getproc */ -# define SQL_API_SQLALLOCCONNECT 1 -# define SQL_API_SQLALLOCENV 2 -# define SQL_API_SQLALLOCSTMT 3 -# define SQL_API_SQLBINDCOL 4 -# define SQL_API_SQLCANCEL 5 -# define SQL_API_SQLCOLATTRIBUTES 6 -# define SQL_API_SQLCONNECT 7 -# define SQL_API_SQLDESCRIBECOL 8 -# define SQL_API_SQLDISCONNECT 9 -# define SQL_API_SQLERROR 10 -# define SQL_API_SQLEXECDIRECT 11 -# define SQL_API_SQLEXECUTE 12 -# define SQL_API_SQLFETCH 13 -# define SQL_API_SQLFREECONNECT 14 -# define SQL_API_SQLFREEENV 15 -# define SQL_API_SQLFREESTMT 16 -# define SQL_API_SQLGETCURSORNAME 17 -# define SQL_API_SQLNUMRESULTCOLS 18 -# define SQL_API_SQLPREPARE 19 -# define SQL_API_SQLROWCOUNT 20 -# define SQL_API_SQLSETCURSORNAME 21 -# define SQL_API_SQLSETPARAM 22 -# define SQL_API_SQLTRANSACT 23 - -# define SQL_NUM_FUNCTIONS 23 - -# define SQL_EXT_API_START 40 - -# define SQL_API_SQLCOLUMNS 40 - -# define SQL_API_SQLDRIVERCONNECT 41 -# define SQL_API_SQLGETCONNECTOPTION 42 -# define SQL_API_SQLGETDATA 43 -# define SQL_API_SQLGETFUNCTIONS 44 -# define SQL_API_SQLGETINFO 45 -# define SQL_API_SQLGETSTMTOPTION 46 -# define SQL_API_SQLGETTYPEINFO 47 -# define SQL_API_SQLPARAMDATA 48 -# define SQL_API_SQLPUTDATA 49 -# define SQL_API_SQLSETCONNECTOPTION 50 -# define SQL_API_SQLSETSTMTOPTION 51 -# define SQL_API_SQLSPECIALCOLUMNS 52 -# define SQL_API_SQLSTATISTICS 53 -# define SQL_API_SQLTABLES 54 - -# define SQL_API_SQLBROWSECONNECT 55 -# define SQL_API_SQLCOLUMNPRIVILEGES 56 -# define SQL_API_SQLDATASOURCES 57 -# define SQL_API_SQLDESCRIBEPARAM 58 -# define SQL_API_SQLEXTENDEDFETCH 59 -# define SQL_API_SQLFOREIGNKEYS 60 -# define SQL_API_SQLMORERESULTS 61 -# define SQL_API_SQLNATIVESQL 62 -# define SQL_API_SQLNUMPARAMS 63 -# define SQL_API_SQLPARAMOPTIONS 64 -# define SQL_API_SQLPRIMARYKEYS 65 -# define SQL_API_SQLPROCEDURECOLUMNS 66 -# define SQL_API_SQLPROCEDURES 67 -# define SQL_API_SQLSETPOS 68 -# define SQL_API_SQLSETSCROLLOPTIONS 69 -# define SQL_API_SQLTABLEPRIVILEGES 70 - -# define SQL_API_SQLDRIVERS 71 -# define SQL_API_SQLBINDPARAMETER 72 -# define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER +#define SQL_API_SQLALLOCCONNECT 1 +#define SQL_API_SQLALLOCENV 2 +#define SQL_API_SQLALLOCSTMT 3 +#define SQL_API_SQLBINDCOL 4 +#define SQL_API_SQLCANCEL 5 +#define SQL_API_SQLCOLATTRIBUTES 6 +#define SQL_API_SQLCONNECT 7 +#define SQL_API_SQLDESCRIBECOL 8 +#define SQL_API_SQLDISCONNECT 9 +#define SQL_API_SQLERROR 10 +#define SQL_API_SQLEXECDIRECT 11 +#define SQL_API_SQLEXECUTE 12 +#define SQL_API_SQLFETCH 13 +#define SQL_API_SQLFREECONNECT 14 +#define SQL_API_SQLFREEENV 15 +#define SQL_API_SQLFREESTMT 16 +#define SQL_API_SQLGETCURSORNAME 17 +#define SQL_API_SQLNUMRESULTCOLS 18 +#define SQL_API_SQLPREPARE 19 +#define SQL_API_SQLROWCOUNT 20 +#define SQL_API_SQLSETCURSORNAME 21 +#define SQL_API_SQLSETPARAM 22 +#define SQL_API_SQLTRANSACT 23 + +#define SQL_NUM_FUNCTIONS 23 + +#define SQL_EXT_API_START 40 + +#define SQL_API_SQLCOLUMNS 40 + +#define SQL_API_SQLDRIVERCONNECT 41 +#define SQL_API_SQLGETCONNECTOPTION 42 +#define SQL_API_SQLGETDATA 43 +#define SQL_API_SQLGETFUNCTIONS 44 +#define SQL_API_SQLGETINFO 45 +#define SQL_API_SQLGETSTMTOPTION 46 +#define SQL_API_SQLGETTYPEINFO 47 +#define SQL_API_SQLPARAMDATA 48 +#define SQL_API_SQLPUTDATA 49 +#define SQL_API_SQLSETCONNECTOPTION 50 +#define SQL_API_SQLSETSTMTOPTION 51 +#define SQL_API_SQLSPECIALCOLUMNS 52 +#define SQL_API_SQLSTATISTICS 53 +#define SQL_API_SQLTABLES 54 + +#define SQL_API_SQLBROWSECONNECT 55 +#define SQL_API_SQLCOLUMNPRIVILEGES 56 +#define SQL_API_SQLDATASOURCES 57 +#define SQL_API_SQLDESCRIBEPARAM 58 +#define SQL_API_SQLEXTENDEDFETCH 59 +#define SQL_API_SQLFOREIGNKEYS 60 +#define SQL_API_SQLMORERESULTS 61 +#define SQL_API_SQLNATIVESQL 62 +#define SQL_API_SQLNUMPARAMS 63 +#define SQL_API_SQLPARAMOPTIONS 64 +#define SQL_API_SQLPRIMARYKEYS 65 +#define SQL_API_SQLPROCEDURECOLUMNS 66 +#define SQL_API_SQLPROCEDURES 67 +#define SQL_API_SQLSETPOS 68 +#define SQL_API_SQLSETSCROLLOPTIONS 69 +#define SQL_API_SQLTABLEPRIVILEGES 70 + +#define SQL_API_SQLDRIVERS 71 +#define SQL_API_SQLBINDPARAMETER 72 +#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER #define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST - SQL_EXT_API_START + 1) -# define SQL_API_ALL_FUNCTIONS 0 +#define SQL_API_ALL_FUNCTIONS 0 /* SQLGetInfo infor number */ -# define SQL_INFO_FIRST 0 -# define SQL_DRIVER_HDBC 3 -# define SQL_DRIVER_HENV 4 -# define SQL_DRIVER_HSTMT 5 -# define SQL_DRIVER_NAME 6 -# define SQL_ODBC_VER 10 -# define SQL_CURSOR_COMMIT_BEHAVIOR 23 -# define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 -# define SQL_DEFAULT_TXN_ISOLATION 26 +#define SQL_INFO_FIRST 0 +#define SQL_DRIVER_HDBC 3 +#define SQL_DRIVER_HENV 4 +#define SQL_DRIVER_HSTMT 5 +#define SQL_DRIVER_NAME 6 +#define SQL_ODBC_VER 10 +#define SQL_CURSOR_COMMIT_BEHAVIOR 23 +#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 +#define SQL_DEFAULT_TXN_ISOLATION 26 -# define SQL_TXN_ISOLATION_OPTION 72 -# define SQL_NON_NULLABLE_COLUMNS 75 +#define SQL_TXN_ISOLATION_OPTION 72 +#define SQL_NON_NULLABLE_COLUMNS 75 -# define SQL_DRIVER_HLIB 76 -# define SQL_DRIVER_ODBC_VER 77 +#define SQL_DRIVER_HLIB 76 +#define SQL_DRIVER_ODBC_VER 77 -# define SQL_QUALIFIER_LOCATION 114 +#define SQL_QUALIFIER_LOCATION 114 -# define SQL_INFO_LAST SQL_QUALIFIER_LOCATION +#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION -# define SQL_INFO_DRIVER_START 1000 +#define SQL_INFO_DRIVER_START 1000 /* SQL_TXN_ISOLATION_OPTION masks */ -# define SQL_TXN_READ_UNCOMMITTED 0x00000001L -# define SQL_TXN_READ_COMMITTED 0x00000002L -# define SQL_TXN_REPEATABLE_READ 0x00000004L -# define SQL_TXN_SERIALIZABLE 0x00000008L -# define SQL_TXN_VERSIONING 0x00000010L +#define SQL_TXN_READ_UNCOMMITTED 0x00000001L +#define SQL_TXN_READ_COMMITTED 0x00000002L +#define SQL_TXN_REPEATABLE_READ 0x00000004L +#define SQL_TXN_SERIALIZABLE 0x00000008L +#define SQL_TXN_VERSIONING 0x00000010L /* SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR values */ -# define SQL_CB_DELETE 0x0000 -# define SQL_CB_CLOSE 0x0001 -# define SQL_CB_PRESERVE 0x0002 +#define SQL_CB_DELETE 0x0000 +#define SQL_CB_CLOSE 0x0001 +#define SQL_CB_PRESERVE 0x0002 /* options for SQLGetStmtOption/SQLSetStmtOption */ -# define SQL_QUERY_TIMEOUT 0 -# define SQL_MAX_ROWS 1 -# define SQL_NOSCAN 2 -# define SQL_MAX_LENGTH 3 -# define SQL_ASYNC_ENABLE 4 -# define SQL_BIND_TYPE 5 -# define SQL_CURSOR_TYPE 6 -# define SQL_CONCURRENCY 7 -# define SQL_KEYSET_SIZE 8 -# define SQL_ROWSET_SIZE 9 -# define SQL_SIMULATE_CURSOR 10 -# define SQL_RETRIEVE_DATA 11 -# define SQL_USE_BOOKMARKS 12 -# define SQL_GET_BOOKMARK 13 /* GetStmtOption Only */ -# define SQL_ROW_NUMBER 14 /* GetStmtOption Only */ -# define SQL_STMT_OPT_MAX SQL_ROW_NUMBER - -# define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT +#define SQL_QUERY_TIMEOUT 0 +#define SQL_MAX_ROWS 1 +#define SQL_NOSCAN 2 +#define SQL_MAX_LENGTH 3 +#define SQL_ASYNC_ENABLE 4 +#define SQL_BIND_TYPE 5 +#define SQL_CURSOR_TYPE 6 +#define SQL_CONCURRENCY 7 +#define SQL_KEYSET_SIZE 8 +#define SQL_ROWSET_SIZE 9 +#define SQL_SIMULATE_CURSOR 10 +#define SQL_RETRIEVE_DATA 11 +#define SQL_USE_BOOKMARKS 12 +#define SQL_GET_BOOKMARK 13 /* GetStmtOption Only */ +#define SQL_ROW_NUMBER 14 /* GetStmtOption Only */ +#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER + +#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT /* * ODBC 3.0 renames the above to SQL_ATTR_ values. At this time I don't * know if they have also been renumbered or not, I will assume not. */ -# define SQL_ATTR_QUERY_TIMEOUT 0 -# define SQL_ATTR_MAX_ROWS 1 -# define SQL_ATTR_NOSCAN 2 -# define SQL_ATTR_MAX_LENGTH 3 -# define SQL_ATTR_ASYNC_ENABLE 4 -# define SQL_ATTR_BIND_TYPE 5 -# define SQL_ATTR_CURSOR_TYPE 6 -# define SQL_ATTR_CONCURRENCY 7 -# define SQL_ATTR_KEYSET_SIZE 8 -# define SQL_ATTR_ROWSET_SIZE 9 -# define SQL_ATTR_SIMULATE_CURSOR 10 -# define SQL_ATTR_RETRIEVE_DATA 11 -# define SQL_ATTR_USE_BOOKMARKS 12 -# define SQL_ATTR_GET_BOOKMARK 13 /* GetStmtOption Only */ -# define SQL_ATTR_ROW_NUMBER 14 /* GetStmtOption Only */ +#define SQL_ATTR_QUERY_TIMEOUT 0 +#define SQL_ATTR_MAX_ROWS 1 +#define SQL_ATTR_NOSCAN 2 +#define SQL_ATTR_MAX_LENGTH 3 +#define SQL_ATTR_ASYNC_ENABLE 4 +#define SQL_ATTR_BIND_TYPE 5 +#define SQL_ATTR_CURSOR_TYPE 6 +#define SQL_ATTR_CONCURRENCY 7 +#define SQL_ATTR_KEYSET_SIZE 8 +#define SQL_ATTR_ROWSET_SIZE 9 +#define SQL_ATTR_SIMULATE_CURSOR 10 +#define SQL_ATTR_RETRIEVE_DATA 11 +#define SQL_ATTR_USE_BOOKMARKS 12 +#define SQL_ATTR_GET_BOOKMARK 13 /* GetStmtOption Only */ +#define SQL_ATTR_ROW_NUMBER 14 /* GetStmtOption Only */ /* New in ODBC 3.0 */ #define SQL_ATTR_APP_PARAM_DESC 15 @@ -216,7 +216,7 @@ #define SQL_ATTR_CURSOR_SCROLLABLE 17 #define SQL_ATTR_CURSOR_SENSITITY 18 #define SQL_ATTR_ENABLE_AUTO_IPD 19 -#define SQL_ATTR_FETCH_BOOKMARK_PTR 20 +#define SQL_ATTR_FETCH_BOOKMARK_PTR 20 #define SQL_ATTR_IMP_PARAM_DESC 21 #define SQL_ATTR_IMP_ROW_DESC 22 #define SQL_ATTR_METADATA_ID 23 @@ -236,80 +236,80 @@ #define SQL_STMT_ATTR_MAX SQL_ATTR_ROWS_FETCHED_PTR /* SQL_QUERY_TIMEOUT options */ -# define SQL_QUERY_TIMEOUT_DEFAULT 0UL +#define SQL_QUERY_TIMEOUT_DEFAULT 0UL /* SQL_MAX_ROWS options */ -# define SQL_MAX_ROWS_DEFAULT 0UL +#define SQL_MAX_ROWS_DEFAULT 0UL /* SQL_MAX_LENGTH options */ -# define SQL_MAX_LENGTH_DEFAULT 0UL +#define SQL_MAX_LENGTH_DEFAULT 0UL /* SQL_CONCURRENCY options */ -# define SQL_CONCUR_READ_ONLY 1 -# define SQL_CONCUR_LOCK 2 -# define SQL_CONCUR_ROWVER 3 -# define SQL_CONCUR_VALUES 4 +#define SQL_CONCUR_READ_ONLY 1 +#define SQL_CONCUR_LOCK 2 +#define SQL_CONCUR_ROWVER 3 +#define SQL_CONCUR_VALUES 4 /* options for SQLSetConnectOption/SQLGetConnectOption */ -# define SQL_ACCESS_MODE 101 -# define SQL_AUTOCOMMIT 102 -# define SQL_LOGIN_TIMEOUT 103 -# define SQL_OPT_TRACE 104 -# define SQL_OPT_TRACEFILE 105 -# define SQL_TRANSLATE_DLL 106 -# define SQL_TRANSLATE_OPTION 107 -# define SQL_TXN_ISOLATION 108 -# define SQL_CURRENT_QUALIFIER 109 -# define SQL_ODBC_CURSORS 110 -# define SQL_QUIET_MODE 111 -# define SQL_PACKET_SIZE 112 -# define SQL_CONN_OPT_MAX SQL_PACKET_SIZE -# define SQL_CONNECT_OPT_DRVR_START 1000 - -# define SQL_CONN_OPT_MIN SQL_ACCESS_MODE +#define SQL_ACCESS_MODE 101 +#define SQL_AUTOCOMMIT 102 +#define SQL_LOGIN_TIMEOUT 103 +#define SQL_OPT_TRACE 104 +#define SQL_OPT_TRACEFILE 105 +#define SQL_TRANSLATE_DLL 106 +#define SQL_TRANSLATE_OPTION 107 +#define SQL_TXN_ISOLATION 108 +#define SQL_CURRENT_QUALIFIER 109 +#define SQL_ODBC_CURSORS 110 +#define SQL_QUIET_MODE 111 +#define SQL_PACKET_SIZE 112 +#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE +#define SQL_CONNECT_OPT_DRVR_START 1000 + +#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE /* SQL_ACCESS_MODE options */ -# define SQL_MODE_READ_WRITE 0UL -# define SQL_MODE_READ_ONLY 1UL -# define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE +#define SQL_MODE_READ_WRITE 0UL +#define SQL_MODE_READ_ONLY 1UL +#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE /* SQL_AUTOCOMMIT options */ -# define SQL_AUTOCOMMIT_OFF 0UL -# define SQL_AUTOCOMMIT_ON 1UL -# define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON +#define SQL_AUTOCOMMIT_OFF 0UL +#define SQL_AUTOCOMMIT_ON 1UL +#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON /* SQL_LOGIN_TIMEOUT options */ -# define SQL_LOGIN_TIMEOUT_DEFAULT 15UL +#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL /* SQL_OPT_TRACE options */ -# define SQL_OPT_TRACE_OFF 0UL -# define SQL_OPT_TRACE_ON 1UL -# define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF -# define SQL_OPT_TRACE_FILE_DEFAULT "odbc.log" +#define SQL_OPT_TRACE_OFF 0UL +#define SQL_OPT_TRACE_ON 1UL +#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF +#define SQL_OPT_TRACE_FILE_DEFAULT "odbc.log" /* SQL_ODBC_CURSORS options */ -# define SQL_CUR_USE_IF_NEEDED 0UL -# define SQL_CUR_USE_ODBC 1UL -# define SQL_CUR_USE_DRIVER 2UL -# define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER +#define SQL_CUR_USE_IF_NEEDED 0UL +#define SQL_CUR_USE_ODBC 1UL +#define SQL_CUR_USE_DRIVER 2UL +#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER /* Column types and scopes in SQLSpecialColumns. */ -# define SQL_BEST_ROWID 1 -# define SQL_ROWVER 2 +#define SQL_BEST_ROWID 1 +#define SQL_ROWVER 2 -# define SQL_SCOPE_CURROW 0 -# define SQL_SCOPE_TRANSACTION 1 -# define SQL_SCOPE_SESSION 2 +#define SQL_SCOPE_CURROW 0 +#define SQL_SCOPE_TRANSACTION 1 +#define SQL_SCOPE_SESSION 2 /* SQLExtendedFetch flag values */ -# define SQL_FETCH_NEXT 1 -# define SQL_FETCH_FIRST 2 -# define SQL_FETCH_LAST 3 -# define SQL_FETCH_PRIOR 4 -# define SQL_FETCH_ABSOLUTE 5 -# define SQL_FETCH_RELATIVE 6 -# define SQL_FETCH_BOOKMARK 8 +#define SQL_FETCH_NEXT 1 +#define SQL_FETCH_FIRST 2 +#define SQL_FETCH_LAST 3 +#define SQL_FETCH_PRIOR 4 +#define SQL_FETCH_ABSOLUTE 5 +#define SQL_FETCH_RELATIVE 6 +#define SQL_FETCH_BOOKMARK 8 /* Defines for SQLBindParameter/SQLProcedureColumns */ #define SQL_PARAM_TYPE_UNKNOWN 0 @@ -320,21 +320,21 @@ #define SQL_RETURN_VALUE 5 /* Defines used by Driver Manager for mapping SQLSetParam to SQLBindParameter */ -# define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT -# define SQL_SETPARAM_VALUE_MAX (-1L) +#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT +#define SQL_SETPARAM_VALUE_MAX (-1L) /* SQLStatistics flag values */ -# define SQL_INDEX_UNIQUE 0 -# define SQL_INDEX_ALL 1 +#define SQL_INDEX_UNIQUE 0 +#define SQL_INDEX_ALL 1 -# define SQL_QUICK 0 -# define SQL_ENSURE 1 +#define SQL_QUICK 0 +#define SQL_ENSURE 1 /* SQLSetScrollOption flag values */ -# define SQL_SCROLL_FORWARD_ONLY 0L -# define SQL_SCROLL_KEYSET_DRIVEN (-1L) -# define SQL_SCROLL_DYNAMIC (-2L) -# define SQL_SCROLL_STATIC (-3L) +#define SQL_SCROLL_FORWARD_ONLY 0L +#define SQL_SCROLL_KEYSET_DRIVEN (-1L) +#define SQL_SCROLL_DYNAMIC (-2L) +#define SQL_SCROLL_STATIC (-3L) /* Everything below has been added to the original isqlext.h that comes * with iodbc. @@ -345,58 +345,64 @@ #define DOUBLE double /* SQL DATA TYPES */ -typedef UCHAR SQLCHAR; -typedef SWORD SQLSMALLINT; -typedef UWORD SQLUSMALLINT; -typedef SDWORD SQLINTEGER; -typedef UDWORD SQLUINTEGER; -typedef FLOAT SQLREAL; -typedef DOUBLE SQLDOUBLE; -typedef DOUBLE SQLFLOAT; -typedef SCHAR SQLSCHAR; -typedef UDWORD BOOKMARK; - -#ifdef GCC /* Because I know GCC supports 64 bit ints */ +typedef UCHAR SQLCHAR; +typedef SWORD SQLSMALLINT; +typedef UWORD SQLUSMALLINT; +typedef SDWORD SQLINTEGER; +typedef UDWORD SQLUINTEGER; +typedef FLOAT SQLREAL; +typedef DOUBLE SQLDOUBLE; +typedef DOUBLE SQLFLOAT; +typedef SCHAR SQLSCHAR; +typedef UDWORD BOOKMARK; + +#ifdef GCC /* Because I know GCC supports 64 bit ints */ typedef long long int ODBCINT64; -typedef unsigned ODBCINT64 SQLUBIGINT; -typedef ODBCINT64 SQLBIGINT; +typedef unsigned ODBCINT64 SQLUBIGINT; +typedef ODBCINT64 SQLBIGINT; -#else /* Used even on platforms with 64 bit ints but not GCC */ +#else /* Used even on platforms with 64 bit ints + * but not GCC */ -typedef struct { +typedef struct +{ SQLUINTEGER dwLowWord; SQLUINTEGER dwHighWord; -} SQLUBIGINT; +} SQLUBIGINT; -typedef struct { +typedef struct +{ SQLUINTEGER dwLowWord; - SQLINTEGER dwHighWord; -} SQLBIGINT; - -#endif /* GCC */ - -typedef struct tagDATE_STRUCT { - SQLSMALLINT year; - SQLUSMALLINT month; - SQLUSMALLINT day; -} DATE_STRUCT,SQL_DATE_STRUCT; - -typedef struct tagTIME_STRUCT { - SQLUSMALLINT hour; - SQLUSMALLINT minute; - SQLUSMALLINT second; -} TIME_STRUCT,SQL_TIME_STRUCT; - -typedef struct tagTIMESTAMP_STRUCT { - SQLSMALLINT year; - SQLUSMALLINT month; - SQLUSMALLINT day; - SQLUSMALLINT hour; - SQLUSMALLINT minute; - SQLUSMALLINT second; - SQLUINTEGER fraction; -} TIMESTAMP_STRUCT,SQL_TIMESTAMP_STRUCT; + SQLINTEGER dwHighWord; +} SQLBIGINT; + +#endif /* GCC */ + +typedef struct tagDATE_STRUCT +{ + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; +} DATE_STRUCT, SQL_DATE_STRUCT; + +typedef struct tagTIME_STRUCT +{ + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; +} TIME_STRUCT, SQL_TIME_STRUCT; + +typedef struct tagTIMESTAMP_STRUCT +{ + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; + SQLUINTEGER fraction; +} TIMESTAMP_STRUCT, SQL_TIMESTAMP_STRUCT; /* postodbc doesn't use these but what the heck */ /* Don't know what SQL_MAX_NUMERIC_LEN should be so I can't include this. It's @@ -411,14 +417,16 @@ typedef struct tagSQL_NUMERIC_STRUCT { */ -typedef struct tagSQLGUID { - DWORD Data1; - WORD Data2; - WORD Data3; - BYTE Data4[8]; -} SQLGUID; +typedef struct tagSQLGUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[8]; +} SQLGUID; -typedef enum { +typedef enum +{ SQL_IS_YEAR = 1, SQL_IS_MONTH = 2, SQL_IS_DAY = 3, @@ -434,27 +442,31 @@ typedef enum { SQL_IS_MINUTE_TO_SECOND = 13 } SQLINTERVAL; -typedef struct tagSQL_YEAR_MONTH { - SQLUINTEGER year; - SQLUINTEGER month; -} SQL_YEAR_MONTH_STRUCT; - -typedef struct tagSQL_DAY_SECOND { - SQLUINTEGER day; - SQLUINTEGER hour; - SQLUINTEGER minute; - SQLUINTEGER second; - SQLUINTEGER fraction; -} SQL_DAY_SECOND_STRUCT; - -typedef struct tagSQL_INTERVAL_STRUCT { - SQLINTERVAL interval_type; - SQLSMALLINT interval_sign; - union { - SQL_YEAR_MONTH_STRUCT year_month; - SQL_DAY_SECOND_STRUCT day_second; - } intval; -} SQL_INTERVAL_STRUCT; +typedef struct tagSQL_YEAR_MONTH +{ + SQLUINTEGER year; + SQLUINTEGER month; +} SQL_YEAR_MONTH_STRUCT; + +typedef struct tagSQL_DAY_SECOND +{ + SQLUINTEGER day; + SQLUINTEGER hour; + SQLUINTEGER minute; + SQLUINTEGER second; + SQLUINTEGER fraction; +} SQL_DAY_SECOND_STRUCT; + +typedef struct tagSQL_INTERVAL_STRUCT +{ + SQLINTERVAL interval_type; + SQLSMALLINT interval_sign; + union + { + SQL_YEAR_MONTH_STRUCT year_month; + SQL_DAY_SECOND_STRUCT day_second; + } intval; +} SQL_INTERVAL_STRUCT; #define SQL_MAX_OPTION_STRING_LENGTH 256 #define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST - SQL_EXT_API_START + 1) @@ -491,8 +503,8 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_INTERVAL_DAY_TO_HOUR (-87) #define SQL_INTERVAL_DAY_TO_MINUTE (-88) #define SQL_INTERVAL_DAY_TO_SECOND (-89) -#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) -#define SQL_INTERVAL_HOUR_TO_SECOND (-91) +#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) +#define SQL_INTERVAL_HOUR_TO_SECOND (-91) #define SQL_INTERVAL_MINUTE_TO_SECOND (-92) #define SQL_UNICODE (-95) @@ -519,7 +531,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_C_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_DAY_TO_SECOND #define SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_INTERVAL_HOUR_TO_MINUTE #define SQL_C_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_HOUR_TO_SECOND -#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND +#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND #define SQL_C_NUMERIC SQL_NUMERIC #define SQL_C_VARBOOKMARK SQL_C_BINARY #define SQL_C_SBIGINT (SQL_BIGINT + SQL_SIGNED_OFFSET) @@ -532,11 +544,11 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_NO_TOTAL (-4) /* SQLBindParameter */ -#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) +#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) #define SQL_LEN_DATA_AT_EXEC(length) (-length+SQL_LEN_DATA_AT_EXEC_OFFSET) #define SQL_LEN_BINARY_ATTR_OFFSET (-100) -#define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET) +#define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET) /* SQLExtendedFetch - row status */ #define SQL_ROW_SUCCESS 0 @@ -555,7 +567,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* SQLForeignKeys - Deferrability (ODBC 3.0) */ #define SQL_INITIALLY_DEFERRED 5 -#define SQL_INITIALLY_IMMEDIATE 6 +#define SQL_INITIALLY_IMMEDIATE 6 #define SQL_NOT_DEFFERABLE 2 /* Constants not in isqlext.h but needed by the driver. I have no idea @@ -566,109 +578,109 @@ typedef struct tagSQL_INTERVAL_STRUCT { */ /* - * SQLGetInfo + * SQLGetInfo */ #define SQL_ACTIVE_CONNECTIONS 0 #define SQL_ACTIVE_STATEMENTS 1 #define SQL_DATA_SOURCE_NAME 2 -#define SQL_DRIVER_VER 7 +#define SQL_DRIVER_VER 7 #define SQL_FETCH_DIRECTION 8 -#define SQL_ODBC_API_CONFORMANCE 9 -#define SQL_ROW_UPDATES 11 -#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 +#define SQL_ODBC_API_CONFORMANCE 9 +#define SQL_ROW_UPDATES 11 +#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 #define SQL_SERVER_NAME 13 #define SQL_SEARCH_PATTERN_ESCAPE 14 -#define SQL_ODBC_SQL_CONFORMANCE 15 +#define SQL_ODBC_SQL_CONFORMANCE 15 #define SQL_DBMS_NAME 17 #define SQL_DBMS_VER 18 #define SQL_ACCESSIBLE_TABLES 19 #define SQL_ACCESSIBLE_PROCEDURES 20 -#define SQL_PROCEDURES 21 -#define SQL_CONCAT_NULL_BEHAVIOR 22 +#define SQL_PROCEDURES 21 +#define SQL_CONCAT_NULL_BEHAVIOR 22 #define SQL_DATA_SOURCE_READ_ONLY 25 -#define SQL_EXPRESSIONS_IN_ORDERBY 27 +#define SQL_EXPRESSIONS_IN_ORDERBY 27 #define SQL_IDENTIFIER_CASE 28 #define SQL_IDENTIFIER_QUOTE_CHAR 29 #define SQL_MAX_COLUMN_NAME_LEN 30 #define SQL_MAX_CURSOR_NAME_LEN 31 #define SQL_MAX_OWNER_NAME_LEN 32 -#define SQL_MAX_PROCEDURE_NAME_LEN 33 +#define SQL_MAX_PROCEDURE_NAME_LEN 33 #define SQL_MAX_QUALIFIER_NAME_LEN 34 #define SQL_MAX_TABLE_NAME_LEN 35 -#define SQL_MULT_RESULT_SETS 36 -#define SQL_MULTIPLE_ACTIVE_TXN 37 -#define SQL_OUTER_JOINS 38 -#define SQL_OWNER_TERM 39 -#define SQL_PROCEDURE_TERM 40 -#define SQL_QUALIFIER_NAME_SEPARATOR 41 -#define SQL_QUALIFIER_TERM 42 +#define SQL_MULT_RESULT_SETS 36 +#define SQL_MULTIPLE_ACTIVE_TXN 37 +#define SQL_OUTER_JOINS 38 +#define SQL_OWNER_TERM 39 +#define SQL_PROCEDURE_TERM 40 +#define SQL_QUALIFIER_NAME_SEPARATOR 41 +#define SQL_QUALIFIER_TERM 42 #define SQL_SCROLL_CONCURRENCY 43 -#define SQL_SCROLL_OPTIONS 44 -#define SQL_TABLE_TERM 45 +#define SQL_SCROLL_OPTIONS 44 +#define SQL_TABLE_TERM 45 #define SQL_TXN_CAPABLE 46 #define SQL_USER_NAME 47 -#define SQL_CONVERT_FUNCTIONS 48 -#define SQL_NUMERIC_FUNCTIONS 49 -#define SQL_STRING_FUNCTIONS 50 -#define SQL_SYSTEM_FUNCTIONS 51 -#define SQL_TIMEDATE_FUNCTIONS 52 -#define SQL_CONVERT_BIGINT 53 -#define SQL_CONVERT_BINARY 54 -#define SQL_CONVERT_BIT 55 -#define SQL_CONVERT_CHAR 56 -#define SQL_CONVERT_DATE 57 -#define SQL_CONVERT_DECIMAL 58 -#define SQL_CONVERT_DOUBLE 59 -#define SQL_CONVERT_FLOAT 60 -#define SQL_CONVERT_INTEGER 61 -#define SQL_CONVERT_LONGVARCHAR 62 -#define SQL_CONVERT_NUMERIC 63 -#define SQL_CONVERT_REAL 64 -#define SQL_CONVERT_SMALLINT 65 -#define SQL_CONVERT_TIME 66 -#define SQL_CONVERT_TIMESTAMP 67 -#define SQL_CONVERT_TINYINT 68 -#define SQL_CONVERT_VARBINARY 69 -#define SQL_CONVERT_VARCHAR 70 -#define SQL_CONVERT_LONGVARBINARY 71 +#define SQL_CONVERT_FUNCTIONS 48 +#define SQL_NUMERIC_FUNCTIONS 49 +#define SQL_STRING_FUNCTIONS 50 +#define SQL_SYSTEM_FUNCTIONS 51 +#define SQL_TIMEDATE_FUNCTIONS 52 +#define SQL_CONVERT_BIGINT 53 +#define SQL_CONVERT_BINARY 54 +#define SQL_CONVERT_BIT 55 +#define SQL_CONVERT_CHAR 56 +#define SQL_CONVERT_DATE 57 +#define SQL_CONVERT_DECIMAL 58 +#define SQL_CONVERT_DOUBLE 59 +#define SQL_CONVERT_FLOAT 60 +#define SQL_CONVERT_INTEGER 61 +#define SQL_CONVERT_LONGVARCHAR 62 +#define SQL_CONVERT_NUMERIC 63 +#define SQL_CONVERT_REAL 64 +#define SQL_CONVERT_SMALLINT 65 +#define SQL_CONVERT_TIME 66 +#define SQL_CONVERT_TIMESTAMP 67 +#define SQL_CONVERT_TINYINT 68 +#define SQL_CONVERT_VARBINARY 69 +#define SQL_CONVERT_VARCHAR 70 +#define SQL_CONVERT_LONGVARBINARY 71 #define SQL_ODBC_SQL_OPT_IEF 73 -#define SQL_CORRELATION_NAME 74 -#define SQL_LOCK_TYPES 78 -#define SQL_POS_OPERATIONS 79 -#define SQL_POSITIONED_STATEMENTS 80 +#define SQL_CORRELATION_NAME 74 +#define SQL_LOCK_TYPES 78 +#define SQL_POS_OPERATIONS 79 +#define SQL_POSITIONED_STATEMENTS 80 #define SQL_GETDATA_EXTENSIONS 81 -#define SQL_BOOKMARK_PERSISTENCE 82 -#define SQL_STATIC_SENSITIVITY 83 -#define SQL_FILE_USAGE 84 +#define SQL_BOOKMARK_PERSISTENCE 82 +#define SQL_STATIC_SENSITIVITY 83 +#define SQL_FILE_USAGE 84 #define SQL_NULL_COLLATION 85 #define SQL_ALTER_TABLE 86 -#define SQL_COLUMN_ALIAS 87 -#define SQL_GROUP_BY 88 -#define SQL_KEYWORDS 89 +#define SQL_COLUMN_ALIAS 87 +#define SQL_GROUP_BY 88 +#define SQL_KEYWORDS 89 #define SQL_ORDER_BY_COLUMNS_IN_SELECT 90 -#define SQL_OWNER_USAGE 91 -#define SQL_QUALIFIER_USAGE 92 -#define SQL_QUOTED_IDENTIFIER_CASE 93 +#define SQL_OWNER_USAGE 91 +#define SQL_QUALIFIER_USAGE 92 +#define SQL_QUOTED_IDENTIFIER_CASE 93 #define SQL_SPECIAL_CHARACTERS 94 -#define SQL_SUBQUERIES 95 -#define SQL_UNION 96 +#define SQL_SUBQUERIES 95 +#define SQL_UNION 96 #define SQL_MAX_COLUMNS_IN_GROUP_BY 97 #define SQL_MAX_COLUMNS_IN_INDEX 98 #define SQL_MAX_COLUMNS_IN_ORDER_BY 99 #define SQL_MAX_COLUMNS_IN_SELECT 100 #define SQL_MAX_COLUMNS_IN_TABLE 101 #define SQL_MAX_INDEX_SIZE 102 -#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 +#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 #define SQL_MAX_ROW_SIZE 104 #define SQL_MAX_STATEMENT_LEN 105 #define SQL_MAX_TABLES_IN_SELECT 106 #define SQL_MAX_USER_NAME_LEN 107 -#define SQL_MAX_CHAR_LITERAL_LEN 108 -#define SQL_TIMEDATE_ADD_INTERVALS 109 -#define SQL_TIMEDATE_DIFF_INTERVALS 110 -#define SQL_NEED_LONG_DATA_LEN 111 -#define SQL_MAX_BINARY_LITERAL_LEN 112 -#define SQL_LIKE_ESCAPE_CLAUSE 113 +#define SQL_MAX_CHAR_LITERAL_LEN 108 +#define SQL_TIMEDATE_ADD_INTERVALS 109 +#define SQL_TIMEDATE_DIFF_INTERVALS 110 +#define SQL_NEED_LONG_DATA_LEN 111 +#define SQL_MAX_BINARY_LITERAL_LEN 112 +#define SQL_LIKE_ESCAPE_CLAUSE 113 #define SQL_OJ_CAPABILITIES 65003 /* ODBC 3.0 alias */ @@ -709,7 +721,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_CVT_REAL 0x00000040L #define SQL_CVT_DOUBLE 0x00000080L #define SQL_CVT_VARCHAR 0x00000100L -#define SQL_CVT_LONGVARCHAR 0x00000200L +#define SQL_CVT_LONGVARCHAR 0x00000200L #define SQL_CVT_BINARY 0x00000400L #define SQL_CVT_VARBINARY 0x00000800L #define SQL_CVT_BIT 0x00001000L @@ -721,20 +733,20 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_CVT_LONGVARBINARY 0x00040000L -/* extras added in ODBC 3.0 */ -#define SQL_CVT_INTERVAL_YEAR_MONTH 0x00080000L +/* extras added in ODBC 3.0 */ +#define SQL_CVT_INTERVAL_YEAR_MONTH 0x00080000L #define SQL_CVT_INTERVAL_DAY_TIME 0x00100000L /* - * concat null behaviour(2 byte val) + * concat null behaviour(2 byte val) */ -#define SQL_CB_NULL 0x0000 -#define SQL_CB_NON_NULL 0x0001 +#define SQL_CB_NULL 0x0000 +#define SQL_CB_NON_NULL 0x0001 /* - * correlation name + * correlation name */ -#define SQL_CN_NONE 0x0000 +#define SQL_CN_NONE 0x0000 #define SQL_CN_DIFFERENT 0x0001 #define SQL_CN_ANY 0x0002 @@ -763,7 +775,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_FN_CVT_CONVERT 0x00000001L #define SQL_FN_CVT_CAST 0x00000002L -/* +/* * File Usage. A SQLUSMALLINT indicating how a singel-tier driver treats * files in a data source. */ @@ -772,7 +784,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_FILE_QUALIFIER 0x0002 #define SQL_FILE_CATALOG SQL_FILE_CATALOG -/* +/* * GetData Extensions. A SQLUINTEGER(4 bytes) bitmask enumerating extensions * to SQLGetData. */ @@ -781,14 +793,14 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_GD_BLOCK 0x00000004L #define SQL_GD_BOUND 0x00000008L -/* +/* * Group By. A SQLUSMALLINT value specifying the relationship between the * columns in the GROUP BY clause and the non-aggregated columns in the * select list. */ #define SQL_GB_NOT_SUPPORTED 0x0000 #define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001 -#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002 +#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002 #define SQL_GB_NO_RELATION 0x0003 /* added in ODBC 3.0 */ @@ -892,24 +904,24 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_OSC_CORE 0x0001 #define SQL_OSC_EXTENDED 0x0002 -/* +/* * Owner Usage. A SQLUINTEGER bitmask. */ #define SQL_OU_DML_STATEMENTS 0x00000001L -#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L #define SQL_OU_TABLE_DEFINITION 0x00000004L #define SQL_OU_INDEX_DEFINITION 0x00000008L -#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L +#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L /* * Schema Usage. A SQLUINTEGER bitmask enumerating the statements in which * schemas can be used. Renamed in ODBC 3.0 from SQL_OWNER_USAGE */ #define SQL_SU_DML_STATEMENTS SQL_OU_DML_STATEMENTS -#define SQL_SU_PROCEDURE_INVOCATION SQL_OU_PROCEDURE_INVOCATION +#define SQL_SU_PROCEDURE_INVOCATION SQL_OU_PROCEDURE_INVOCATION #define SQL_SU_TABLE_DEFINITION SQL_OU_TABLE_DEFINITION #define SQL_SU_INDEX_DEFINITION SQL_OU_INDEX_DEFINITION -#define SQL_SU_PRIVILEGE_DEFINITION SQL_OU_PRIVILEGE_DEFINITION +#define SQL_SU_PRIVILEGE_DEFINITION SQL_OU_PRIVILEGE_DEFINITION /* * Pos. Operations. A SQLINTEGER bitmask enumerating the supported operations @@ -922,12 +934,12 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_POS_ADD 0x00000010L /* - * SQLSetPos + * SQLSetPos */ #define SQL_ENTIRE_ROWSET 0 #define SQL_POSITION 0 -#define SQL_REFRESH 1 +#define SQL_REFRESH 1 #define SQL_UPDATE 2 #define SQL_DELETE 3 #define SQL_ADD 4 @@ -935,22 +947,22 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* * SQLSetPos Lock options */ -#define SQL_LOCK_NO_CHANGE 0 -#define SQL_LOCK_EXCLUSIVE 1 -#define SQL_LOCK_UNLOCK 2 +#define SQL_LOCK_NO_CHANGE 0 +#define SQL_LOCK_EXCLUSIVE 1 +#define SQL_LOCK_UNLOCK 2 -#define SQL_POSITION_TO(hstmt,irow) \ - SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE) +#define SQL_POSITION_TO(hstmt,irow) \ + SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE) #define SQL_LOCK_RECORD(hstmt,irow,fLock) \ - SQLSetPos(hstmt,irow,SQL_POSITION,fLock) + SQLSetPos(hstmt,irow,SQL_POSITION,fLock) #define SQL_REFRESH_RECORD(hstmt,irow,fLock) \ - SQLSetPos(hstmt,irow,SQL_REFRESH,fLock) + SQLSetPos(hstmt,irow,SQL_REFRESH,fLock) #define SQL_UPDATE_RECORD(hstmt,irow) \ - SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE) + SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE) #define SQL_DELETE_RECORD(hstmt,irow) \ - SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE) + SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE) #define SQL_ADD_RECORD(hstmt,irow) \ - SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE) + SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE) /* * Positioned Statements. A SQLINTEGER bitmask enumerating the supported @@ -966,21 +978,21 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_QL_START 0x0001 #define SQL_QL_END 0x0002 -/* +/* * Qualifier Usage. A SQLUINTEGER bitmask. */ #define SQL_QU_DML_STATEMENTS 0x00000001L -#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L #define SQL_QU_TABLE_DEFINITION 0x00000004L #define SQL_QU_INDEX_DEFINITION 0x00000008L -#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L +#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L /* The above is renamed in ODBC 3.0 to Catalog Usage. */ #define SQL_CU_DML_STATEMENTS SQL_QU_DML_STATEMENTS -#define SQL_CU_PROCEDURE_INVOCATION SQL_QU_PROCEDURE_INVOCATION +#define SQL_CU_PROCEDURE_INVOCATION SQL_QU_PROCEDURE_INVOCATION #define SQL_CU_TABLE_DEFINITION SQL_QU_TABLE_DEFINITION #define SQL_CU_INDEX_DEFINITION SQL_QU_INDEX_DEFINITION -#define SQL_CU_PRIVILEGE_DEFINITION SQL_QU_PRIVILEGE_DEFINITION +#define SQL_CU_PRIVILEGE_DEFINITION SQL_QU_PRIVILEGE_DEFINITION /* ODBC 3.0 renamed the above to Catalog Location. */ #define SQL_CL_START SQL_QL_START @@ -996,7 +1008,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_SCCO_OPT_VALUES 0x00000008L -/* +/* * Scroll Options. A SQLUINTEGER bitmask enumerating the scroll options * supported for scrollable cursors. */ @@ -1014,7 +1026,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { */ #define SQL_SS_ADDITIONS 0x00000001L #define SQL_SS_DELETIONS 0x00000002L -#define SQL_SS_UPDATES 0x00000004L +#define SQL_SS_UPDATES 0x00000004L /* * String Functions. A SQLUINTEGER bitmask enumerating the scalar string @@ -1043,7 +1055,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* introduced in ODBC 3.0 */ #define SQL_FN_STR_BIT_LENGTH 0x00080000L #define SQL_FN_STR_CHAR_LENGTH 0x00100000L -#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L +#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L #define SQL_FN_STR_OCTET_LENGTH 0x00400000L #define SQL_FN_STR_POSITION 0x00800000L @@ -1061,14 +1073,14 @@ typedef struct tagSQL_INTERVAL_STRUCT { * System Functions. A SQLUINTEGER bitmask enumerating the scalar system * functions supported by the driver and associated data source. */ -#define SQL_FN_SYS_USERNAME 0x00000001L +#define SQL_FN_SYS_USERNAME 0x00000001L #define SQL_FN_SYS_DBNAME 0x00000002L #define SQL_FN_SYS_IFNULL 0x00000004L /* * Time-Date add and diff intervals. A SQLUINTEGER bitmask enumerating the * timestamp intervals supported by the driver and associated data source - * for the TIMESTAMPADD and TIMESTAMPDIFF scalar function. + * for the TIMESTAMPADD and TIMESTAMPDIFF scalar function. */ #define SQL_FN_TSI_FRAC_SECOND 0x00000001L #define SQL_FN_TSI_SECOND 0x00000002L @@ -1105,7 +1117,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* Added in ODBC 3.0 */ #define SQL_FN_TD_CURRENT_DATE 0x00020000L #define SQL_FN_TD_CURRENT_TIME 0x00040000L -#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L +#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L #define SQL_FN_TD_EXTRACT 0x00100000L /* @@ -1128,7 +1140,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* SQLStatistics: Type, Smallint */ #define SQL_TABLE_STAT 0 -#define SQL_INDEX_CLUSTERED 1 +#define SQL_INDEX_CLUSTERED 1 #define SQL_INDEX_HASHED 2 #define SQL_INDEX_OTHER 3 @@ -1139,7 +1151,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { /* SQLSpecialColumns: PSEUDO_COLUMN: Smallint */ #define SQL_PC_UNKNOWN 0 -#define SQL_PC_PSEUDO 1 +#define SQL_PC_PSEUDO 1 #define SQL_PC_NOT_PSEUDO 2 /* SQLSet/Get/StmtOptions: ASYNC_ENABLE. A SQLUINTEGER */ @@ -1153,7 +1165,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { */ #define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY -/* +/* * SQLSet/GetStmtOptions: CURSOR_SCROLLABLE. A SQLUINTEGER. Added in ODBC * 3.0. */ @@ -1161,7 +1173,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_SCROLLABLE 1UL #define SQL_CURSOR_SCROLLABLE_DEFAULT SQL_NONSCROLLABLE -/* +/* * SQLSet/GetStmtOptions: CURSOR_SENSITITY. A SQLUINTEGER. Added in ODBC * 3.0. */ @@ -1170,15 +1182,15 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_SENSITIVIE 2UL #define SQL_CURSOR_SENSITIVITY_DEFAULT SQL_UNSPECIFIED -/* +/* * SQLSet/GetStmtOptions: CURSOR_TYPE: A SQLUINTEGER value that specifies the * cursor type */ -#define SQL_CURSOR_FORWARD_ONLY 0UL +#define SQL_CURSOR_FORWARD_ONLY 0UL #define SQL_CURSOR_KEYSET_DRIVEN 1UL #define SQL_CURSOR_DYNAMIC 2UL #define SQL_CURSOR_STATIC 3UL -#define SQL_CURSOR_DEFAULT SQL_CURSOR_FORWARD_ONLY +#define SQL_CURSOR_DEFAULT SQL_CURSOR_FORWARD_ONLY /* * ENABLE_AUTO_IPD: A SQLUINTEGER, either SQL_TRUE or SQL_FALSE. Default @@ -1211,7 +1223,7 @@ typedef struct tagSQL_INTERVAL_STRUCT { * */ #define SQL_PARAM_SUCCESS 0 -#define SQL_PARAM_SUCCESS_WITH_INFO 6 +#define SQL_PARAM_SUCCESS_WITH_INFO 6 #define SQL_PARAM_ERROR 5 #define SQL_PARAM_UNUSED 7 #define SQL_PARAM_DIAG_UNAVAILABLE 1 @@ -1236,12 +1248,12 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_ROW_IGNORE 1 /* - * SQL_ROWSET_SIZE + * SQL_ROWSET_SIZE */ -#define SQL_ROWSET_SIZE_DEFAULT 1UL +#define SQL_ROWSET_SIZE_DEFAULT 1UL /* - * SQL_KEYSET_SIZE + * SQL_KEYSET_SIZE */ #define SQL_KEYSET_SIZE_DEFAULT 0UL @@ -1261,29 +1273,29 @@ typedef struct tagSQL_INTERVAL_STRUCT { #define SQL_UB_OFF 0UL #define SQL_UB_ON 1UL #define SQL_UB_FIXED SQL_UB_ON /* Deprecated in ODBC 3.0 */ -#define SQL_UB_VARIABLE 2UL /* Added in ODBC 3.0 */ +#define SQL_UB_VARIABLE 2UL /* Added in ODBC 3.0 */ #define SQL_UB_DEFAULT SQL_UB_OFF /* Deprecated */ -#define SQL_DATABASE_NAME 16 -#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR -#define SQL_FETCH_PREV SQL_FETCH_PRIOR -#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER -#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER -#define SQL_CC_DELETE SQL_CB_DELETE -#define SQL_CR_DELETE SQL_CB_DELETE -#define SQL_CC_CLOSE SQL_CB_CLOSE -#define SQL_CR_CLOSE SQL_CB_CLOSE -#define SQL_CC_PRESERVE SQL_CB_PRESERVE -#define SQL_CR_PRESERVE SQL_CB_PRESERVE -#define SQL_FETCH_RESUME 7 -#define SQL_SCROLL_FORWARD_ONLY 0L -#define SQL_SCROLL_KEYSET_DRIVEN (-1L) -#define SQL_SCROLL_DYNAMIC (-2L) -#define SQL_SCROLL_STATIC (-3L) - +#define SQL_DATABASE_NAME 16 +#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR +#define SQL_FETCH_PREV SQL_FETCH_PRIOR +#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER +#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER +#define SQL_CC_DELETE SQL_CB_DELETE +#define SQL_CR_DELETE SQL_CB_DELETE +#define SQL_CC_CLOSE SQL_CB_CLOSE +#define SQL_CR_CLOSE SQL_CB_CLOSE +#define SQL_CC_PRESERVE SQL_CB_PRESERVE +#define SQL_CR_PRESERVE SQL_CB_PRESERVE +#define SQL_FETCH_RESUME 7 +#define SQL_SCROLL_FORWARD_ONLY 0L +#define SQL_SCROLL_KEYSET_DRIVEN (-1L) +#define SQL_SCROLL_DYNAMIC (-2L) +#define SQL_SCROLL_STATIC (-3L) + /* - * ODBC keywords + * ODBC keywords */ #define SQL_ODBC_KEYWORDS \ "ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\ @@ -1317,223 +1329,225 @@ typedef struct tagSQL_INTERVAL_STRUCT { "UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\ "VALUE,,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,YEAR" -# ifdef __cplusplus - extern "C" { -# endif +#ifdef __cplusplus +extern "C" +{ +#endif -RETCODE SQL_API SQLSetConnectOption (HDBC, UWORD, UDWORD); -RETCODE SQL_API SQLNumResultCols ( HSTMT, SWORD FAR* ); + RETCODE SQL_API SQLSetConnectOption(HDBC, UWORD, UDWORD); + RETCODE SQL_API SQLNumResultCols(HSTMT, SWORD FAR *); /* - * function prototypes previously missing from isqlext.h + * function prototypes previously missing from isqlext.h */ -RETCODE SQL_API SQLColumns (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szColumnName, - SWORD cbColumnName); - -RETCODE SQL_API SQLDriverConnect (HDBC hdbc, - HWND hwnd, - UCHAR FAR * szConnStrIn, - SWORD cbConnStrIn, - UCHAR FAR * szConnStrOut, - SWORD cbConnStrOutMax, - SWORD FAR * pcbConnStrOut, - UWORD fDriverCompletion); - -RETCODE SQL_API SQLGetConnectOption (HDBC hdbc, - UWORD fOption, - PTR pvParam); - -RETCODE SQL_API SQLGetData (HSTMT hstmt, - UWORD icol, - SWORD fCType, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR * pcbValue); - -RETCODE SQL_API SQLGetFunctions (HDBC hdbc, - UWORD fFunction, - UWORD FAR * pfExists); - -RETCODE SQL_API SQLGetInfo (HDBC hdbc, - UWORD fInfoType, - PTR rgbInfoValue, - SWORD cbInfoValueMax, - SWORD FAR * pcbInfoValue); - -RETCODE SQL_API SQLGetStmtOption (HSTMT hstmt, - UWORD fOption, - PTR pvParam); - -RETCODE SQL_API SQLGetTypeInfo (HSTMT hstmt, - SWORD fSqlType); - -RETCODE SQL_API SQLParamData (HSTMT hstmt, - PTR FAR * prgbValue); - -RETCODE SQL_API SQLPutData (HSTMT hstmt, - PTR rgbValue, - SDWORD cbValue); - -RETCODE SQL_API SQLSetStmtOption (HSTMT hstmt, - UWORD fOption, - UDWORD vParam); - -RETCODE SQL_API SQLSpecialColumns (HSTMT hstmt, - UWORD fColType, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UWORD fScope, - UWORD fNullable); - -RETCODE SQL_API SQLStatistics (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UWORD fUnique, - UWORD fAccuracy); - -RETCODE SQL_API SQLTables (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szTableType, - SWORD cbTableType); - -RETCODE SQL_API SQLBrowseConnect (HDBC hdbc, - UCHAR FAR * szConnStrIn, - SWORD cbConnStrIn, - UCHAR FAR * szConnStrOut, - SWORD cbConnStrOutMax, - SWORD FAR * pcbConnStrOut); - -RETCODE SQL_API SQLColumnPrivileges (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName, - UCHAR FAR * szColumnName, - SWORD cbColumnName); - -RETCODE SQL_API SQLDescribeParam (HSTMT hstmt, - UWORD ipar, - SWORD FAR * pfSqlType, - UDWORD FAR * pcbColDef, - SWORD FAR * pibScale, - SWORD FAR * pfNullable); - -RETCODE SQL_API SQLExtendedFetch (HSTMT hstmt, - UWORD fFetchType, - SDWORD irow, - UDWORD FAR * pcrow, - UWORD FAR * rgfRowStatus); - -RETCODE SQL_API SQLForeignKeys (HSTMT hstmt, - UCHAR FAR * szPkTableQualifier, - SWORD cbPkTableQualifier, - UCHAR FAR * szPkTableOwner, - SWORD cbPkTableOwner, - UCHAR FAR * szPkTableName, - SWORD cbPkTableName, - UCHAR FAR * szFkTableQualifier, - SWORD cbFkTableQualifier, - UCHAR FAR * szFkTableOwner, - SWORD cbFkTableOwner, - UCHAR FAR * szFkTableName, - SWORD cbFkTableName); - -RETCODE SQL_API SQLMoreResults (HSTMT hstmt); - -RETCODE SQL_API SQLNativeSql (HDBC hdbc, - UCHAR FAR * szSqlStrIn, - SDWORD cbSqlStrIn, - UCHAR FAR * szSqlStr, - SDWORD cbSqlStrMax, - SDWORD FAR * pcbSqlStr); - -RETCODE SQL_API SQLNumParams (HSTMT hstmt, - SWORD FAR * pcpar); - -RETCODE SQL_API SQLParamOptions (HSTMT hstmt, - UDWORD crow, - UDWORD FAR * pirow); - -RETCODE SQL_API SQLPrimaryKeys (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName); - -RETCODE SQL_API SQLProcedureColumns (HSTMT hstmt, - UCHAR FAR * szProcQualifier, - SWORD cbProcQualifier, - UCHAR FAR * szProcOwner, - SWORD cbProcOwner, - UCHAR FAR * szProcName, - SWORD cbProcName, - UCHAR FAR * szColumnName, - SWORD cbColumnName); - -RETCODE SQL_API SQLProcedures (HSTMT hstmt, - UCHAR FAR * szProcQualifier, - SWORD cbProcQualifier, - UCHAR FAR * szProcOwner, - SWORD cbProcOwner, - UCHAR FAR * szProcName, - SWORD cbProcName); - -RETCODE SQL_API SQLSetPos (HSTMT hstmt, - UWORD irow, - UWORD fOption, - UWORD fLock); - -RETCODE SQL_API SQLTablePrivileges (HSTMT hstmt, - UCHAR FAR * szTableQualifier, - SWORD cbTableQualifier, - UCHAR FAR * szTableOwner, - SWORD cbTableOwner, - UCHAR FAR * szTableName, - SWORD cbTableName); - -RETCODE SQL_API SQLBindParameter (HSTMT hstmt, - UWORD ipar, - SWORD fParamType, - SWORD fCType, - SWORD fSqlType, - UDWORD cbColDef, - SWORD ibScale, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR * pcbValue); - -RETCODE SQL_API SQLSetScrollOptions (HSTMT hstmt, - UWORD fConcurrency, - SDWORD crowKeyset, - UWORD crowRowset); - - -# ifdef __cplusplus - } -# endif + RETCODE SQL_API SQLColumns(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szColumnName, + SWORD cbColumnName); + + RETCODE SQL_API SQLDriverConnect(HDBC hdbc, + HWND hwnd, + UCHAR FAR * szConnStrIn, + SWORD cbConnStrIn, + UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, + SWORD FAR * pcbConnStrOut, + UWORD fDriverCompletion); + + RETCODE SQL_API SQLGetConnectOption(HDBC hdbc, + UWORD fOption, + PTR pvParam); + + RETCODE SQL_API SQLGetData(HSTMT hstmt, + UWORD icol, + SWORD fCType, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue); + + RETCODE SQL_API SQLGetFunctions(HDBC hdbc, + UWORD fFunction, + UWORD FAR * pfExists); + + RETCODE SQL_API SQLGetInfo(HDBC hdbc, + UWORD fInfoType, + PTR rgbInfoValue, + SWORD cbInfoValueMax, + SWORD FAR * pcbInfoValue); + + RETCODE SQL_API SQLGetStmtOption(HSTMT hstmt, + UWORD fOption, + PTR pvParam); + + RETCODE SQL_API SQLGetTypeInfo(HSTMT hstmt, + SWORD fSqlType); + + RETCODE SQL_API SQLParamData(HSTMT hstmt, + PTR FAR * prgbValue); + + RETCODE SQL_API SQLPutData(HSTMT hstmt, + PTR rgbValue, + SDWORD cbValue); + + RETCODE SQL_API SQLSetStmtOption(HSTMT hstmt, + UWORD fOption, + UDWORD vParam); + + RETCODE SQL_API SQLSpecialColumns(HSTMT hstmt, + UWORD fColType, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UWORD fScope, + UWORD fNullable); + + RETCODE SQL_API SQLStatistics(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UWORD fUnique, + UWORD fAccuracy); + + RETCODE SQL_API SQLTables(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szTableType, + SWORD cbTableType); + + RETCODE SQL_API SQLBrowseConnect(HDBC hdbc, + UCHAR FAR * szConnStrIn, + SWORD cbConnStrIn, + UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, + SWORD FAR * pcbConnStrOut); + + RETCODE SQL_API SQLColumnPrivileges(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName, + UCHAR FAR * szColumnName, + SWORD cbColumnName); + + RETCODE SQL_API SQLDescribeParam(HSTMT hstmt, + UWORD ipar, + SWORD FAR * pfSqlType, + UDWORD FAR * pcbColDef, + SWORD FAR * pibScale, + SWORD FAR * pfNullable); + + RETCODE SQL_API SQLExtendedFetch(HSTMT hstmt, + UWORD fFetchType, + SDWORD irow, + UDWORD FAR * pcrow, + UWORD FAR * rgfRowStatus); + + RETCODE SQL_API SQLForeignKeys(HSTMT hstmt, + UCHAR FAR * szPkTableQualifier, + SWORD cbPkTableQualifier, + UCHAR FAR * szPkTableOwner, + SWORD cbPkTableOwner, + UCHAR FAR * szPkTableName, + SWORD cbPkTableName, + UCHAR FAR * szFkTableQualifier, + SWORD cbFkTableQualifier, + UCHAR FAR * szFkTableOwner, + SWORD cbFkTableOwner, + UCHAR FAR * szFkTableName, + SWORD cbFkTableName); + + RETCODE SQL_API SQLMoreResults(HSTMT hstmt); + + RETCODE SQL_API SQLNativeSql(HDBC hdbc, + UCHAR FAR * szSqlStrIn, + SDWORD cbSqlStrIn, + UCHAR FAR * szSqlStr, + SDWORD cbSqlStrMax, + SDWORD FAR * pcbSqlStr); + + RETCODE SQL_API SQLNumParams(HSTMT hstmt, + SWORD FAR * pcpar); + + RETCODE SQL_API SQLParamOptions(HSTMT hstmt, + UDWORD crow, + UDWORD FAR * pirow); + + RETCODE SQL_API SQLPrimaryKeys(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName); + + RETCODE SQL_API SQLProcedureColumns(HSTMT hstmt, + UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, + UCHAR FAR * szProcOwner, + SWORD cbProcOwner, + UCHAR FAR * szProcName, + SWORD cbProcName, + UCHAR FAR * szColumnName, + SWORD cbColumnName); + + RETCODE SQL_API SQLProcedures(HSTMT hstmt, + UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, + UCHAR FAR * szProcOwner, + SWORD cbProcOwner, + UCHAR FAR * szProcName, + SWORD cbProcName); + + RETCODE SQL_API SQLSetPos(HSTMT hstmt, + UWORD irow, + UWORD fOption, + UWORD fLock); + + RETCODE SQL_API SQLTablePrivileges(HSTMT hstmt, + UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, + SWORD cbTableOwner, + UCHAR FAR * szTableName, + SWORD cbTableName); + + RETCODE SQL_API SQLBindParameter(HSTMT hstmt, + UWORD ipar, + SWORD fParamType, + SWORD fCType, + SWORD fSqlType, + UDWORD cbColDef, + SWORD ibScale, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue); + + RETCODE SQL_API SQLSetScrollOptions(HSTMT hstmt, + UWORD fConcurrency, + SDWORD crowKeyset, + UWORD crowRowset); + + +#ifdef __cplusplus +} + +#endif #endif diff --git a/src/interfaces/odbc/lobj.c b/src/interfaces/odbc/lobj.c index c31591a65b..0f1fd3b7c1 100644 --- a/src/interfaces/odbc/lobj.c +++ b/src/interfaces/odbc/lobj.c @@ -1,13 +1,13 @@ -/* Module: lobj.c +/* Module: lobj.c * - * Description: This module contains routines related to manipulating - * large objects. + * Description: This module contains routines related to manipulating + * large objects. * - * Classes: none + * Classes: none * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -16,17 +16,18 @@ #include "connection.h" Oid -lo_creat(ConnectionClass *conn, int mode) +lo_creat(ConnectionClass * conn, int mode) { -LO_ARG argv[1]; -int retval, result_len; + LO_ARG argv[1]; + int retval, + result_len; argv[0].isint = 1; argv[0].len = 4; argv[0].u.integer = mode; - if ( ! CC_send_function(conn, LO_CREAT, &retval, &result_len, 1, argv, 1)) - return 0; /* invalid oid */ + if (!CC_send_function(conn, LO_CREAT, &retval, &result_len, 1, argv, 1)) + return 0; /* invalid oid */ else return retval; @@ -34,11 +35,11 @@ int retval, result_len; } int -lo_open(ConnectionClass *conn, int lobjId, int mode) +lo_open(ConnectionClass * conn, int lobjId, int mode) { -int fd; -int result_len; -LO_ARG argv[2]; + int fd; + int result_len; + LO_ARG argv[2]; argv[0].isint = 1; @@ -49,7 +50,7 @@ LO_ARG argv[2]; argv[1].len = 4; argv[1].u.integer = mode; - if ( ! CC_send_function(conn, LO_OPEN, &fd, &result_len, 1, argv, 2)) + if (!CC_send_function(conn, LO_OPEN, &fd, &result_len, 1, argv, 2)) return -1; if (fd >= 0 && lo_lseek(conn, fd, 0L, SEEK_SET) < 0) @@ -58,18 +59,19 @@ LO_ARG argv[2]; return fd; } -int -lo_close(ConnectionClass *conn, int fd) +int +lo_close(ConnectionClass * conn, int fd) { -LO_ARG argv[1]; -int retval, result_len; + LO_ARG argv[1]; + int retval, + result_len; argv[0].isint = 1; argv[0].len = 4; argv[0].u.integer = fd; - if ( ! CC_send_function(conn, LO_CLOSE, &retval, &result_len, 1, argv, 1)) + if (!CC_send_function(conn, LO_CLOSE, &retval, &result_len, 1, argv, 1)) return -1; else @@ -79,10 +81,10 @@ int retval, result_len; int -lo_read(ConnectionClass *conn, int fd, char *buf, int len) +lo_read(ConnectionClass * conn, int fd, char *buf, int len) { -LO_ARG argv[2]; -int result_len; + LO_ARG argv[2]; + int result_len; argv[0].isint = 1; @@ -93,7 +95,7 @@ int result_len; argv[1].len = 4; argv[1].u.integer = len; - if ( ! CC_send_function(conn, LO_READ, (int *) buf, &result_len, 0, argv, 2)) + if (!CC_send_function(conn, LO_READ, (int *) buf, &result_len, 0, argv, 2)) return -1; else @@ -101,10 +103,11 @@ int result_len; } int -lo_write(ConnectionClass *conn, int fd, char *buf, int len) +lo_write(ConnectionClass * conn, int fd, char *buf, int len) { -LO_ARG argv[2]; -int retval, result_len; + LO_ARG argv[2]; + int retval, + result_len; if (len <= 0) @@ -118,7 +121,7 @@ int retval, result_len; argv[1].len = len; argv[1].u.ptr = (char *) buf; - if ( ! CC_send_function(conn, LO_WRITE, &retval, &result_len, 1, argv, 2)) + if (!CC_send_function(conn, LO_WRITE, &retval, &result_len, 1, argv, 2)) return -1; else @@ -126,10 +129,11 @@ int retval, result_len; } int -lo_lseek(ConnectionClass *conn, int fd, int offset, int whence) +lo_lseek(ConnectionClass * conn, int fd, int offset, int whence) { -LO_ARG argv[3]; -int retval, result_len; + LO_ARG argv[3]; + int retval, + result_len; argv[0].isint = 1; @@ -144,7 +148,7 @@ int retval, result_len; argv[2].len = 4; argv[2].u.integer = whence; - if ( ! CC_send_function(conn, LO_LSEEK, &retval, &result_len, 1, argv, 3)) + if (!CC_send_function(conn, LO_LSEEK, &retval, &result_len, 1, argv, 3)) return -1; else @@ -152,45 +156,39 @@ int retval, result_len; } int -lo_tell(ConnectionClass *conn, int fd) +lo_tell(ConnectionClass * conn, int fd) { -LO_ARG argv[1]; -int retval, result_len; + LO_ARG argv[1]; + int retval, + result_len; argv[0].isint = 1; argv[0].len = 4; argv[0].u.integer = fd; - if ( ! CC_send_function(conn, LO_TELL, &retval, &result_len, 1, argv, 1)) + if (!CC_send_function(conn, LO_TELL, &retval, &result_len, 1, argv, 1)) return -1; else return retval; } -int -lo_unlink(ConnectionClass *conn, Oid lobjId) +int +lo_unlink(ConnectionClass * conn, Oid lobjId) { -LO_ARG argv[1]; -int retval, result_len; + LO_ARG argv[1]; + int retval, + result_len; argv[0].isint = 1; argv[0].len = 4; argv[0].u.integer = lobjId; - if ( ! CC_send_function(conn, LO_UNLINK, &retval, &result_len, 1, argv, 1)) + if (!CC_send_function(conn, LO_UNLINK, &retval, &result_len, 1, argv, 1)) return -1; else return retval; } - - - - - - - - diff --git a/src/interfaces/odbc/lobj.h b/src/interfaces/odbc/lobj.h index 8c4a3075d1..d8ab76bd24 100644 --- a/src/interfaces/odbc/lobj.h +++ b/src/interfaces/odbc/lobj.h @@ -1,9 +1,9 @@ -/* File: lobj.h +/* File: lobj.h * - * Description: See "lobj.c" + * Description: See "lobj.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -13,14 +13,15 @@ #include "psqlodbc.h" -struct lo_arg { - int isint; - int len; +struct lo_arg +{ + int isint; + int len; union { - int integer; - char *ptr; - } u; + int integer; + char *ptr; + } u; }; #define LO_CREAT 957 @@ -35,14 +36,13 @@ struct lo_arg { #define INV_WRITE 0x00020000 #define INV_READ 0x00040000 -Oid lo_creat(ConnectionClass *conn, int mode); -int lo_open(ConnectionClass *conn, int lobjId, int mode); -int lo_close(ConnectionClass *conn, int fd); -int lo_read(ConnectionClass *conn, int fd, char *buf, int len); -int lo_write(ConnectionClass *conn, int fd, char *buf, int len); -int lo_lseek(ConnectionClass *conn, int fd, int offset, int len); -int lo_tell(ConnectionClass *conn, int fd); -int lo_unlink(ConnectionClass *conn, Oid lobjId); +Oid lo_creat(ConnectionClass * conn, int mode); +int lo_open(ConnectionClass * conn, int lobjId, int mode); +int lo_close(ConnectionClass * conn, int fd); +int lo_read(ConnectionClass * conn, int fd, char *buf, int len); +int lo_write(ConnectionClass * conn, int fd, char *buf, int len); +int lo_lseek(ConnectionClass * conn, int fd, int offset, int len); +int lo_tell(ConnectionClass * conn, int fd); +int lo_unlink(ConnectionClass * conn, Oid lobjId); #endif - diff --git a/src/interfaces/odbc/misc.c b/src/interfaces/odbc/misc.c index b35c5c3d5b..3dd6c93e0b 100644 --- a/src/interfaces/odbc/misc.c +++ b/src/interfaces/odbc/misc.c @@ -1,13 +1,13 @@ -/* Module: misc.c +/* Module: misc.c * - * Description: This module contains miscellaneous routines - * such as for debugging/logging and string functions. + * Description: This module contains miscellaneous routines + * such as for debugging/logging and string functions. * - * Classes: n/a + * Classes: n/a * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -24,49 +24,54 @@ #include #include #else -#include /* Byron: is this where Windows keeps def. of getpid ? */ +#include /* Byron: is this where Windows keeps def. + * of getpid ? */ #endif extern GLOBAL_VALUES globals; -void generate_filename(char*,char*,char*); +void generate_filename(char *, char *, char *); void -generate_filename(char* dirname,char* prefix,char* filename) +generate_filename(char *dirname, char *prefix, char *filename) { - int pid = 0; + int pid = 0; + #ifndef WIN32 struct passwd *ptr = 0; + ptr = getpwuid(getuid()); #endif pid = getpid(); - if(dirname == 0 || filename == 0) + if (dirname == 0 || filename == 0) return; - strcpy(filename,dirname); - strcat(filename,DIRSEPARATOR); - if(prefix != 0) - strcat(filename,prefix); + strcpy(filename, dirname); + strcat(filename, DIRSEPARATOR); + if (prefix != 0) + strcat(filename, prefix); #ifndef WIN32 - strcat(filename,ptr->pw_name); + strcat(filename, ptr->pw_name); #endif - sprintf(filename,"%s%u%s",filename,pid,".log"); + sprintf(filename, "%s%u%s", filename, pid, ".log"); return; } #ifdef MY_LOG void -mylog(char * fmt, ...) +mylog(char *fmt,...) { - va_list args; - char filebuf[80]; - FILE* LOGFP = globals.mylogFP; + va_list args; + char filebuf[80]; + FILE *LOGFP = globals.mylogFP; - if ( globals.debug) { + if (globals.debug) + { va_start(args, fmt); - if (! LOGFP) { - generate_filename(MYLOGDIR,MYLOGFILE,filebuf); + if (!LOGFP) + { + generate_filename(MYLOGDIR, MYLOGFILE, filebuf); LOGFP = fopen(filebuf, PG_BINARY_W); globals.mylogFP = LOGFP; setbuf(LOGFP, NULL); @@ -78,23 +83,26 @@ mylog(char * fmt, ...) va_end(args); } } + #endif #ifdef Q_LOG void -qlog(char * fmt, ...) +qlog(char *fmt,...) { - va_list args; - char filebuf[80]; - FILE* LOGFP = globals.qlogFP; + va_list args; + char filebuf[80]; + FILE *LOGFP = globals.qlogFP; - if ( globals.commlog) { + if (globals.commlog) + { va_start(args, fmt); - if (! LOGFP) { - generate_filename(QLOGDIR,QLOGFILE,filebuf); + if (!LOGFP) + { + generate_filename(QLOGDIR, QLOGFILE, filebuf); LOGFP = fopen(filebuf, PG_BINARY_W); globals.qlogFP = LOGFP; setbuf(LOGFP, NULL); @@ -106,9 +114,10 @@ qlog(char * fmt, ...) va_end(args); } } + #endif -/* Undefine these because windows.h will redefine and cause a warning */ +/* Undefine these because windows.h will redefine and cause a warning */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -135,7 +144,8 @@ my_strcpy(char *dst, int dst_len, char *src, int src_len) if (dst_len <= 0) return STRCPY_FAIL; - if (src_len == SQL_NULL_DATA) { + if (src_len == SQL_NULL_DATA) + { dst[0] = '\0'; return STRCPY_NULL; } @@ -145,14 +155,17 @@ my_strcpy(char *dst, int dst_len, char *src, int src_len) if (src_len <= 0) return STRCPY_FAIL; - else { - if (src_len < dst_len) { + else + { + if (src_len < dst_len) + { memcpy(dst, src, src_len); dst[src_len] = '\0'; } - else { - memcpy(dst, src, dst_len-1); - dst[dst_len-1] = '\0'; /* truncated */ + else + { + memcpy(dst, src, dst_len - 1); + dst[dst_len - 1] = '\0'; /* truncated */ return STRCPY_TRUNCATED; } } @@ -164,28 +177,29 @@ my_strcpy(char *dst, int dst_len, char *src, int src_len) /* the destination string if src has len characters or more. */ /* instead, I want it to copy up to len-1 characters and always */ /* terminate the destination string. */ -char *strncpy_null(char *dst, const char *src, int len) +char * +strncpy_null(char *dst, const char *src, int len) { -int i; + int i; - if (NULL != dst) { + if (NULL != dst) + { - /* Just in case, check for special lengths */ - if (len == SQL_NULL_DATA) { + /* Just in case, check for special lengths */ + if (len == SQL_NULL_DATA) + { dst[0] = '\0'; return NULL; } else if (len == SQL_NTS) len = strlen(src) + 1; - for(i = 0; src[i] && i < len - 1; i++) { + for (i = 0; src[i] && i < len - 1; i++) dst[i] = src[i]; - } - if(len > 0) { + if (len > 0) dst[i] = '\0'; - } } return dst; } @@ -196,22 +210,24 @@ int i; char * make_string(char *s, int len, char *buf) { -int length; -char *str; + int length; + char *str; - if(s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) { + if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) + { length = (len > 0) ? len : strlen(s); - if (buf) { - strncpy_null(buf, s, length+1); + if (buf) + { + strncpy_null(buf, s, length + 1); return buf; } str = malloc(length + 1); - if ( ! str) + if (!str) return NULL; - strncpy_null(str, s, length+1); + strncpy_null(str, s, length + 1); return str; } @@ -226,10 +242,11 @@ char * my_strcat(char *buf, char *fmt, char *s, int len) { - if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) { - int length = (len > 0) ? len : strlen(s); + if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) + { + int length = (len > 0) ? len : strlen(s); - int pos = strlen(buf); + int pos = strlen(buf); sprintf(&buf[pos], fmt, length, s); return buf; @@ -237,24 +254,26 @@ my_strcat(char *buf, char *fmt, char *s, int len) return NULL; } -void remove_newlines(char *string) +void +remove_newlines(char *string) { unsigned int i; - for(i=0; i < strlen(string); i++) { - if((string[i] == '\n') || - (string[i] == '\r')) { + for (i = 0; i < strlen(string); i++) + { + if ((string[i] == '\n') || + (string[i] == '\r')) string[i] = ' '; - } } } char * trim(char *s) { - int i; + int i; - for (i = strlen(s) - 1; i >= 0; i--) { + for (i = strlen(s) - 1; i >= 0; i--) + { if (s[i] == ' ') s[i] = '\0'; else diff --git a/src/interfaces/odbc/misc.h b/src/interfaces/odbc/misc.h index ebe56ea9d8..e5e916465e 100644 --- a/src/interfaces/odbc/misc.h +++ b/src/interfaces/odbc/misc.h @@ -1,9 +1,9 @@ -/* File: misc.h +/* File: misc.h * - * Description: See "misc.c" + * Description: See "misc.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -39,35 +39,37 @@ #ifdef MY_LOG - #define MYLOGFILE "mylog_" - #ifndef WIN32 - #define MYLOGDIR "/tmp" - #else - #define MYLOGDIR "c:" - #endif - extern void mylog(char * fmt, ...); +#define MYLOGFILE "mylog_" +#ifndef WIN32 +#define MYLOGDIR "/tmp" +#else +#define MYLOGDIR "c:" +#endif +extern void mylog(char *fmt,...); + #else - #ifndef WIN32 - #define mylog(args...) /* GNU convention for variable arguments */ - #else - #define mylog /* mylog */ - #endif +#ifndef WIN32 +#define mylog(args...) /* GNU convention for variable arguments */ +#else +#define mylog /* mylog */ +#endif #endif #ifdef Q_LOG - #define QLOGFILE "psqlodbc_" - #ifndef WIN32 - #define QLOGDIR "/tmp" - #else - #define QLOGDIR "c:" - #endif - extern void qlog(char * fmt, ...); +#define QLOGFILE "psqlodbc_" +#ifndef WIN32 +#define QLOGDIR "/tmp" +#else +#define QLOGDIR "c:" +#endif +extern void qlog(char *fmt,...); + #else - #ifndef WIN32 - #define qlog(args...) /* GNU convention for variable arguments */ - #else - #define qlog /* qlog */ - #endif +#ifndef WIN32 +#define qlog(args...) /* GNU convention for variable arguments */ +#else +#define qlog /* qlog */ +#endif #endif #ifndef WIN32 @@ -78,20 +80,20 @@ #ifdef WIN32 #define PG_BINARY O_BINARY -#define PG_BINARY_R "rb" -#define PG_BINARY_W "wb" +#define PG_BINARY_R "rb" +#define PG_BINARY_W "wb" #else -#define PG_BINARY 0 -#define PG_BINARY_R "r" -#define PG_BINARY_W "w" +#define PG_BINARY 0 +#define PG_BINARY_R "r" +#define PG_BINARY_W "w" #endif -void remove_newlines(char *string); -char *strncpy_null(char *dst, const char *src, int len); -char *trim(char *string); -char *make_string(char *s, int len, char *buf); -char *my_strcat(char *buf, char *fmt, char *s, int len); +void remove_newlines(char *string); +char *strncpy_null(char *dst, const char *src, int len); +char *trim(char *string); +char *make_string(char *s, int len, char *buf); +char *my_strcat(char *buf, char *fmt, char *s, int len); /* defines for return value of my_strcpy */ #define STRCPY_SUCCESS 1 @@ -99,6 +101,6 @@ char *my_strcat(char *buf, char *fmt, char *s, int len); #define STRCPY_TRUNCATED -1 #define STRCPY_NULL -2 -int my_strcpy(char *dst, int dst_len, char *src, int src_len); +int my_strcpy(char *dst, int dst_len, char *src, int src_len); #endif diff --git a/src/interfaces/odbc/options.c b/src/interfaces/odbc/options.c index 67c973ec0a..acb36a2a96 100644 --- a/src/interfaces/odbc/options.c +++ b/src/interfaces/odbc/options.c @@ -1,14 +1,14 @@ -/* Module: options.c +/* Module: options.c * - * Description: This module contains routines for getting/setting - * connection and statement options. + * Description: This module contains routines for getting/setting + * connection and statement options. * - * Classes: n/a + * Classes: n/a * - * API functions: SQLSetConnectOption, SQLSetStmtOption, SQLGetConnectOption, - * SQLGetStmtOption + * API functions: SQLSetConnectOption, SQLSetStmtOption, SQLGetConnectOption, + * SQLGetStmtOption * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -37,207 +37,246 @@ extern GLOBAL_VALUES globals; -RETCODE set_statement_option(ConnectionClass *conn, - StatementClass *stmt, - UWORD fOption, - UDWORD vParam); +RETCODE set_statement_option(ConnectionClass * conn, + StatementClass * stmt, + UWORD fOption, + UDWORD vParam); -RETCODE set_statement_option(ConnectionClass *conn, - StatementClass *stmt, - UWORD fOption, - UDWORD vParam) +RETCODE +set_statement_option(ConnectionClass * conn, + StatementClass * stmt, + UWORD fOption, + UDWORD vParam) { -static char *func="set_statement_option"; -char changed = FALSE; + static char *func = "set_statement_option"; + char changed = FALSE; - switch(fOption) { - case SQL_ASYNC_ENABLE:/* ignored */ - break; + switch (fOption) + { + case SQL_ASYNC_ENABLE: /* ignored */ + break; - case SQL_BIND_TYPE: - /* now support multi-column and multi-row binding */ - if (conn) conn->stmtOptions.bind_size = vParam; - if (stmt) stmt->options.bind_size = vParam; - break; + case SQL_BIND_TYPE: + /* now support multi-column and multi-row binding */ + if (conn) + conn->stmtOptions.bind_size = vParam; + if (stmt) + stmt->options.bind_size = vParam; + break; - case SQL_CONCURRENCY: - /* positioned update isn't supported so cursor concurrency is read-only */ + case SQL_CONCURRENCY: - if (conn) conn->stmtOptions.scroll_concurrency = vParam; - if (stmt) stmt->options.scroll_concurrency = vParam; - break; + /* + * positioned update isn't supported so cursor concurrency is + * read-only + */ - /* - if (globals.lie) { - if (conn) conn->stmtOptions.scroll_concurrency = vParam; - if (stmt) stmt->options.scroll_concurrency = vParam; - } - else { + if (conn) + conn->stmtOptions.scroll_concurrency = vParam; + if (stmt) + stmt->options.scroll_concurrency = vParam; + break; - if (conn) conn->stmtOptions.scroll_concurrency = SQL_CONCUR_READ_ONLY; - if (stmt) stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; + /* + * if (globals.lie) { if (conn) + * conn->stmtOptions.scroll_concurrency = vParam; if (stmt) + * stmt->options.scroll_concurrency = vParam; } else { + * + * if (conn) conn->stmtOptions.scroll_concurrency = + * SQL_CONCUR_READ_ONLY; if (stmt) + * stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; + * + * if (vParam != SQL_CONCUR_READ_ONLY) changed = TRUE; } break; + */ + + case SQL_CURSOR_TYPE: + + /* + * if declare/fetch, then type can only be forward. otherwise, + * it can only be forward or static. + */ + mylog("SetStmtOption(): SQL_CURSOR_TYPE = %d\n", vParam); + + if (globals.lie) + { + + if (conn) + conn->stmtOptions.cursor_type = vParam; + if (stmt) + stmt->options.cursor_type = vParam; - if (vParam != SQL_CONCUR_READ_ONLY) - changed = TRUE; - } - break; - */ - - case SQL_CURSOR_TYPE: - /* if declare/fetch, then type can only be forward. - otherwise, it can only be forward or static. - */ - mylog("SetStmtOption(): SQL_CURSOR_TYPE = %d\n", vParam); + } + else + { + if (globals.use_declarefetch) + { + + if (conn) + conn->stmtOptions.cursor_type = SQL_CURSOR_FORWARD_ONLY; + if (stmt) + stmt->options.cursor_type = SQL_CURSOR_FORWARD_ONLY; + + if (vParam != SQL_CURSOR_FORWARD_ONLY) + changed = TRUE; + } + else + { + if (vParam == SQL_CURSOR_FORWARD_ONLY || vParam == SQL_CURSOR_STATIC) + { + + if (conn) + conn->stmtOptions.cursor_type = vParam; /* valid type */ + if (stmt) + stmt->options.cursor_type = vParam; /* valid type */ + } + else + { + + if (conn) + conn->stmtOptions.cursor_type = SQL_CURSOR_STATIC; + if (stmt) + stmt->options.cursor_type = SQL_CURSOR_STATIC; + + changed = TRUE; + } + } + } + break; - if (globals.lie) { + case SQL_KEYSET_SIZE: /* ignored, but saved and returned */ + mylog("SetStmtOption(): SQL_KEYSET_SIZE, vParam = %d\n", vParam); - if (conn) conn->stmtOptions.cursor_type = vParam; - if (stmt) stmt->options.cursor_type = vParam; + if (conn) + conn->stmtOptions.keyset_size = vParam; + if (stmt) + stmt->options.keyset_size = vParam; - } - else { - if (globals.use_declarefetch) { + break; - if (conn) conn->stmtOptions.cursor_type = SQL_CURSOR_FORWARD_ONLY; - if (stmt) stmt->options.cursor_type = SQL_CURSOR_FORWARD_ONLY; + /* + * if (globals.lie) stmt->keyset_size = vParam; else { + * stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + * stmt->errormsg = "Driver does not support keyset size + * option"; SC_log_error(func, "", stmt); return SQL_ERROR; } + */ + + case SQL_MAX_LENGTH: /* ignored, but saved */ + mylog("SetStmtOption(): SQL_MAX_LENGTH, vParam = %d\n", vParam); + if (conn) + conn->stmtOptions.maxLength = vParam; + if (stmt) + stmt->options.maxLength = vParam; + break; - if (vParam != SQL_CURSOR_FORWARD_ONLY) - changed = TRUE; - } - else { - if (vParam == SQL_CURSOR_FORWARD_ONLY || vParam == SQL_CURSOR_STATIC) { + case SQL_MAX_ROWS: /* ignored, but saved */ + mylog("SetStmtOption(): SQL_MAX_ROWS, vParam = %d\n", vParam); + if (conn) + conn->stmtOptions.maxRows = vParam; + if (stmt) + stmt->options.maxRows = vParam; + break; - if (conn) conn->stmtOptions.cursor_type = vParam; /* valid type */ - if (stmt) stmt->options.cursor_type = vParam; /* valid type */ - } - else { + case SQL_NOSCAN: /* ignored */ + mylog("SetStmtOption: SQL_NOSCAN, vParam = %d\n", vParam); + break; - if (conn) conn->stmtOptions.cursor_type = SQL_CURSOR_STATIC; - if (stmt) stmt->options.cursor_type = SQL_CURSOR_STATIC; + case SQL_QUERY_TIMEOUT:/* ignored */ + mylog("SetStmtOption: SQL_QUERY_TIMEOUT, vParam = %d\n", vParam); + /* "0" returned in SQLGetStmtOption */ + break; - changed = TRUE; - } - } - } - break; + case SQL_RETRIEVE_DATA:/* ignored, but saved */ + mylog("SetStmtOption(): SQL_RETRIEVE_DATA, vParam = %d\n", vParam); + if (conn) + conn->stmtOptions.retrieve_data = vParam; + if (stmt) + stmt->options.retrieve_data = vParam; + break; - case SQL_KEYSET_SIZE: /* ignored, but saved and returned */ - mylog("SetStmtOption(): SQL_KEYSET_SIZE, vParam = %d\n", vParam); + case SQL_ROWSET_SIZE: + mylog("SetStmtOption(): SQL_ROWSET_SIZE, vParam = %d\n", vParam); - if (conn) conn->stmtOptions.keyset_size = vParam; - if (stmt) stmt->options.keyset_size = vParam; - break; + /* + * Save old rowset size for SQLExtendedFetch purposes If the + * rowset_size is being changed since the last call to fetch + * rows. + */ - /* - if (globals.lie) - stmt->keyset_size = vParam; - else { - stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - stmt->errormsg = "Driver does not support keyset size option"; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } - */ - - case SQL_MAX_LENGTH:/* ignored, but saved */ - mylog("SetStmtOption(): SQL_MAX_LENGTH, vParam = %d\n", vParam); - if (conn) conn->stmtOptions.maxLength = vParam; - if (stmt) stmt->options.maxLength = vParam; - break; - - case SQL_MAX_ROWS: /* ignored, but saved */ - mylog("SetStmtOption(): SQL_MAX_ROWS, vParam = %d\n", vParam); - if (conn) conn->stmtOptions.maxRows = vParam; - if (stmt) stmt->options.maxRows = vParam; - break; - - case SQL_NOSCAN: /* ignored */ - mylog("SetStmtOption: SQL_NOSCAN, vParam = %d\n", vParam); - break; - - case SQL_QUERY_TIMEOUT: /* ignored */ - mylog("SetStmtOption: SQL_QUERY_TIMEOUT, vParam = %d\n", vParam); - /* "0" returned in SQLGetStmtOption */ - break; - - case SQL_RETRIEVE_DATA: /* ignored, but saved */ - mylog("SetStmtOption(): SQL_RETRIEVE_DATA, vParam = %d\n", vParam); - if (conn) conn->stmtOptions.retrieve_data = vParam; - if (stmt) stmt->options.retrieve_data = vParam; - break; - - case SQL_ROWSET_SIZE: - mylog("SetStmtOption(): SQL_ROWSET_SIZE, vParam = %d\n", vParam); - - - /* Save old rowset size for SQLExtendedFetch purposes - If the rowset_size is being changed since the last call - to fetch rows. - */ - - if (stmt && stmt->save_rowset_size <= 0 && stmt->last_fetch_count > 0 ) - stmt->save_rowset_size = stmt->options.rowset_size; - - if (vParam < 1) { - vParam = 1; - changed = TRUE; - } + if (stmt && stmt->save_rowset_size <= 0 && stmt->last_fetch_count > 0) + stmt->save_rowset_size = stmt->options.rowset_size; - if (conn) conn->stmtOptions.rowset_size = vParam; - if (stmt) stmt->options.rowset_size = vParam; + if (vParam < 1) + { + vParam = 1; + changed = TRUE; + } - break; + if (conn) + conn->stmtOptions.rowset_size = vParam; + if (stmt) + stmt->options.rowset_size = vParam; - case SQL_SIMULATE_CURSOR: /* NOT SUPPORTED */ - if (stmt) { - stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - stmt->errormsg = "Simulated positioned update/delete not supported. Use the cursor library."; - SC_log_error(func, "", stmt); - } - if (conn) { - conn->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - conn->errormsg = "Simulated positioned update/delete not supported. Use the cursor library."; - CC_log_error(func, "", conn); - } - return SQL_ERROR; + break; - case SQL_USE_BOOKMARKS: + case SQL_SIMULATE_CURSOR: /* NOT SUPPORTED */ + if (stmt) + { + stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + stmt->errormsg = "Simulated positioned update/delete not supported. Use the cursor library."; + SC_log_error(func, "", stmt); + } + if (conn) + { + conn->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + conn->errormsg = "Simulated positioned update/delete not supported. Use the cursor library."; + CC_log_error(func, "", conn); + } + return SQL_ERROR; - if (stmt) stmt->options.use_bookmarks = vParam; - if (conn) conn->stmtOptions.use_bookmarks = vParam; - break; + case SQL_USE_BOOKMARKS: - default: - { - char option[64]; + if (stmt) + stmt->options.use_bookmarks = vParam; + if (conn) + conn->stmtOptions.use_bookmarks = vParam; + break; - if (stmt) { - stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - stmt->errormsg = "Unknown statement option (Set)"; - sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); - SC_log_error(func, option, stmt); - } - if (conn) { - conn->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - conn->errormsg = "Unknown statement option (Set)"; - sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); - CC_log_error(func, option, conn); - } + default: + { + char option[64]; + + if (stmt) + { + stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + stmt->errormsg = "Unknown statement option (Set)"; + sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); + SC_log_error(func, option, stmt); + } + if (conn) + { + conn->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + conn->errormsg = "Unknown statement option (Set)"; + sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); + CC_log_error(func, option, conn); + } - return SQL_ERROR; - } - } + return SQL_ERROR; + } + } - if (changed) { - if (stmt) { + if (changed) + { + if (stmt) + { stmt->errormsg = "Requested value changed."; stmt->errornumber = STMT_OPTION_VALUE_CHANGED; } - if (conn) { + if (conn) + { conn->errormsg = "Requested value changed."; conn->errornumber = STMT_OPTION_VALUE_CHANGED; } @@ -250,133 +289,145 @@ char changed = FALSE; /* Implements only SQL_AUTOCOMMIT */ -RETCODE SQL_API SQLSetConnectOption( - HDBC hdbc, - UWORD fOption, - UDWORD vParam) +RETCODE SQL_API +SQLSetConnectOption( + HDBC hdbc, + UWORD fOption, + UDWORD vParam) { -static char *func="SQLSetConnectOption"; -ConnectionClass *conn = (ConnectionClass *) hdbc; -char changed = FALSE; -RETCODE retval; -int i; + static char *func = "SQLSetConnectOption"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + char changed = FALSE; + RETCODE retval; + int i; mylog("%s: entering...\n", func); - if ( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - switch (fOption) { - /* Statement Options - (apply to all stmts on the connection and become defaults for new stmts) - */ - case SQL_ASYNC_ENABLE: - case SQL_BIND_TYPE: - case SQL_CONCURRENCY: - case SQL_CURSOR_TYPE: - case SQL_KEYSET_SIZE: - case SQL_MAX_LENGTH: - case SQL_MAX_ROWS: - case SQL_NOSCAN: - case SQL_QUERY_TIMEOUT: - case SQL_RETRIEVE_DATA: - case SQL_ROWSET_SIZE: - case SQL_SIMULATE_CURSOR: - case SQL_USE_BOOKMARKS: - - /* Affect all current Statements */ - for (i = 0; i < conn->num_stmts; i++) { - if ( conn->stmts[i]) { - set_statement_option(NULL, conn->stmts[i], fOption, vParam); + switch (fOption) + { + + /* + * Statement Options (apply to all stmts on the connection and + * become defaults for new stmts) + */ + case SQL_ASYNC_ENABLE: + case SQL_BIND_TYPE: + case SQL_CONCURRENCY: + case SQL_CURSOR_TYPE: + case SQL_KEYSET_SIZE: + case SQL_MAX_LENGTH: + case SQL_MAX_ROWS: + case SQL_NOSCAN: + case SQL_QUERY_TIMEOUT: + case SQL_RETRIEVE_DATA: + case SQL_ROWSET_SIZE: + case SQL_SIMULATE_CURSOR: + case SQL_USE_BOOKMARKS: + + /* Affect all current Statements */ + for (i = 0; i < conn->num_stmts; i++) + { + if (conn->stmts[i]) + set_statement_option(NULL, conn->stmts[i], fOption, vParam); } - } - /* Become the default for all future statements on this connection */ - retval = set_statement_option(conn, NULL, fOption, vParam); + /* + * Become the default for all future statements on this + * connection + */ + retval = set_statement_option(conn, NULL, fOption, vParam); - if (retval == SQL_SUCCESS_WITH_INFO) - changed = TRUE; - else if (retval == SQL_ERROR) - return SQL_ERROR; + if (retval == SQL_SUCCESS_WITH_INFO) + changed = TRUE; + else if (retval == SQL_ERROR) + return SQL_ERROR; - break; + break; - /**********************************/ - /***** Connection Options *******/ - /**********************************/ + /**********************************/ + /***** Connection Options *******/ + /**********************************/ - case SQL_ACCESS_MODE: /* ignored */ - break; + case SQL_ACCESS_MODE: /* ignored */ + break; - case SQL_AUTOCOMMIT: + case SQL_AUTOCOMMIT: - if (CC_is_in_trans(conn)) { - conn->errormsg = "Cannot switch commit mode while a transaction is in progress"; - conn->errornumber = CONN_TRANSACT_IN_PROGRES; - CC_log_error(func, "", conn); - return SQL_ERROR; - } + if (CC_is_in_trans(conn)) + { + conn->errormsg = "Cannot switch commit mode while a transaction is in progress"; + conn->errornumber = CONN_TRANSACT_IN_PROGRES; + CC_log_error(func, "", conn); + return SQL_ERROR; + } + + mylog("SQLSetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam); + + switch (vParam) + { + case SQL_AUTOCOMMIT_OFF: + CC_set_autocommit_off(conn); + break; - mylog("SQLSetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam); + case SQL_AUTOCOMMIT_ON: + CC_set_autocommit_on(conn); + break; + + default: + conn->errormsg = "Illegal parameter value for SQL_AUTOCOMMIT"; + conn->errornumber = CONN_INVALID_ARGUMENT_NO; + CC_log_error(func, "", conn); + return SQL_ERROR; + } - switch(vParam) { - case SQL_AUTOCOMMIT_OFF: - CC_set_autocommit_off(conn); break; - case SQL_AUTOCOMMIT_ON: - CC_set_autocommit_on(conn); + case SQL_CURRENT_QUALIFIER: /* ignored */ + break; + + case SQL_LOGIN_TIMEOUT:/* ignored */ + break; + + case SQL_PACKET_SIZE: /* ignored */ + break; + + case SQL_QUIET_MODE: /* ignored */ + break; + + case SQL_TXN_ISOLATION:/* ignored */ + break; + + /* These options should be handled by driver manager */ + case SQL_ODBC_CURSORS: + case SQL_OPT_TRACE: + case SQL_OPT_TRACEFILE: + case SQL_TRANSLATE_DLL: + case SQL_TRANSLATE_OPTION: + CC_log_error(func, "This connect option (Set) is only used by the Driver Manager", conn); break; default: - conn->errormsg = "Illegal parameter value for SQL_AUTOCOMMIT"; - conn->errornumber = CONN_INVALID_ARGUMENT_NO; - CC_log_error(func, "", conn); - return SQL_ERROR; - } + { + char option[64]; - break; - - case SQL_CURRENT_QUALIFIER: /* ignored */ - break; - - case SQL_LOGIN_TIMEOUT: /* ignored */ - break; - - case SQL_PACKET_SIZE: /* ignored */ - break; - - case SQL_QUIET_MODE: /* ignored */ - break; - - case SQL_TXN_ISOLATION: /* ignored */ - break; - - /* These options should be handled by driver manager */ - case SQL_ODBC_CURSORS: - case SQL_OPT_TRACE: - case SQL_OPT_TRACEFILE: - case SQL_TRANSLATE_DLL: - case SQL_TRANSLATE_OPTION: - CC_log_error(func, "This connect option (Set) is only used by the Driver Manager", conn); - break; - - default: - { - char option[64]; - conn->errormsg = "Unknown connect option (Set)"; - conn->errornumber = CONN_UNSUPPORTED_OPTION; - sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); - CC_log_error(func, option, conn); - return SQL_ERROR; - } + conn->errormsg = "Unknown connect option (Set)"; + conn->errornumber = CONN_UNSUPPORTED_OPTION; + sprintf(option, "fOption=%d, vParam=%ld", fOption, vParam); + CC_log_error(func, option, conn); + return SQL_ERROR; + } - } + } - if (changed) { + if (changed) + { conn->errornumber = CONN_OPTION_VALUE_CHANGED; conn->errormsg = "Requested value changed."; return SQL_SUCCESS_WITH_INFO; @@ -385,90 +436,95 @@ int i; return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ /* This function just can tell you whether you are in Autcommit mode or not */ -RETCODE SQL_API SQLGetConnectOption( - HDBC hdbc, - UWORD fOption, - PTR pvParam) +RETCODE SQL_API +SQLGetConnectOption( + HDBC hdbc, + UWORD fOption, + PTR pvParam) { -static char *func="SQLGetConnectOption"; -ConnectionClass *conn = (ConnectionClass *) hdbc; + static char *func = "SQLGetConnectOption"; + ConnectionClass *conn = (ConnectionClass *) hdbc; mylog("%s: entering...\n", func); - if (! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - switch (fOption) { - case SQL_ACCESS_MODE:/* NOT SUPPORTED */ - *((UDWORD *) pvParam) = SQL_MODE_READ_WRITE; - break; + switch (fOption) + { + case SQL_ACCESS_MODE: /* NOT SUPPORTED */ + *((UDWORD *) pvParam) = SQL_MODE_READ_WRITE; + break; - case SQL_AUTOCOMMIT: - *((UDWORD *)pvParam) = (UDWORD)( CC_is_in_autocommit(conn) ? - SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF); - break; + case SQL_AUTOCOMMIT: + *((UDWORD *) pvParam) = (UDWORD) (CC_is_in_autocommit(conn) ? + SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF); + break; - case SQL_CURRENT_QUALIFIER: /* don't use qualifiers */ - if(pvParam) - strcpy(pvParam, ""); + case SQL_CURRENT_QUALIFIER: /* don't use qualifiers */ + if (pvParam) + strcpy(pvParam, ""); - break; + break; - case SQL_LOGIN_TIMEOUT: /* NOT SUPPORTED */ - *((UDWORD *) pvParam) = 0; - break; + case SQL_LOGIN_TIMEOUT:/* NOT SUPPORTED */ + *((UDWORD *) pvParam) = 0; + break; - case SQL_PACKET_SIZE: /* NOT SUPPORTED */ - *((UDWORD *) pvParam) = globals.socket_buffersize; - break; + case SQL_PACKET_SIZE: /* NOT SUPPORTED */ + *((UDWORD *) pvParam) = globals.socket_buffersize; + break; - case SQL_QUIET_MODE:/* NOT SUPPORTED */ - *((UDWORD *) pvParam) = (UDWORD) NULL; - break; + case SQL_QUIET_MODE: /* NOT SUPPORTED */ + *((UDWORD *) pvParam) = (UDWORD) NULL; + break; - case SQL_TXN_ISOLATION:/* NOT SUPPORTED */ - *((UDWORD *) pvParam) = SQL_TXN_SERIALIZABLE; - break; + case SQL_TXN_ISOLATION:/* NOT SUPPORTED */ + *((UDWORD *) pvParam) = SQL_TXN_SERIALIZABLE; + break; - /* These options should be handled by driver manager */ - case SQL_ODBC_CURSORS: - case SQL_OPT_TRACE: - case SQL_OPT_TRACEFILE: - case SQL_TRANSLATE_DLL: - case SQL_TRANSLATE_OPTION: - CC_log_error(func, "This connect option (Get) is only used by the Driver Manager", conn); - break; + /* These options should be handled by driver manager */ + case SQL_ODBC_CURSORS: + case SQL_OPT_TRACE: + case SQL_OPT_TRACEFILE: + case SQL_TRANSLATE_DLL: + case SQL_TRANSLATE_OPTION: + CC_log_error(func, "This connect option (Get) is only used by the Driver Manager", conn); + break; - default: - { - char option[64]; - conn->errormsg = "Unknown connect option (Get)"; - conn->errornumber = CONN_UNSUPPORTED_OPTION; - sprintf(option, "fOption=%d", fOption); - CC_log_error(func, option, conn); - return SQL_ERROR; - break; - } + default: + { + char option[64]; - } + conn->errormsg = "Unknown connect option (Get)"; + conn->errornumber = CONN_UNSUPPORTED_OPTION; + sprintf(option, "fOption=%d", fOption); + CC_log_error(func, option, conn); + return SQL_ERROR; + break; + } + + } return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLSetStmtOption( - HSTMT hstmt, - UWORD fOption, - UDWORD vParam) +RETCODE SQL_API +SQLSetStmtOption( + HSTMT hstmt, + UWORD fOption, + UDWORD vParam) { -static char *func="SQLSetStmtOption"; -StatementClass *stmt = (StatementClass *) hstmt; + static char *func = "SQLSetStmtOption"; + StatementClass *stmt = (StatementClass *) hstmt; mylog("%s: entering...\n", func); @@ -476,7 +532,8 @@ StatementClass *stmt = (StatementClass *) hstmt; /* all the time, but it tries to set a huge value for SQL_MAX_LENGTH */ /* and expects the driver to reduce it to the real value */ - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -485,16 +542,17 @@ StatementClass *stmt = (StatementClass *) hstmt; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -RETCODE SQL_API SQLGetStmtOption( - HSTMT hstmt, - UWORD fOption, - PTR pvParam) +RETCODE SQL_API +SQLGetStmtOption( + HSTMT hstmt, + UWORD fOption, + PTR pvParam) { -static char *func="SQLGetStmtOption"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; + static char *func = "SQLGetStmtOption"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; mylog("%s: entering...\n", func); @@ -502,115 +560,123 @@ QResultClass *res; /* all the time, but it tries to set a huge value for SQL_MAX_LENGTH */ /* and expects the driver to reduce it to the real value */ - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - switch(fOption) { - case SQL_GET_BOOKMARK: - case SQL_ROW_NUMBER: - - res = stmt->result; - - if ( stmt->manual_result || ! globals.use_declarefetch) { - /* make sure we're positioned on a valid row */ - if((stmt->currTuple < 0) || - (stmt->currTuple >= QR_get_num_tuples(res))) { - stmt->errormsg = "Not positioned on a valid row."; - stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; + switch (fOption) + { + case SQL_GET_BOOKMARK: + case SQL_ROW_NUMBER: + + res = stmt->result; + + if (stmt->manual_result || !globals.use_declarefetch) + { + /* make sure we're positioned on a valid row */ + if ((stmt->currTuple < 0) || + (stmt->currTuple >= QR_get_num_tuples(res))) + { + stmt->errormsg = "Not positioned on a valid row."; + stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } } - } - else { - if (stmt->currTuple == -1 || ! res || ! res->tupleField) { - stmt->errormsg = "Not positioned on a valid row."; - stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; + else + { + if (stmt->currTuple == -1 || !res || !res->tupleField) + { + stmt->errormsg = "Not positioned on a valid row."; + stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } + } + + if (fOption == SQL_GET_BOOKMARK && stmt->options.use_bookmarks == SQL_UB_OFF) + { + stmt->errormsg = "Operation invalid because use bookmarks not enabled."; + stmt->errornumber = STMT_OPERATION_INVALID; SC_log_error(func, "", stmt); return SQL_ERROR; } - } - if (fOption == SQL_GET_BOOKMARK && stmt->options.use_bookmarks == SQL_UB_OFF) { - stmt->errormsg = "Operation invalid because use bookmarks not enabled."; - stmt->errornumber = STMT_OPERATION_INVALID; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + *((UDWORD *) pvParam) = SC_get_bookmark(stmt); - *((UDWORD *) pvParam) = SC_get_bookmark(stmt); - - break; + break; - case SQL_ASYNC_ENABLE: /* NOT SUPPORTED */ - *((SDWORD *) pvParam) = SQL_ASYNC_ENABLE_OFF; - break; + case SQL_ASYNC_ENABLE: /* NOT SUPPORTED */ + *((SDWORD *) pvParam) = SQL_ASYNC_ENABLE_OFF; + break; - case SQL_BIND_TYPE: - *((SDWORD *) pvParam) = stmt->options.bind_size; - break; + case SQL_BIND_TYPE: + *((SDWORD *) pvParam) = stmt->options.bind_size; + break; - case SQL_CONCURRENCY: /* NOT REALLY SUPPORTED */ - mylog("GetStmtOption(): SQL_CONCURRENCY\n"); - *((SDWORD *)pvParam) = stmt->options.scroll_concurrency; - break; + case SQL_CONCURRENCY: /* NOT REALLY SUPPORTED */ + mylog("GetStmtOption(): SQL_CONCURRENCY\n"); + *((SDWORD *) pvParam) = stmt->options.scroll_concurrency; + break; - case SQL_CURSOR_TYPE: /* PARTIAL SUPPORT */ - mylog("GetStmtOption(): SQL_CURSOR_TYPE\n"); - *((SDWORD *)pvParam) = stmt->options.cursor_type; - break; + case SQL_CURSOR_TYPE: /* PARTIAL SUPPORT */ + mylog("GetStmtOption(): SQL_CURSOR_TYPE\n"); + *((SDWORD *) pvParam) = stmt->options.cursor_type; + break; - case SQL_KEYSET_SIZE: /* NOT SUPPORTED, but saved */ - mylog("GetStmtOption(): SQL_KEYSET_SIZE\n"); - *((SDWORD *)pvParam) = stmt->options.keyset_size; - break; + case SQL_KEYSET_SIZE: /* NOT SUPPORTED, but saved */ + mylog("GetStmtOption(): SQL_KEYSET_SIZE\n"); + *((SDWORD *) pvParam) = stmt->options.keyset_size; + break; - case SQL_MAX_LENGTH: /* NOT SUPPORTED, but saved */ - *((SDWORD *)pvParam) = stmt->options.maxLength; - break; + case SQL_MAX_LENGTH: /* NOT SUPPORTED, but saved */ + *((SDWORD *) pvParam) = stmt->options.maxLength; + break; - case SQL_MAX_ROWS: /* NOT SUPPORTED, but saved */ - *((SDWORD *)pvParam) = stmt->options.maxRows; - mylog("GetSmtOption: MAX_ROWS, returning %d\n", stmt->options.maxRows); - break; + case SQL_MAX_ROWS: /* NOT SUPPORTED, but saved */ + *((SDWORD *) pvParam) = stmt->options.maxRows; + mylog("GetSmtOption: MAX_ROWS, returning %d\n", stmt->options.maxRows); + break; - case SQL_NOSCAN:/* NOT SUPPORTED */ - *((SDWORD *) pvParam) = SQL_NOSCAN_ON; - break; + case SQL_NOSCAN: /* NOT SUPPORTED */ + *((SDWORD *) pvParam) = SQL_NOSCAN_ON; + break; - case SQL_QUERY_TIMEOUT: /* NOT SUPPORTED */ - *((SDWORD *) pvParam) = 0; - break; + case SQL_QUERY_TIMEOUT:/* NOT SUPPORTED */ + *((SDWORD *) pvParam) = 0; + break; - case SQL_RETRIEVE_DATA: /* NOT SUPPORTED, but saved */ - *((SDWORD *) pvParam) = stmt->options.retrieve_data; - break; + case SQL_RETRIEVE_DATA:/* NOT SUPPORTED, but saved */ + *((SDWORD *) pvParam) = stmt->options.retrieve_data; + break; - case SQL_ROWSET_SIZE: - *((SDWORD *) pvParam) = stmt->options.rowset_size; - break; + case SQL_ROWSET_SIZE: + *((SDWORD *) pvParam) = stmt->options.rowset_size; + break; - case SQL_SIMULATE_CURSOR:/* NOT SUPPORTED */ - *((SDWORD *) pvParam) = SQL_SC_NON_UNIQUE; - break; + case SQL_SIMULATE_CURSOR: /* NOT SUPPORTED */ + *((SDWORD *) pvParam) = SQL_SC_NON_UNIQUE; + break; - case SQL_USE_BOOKMARKS: - *((SDWORD *) pvParam) = stmt->options.use_bookmarks; - break; + case SQL_USE_BOOKMARKS: + *((SDWORD *) pvParam) = stmt->options.use_bookmarks; + break; - default: - { - char option[64]; - stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; - stmt->errormsg = "Unknown statement option (Get)"; - sprintf(option, "fOption=%d", fOption); - SC_log_error(func, option, stmt); - return SQL_ERROR; - } + default: + { + char option[64]; + + stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; + stmt->errormsg = "Unknown statement option (Get)"; + sprintf(option, "fOption=%d", fOption); + SC_log_error(func, option, stmt); + return SQL_ERROR; + } } return SQL_SUCCESS; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ diff --git a/src/interfaces/odbc/parse.c b/src/interfaces/odbc/parse.c index dd85e66dce..20fedccccd 100644 --- a/src/interfaces/odbc/parse.c +++ b/src/interfaces/odbc/parse.c @@ -1,19 +1,19 @@ -/* Module: parse.c +/* Module: parse.c * - * Description: This module contains routines related to parsing SQL statements. - * This can be useful for two reasons: + * Description: This module contains routines related to parsing SQL statements. + * This can be useful for two reasons: * - * 1. So the query does not actually have to be executed to return data about it + * 1. So the query does not actually have to be executed to return data about it * - * 2. To be able to return information about precision, nullability, aliases, etc. - * in the functions SQLDescribeCol and SQLColAttributes. Currently, Postgres - * doesn't return any information about these things in a query. + * 2. To be able to return information about precision, nullability, aliases, etc. + * in the functions SQLDescribeCol and SQLColAttributes. Currently, Postgres + * doesn't return any information about these things in a query. * - * Classes: none + * Classes: none * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -28,7 +28,7 @@ #ifndef WIN32 #ifndef HAVE_STRICMP -#define stricmp(s1,s2) strcasecmp(s1,s2) +#define stricmp(s1,s2) strcasecmp(s1,s2) #define strnicmp(s1,s2,n) strncasecmp(s1,s2,n) #endif #endif @@ -37,16 +37,17 @@ #define TAB_INCR 8 #define COL_INCR 16 -char *getNextToken(char *s, char *token, int smax, char *delim, char *quote, char *dquote, char *numeric); -void getColInfo(COL_INFO *col_info, FIELD_INFO *fi, int k); -char searchColInfo(COL_INFO *col_info, FIELD_INFO *fi); +char *getNextToken(char *s, char *token, int smax, char *delim, char *quote, char *dquote, char *numeric); +void getColInfo(COL_INFO * col_info, FIELD_INFO * fi, int k); +char searchColInfo(COL_INFO * col_info, FIELD_INFO * fi); char * getNextToken(char *s, char *token, int smax, char *delim, char *quote, char *dquote, char *numeric) { -int i = 0; -int out = 0; -char qc, in_escape = FALSE; + int i = 0; + int out = 0; + char qc, + in_escape = FALSE; if (smax <= 1) return NULL; @@ -54,44 +55,55 @@ char qc, in_escape = FALSE; smax--; /* skip leading delimiters */ - while (isspace((unsigned char) s[i]) || s[i] == ',') { + while (isspace((unsigned char) s[i]) || s[i] == ',') + { /* mylog("skipping '%c'\n", s[i]); */ i++; } - if (s[0] == '\0') { + if (s[0] == '\0') + { token[0] = '\0'; return NULL; } - if (quote) *quote = FALSE; - if (dquote) *dquote = FALSE; - if (numeric) *numeric = FALSE; + if (quote) + *quote = FALSE; + if (dquote) + *dquote = FALSE; + if (numeric) + *numeric = FALSE; /* get the next token */ - while ( ! isspace((unsigned char) s[i]) && s[i] != ',' && - s[i] != '\0' && out != smax) { + while (!isspace((unsigned char) s[i]) && s[i] != ',' && + s[i] != '\0' && out != smax) + { - /* Handle quoted stuff */ - if ( out == 0 && (s[i] == '\"' || s[i] == '\'')) { + /* Handle quoted stuff */ + if (out == 0 && (s[i] == '\"' || s[i] == '\'')) + { qc = s[i]; - if (qc == '\"') { - if (dquote) *dquote = TRUE; + if (qc == '\"') + { + if (dquote) + *dquote = TRUE; } - if (qc == '\'') { - if (quote) *quote = TRUE; + if (qc == '\'') + { + if (quote) + *quote = TRUE; } - i++; /* dont return the quote */ - while (s[i] != '\0' && out != smax) { - if (s[i] == qc && ! in_escape) { + i++; /* dont return the quote */ + while (s[i] != '\0' && out != smax) + { + if (s[i] == qc && !in_escape) break; - } - if (s[i] == '\\' && ! in_escape) { + if (s[i] == '\\' && !in_escape) in_escape = TRUE; - } - else { - in_escape = FALSE; + else + { + in_escape = FALSE; token[out++] = s[i]; } i++; @@ -101,20 +113,24 @@ char qc, in_escape = FALSE; break; } - /* Check for numeric literals */ - if ( out == 0 && isdigit((unsigned char) s[i])) { - if (numeric) *numeric = TRUE; + /* Check for numeric literals */ + if (out == 0 && isdigit((unsigned char) s[i])) + { + if (numeric) + *numeric = TRUE; token[out++] = s[i++]; - while ( isalnum((unsigned char) s[i]) || s[i] == '.') + while (isalnum((unsigned char) s[i]) || s[i] == '.') token[out++] = s[i++]; break; } - if ( ispunct((unsigned char) s[i]) && s[i] != '_') { + if (ispunct((unsigned char) s[i]) && s[i] != '_') + { mylog("got ispunct: s[%d] = '%c'\n", i, s[i]); - if (out == 0) { + if (out == 0) + { token[out++] = s[i++]; break; } @@ -132,25 +148,30 @@ char qc, in_escape = FALSE; token[out] = '\0'; - /* find the delimiter */ - while ( isspace((unsigned char) s[i])) + /* find the delimiter */ + while (isspace((unsigned char) s[i])) i++; - /* return the most priority delimiter */ - if (s[i] == ',') { - if (delim) *delim = s[i]; + /* return the most priority delimiter */ + if (s[i] == ',') + { + if (delim) + *delim = s[i]; } - else if (s[i] == '\0') { - if (delim) *delim = '\0'; + else if (s[i] == '\0') + { + if (delim) + *delim = '\0'; } - else { - if (delim) *delim = ' '; + else + { + if (delim) + *delim = ' '; } /* skip trailing blanks */ - while ( isspace((unsigned char) s[i])) { + while (isspace((unsigned char) s[i])) i++; - } return &s[i]; } @@ -176,28 +197,30 @@ QR_set_field_info(stmt->result, 13, "FIELD_TYPE", PG_TYPE_INT4, 4); #endif void -getColInfo(COL_INFO *col_info, FIELD_INFO *fi, int k) +getColInfo(COL_INFO * col_info, FIELD_INFO * fi, int k) { if (fi->name[0] == '\0') strcpy(fi->name, QR_get_value_manual(col_info->result, k, 3)); - fi->type = atoi( QR_get_value_manual(col_info->result, k, 13)); - fi->precision = atoi( QR_get_value_manual(col_info->result, k, 6)); - fi->length = atoi( QR_get_value_manual(col_info->result, k, 7)); - fi->nullable = atoi( QR_get_value_manual(col_info->result, k, 10)); - fi->display_size = atoi( QR_get_value_manual(col_info->result, k, 12)); + fi->type = atoi(QR_get_value_manual(col_info->result, k, 13)); + fi->precision = atoi(QR_get_value_manual(col_info->result, k, 6)); + fi->length = atoi(QR_get_value_manual(col_info->result, k, 7)); + fi->nullable = atoi(QR_get_value_manual(col_info->result, k, 10)); + fi->display_size = atoi(QR_get_value_manual(col_info->result, k, 12)); } char -searchColInfo(COL_INFO *col_info, FIELD_INFO *fi) +searchColInfo(COL_INFO * col_info, FIELD_INFO * fi) { -int k; -char *col; + int k; + char *col; - for (k = 0; k < QR_get_num_tuples(col_info->result); k++) { + for (k = 0; k < QR_get_num_tuples(col_info->result); k++) + { col = QR_get_value_manual(col_info->result, k, 3); - if ( ! strcmp(col, fi->name)) { + if (!strcmp(col, fi->name)) + { getColInfo(col_info, fi, k); mylog("PARSE: searchColInfo: \n"); @@ -210,22 +233,39 @@ char *col; char -parse_statement(StatementClass *stmt) +parse_statement(StatementClass * stmt) { -static char *func="parse_statement"; -char token[256]; -char delim, quote, dquote, numeric, unquoted; -char *ptr; -char in_select = FALSE, in_distinct = FALSE, in_on = FALSE, in_from = FALSE, in_where = FALSE, in_table = FALSE; -char in_field = FALSE, in_expr = FALSE, in_func = FALSE, in_dot = FALSE, in_as = FALSE; -int j, i, k = 0, n, blevel = 0; -FIELD_INFO **fi; -TABLE_INFO **ti; -char parse; -ConnectionClass *conn = stmt->hdbc; -HSTMT hcol_stmt; -StatementClass *col_stmt; -RETCODE result; + static char *func = "parse_statement"; + char token[256]; + char delim, + quote, + dquote, + numeric, + unquoted; + char *ptr; + char in_select = FALSE, + in_distinct = FALSE, + in_on = FALSE, + in_from = FALSE, + in_where = FALSE, + in_table = FALSE; + char in_field = FALSE, + in_expr = FALSE, + in_func = FALSE, + in_dot = FALSE, + in_as = FALSE; + int j, + i, + k = 0, + n, + blevel = 0; + FIELD_INFO **fi; + TABLE_INFO **ti; + char parse; + ConnectionClass *conn = stmt->hdbc; + HSTMT hcol_stmt; + StatementClass *col_stmt; + RETCODE result; mylog("%s: entering...\n", func); @@ -237,34 +277,39 @@ RETCODE result; stmt->nfld = 0; stmt->ntab = 0; - while ((ptr = getNextToken(ptr, token, sizeof(token), &delim, "e, &dquote, &numeric)) != NULL) { + while ((ptr = getNextToken(ptr, token, sizeof(token), &delim, "e, &dquote, &numeric)) != NULL) + { - unquoted = ! ( quote || dquote ); + unquoted = !(quote || dquote); mylog("unquoted=%d, quote=%d, dquote=%d, numeric=%d, delim='%c', token='%s', ptr='%s'\n", unquoted, quote, dquote, numeric, delim, token, ptr); - if ( unquoted && ! stricmp(token, "select")) { + if (unquoted && !stricmp(token, "select")) + { in_select = TRUE; mylog("SELECT\n"); continue; } - if ( unquoted && in_select && ! stricmp(token, "distinct")) { + if (unquoted && in_select && !stricmp(token, "distinct")) + { in_distinct = TRUE; mylog("DISTINCT\n"); continue; } - if ( unquoted && ! stricmp(token, "into")) { + if (unquoted && !stricmp(token, "into")) + { in_select = FALSE; mylog("INTO\n"); continue; } - if ( unquoted && ! stricmp(token, "from")) { + if (unquoted && !stricmp(token, "from")) + { in_select = FALSE; in_from = TRUE; @@ -272,11 +317,12 @@ RETCODE result; continue; } - if ( unquoted && (! stricmp(token, "where") || - ! stricmp(token, "union") || - ! stricmp(token, "order") || - ! stricmp(token, "group") || - ! stricmp(token, "having"))) { + if (unquoted && (!stricmp(token, "where") || + !stricmp(token, "union") || + !stricmp(token, "order") || + !stricmp(token, "group") || + !stricmp(token, "having"))) + { in_select = FALSE; in_from = FALSE; @@ -286,44 +332,53 @@ RETCODE result; break; } - if (in_select) { + if (in_select) + { - if ( in_distinct) { + if (in_distinct) + { mylog("in distinct\n"); - if (unquoted && ! stricmp(token, "on")) { + if (unquoted && !stricmp(token, "on")) + { in_on = TRUE; mylog("got on\n"); continue; } - if (in_on) { + if (in_on) + { in_distinct = FALSE; in_on = FALSE; - continue; /* just skip the unique on field */ + continue; /* just skip the unique on field */ } mylog("done distinct\n"); in_distinct = FALSE; } - if ( in_expr || in_func) { /* just eat the expression */ + if (in_expr || in_func) + { /* just eat the expression */ mylog("in_expr=%d or func=%d\n", in_expr, in_func); if (quote || dquote) continue; - if (in_expr && blevel == 0 && delim == ',') { + if (in_expr && blevel == 0 && delim == ',') + { mylog("**** in_expr and Got comma\n"); in_expr = FALSE; in_field = FALSE; } - else if (token[0] == '(') { + else if (token[0] == '(') + { blevel++; mylog("blevel++ = %d\n", blevel); } - else if (token[0] == ')') { + else if (token[0] == ')') + { blevel--; mylog("blevel-- = %d\n", blevel); - if (delim==',') { + if (delim == ',') + { in_func = FALSE; in_expr = FALSE; in_field = FALSE; @@ -332,43 +387,50 @@ RETCODE result; continue; } - if ( ! in_field) { + if (!in_field) + { - if ( ! token[0]) + if (!token[0]) continue; - if ( ! (stmt->nfld % FLD_INCR)) { + if (!(stmt->nfld % FLD_INCR)) + { mylog("reallocing at nfld=%d\n", stmt->nfld); fi = (FIELD_INFO **) realloc(fi, (stmt->nfld + FLD_INCR) * sizeof(FIELD_INFO *)); - if ( ! fi) { + if (!fi) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } stmt->fi = fi; } - fi[stmt->nfld] = (FIELD_INFO *) malloc( sizeof(FIELD_INFO)); - if (fi[stmt->nfld] == NULL) { + fi[stmt->nfld] = (FIELD_INFO *) malloc(sizeof(FIELD_INFO)); + if (fi[stmt->nfld] == NULL) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } - /* Initialize the field info */ + /* Initialize the field info */ memset(fi[stmt->nfld], 0, sizeof(FIELD_INFO)); - /* double quotes are for qualifiers */ + /* double quotes are for qualifiers */ if (dquote) fi[stmt->nfld]->dquote = TRUE; - if (quote) { + if (quote) + { fi[stmt->nfld++]->quote = TRUE; continue; } - else if (numeric) { + else if (numeric) + { mylog("**** got numeric: nfld = %d\n", stmt->nfld); fi[stmt->nfld]->numeric = TRUE; } - else if (token[0] == '(') { /* expression */ + else if (token[0] == '(') + { /* expression */ mylog("got EXPRESSION\n"); fi[stmt->nfld++]->expr = TRUE; in_expr = TRUE; @@ -376,33 +438,34 @@ RETCODE result; continue; } - else { + else + { strcpy(fi[stmt->nfld]->name, token); fi[stmt->nfld]->dot[0] = '\0'; } mylog("got field='%s', dot='%s'\n", fi[stmt->nfld]->name, fi[stmt->nfld]->dot); - if (delim == ',') { + if (delim == ',') mylog("comma (1)\n"); - } - else { + else in_field = TRUE; - } stmt->nfld++; continue; } /**************************/ - /* We are in a field now */ + /* We are in a field now */ /**************************/ - if (in_dot) { + if (in_dot) + { stmt->nfld--; strcpy(fi[stmt->nfld]->dot, fi[stmt->nfld]->name); strcpy(fi[stmt->nfld]->name, token); stmt->nfld++; in_dot = FALSE; - if (delim == ',') { + if (delim == ',') + { mylog("in_dot: got comma\n"); in_field = FALSE; } @@ -410,7 +473,8 @@ RETCODE result; continue; } - if (in_as) { + if (in_as) + { stmt->nfld--; strcpy(fi[stmt->nfld]->alias, token); mylog("alias for field '%s' is '%s'\n", fi[stmt->nfld]->name, fi[stmt->nfld]->alias); @@ -419,58 +483,69 @@ RETCODE result; stmt->nfld++; - if (delim == ',') { + if (delim == ',') mylog("comma(2)\n"); - } continue; } - /* Function */ - if (token[0] == '(') { + /* Function */ + if (token[0] == '(') + { in_func = TRUE; blevel = 1; - fi[stmt->nfld-1]->func = TRUE; - /* name will have the function name -- maybe useful some day */ - mylog("**** got function = '%s'\n", fi[stmt->nfld-1]->name); + fi[stmt->nfld - 1]->func = TRUE; + + /* + * name will have the function name -- maybe useful some + * day + */ + mylog("**** got function = '%s'\n", fi[stmt->nfld - 1]->name); continue; } - if (token[0] == '.') { - in_dot = TRUE; + if (token[0] == '.') + { + in_dot = TRUE; mylog("got dot\n"); continue; } - if ( ! stricmp(token, "as")) { + if (!stricmp(token, "as")) + { in_as = TRUE; mylog("got AS\n"); continue; } - /* otherwise, it's probably an expression */ + /* otherwise, it's probably an expression */ in_expr = TRUE; - fi[stmt->nfld-1]->expr = TRUE; - fi[stmt->nfld-1]->name[0] = '\0'; + fi[stmt->nfld - 1]->expr = TRUE; + fi[stmt->nfld - 1]->name[0] = '\0'; mylog("*** setting expression\n"); } - if (in_from) { + if (in_from) + { - if ( ! in_table) { - if ( ! token[0]) + if (!in_table) + { + if (!token[0]) continue; - if ( ! (stmt->ntab % TAB_INCR)) { + if (!(stmt->ntab % TAB_INCR)) + { ti = (TABLE_INFO **) realloc(ti, (stmt->ntab + TAB_INCR) * sizeof(TABLE_INFO *)); - if ( ! ti) { + if (!ti) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } stmt->ti = ti; } ti[stmt->ntab] = (TABLE_INFO *) malloc(sizeof(TABLE_INFO)); - if (ti[stmt->ntab] == NULL) { + if (ti[stmt->ntab] == NULL) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } @@ -480,57 +555,61 @@ RETCODE result; strcpy(ti[stmt->ntab]->name, token); mylog("got table = '%s'\n", ti[stmt->ntab]->name); - if (delim == ',') { + if (delim == ',') mylog("more than 1 tables\n"); - } - else { + else in_table = TRUE; - } stmt->ntab++; continue; } - strcpy(ti[stmt->ntab-1]->alias, token); - mylog("alias for table '%s' is '%s'\n", ti[stmt->ntab-1]->name, ti[stmt->ntab-1]->alias); + strcpy(ti[stmt->ntab - 1]->alias, token); + mylog("alias for table '%s' is '%s'\n", ti[stmt->ntab - 1]->name, ti[stmt->ntab - 1]->alias); in_table = FALSE; - if (delim == ',') { + if (delim == ',') mylog("more than 1 tables\n"); - } } } /*************************************************/ - /* Resolve any possible field names with tables */ + /* Resolve any possible field names with tables */ /*************************************************/ parse = TRUE; - /* Resolve field names with tables */ - for (i = 0; i < stmt->nfld; i++) { + /* Resolve field names with tables */ + for (i = 0; i < stmt->nfld; i++) + { - if (fi[i]->func || fi[i]->expr || fi[i]->numeric) { + if (fi[i]->func || fi[i]->expr || fi[i]->numeric) + { fi[i]->ti = NULL; fi[i]->type = -1; parse = FALSE; continue; } - else if (fi[i]->quote) { /* handle as text */ + else if (fi[i]->quote) + { /* handle as text */ fi[i]->ti = NULL; fi[i]->type = PG_TYPE_TEXT; fi[i]->precision = 0; continue; - } + } - /* it's a dot, resolve to table or alias */ - else if (fi[i]->dot[0]) { - for (k = 0; k < stmt->ntab; k++) { - if ( ! stricmp(ti[k]->name, fi[i]->dot)) { + /* it's a dot, resolve to table or alias */ + else if (fi[i]->dot[0]) + { + for (k = 0; k < stmt->ntab; k++) + { + if (!stricmp(ti[k]->name, fi[i]->dot)) + { fi[i]->ti = ti[k]; break; } - else if ( ! stricmp(ti[k]->alias, fi[i]->dot)) { + else if (!stricmp(ti[k]->alias, fi[i]->dot)) + { fi[i]->ti = ti[k]; break; } @@ -543,41 +622,47 @@ RETCODE result; mylog("--------------------------------------------\n"); mylog("nfld=%d, ntab=%d\n", stmt->nfld, stmt->ntab); - for (i=0; i < stmt->nfld; i++) { + for (i = 0; i < stmt->nfld; i++) + { mylog("Field %d: expr=%d, func=%d, quote=%d, dquote=%d, numeric=%d, name='%s', alias='%s', dot='%s'\n", i, fi[i]->expr, fi[i]->func, fi[i]->quote, fi[i]->dquote, fi[i]->numeric, fi[i]->name, fi[i]->alias, fi[i]->dot); if (fi[i]->ti) - mylog(" ----> table_name='%s', table_alias='%s'\n", fi[i]->ti->name, fi[i]->ti->alias); + mylog(" ----> table_name='%s', table_alias='%s'\n", fi[i]->ti->name, fi[i]->ti->alias); } - for (i=0; i < stmt->ntab; i++) { + for (i = 0; i < stmt->ntab; i++) mylog("Table %d: name='%s', alias='%s'\n", i, ti[i]->name, ti[i]->alias); - } /******************************************************/ - /* Now save the SQLColumns Info for the parse tables */ + /* Now save the SQLColumns Info for the parse tables */ /******************************************************/ - /* Call SQLColumns for each table and store the result */ - for (i = 0; i < stmt->ntab; i++) { + /* Call SQLColumns for each table and store the result */ + for (i = 0; i < stmt->ntab; i++) + { - /* See if already got it */ - char found = FALSE; - for (k = 0; k < conn->ntables; k++) { - if ( ! stricmp(conn->col_info[k]->name, ti[i]->name)) { + /* See if already got it */ + char found = FALSE; + + for (k = 0; k < conn->ntables; k++) + { + if (!stricmp(conn->col_info[k]->name, ti[i]->name)) + { mylog("FOUND col_info table='%s'\n", ti[i]->name); found = TRUE; break; } } - - if ( ! found) { + + if (!found) + { mylog("PARSE: Getting SQLColumns for table[%d]='%s'\n", i, ti[i]->name); - result = SQLAllocStmt( stmt->hdbc, &hcol_stmt); - if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + result = SQLAllocStmt(stmt->hdbc, &hcol_stmt); + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { stmt->errormsg = "SQLAllocStmt failed in parse_statement for columns."; stmt->errornumber = STMT_NO_MEMORY_ERROR; stmt->parse_status = STMT_PARSE_FATAL; @@ -587,18 +672,21 @@ RETCODE result; col_stmt = (StatementClass *) hcol_stmt; col_stmt->internal = TRUE; - result = SQLColumns(hcol_stmt, "", 0, "", 0, + result = SQLColumns(hcol_stmt, "", 0, "", 0, ti[i]->name, (SWORD) strlen(ti[i]->name), "", 0); - + mylog(" Past SQLColumns\n"); - if (result == SQL_SUCCESS) { + if (result == SQL_SUCCESS) + { mylog(" Success\n"); - if ( ! (conn->ntables % COL_INCR)) { + if (!(conn->ntables % COL_INCR)) + { mylog("PARSE: Allocing col_info at ntables=%d\n", conn->ntables); conn->col_info = (COL_INFO **) realloc(conn->col_info, (conn->ntables + COL_INCR) * sizeof(COL_INFO *)); - if ( ! conn->col_info) { + if (!conn->col_info) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } @@ -606,18 +694,23 @@ RETCODE result; mylog("PARSE: malloc at conn->col_info[%d]\n", conn->ntables); conn->col_info[conn->ntables] = (COL_INFO *) malloc(sizeof(COL_INFO)); - if ( ! conn->col_info[conn->ntables]) { + if (!conn->col_info[conn->ntables]) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } - /* Store the table name and the SQLColumns result structure */ + /* + * Store the table name and the SQLColumns result + * structure + */ strcpy(conn->col_info[conn->ntables]->name, ti[i]->name); conn->col_info[conn->ntables]->result = col_stmt->result; - /* The connection will now free the result structures, so make - sure that the statement doesn't free it - */ + /* + * The connection will now free the result structures, so + * make sure that the statement doesn't free it + */ col_stmt->result = NULL; conn->ntables++; @@ -625,13 +718,14 @@ RETCODE result; SQLFreeStmt(hcol_stmt, SQL_DROP); mylog("Created col_info table='%s', ntables=%d\n", ti[i]->name, conn->ntables); } - else { + else + { SQLFreeStmt(hcol_stmt, SQL_DROP); break; } } - /* Associate a table from the statement with a SQLColumn info */ + /* Associate a table from the statement with a SQLColumn info */ ti[i]->col_info = conn->col_info[k]; mylog("associate col_info: i=%d, k=%d\n", i, k); } @@ -640,96 +734,115 @@ RETCODE result; mylog("Done SQLColumns\n"); /******************************************************/ - /* Now resolve the fields to point to column info */ + /* Now resolve the fields to point to column info */ /******************************************************/ - for (i = 0; i < stmt->nfld;) { + for (i = 0; i < stmt->nfld;) + { - /* Dont worry about functions or quotes */ - if (fi[i]->func || fi[i]->quote || fi[i]->numeric) { + /* Dont worry about functions or quotes */ + if (fi[i]->func || fi[i]->quote || fi[i]->numeric) + { i++; continue; } - /* Stars get expanded to all fields in the table */ - else if (fi[i]->name[0] == '*') { + /* Stars get expanded to all fields in the table */ + else if (fi[i]->name[0] == '*') + { - char do_all_tables; - int total_cols, old_size, need, cols; + char do_all_tables; + int total_cols, + old_size, + need, + cols; mylog("expanding field %d\n", i); - total_cols = 0; + total_cols = 0; - if (fi[i]->ti) /* The star represents only the qualified table */ + if (fi[i]->ti) /* The star represents only the qualified + * table */ total_cols = QR_get_num_tuples(fi[i]->ti->col_info->result); - else { /* The star represents all tables */ + else + { /* The star represents all tables */ - /* Calculate the total number of columns after expansion */ - for (k = 0; k < stmt->ntab; k++) { + /* Calculate the total number of columns after expansion */ + for (k = 0; k < stmt->ntab; k++) total_cols += QR_get_num_tuples(ti[k]->col_info->result); - } } total_cols--; /* makes up for the star */ - /* Allocate some more field pointers if necessary */ + /* Allocate some more field pointers if necessary */ /*------------------------------------------------------------- */ old_size = (stmt->nfld / FLD_INCR * FLD_INCR + FLD_INCR); need = total_cols - (old_size - stmt->nfld); - mylog("k=%d, total_cols=%d, old_size=%d, need=%d\n", k,total_cols,old_size,need); + mylog("k=%d, total_cols=%d, old_size=%d, need=%d\n", k, total_cols, old_size, need); + + if (need > 0) + { + int new_size = need / FLD_INCR * FLD_INCR + FLD_INCR; - if (need > 0) { - int new_size = need / FLD_INCR * FLD_INCR + FLD_INCR; mylog("need more cols: new_size = %d\n", new_size); fi = (FIELD_INFO **) realloc(fi, (old_size + new_size) * sizeof(FIELD_INFO *)); - if ( ! fi) { + if (!fi) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } } /*------------------------------------------------------------- */ - /* copy any other fields (if there are any) up past the expansion */ - for (j = stmt->nfld - 1; j > i; j--) { + + /* + * copy any other fields (if there are any) up past the + * expansion + */ + for (j = stmt->nfld - 1; j > i; j--) + { mylog("copying field %d to %d\n", j, total_cols + j); fi[total_cols + j] = fi[j]; } mylog("done copying fields\n"); /*------------------------------------------------------------- */ - /* Set the new number of fields */ + /* Set the new number of fields */ stmt->nfld += total_cols; mylog("stmt->nfld now at %d\n", stmt->nfld); /*------------------------------------------------------------- */ - /* copy the new field info */ + /* copy the new field info */ do_all_tables = (fi[i]->ti ? FALSE : TRUE); - for (k = 0; k < (do_all_tables ? stmt->ntab : 1); k++) { + for (k = 0; k < (do_all_tables ? stmt->ntab : 1); k++) + { TABLE_INFO *the_ti = do_all_tables ? ti[k] : fi[i]->ti; cols = QR_get_num_tuples(the_ti->col_info->result); - for (n = 0; n < cols; n++) { + for (n = 0; n < cols; n++) + { mylog("creating field info: n=%d\n", n); /* skip malloc (already did it for the Star) */ - if (k > 0 || n > 0) { + if (k > 0 || n > 0) + { mylog("allocating field info at %d\n", n + i); - fi[n + i] = (FIELD_INFO *) malloc( sizeof(FIELD_INFO)); - if (fi[n + i] == NULL) { + fi[n + i] = (FIELD_INFO *) malloc(sizeof(FIELD_INFO)); + if (fi[n + i] == NULL) + { stmt->parse_status = STMT_PARSE_FATAL; return FALSE; } } - /* Initialize the new space (or the * field) */ + /* Initialize the new space (or the * field) */ memset(fi[n + i], 0, sizeof(FIELD_INFO)); fi[n + i]->ti = the_ti; @@ -747,22 +860,28 @@ RETCODE result; /*------------------------------------------------------------- */ } - /* We either know which table the field was in because it was qualified - with a table name or alias -OR- there was only 1 table. - */ - else if (fi[i]->ti) { + /* + * We either know which table the field was in because it was + * qualified with a table name or alias -OR- there was only 1 + * table. + */ + else if (fi[i]->ti) + { - if ( ! searchColInfo(fi[i]->ti->col_info, fi[i])) + if (!searchColInfo(fi[i]->ti->col_info, fi[i])) parse = FALSE; i++; } - /* Don't know the table -- search all tables in "from" list */ - else { + /* Don't know the table -- search all tables in "from" list */ + else + { parse = FALSE; - for (k = 0; k < stmt->ntab; k++) { - if ( searchColInfo(ti[k]->col_info, fi[i])) { + for (k = 0; k < stmt->ntab; k++) + { + if (searchColInfo(ti[k]->col_info, fi[i])) + { fi[i]->ti = ti[k]; /* now know the table */ parse = TRUE; break; @@ -773,7 +892,7 @@ RETCODE result; } - if ( ! parse) + if (!parse) stmt->parse_status = STMT_PARSE_INCOMPLETE; else stmt->parse_status = STMT_PARSE_COMPLETE; @@ -782,4 +901,3 @@ RETCODE result; mylog("done parse_statement: parse=%d, parse_status=%d\n", parse, stmt->parse_status); return parse; } - diff --git a/src/interfaces/odbc/pgtypes.c b/src/interfaces/odbc/pgtypes.c index 91a1b3d37f..7139f57a19 100644 --- a/src/interfaces/odbc/pgtypes.c +++ b/src/interfaces/odbc/pgtypes.c @@ -1,16 +1,16 @@ -/* Module: pgtypes.c +/* Module: pgtypes.c * - * Description: This module contains routines for getting information - * about the supported Postgres data types. Only the function - * pgtype_to_sqltype() returns an unknown condition. All other - * functions return a suitable default so that even data types that - * are not directly supported can be used (it is handled as char data). + * Description: This module contains routines for getting information + * about the supported Postgres data types. Only the function + * pgtype_to_sqltype() returns an unknown condition. All other + * functions return a suitable default so that even data types that + * are not directly supported can be used (it is handled as char data). * - * Classes: n/a + * Classes: n/a * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -38,48 +38,48 @@ extern GLOBAL_VALUES globals; -Int4 getCharPrecision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as); +Int4 getCharPrecision(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as); -/* these are the types we support. all of the pgtype_ functions should */ -/* return values for each one of these. */ -/* Even types not directly supported are handled as character types +/* these are the types we support. all of the pgtype_ functions should */ +/* return values for each one of these. */ +/* Even types not directly supported are handled as character types so all types should work (points, etc.) */ /* ALL THESE TYPES ARE NO LONGER REPORTED in SQLGetTypeInfo. Instead, all - the SQL TYPES are reported and mapped to a corresponding Postgres Type + the SQL TYPES are reported and mapped to a corresponding Postgres Type */ /* -Int4 pgtypes_defined[] = { +Int4 pgtypes_defined[] = { PG_TYPE_CHAR, PG_TYPE_CHAR2, PG_TYPE_CHAR4, - PG_TYPE_CHAR8, + PG_TYPE_CHAR8, PG_TYPE_CHAR16, - PG_TYPE_NAME, - PG_TYPE_VARCHAR, - PG_TYPE_BPCHAR, + PG_TYPE_NAME, + PG_TYPE_VARCHAR, + PG_TYPE_BPCHAR, PG_TYPE_DATE, PG_TYPE_TIME, PG_TYPE_DATETIME, PG_TYPE_ABSTIME, PG_TYPE_TIMESTAMP, - PG_TYPE_TEXT, - PG_TYPE_INT2, - PG_TYPE_INT4, - PG_TYPE_FLOAT4, - PG_TYPE_FLOAT8, - PG_TYPE_OID, + PG_TYPE_TEXT, + PG_TYPE_INT2, + PG_TYPE_INT4, + PG_TYPE_FLOAT4, + PG_TYPE_FLOAT8, + PG_TYPE_OID, PG_TYPE_MONEY, PG_TYPE_BOOL, PG_TYPE_BYTEA, PG_TYPE_LO, - 0 }; + 0 }; */ /* These are NOW the SQL Types reported in SQLGetTypeInfo. */ -Int2 sqlTypes [] = { +Int2 sqlTypes[] = { SQL_BIGINT, /* SQL_BINARY, -- Commented out because VarBinary is more correct. */ SQL_BIT, @@ -102,232 +102,303 @@ Int2 sqlTypes [] = { 0 }; -Int4 sqltype_to_pgtype(SWORD fSqlType) +Int4 +sqltype_to_pgtype(SWORD fSqlType) { -Int4 pgType; + Int4 pgType; - switch(fSqlType) { + switch (fSqlType) + { - case SQL_BINARY: - pgType = PG_TYPE_BYTEA; - break; + case SQL_BINARY: + pgType = PG_TYPE_BYTEA; + break; - case SQL_CHAR: - pgType = PG_TYPE_BPCHAR; - break; + case SQL_CHAR: + pgType = PG_TYPE_BPCHAR; + break; - case SQL_BIT: - pgType = globals.bools_as_char ? PG_TYPE_CHAR : PG_TYPE_BOOL; - break; + case SQL_BIT: + pgType = globals.bools_as_char ? PG_TYPE_CHAR : PG_TYPE_BOOL; + break; - case SQL_DATE: - pgType = PG_TYPE_DATE; - break; + case SQL_DATE: + pgType = PG_TYPE_DATE; + break; - case SQL_DOUBLE: - case SQL_FLOAT: - pgType = PG_TYPE_FLOAT8; - break; + case SQL_DOUBLE: + case SQL_FLOAT: + pgType = PG_TYPE_FLOAT8; + break; - case SQL_DECIMAL: - case SQL_NUMERIC: - pgType = PG_TYPE_NUMERIC; - break; + case SQL_DECIMAL: + case SQL_NUMERIC: + pgType = PG_TYPE_NUMERIC; + break; - case SQL_BIGINT: - pgType = PG_TYPE_INT8; - break; + case SQL_BIGINT: + pgType = PG_TYPE_INT8; + break; - case SQL_INTEGER: - pgType = PG_TYPE_INT4; - break; + case SQL_INTEGER: + pgType = PG_TYPE_INT4; + break; - case SQL_LONGVARBINARY: - pgType = PG_TYPE_LO; - break; + case SQL_LONGVARBINARY: + pgType = PG_TYPE_LO; + break; - case SQL_LONGVARCHAR: - pgType = globals.text_as_longvarchar ? PG_TYPE_TEXT : PG_TYPE_VARCHAR; - break; + case SQL_LONGVARCHAR: + pgType = globals.text_as_longvarchar ? PG_TYPE_TEXT : PG_TYPE_VARCHAR; + break; - case SQL_REAL: - pgType = PG_TYPE_FLOAT4; - break; + case SQL_REAL: + pgType = PG_TYPE_FLOAT4; + break; - case SQL_SMALLINT: - case SQL_TINYINT: - pgType = PG_TYPE_INT2; - break; + case SQL_SMALLINT: + case SQL_TINYINT: + pgType = PG_TYPE_INT2; + break; - case SQL_TIME: - pgType = PG_TYPE_TIME; - break; + case SQL_TIME: + pgType = PG_TYPE_TIME; + break; - case SQL_TIMESTAMP: - pgType = PG_TYPE_DATETIME; - break; + case SQL_TIMESTAMP: + pgType = PG_TYPE_DATETIME; + break; - case SQL_VARBINARY: - pgType = PG_TYPE_BYTEA; - break; + case SQL_VARBINARY: + pgType = PG_TYPE_BYTEA; + break; - case SQL_VARCHAR: - pgType = PG_TYPE_VARCHAR; - break; + case SQL_VARCHAR: + pgType = PG_TYPE_VARCHAR; + break; - default: - pgType = 0; /* ??? */ - break; + default: + pgType = 0; /* ??? */ + break; } return pgType; } -/* There are two ways of calling this function: +/* There are two ways of calling this function: 1. When going through the supported PG types (SQLGetTypeInfo) 2. When taking any type id (SQLColumns, SQLGetData) The first type will always work because all the types defined are returned here. - The second type will return a default based on global parameter when it does not - know. This allows for supporting + The second type will return a default based on global parameter when it does not + know. This allows for supporting types that are unknown. All other pg routines in here return a suitable default. */ -Int2 pgtype_to_sqltype(StatementClass *stmt, Int4 type) +Int2 +pgtype_to_sqltype(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_CHAR: - case PG_TYPE_CHAR2: - case PG_TYPE_CHAR4: - case PG_TYPE_CHAR8: - case PG_TYPE_NAME: return SQL_CHAR; - - case PG_TYPE_BPCHAR: return SQL_CHAR; - - case PG_TYPE_VARCHAR: return SQL_VARCHAR; - - case PG_TYPE_TEXT: return globals.text_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR; - - case PG_TYPE_BYTEA: return SQL_VARBINARY; - case PG_TYPE_LO: return SQL_LONGVARBINARY; - - case PG_TYPE_INT2: return SQL_SMALLINT; - - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: return SQL_INTEGER; - - /* Change this to SQL_BIGINT for ODBC v3 bjm 2001-01-23 */ - case PG_TYPE_INT8: return SQL_CHAR; - - case PG_TYPE_NUMERIC: return SQL_NUMERIC; - - case PG_TYPE_FLOAT4: return SQL_REAL; - case PG_TYPE_FLOAT8: return SQL_FLOAT; - case PG_TYPE_DATE: return SQL_DATE; - case PG_TYPE_TIME: return SQL_TIME; - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return SQL_TIMESTAMP; - case PG_TYPE_MONEY: return SQL_FLOAT; - case PG_TYPE_BOOL: return globals.bools_as_char ? SQL_CHAR : SQL_BIT; - - default: - - /* first, check to see if 'type' is in list. If not, look up with query. - Add oid, name to list. If it's already in list, just return. - */ - if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */ + switch (type) + { + case PG_TYPE_CHAR: + case PG_TYPE_CHAR2: + case PG_TYPE_CHAR4: + case PG_TYPE_CHAR8: + case PG_TYPE_NAME:return SQL_CHAR; + + case PG_TYPE_BPCHAR: + return SQL_CHAR; + + case PG_TYPE_VARCHAR: + return SQL_VARCHAR; + + case PG_TYPE_TEXT: + return globals.text_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR; + + case PG_TYPE_BYTEA: + return SQL_VARBINARY; + case PG_TYPE_LO: return SQL_LONGVARBINARY; - return globals.unknowns_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR; + case PG_TYPE_INT2: + return SQL_SMALLINT; + + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + return SQL_INTEGER; + + /* Change this to SQL_BIGINT for ODBC v3 bjm 2001-01-23 */ + case PG_TYPE_INT8: + return SQL_CHAR; + + case PG_TYPE_NUMERIC: + return SQL_NUMERIC; + + case PG_TYPE_FLOAT4: + return SQL_REAL; + case PG_TYPE_FLOAT8: + return SQL_FLOAT; + case PG_TYPE_DATE: + return SQL_DATE; + case PG_TYPE_TIME: + return SQL_TIME; + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + return SQL_TIMESTAMP; + case PG_TYPE_MONEY: + return SQL_FLOAT; + case PG_TYPE_BOOL: + return globals.bools_as_char ? SQL_CHAR : SQL_BIT; + + default: + + /* + * first, check to see if 'type' is in list. If not, look up + * with query. Add oid, name to list. If it's already in + * list, just return. + */ + if (type == stmt->hdbc->lobj_type) /* hack until permanent + * type is available */ + return SQL_LONGVARBINARY; + + return globals.unknowns_as_longvarchar ? SQL_LONGVARCHAR : SQL_VARCHAR; } } -Int2 pgtype_to_ctype(StatementClass *stmt, Int4 type) +Int2 +pgtype_to_ctype(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_INT8: return SQL_C_CHAR; - case PG_TYPE_NUMERIC: return SQL_C_CHAR; - case PG_TYPE_INT2: return SQL_C_SSHORT; - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: return SQL_C_SLONG; - case PG_TYPE_FLOAT4: return SQL_C_FLOAT; - case PG_TYPE_FLOAT8: return SQL_C_DOUBLE; - case PG_TYPE_DATE: return SQL_C_DATE; - case PG_TYPE_TIME: return SQL_C_TIME; - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return SQL_C_TIMESTAMP; - case PG_TYPE_MONEY: return SQL_C_FLOAT; - case PG_TYPE_BOOL: return globals.bools_as_char ? SQL_C_CHAR : SQL_C_BIT; - - case PG_TYPE_BYTEA: return SQL_C_BINARY; - case PG_TYPE_LO: return SQL_C_BINARY; - - default: - - if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */ + switch (type) + { + case PG_TYPE_INT8:return SQL_C_CHAR; + case PG_TYPE_NUMERIC: + return SQL_C_CHAR; + case PG_TYPE_INT2: + return SQL_C_SSHORT; + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + return SQL_C_SLONG; + case PG_TYPE_FLOAT4: + return SQL_C_FLOAT; + case PG_TYPE_FLOAT8: + return SQL_C_DOUBLE; + case PG_TYPE_DATE: + return SQL_C_DATE; + case PG_TYPE_TIME: + return SQL_C_TIME; + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + return SQL_C_TIMESTAMP; + case PG_TYPE_MONEY: + return SQL_C_FLOAT; + case PG_TYPE_BOOL: + return globals.bools_as_char ? SQL_C_CHAR : SQL_C_BIT; + + case PG_TYPE_BYTEA: return SQL_C_BINARY; + case PG_TYPE_LO: + return SQL_C_BINARY; + + default: + + if (type == stmt->hdbc->lobj_type) /* hack until permanent + * type is available */ + return SQL_C_BINARY; - return SQL_C_CHAR; + return SQL_C_CHAR; } } -char *pgtype_to_name(StatementClass *stmt, Int4 type) +char * +pgtype_to_name(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_CHAR: return "char"; - case PG_TYPE_CHAR2: return "char2"; - case PG_TYPE_CHAR4: return "char4"; - case PG_TYPE_CHAR8: return "char8"; - case PG_TYPE_INT8: return "int8"; - case PG_TYPE_NUMERIC: return "numeric"; - case PG_TYPE_VARCHAR: return "varchar"; - case PG_TYPE_BPCHAR: return "char"; - case PG_TYPE_TEXT: return "text"; - case PG_TYPE_NAME: return "name"; - case PG_TYPE_INT2: return "int2"; - case PG_TYPE_OID: return "oid"; - case PG_TYPE_INT4: return "int4"; - case PG_TYPE_FLOAT4: return "float4"; - case PG_TYPE_FLOAT8: return "float8"; - case PG_TYPE_DATE: return "date"; - case PG_TYPE_TIME: return "time"; - case PG_TYPE_ABSTIME: return "abstime"; - case PG_TYPE_DATETIME: return "datetime"; - case PG_TYPE_TIMESTAMP: return "timestamp"; - case PG_TYPE_MONEY: return "money"; - case PG_TYPE_BOOL: return "bool"; - case PG_TYPE_BYTEA: return "bytea"; - - case PG_TYPE_LO: return PG_TYPE_LO_NAME; - - default: - if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */ + switch (type) + { + case PG_TYPE_CHAR:return "char"; + case PG_TYPE_CHAR2: + return "char2"; + case PG_TYPE_CHAR4: + return "char4"; + case PG_TYPE_CHAR8: + return "char8"; + case PG_TYPE_INT8: + return "int8"; + case PG_TYPE_NUMERIC: + return "numeric"; + case PG_TYPE_VARCHAR: + return "varchar"; + case PG_TYPE_BPCHAR: + return "char"; + case PG_TYPE_TEXT: + return "text"; + case PG_TYPE_NAME: + return "name"; + case PG_TYPE_INT2: + return "int2"; + case PG_TYPE_OID: + return "oid"; + case PG_TYPE_INT4: + return "int4"; + case PG_TYPE_FLOAT4: + return "float4"; + case PG_TYPE_FLOAT8: + return "float8"; + case PG_TYPE_DATE: + return "date"; + case PG_TYPE_TIME: + return "time"; + case PG_TYPE_ABSTIME: + return "abstime"; + case PG_TYPE_DATETIME: + return "datetime"; + case PG_TYPE_TIMESTAMP: + return "timestamp"; + case PG_TYPE_MONEY: + return "money"; + case PG_TYPE_BOOL: + return "bool"; + case PG_TYPE_BYTEA: + return "bytea"; + + case PG_TYPE_LO: return PG_TYPE_LO_NAME; - /* "unknown" can actually be used in alter table because it is a real PG type! */ - return "unknown"; - } + default: + if (type == stmt->hdbc->lobj_type) /* hack until permanent + * type is available */ + return PG_TYPE_LO_NAME; + + /* + * "unknown" can actually be used in alter table because it is + * a real PG type! + */ + return "unknown"; + } } static Int2 -getNumericScale(StatementClass *stmt, Int4 type, int col) +getNumericScale(StatementClass * stmt, Int4 type, int col) { -Int4 atttypmod; -QResultClass *result; -ColumnInfoClass *flds; + Int4 atttypmod; + QResultClass *result; + ColumnInfoClass *flds; -mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type,col); + mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type, col); if (col < 0) return PG_NUMERIC_MAX_SCALE; result = SC_get_Result(stmt); - /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */ - if (stmt->manual_result) { + /* + * Manual Result Sets -- use assigned column width (i.e., from + * set_tuplefield_string) + */ + if (stmt->manual_result) + { flds = result->fields; if (flds) return flds->adtsize[col]; @@ -336,30 +407,34 @@ mylog("getNumericScale: type=%d, col=%d, unknown = %d\n", type,col); } atttypmod = QR_get_atttypmod(result, col); - if ( atttypmod > -1 ) + if (atttypmod > -1) return (atttypmod & 0xffff); else - return ( QR_get_display_size(result, col) ? - QR_get_display_size(result, col) : - PG_NUMERIC_MAX_SCALE); + return (QR_get_display_size(result, col) ? + QR_get_display_size(result, col) : + PG_NUMERIC_MAX_SCALE); } static Int4 -getNumericPrecision(StatementClass *stmt, Int4 type, int col) +getNumericPrecision(StatementClass * stmt, Int4 type, int col) { -Int4 atttypmod; -QResultClass *result; -ColumnInfoClass *flds; + Int4 atttypmod; + QResultClass *result; + ColumnInfoClass *flds; -mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type,col); + mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type, col); if (col < 0) return PG_NUMERIC_MAX_PRECISION; result = SC_get_Result(stmt); - /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */ - if (stmt->manual_result) { + /* + * Manual Result Sets -- use assigned column width (i.e., from + * set_tuplefield_string) + */ + if (stmt->manual_result) + { flds = result->fields; if (flds) return flds->adtsize[col]; @@ -368,55 +443,62 @@ mylog("getNumericPrecision: type=%d, col=%d, unknown = %d\n", type,col); } atttypmod = QR_get_atttypmod(result, col); - if ( atttypmod > -1 ) + if (atttypmod > -1) return (atttypmod >> 16) & 0xffff; else - return ( QR_get_display_size(result, col) >= 0 ? - QR_get_display_size(result, col) : - PG_NUMERIC_MAX_PRECISION ); + return (QR_get_display_size(result, col) >= 0 ? + QR_get_display_size(result, col) : + PG_NUMERIC_MAX_PRECISION); } Int4 -getCharPrecision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as) +getCharPrecision(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as) { -int p = -1, maxsize; -QResultClass *result; -ColumnInfoClass *flds; - -mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unknown_size_as); - - /* Assign Maximum size based on parameters */ - switch(type) { - case PG_TYPE_TEXT: - if (globals.text_as_longvarchar) - maxsize = globals.max_longvarchar_size; - else - maxsize = globals.max_varchar_size; - break; - - case PG_TYPE_VARCHAR: - case PG_TYPE_BPCHAR: - maxsize = globals.max_varchar_size; - break; - - default: - if (globals.unknowns_as_longvarchar) - maxsize = globals.max_longvarchar_size; - else + int p = -1, + maxsize; + QResultClass *result; + ColumnInfoClass *flds; + + mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type, col, handle_unknown_size_as); + + /* Assign Maximum size based on parameters */ + switch (type) + { + case PG_TYPE_TEXT: + if (globals.text_as_longvarchar) + maxsize = globals.max_longvarchar_size; + else + maxsize = globals.max_varchar_size; + break; + + case PG_TYPE_VARCHAR: + case PG_TYPE_BPCHAR: maxsize = globals.max_varchar_size; - break; + break; + + default: + if (globals.unknowns_as_longvarchar) + maxsize = globals.max_longvarchar_size; + else + maxsize = globals.max_varchar_size; + break; } - /* Static Precision (i.e., the Maximum Precision of the datatype) - This has nothing to do with a result set. - */ + /* + * Static Precision (i.e., the Maximum Precision of the datatype) This + * has nothing to do with a result set. + */ if (col < 0) return maxsize; result = SC_get_Result(stmt); - /* Manual Result Sets -- use assigned column width (i.e., from set_tuplefield_string) */ - if (stmt->manual_result) { + /* + * Manual Result Sets -- use assigned column width (i.e., from + * set_tuplefield_string) + */ + if (stmt->manual_result) + { flds = result->fields; if (flds) return flds->adtsize[col]; @@ -424,11 +506,12 @@ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unkno return maxsize; } - /* Size is unknown -- handle according to parameter */ + /* Size is unknown -- handle according to parameter */ if (QR_get_atttypmod(result, col) > -1) return QR_get_atttypmod(result, col); - if (type == PG_TYPE_BPCHAR || handle_unknown_size_as == UNKNOWNS_AS_LONGEST) { + if (type == PG_TYPE_BPCHAR || handle_unknown_size_as == UNKNOWNS_AS_LONGEST) + { p = QR_get_display_size(result, col); mylog("getCharPrecision: LONGEST: p = %d\n", p); } @@ -439,351 +522,424 @@ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unkno return p; } -/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, PG_TYPE_NUMERIC, SQLColumns will +/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, PG_TYPE_NUMERIC, SQLColumns will override this length with the atttypmod length from pg_attribute . If col >= 0, then will attempt to get the info from the result set. This is used for functions SQLDescribeCol and SQLColAttributes. */ -Int4 pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as) +Int4 +pgtype_precision(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as) { - switch(type) { + switch (type) + { - case PG_TYPE_CHAR: return 1; - case PG_TYPE_CHAR2: return 2; - case PG_TYPE_CHAR4: return 4; - case PG_TYPE_CHAR8: return 8; + case PG_TYPE_CHAR:return 1; + case PG_TYPE_CHAR2: + return 2; + case PG_TYPE_CHAR4: + return 4; + case PG_TYPE_CHAR8: + return 8; - case PG_TYPE_NAME: return NAME_FIELD_SIZE; + case PG_TYPE_NAME: + return NAME_FIELD_SIZE; - case PG_TYPE_INT2: return 5; + case PG_TYPE_INT2: + return 5; - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: return 10; + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + return 10; - case PG_TYPE_INT8: return 19; /* signed */ + case PG_TYPE_INT8: + return 19; /* signed */ - case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col); + case PG_TYPE_NUMERIC: + return getNumericPrecision(stmt, type, col); - case PG_TYPE_FLOAT4: - case PG_TYPE_MONEY: return 7; + case PG_TYPE_FLOAT4: + case PG_TYPE_MONEY: + return 7; - case PG_TYPE_FLOAT8: return 15; + case PG_TYPE_FLOAT8: + return 15; - case PG_TYPE_DATE: return 10; - case PG_TYPE_TIME: return 8; + case PG_TYPE_DATE: + return 10; + case PG_TYPE_TIME: + return 8; - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return 19; + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + return 19; - case PG_TYPE_BOOL: return 1; + case PG_TYPE_BOOL: + return 1; - case PG_TYPE_LO: return SQL_NO_TOTAL; + case PG_TYPE_LO: + return SQL_NO_TOTAL; - default: + default: - if (type == stmt->hdbc->lobj_type) /* hack until permanent type is available */ - return SQL_NO_TOTAL; + if (type == stmt->hdbc->lobj_type) /* hack until permanent + * type is available */ + return SQL_NO_TOTAL; - /* Handle Character types and unknown types */ - return getCharPrecision(stmt, type, col, handle_unknown_size_as); - } + /* Handle Character types and unknown types */ + return getCharPrecision(stmt, type, col, handle_unknown_size_as); + } } -Int4 pgtype_display_size(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as) +Int4 +pgtype_display_size(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as) { - switch(type) { - case PG_TYPE_INT2: return 6; + switch (type) + { + case PG_TYPE_INT2:return 6; + + case PG_TYPE_OID: + case PG_TYPE_XID: + return 10; - case PG_TYPE_OID: - case PG_TYPE_XID: return 10; + case PG_TYPE_INT4: + return 11; - case PG_TYPE_INT4: return 11; + case PG_TYPE_INT8: + return 20; /* signed: 19 digits + sign */ - case PG_TYPE_INT8: return 20; /* signed: 19 digits + sign */ + case PG_TYPE_NUMERIC: + return getNumericPrecision(stmt, type, col) + 2; - case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col) + 2; + case PG_TYPE_MONEY: + return 15; /* ($9,999,999.99) */ - case PG_TYPE_MONEY: return 15; /* ($9,999,999.99) */ + case PG_TYPE_FLOAT4: + return 13; - case PG_TYPE_FLOAT4: return 13; + case PG_TYPE_FLOAT8: + return 22; - case PG_TYPE_FLOAT8: return 22; - - /* Character types use regular precision */ - default: - return pgtype_precision(stmt, type, col, handle_unknown_size_as); + /* Character types use regular precision */ + default: + return pgtype_precision(stmt, type, col, handle_unknown_size_as); } } -/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, SQLColumns will - override this length with the atttypmod length from pg_attribute +/* For PG_TYPE_VARCHAR, PG_TYPE_BPCHAR, SQLColumns will + override this length with the atttypmod length from pg_attribute */ -Int4 pgtype_length(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as) +Int4 +pgtype_length(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as) { - switch(type) { + switch (type) + { - case PG_TYPE_INT2: return 2; + case PG_TYPE_INT2:return 2; - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: return 4; + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + return 4; - case PG_TYPE_INT8: return 20; /* signed: 19 digits + sign */ + case PG_TYPE_INT8: + return 20; /* signed: 19 digits + sign */ - case PG_TYPE_NUMERIC: return getNumericPrecision(stmt,type,col) + 2; + case PG_TYPE_NUMERIC: + return getNumericPrecision(stmt, type, col) + 2; - case PG_TYPE_FLOAT4: - case PG_TYPE_MONEY: return 4; + case PG_TYPE_FLOAT4: + case PG_TYPE_MONEY: + return 4; - case PG_TYPE_FLOAT8: return 8; + case PG_TYPE_FLOAT8: + return 8; - case PG_TYPE_DATE: - case PG_TYPE_TIME: return 6; + case PG_TYPE_DATE: + case PG_TYPE_TIME: + return 6; - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return 16; + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP: + return 16; - /* Character types (and NUMERIC) use the default precision */ - default: - return pgtype_precision(stmt, type, col, handle_unknown_size_as); - } + /* Character types (and NUMERIC) use the default precision */ + default: + return pgtype_precision(stmt, type, col, handle_unknown_size_as); + } } -Int2 pgtype_scale(StatementClass *stmt, Int4 type, int col) +Int2 +pgtype_scale(StatementClass * stmt, Int4 type, int col) { - switch(type) { - - case PG_TYPE_INT2: - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: - case PG_TYPE_INT8: - case PG_TYPE_FLOAT4: - case PG_TYPE_FLOAT8: - case PG_TYPE_MONEY: - case PG_TYPE_BOOL: - - /* Number of digits to the right of the decimal point in "yyyy-mm=dd hh:mm:ss[.f...]" */ - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return 0; - - case PG_TYPE_NUMERIC: return getNumericScale(stmt,type,col); - - default: return -1; + switch (type) + { + + case PG_TYPE_INT2: + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + case PG_TYPE_INT8: + case PG_TYPE_FLOAT4: + case PG_TYPE_FLOAT8: + case PG_TYPE_MONEY: + case PG_TYPE_BOOL: + + /* + * Number of digits to the right of the decimal point in + * "yyyy-mm=dd hh:mm:ss[.f...]" + */ + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP:return 0; + + case PG_TYPE_NUMERIC: + return getNumericScale(stmt, type, col); + + default: + return -1; } } -Int2 pgtype_radix(StatementClass *stmt, Int4 type) +Int2 +pgtype_radix(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_INT2: - case PG_TYPE_OID: - case PG_TYPE_INT4: - case PG_TYPE_INT8: - case PG_TYPE_NUMERIC: - case PG_TYPE_FLOAT4: - case PG_TYPE_MONEY: - case PG_TYPE_FLOAT8: return 10; - - default: return -1; - } + switch (type) + { + case PG_TYPE_INT2: + case PG_TYPE_OID: + case PG_TYPE_INT4: + case PG_TYPE_INT8: + case PG_TYPE_NUMERIC: + case PG_TYPE_FLOAT4: + case PG_TYPE_MONEY: + case PG_TYPE_FLOAT8:return 10; + + default: + return -1; + } } -Int2 pgtype_nullable(StatementClass *stmt, Int4 type) +Int2 +pgtype_nullable(StatementClass * stmt, Int4 type) { - return SQL_NULLABLE; /* everything should be nullable */ + return SQL_NULLABLE; /* everything should be nullable */ } -Int2 pgtype_auto_increment(StatementClass *stmt, Int4 type) +Int2 +pgtype_auto_increment(StatementClass * stmt, Int4 type) { - switch(type) { - - case PG_TYPE_INT2: - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: - case PG_TYPE_FLOAT4: - case PG_TYPE_MONEY: - case PG_TYPE_BOOL: - case PG_TYPE_FLOAT8: - case PG_TYPE_INT8: - case PG_TYPE_NUMERIC: - - case PG_TYPE_DATE: - case PG_TYPE_TIME: - case PG_TYPE_ABSTIME: - case PG_TYPE_DATETIME: - case PG_TYPE_TIMESTAMP: return FALSE; - - default: return -1; - } + switch (type) + { + + case PG_TYPE_INT2: + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + case PG_TYPE_FLOAT4: + case PG_TYPE_MONEY: + case PG_TYPE_BOOL: + case PG_TYPE_FLOAT8: + case PG_TYPE_INT8: + case PG_TYPE_NUMERIC: + + case PG_TYPE_DATE: + case PG_TYPE_TIME: + case PG_TYPE_ABSTIME: + case PG_TYPE_DATETIME: + case PG_TYPE_TIMESTAMP:return FALSE; + + default: + return -1; + } } -Int2 pgtype_case_sensitive(StatementClass *stmt, Int4 type) +Int2 +pgtype_case_sensitive(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_CHAR: + switch (type) + { + case PG_TYPE_CHAR: - case PG_TYPE_CHAR2: - case PG_TYPE_CHAR4: - case PG_TYPE_CHAR8: + case PG_TYPE_CHAR2: + case PG_TYPE_CHAR4: + case PG_TYPE_CHAR8: - case PG_TYPE_VARCHAR: - case PG_TYPE_BPCHAR: - case PG_TYPE_TEXT: - case PG_TYPE_NAME: return TRUE; + case PG_TYPE_VARCHAR: + case PG_TYPE_BPCHAR: + case PG_TYPE_TEXT: + case PG_TYPE_NAME:return TRUE; - default: return FALSE; - } + default: + return FALSE; + } } -Int2 pgtype_money(StatementClass *stmt, Int4 type) +Int2 +pgtype_money(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_MONEY: return TRUE; - default: return FALSE; - } + switch (type) + { + case PG_TYPE_MONEY:return TRUE; + default: + return FALSE; + } } -Int2 pgtype_searchable(StatementClass *stmt, Int4 type) +Int2 +pgtype_searchable(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_CHAR: - case PG_TYPE_CHAR2: - case PG_TYPE_CHAR4: - case PG_TYPE_CHAR8: - - case PG_TYPE_VARCHAR: - case PG_TYPE_BPCHAR: - case PG_TYPE_TEXT: - case PG_TYPE_NAME: return SQL_SEARCHABLE; - - default: return SQL_ALL_EXCEPT_LIKE; - } + switch (type) + { + case PG_TYPE_CHAR: + case PG_TYPE_CHAR2: + case PG_TYPE_CHAR4: + case PG_TYPE_CHAR8: + + case PG_TYPE_VARCHAR: + case PG_TYPE_BPCHAR: + case PG_TYPE_TEXT: + case PG_TYPE_NAME:return SQL_SEARCHABLE; + + default: + return SQL_ALL_EXCEPT_LIKE; + } } -Int2 pgtype_unsigned(StatementClass *stmt, Int4 type) +Int2 +pgtype_unsigned(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_OID: - case PG_TYPE_XID: return TRUE; - - case PG_TYPE_INT2: - case PG_TYPE_INT4: - case PG_TYPE_INT8: - case PG_TYPE_NUMERIC: - case PG_TYPE_FLOAT4: - case PG_TYPE_FLOAT8: - case PG_TYPE_MONEY: return FALSE; - - default: return -1; + switch (type) + { + case PG_TYPE_OID: + case PG_TYPE_XID:return TRUE; + + case PG_TYPE_INT2: + case PG_TYPE_INT4: + case PG_TYPE_INT8: + case PG_TYPE_NUMERIC: + case PG_TYPE_FLOAT4: + case PG_TYPE_FLOAT8: + case PG_TYPE_MONEY: + return FALSE; + + default: + return -1; } } -char *pgtype_literal_prefix(StatementClass *stmt, Int4 type) +char * +pgtype_literal_prefix(StatementClass * stmt, Int4 type) { - switch(type) { - - case PG_TYPE_INT2: - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: - case PG_TYPE_INT8: - case PG_TYPE_NUMERIC: - case PG_TYPE_FLOAT4: - case PG_TYPE_FLOAT8: - case PG_TYPE_MONEY: return NULL; - - default: return "'"; + switch (type) + { + + case PG_TYPE_INT2: + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + case PG_TYPE_INT8: + case PG_TYPE_NUMERIC: + case PG_TYPE_FLOAT4: + case PG_TYPE_FLOAT8: + case PG_TYPE_MONEY:return NULL; + + default: + return "'"; } } -char *pgtype_literal_suffix(StatementClass *stmt, Int4 type) +char * +pgtype_literal_suffix(StatementClass * stmt, Int4 type) { - switch(type) { - - case PG_TYPE_INT2: - case PG_TYPE_OID: - case PG_TYPE_XID: - case PG_TYPE_INT4: - case PG_TYPE_INT8: - case PG_TYPE_NUMERIC: - case PG_TYPE_FLOAT4: - case PG_TYPE_FLOAT8: - case PG_TYPE_MONEY: return NULL; - - default: return "'"; + switch (type) + { + + case PG_TYPE_INT2: + case PG_TYPE_OID: + case PG_TYPE_XID: + case PG_TYPE_INT4: + case PG_TYPE_INT8: + case PG_TYPE_NUMERIC: + case PG_TYPE_FLOAT4: + case PG_TYPE_FLOAT8: + case PG_TYPE_MONEY:return NULL; + + default: + return "'"; } } -char *pgtype_create_params(StatementClass *stmt, Int4 type) +char * +pgtype_create_params(StatementClass * stmt, Int4 type) { - switch(type) { - case PG_TYPE_CHAR: - case PG_TYPE_VARCHAR: return "max. length"; - default: return NULL; + switch (type) + { + case PG_TYPE_CHAR: + case PG_TYPE_VARCHAR:return "max. length"; + default: + return NULL; } } -Int2 sqltype_to_default_ctype(Int2 sqltype) +Int2 +sqltype_to_default_ctype(Int2 sqltype) { - /* from the table on page 623 of ODBC 2.0 Programmer's Reference */ - /* (Appendix D) */ - switch(sqltype) { - case SQL_CHAR: - case SQL_VARCHAR: - case SQL_LONGVARCHAR: - case SQL_DECIMAL: - case SQL_NUMERIC: - case SQL_BIGINT: - return SQL_C_CHAR; - - case SQL_BIT: - return SQL_C_BIT; - - case SQL_TINYINT: - return SQL_C_STINYINT; - - case SQL_SMALLINT: - return SQL_C_SSHORT; - - case SQL_INTEGER: - return SQL_C_SLONG; - - case SQL_REAL: - return SQL_C_FLOAT; - - case SQL_FLOAT: - case SQL_DOUBLE: - return SQL_C_DOUBLE; - - case SQL_BINARY: - case SQL_VARBINARY: - case SQL_LONGVARBINARY: - return SQL_C_BINARY; + /* from the table on page 623 of ODBC 2.0 Programmer's Reference */ + /* (Appendix D) */ + switch (sqltype) + { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: + case SQL_DECIMAL: + case SQL_NUMERIC: + case SQL_BIGINT: + return SQL_C_CHAR; + + case SQL_BIT: + return SQL_C_BIT; + + case SQL_TINYINT: + return SQL_C_STINYINT; + + case SQL_SMALLINT: + return SQL_C_SSHORT; + + case SQL_INTEGER: + return SQL_C_SLONG; + + case SQL_REAL: + return SQL_C_FLOAT; + + case SQL_FLOAT: + case SQL_DOUBLE: + return SQL_C_DOUBLE; + + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: + return SQL_C_BINARY; - case SQL_DATE: - return SQL_C_DATE; + case SQL_DATE: + return SQL_C_DATE; - case SQL_TIME: - return SQL_C_TIME; + case SQL_TIME: + return SQL_C_TIME; - case SQL_TIMESTAMP: - return SQL_C_TIMESTAMP; + case SQL_TIMESTAMP: + return SQL_C_TIMESTAMP; - default: /* should never happen */ - return SQL_C_CHAR; - } + default: /* should never happen */ + return SQL_C_CHAR; + } } - diff --git a/src/interfaces/odbc/pgtypes.h b/src/interfaces/odbc/pgtypes.h index f9c48ff64f..0c82f6487f 100644 --- a/src/interfaces/odbc/pgtypes.h +++ b/src/interfaces/odbc/pgtypes.h @@ -1,9 +1,9 @@ -/* File: pgtypes.h +/* File: pgtypes.h * - * Description: See "pgtypes.c" + * Description: See "pgtypes.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -17,48 +17,48 @@ #if 0 -#define PG_TYPE_LO ???? /* waiting for permanent type */ +#define PG_TYPE_LO ????/* waiting for permanent type */ #endif -#define PG_TYPE_BOOL 16 -#define PG_TYPE_BYTEA 17 -#define PG_TYPE_CHAR 18 -#define PG_TYPE_NAME 19 -#define PG_TYPE_INT8 20 -#define PG_TYPE_INT2 21 -#define PG_TYPE_INT2VECTOR 22 -#define PG_TYPE_INT4 23 -#define PG_TYPE_REGPROC 24 -#define PG_TYPE_TEXT 25 -#define PG_TYPE_OID 26 -#define PG_TYPE_TID 27 -#define PG_TYPE_XID 28 -#define PG_TYPE_CID 29 -#define PG_TYPE_OIDVECTOR 30 -#define PG_TYPE_SET 32 -#define PG_TYPE_CHAR2 409 -#define PG_TYPE_CHAR4 410 -#define PG_TYPE_CHAR8 411 -#define PG_TYPE_POINT 600 -#define PG_TYPE_LSEG 601 -#define PG_TYPE_PATH 602 -#define PG_TYPE_BOX 603 -#define PG_TYPE_POLYGON 604 -#define PG_TYPE_FILENAME 605 -#define PG_TYPE_FLOAT4 700 -#define PG_TYPE_FLOAT8 701 -#define PG_TYPE_ABSTIME 702 -#define PG_TYPE_RELTIME 703 -#define PG_TYPE_TINTERVAL 704 -#define PG_TYPE_UNKNOWN 705 +#define PG_TYPE_BOOL 16 +#define PG_TYPE_BYTEA 17 +#define PG_TYPE_CHAR 18 +#define PG_TYPE_NAME 19 +#define PG_TYPE_INT8 20 +#define PG_TYPE_INT2 21 +#define PG_TYPE_INT2VECTOR 22 +#define PG_TYPE_INT4 23 +#define PG_TYPE_REGPROC 24 +#define PG_TYPE_TEXT 25 +#define PG_TYPE_OID 26 +#define PG_TYPE_TID 27 +#define PG_TYPE_XID 28 +#define PG_TYPE_CID 29 +#define PG_TYPE_OIDVECTOR 30 +#define PG_TYPE_SET 32 +#define PG_TYPE_CHAR2 409 +#define PG_TYPE_CHAR4 410 +#define PG_TYPE_CHAR8 411 +#define PG_TYPE_POINT 600 +#define PG_TYPE_LSEG 601 +#define PG_TYPE_PATH 602 +#define PG_TYPE_BOX 603 +#define PG_TYPE_POLYGON 604 +#define PG_TYPE_FILENAME 605 +#define PG_TYPE_FLOAT4 700 +#define PG_TYPE_FLOAT8 701 +#define PG_TYPE_ABSTIME 702 +#define PG_TYPE_RELTIME 703 +#define PG_TYPE_TINTERVAL 704 +#define PG_TYPE_UNKNOWN 705 #define PG_TYPE_MONEY 790 -#define PG_TYPE_OIDINT2 810 -#define PG_TYPE_OIDINT4 910 -#define PG_TYPE_OIDNAME 911 -#define PG_TYPE_BPCHAR 1042 +#define PG_TYPE_OIDINT2 810 +#define PG_TYPE_OIDINT4 910 +#define PG_TYPE_OIDNAME 911 +#define PG_TYPE_BPCHAR 1042 #define PG_TYPE_VARCHAR 1043 -#define PG_TYPE_DATE 1082 -#define PG_TYPE_TIME 1083 +#define PG_TYPE_DATE 1082 +#define PG_TYPE_TIME 1083 #define PG_TYPE_DATETIME 1184 #define PG_TYPE_TIMESTAMP 1296 #define PG_TYPE_NUMERIC 1700 @@ -67,32 +67,31 @@ extern Int2 sqlTypes[]; /* Defines for pgtype_precision */ -#define PG_STATIC -1 +#define PG_STATIC -1 -Int4 sqltype_to_pgtype(Int2 fSqlType); +Int4 sqltype_to_pgtype(Int2 fSqlType); -Int2 pgtype_to_sqltype(StatementClass *stmt, Int4 type); -Int2 pgtype_to_ctype(StatementClass *stmt, Int4 type); -char *pgtype_to_name(StatementClass *stmt, Int4 type); +Int2 pgtype_to_sqltype(StatementClass * stmt, Int4 type); +Int2 pgtype_to_ctype(StatementClass * stmt, Int4 type); +char *pgtype_to_name(StatementClass * stmt, Int4 type); /* These functions can use static numbers or result sets(col parameter) */ -Int4 pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as); -Int4 pgtype_display_size(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as); -Int4 pgtype_length(StatementClass *stmt, Int4 type, int col, int handle_unknown_size_as); - -Int2 pgtype_scale(StatementClass *stmt, Int4 type, int col); -Int2 pgtype_radix(StatementClass *stmt, Int4 type); -Int2 pgtype_nullable(StatementClass *stmt, Int4 type); -Int2 pgtype_auto_increment(StatementClass *stmt, Int4 type); -Int2 pgtype_case_sensitive(StatementClass *stmt, Int4 type); -Int2 pgtype_money(StatementClass *stmt, Int4 type); -Int2 pgtype_searchable(StatementClass *stmt, Int4 type); -Int2 pgtype_unsigned(StatementClass *stmt, Int4 type); -char *pgtype_literal_prefix(StatementClass *stmt, Int4 type); -char *pgtype_literal_suffix(StatementClass *stmt, Int4 type); -char *pgtype_create_params(StatementClass *stmt, Int4 type); - -Int2 sqltype_to_default_ctype(Int2 sqltype); +Int4 pgtype_precision(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as); +Int4 pgtype_display_size(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as); +Int4 pgtype_length(StatementClass * stmt, Int4 type, int col, int handle_unknown_size_as); + +Int2 pgtype_scale(StatementClass * stmt, Int4 type, int col); +Int2 pgtype_radix(StatementClass * stmt, Int4 type); +Int2 pgtype_nullable(StatementClass * stmt, Int4 type); +Int2 pgtype_auto_increment(StatementClass * stmt, Int4 type); +Int2 pgtype_case_sensitive(StatementClass * stmt, Int4 type); +Int2 pgtype_money(StatementClass * stmt, Int4 type); +Int2 pgtype_searchable(StatementClass * stmt, Int4 type); +Int2 pgtype_unsigned(StatementClass * stmt, Int4 type); +char *pgtype_literal_prefix(StatementClass * stmt, Int4 type); +char *pgtype_literal_suffix(StatementClass * stmt, Int4 type); +char *pgtype_create_params(StatementClass * stmt, Int4 type); + +Int2 sqltype_to_default_ctype(Int2 sqltype); #endif - diff --git a/src/interfaces/odbc/psqlodbc.c b/src/interfaces/odbc/psqlodbc.c index c5770f9d33..ef6345cdd2 100644 --- a/src/interfaces/odbc/psqlodbc.c +++ b/src/interfaces/odbc/psqlodbc.c @@ -1,14 +1,14 @@ -/* Module: psqlodbc.c +/* Module: psqlodbc.c * - * Description: This module contains the main entry point (DllMain) for the library. - * It also contains functions to get and set global variables for the - * driver in the registry. + * Description: This module contains the main entry point (DllMain) for the library. + * It also contains functions to get and set global variables for the + * driver in the registry. * - * Classes: n/a + * Classes: n/a * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -35,57 +35,60 @@ GLOBAL_VALUES globals; RETCODE SQL_API SQLDummyOrdinal(void); #ifdef WIN32 -HINSTANCE NEAR s_hModule; /* Saved module handle. */ +HINSTANCE NEAR s_hModule; /* Saved module handle. */ /* This is where the Driver Manager attaches to this Driver */ -BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +BOOL WINAPI +DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { -WORD wVersionRequested; -WSADATA wsaData; + WORD wVersionRequested; + WSADATA wsaData; - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - s_hModule = hInst; /* Save for dialog boxes */ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + s_hModule = hInst; /* Save for dialog boxes */ - /* Load the WinSock Library */ - wVersionRequested = MAKEWORD(1, 1); + /* Load the WinSock Library */ + wVersionRequested = MAKEWORD(1, 1); - if ( WSAStartup(wVersionRequested, &wsaData)) - return FALSE; + if (WSAStartup(wVersionRequested, &wsaData)) + return FALSE; - /* Verify that this is the minimum version of WinSock */ - if ( LOBYTE( wsaData.wVersion ) != 1 || - HIBYTE( wsaData.wVersion ) != 1 ) { + /* Verify that this is the minimum version of WinSock */ + if (LOBYTE(wsaData.wVersion) != 1 || + HIBYTE(wsaData.wVersion) != 1) + { - WSACleanup(); - return FALSE; - } + WSACleanup(); + return FALSE; + } - getGlobalDefaults(DBMS_NAME, ODBCINST_INI, FALSE); - break; + getGlobalDefaults(DBMS_NAME, ODBCINST_INI, FALSE); + break; - case DLL_THREAD_ATTACH: - break; + case DLL_THREAD_ATTACH: + break; - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: - WSACleanup(); + WSACleanup(); - return TRUE; + return TRUE; - case DLL_THREAD_DETACH: - break; + case DLL_THREAD_DETACH: + break; - default: - break; + default: + break; } - return TRUE; - - UNREFERENCED_PARAMETER(lpReserved); + return TRUE; + + UNREFERENCED_PARAMETER(lpReserved); } -#else /* not WIN32 */ +#else /* not WIN32 */ #ifndef TRUE #define TRUE (BOOL)1 @@ -96,7 +99,7 @@ WSADATA wsaData; #ifdef __GNUC__ -/* This function is called at library initialization time. */ +/* This function is called at library initialization time. */ static BOOL __attribute__((constructor)) @@ -106,7 +109,7 @@ init(void) return TRUE; } -#else /* not __GNUC__ */ +#else /* not __GNUC__ */ /* These two functions do shared library initialziation on UNIX, well at least * on Linux. I don't know about other systems. @@ -124,9 +127,9 @@ _fini(void) return TRUE; } -#endif /* not __GNUC__ */ +#endif /* not __GNUC__ */ -#endif /* not WIN32 */ +#endif /* not WIN32 */ /* This function is used to cause the Driver Manager to call functions by number rather than name, which is faster. @@ -134,8 +137,8 @@ _fini(void) Driver Manager do this. Also, the ordinal values of the functions must match the value of fFunction in SQLGetFunctions() */ -RETCODE SQL_API SQLDummyOrdinal(void) +RETCODE SQL_API +SQLDummyOrdinal(void) { return SQL_SUCCESS; } - diff --git a/src/interfaces/odbc/psqlodbc.h b/src/interfaces/odbc/psqlodbc.h index 96588de590..1db83bd9a0 100644 --- a/src/interfaces/odbc/psqlodbc.h +++ b/src/interfaces/odbc/psqlodbc.h @@ -1,12 +1,12 @@ -/* File: psqlodbc.h +/* File: psqlodbc.h * - * Description: This file contains defines and declarations that are related to - * the entire driver. + * Description: This file contains defines and declarations that are related to + * the entire driver. * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * - * $Id: psqlodbc.h,v 1.31 2001/02/10 06:57:53 momjian Exp $ + * $Id: psqlodbc.h,v 1.32 2001/02/10 07:01:19 momjian Exp $ */ #ifndef __PSQLODBC_H__ @@ -16,7 +16,7 @@ #include "config.h" #endif -#include /* for FILE* pointers: see GLOBAL_VALUES */ +#include /* for FILE* pointers: see GLOBAL_VALUES */ #ifndef WIN32 #define Int4 long int @@ -25,6 +25,7 @@ #define UInt2 unsigned short typedef float SFLOAT; typedef double SDOUBLE; + #else #define Int4 int #define UInt4 unsigned int @@ -38,8 +39,8 @@ typedef UInt4 Oid; #define ODBCVER 0x0250 #define DRIVER_ODBC_VER "02.50" -#define DRIVERNAME "PostgreSQL ODBC" -#define DBMS_NAME "PostgreSQL" +#define DRIVERNAME "PostgreSQL ODBC" +#define DBMS_NAME "PostgreSQL" #define POSTGRESDRIVERVERSION "07.01.0002" @@ -51,17 +52,21 @@ typedef UInt4 Oid; /* Limits */ #ifdef WIN32 -#define BLCKSZ 4096 +#define BLCKSZ 4096 #endif -#define MAX_MESSAGE_LEN 65536 /* This puts a limit on query size but I don't */ - /* see an easy way round this - DJP 24-1-2001 */ +#define MAX_MESSAGE_LEN 65536 /* This puts a limit on + * query size but I don't */ + /* see an easy way round this - DJP 24-1-2001 */ #define MAX_CONNECT_STRING 4096 #define ERROR_MSG_LENGTH 4096 -#define FETCH_MAX 100 /* default number of rows to cache for declare/fetch */ +#define FETCH_MAX 100 /* default number of rows to cache + * for declare/fetch */ #define TUPLE_MALLOC_INC 100 -#define SOCK_BUFFER_SIZE 4096 /* default socket buffer size */ -#define MAX_CONNECTIONS 128 /* conns per environment (arbitrary) */ +#define SOCK_BUFFER_SIZE 4096 /* default socket buffer + * size */ +#define MAX_CONNECTIONS 128 /* conns per environment + * (arbitrary) */ #define MAX_FIELDS 512 #define BYTELEN 8 #define VARHDRSZ sizeof(Int4) @@ -71,21 +76,24 @@ typedef UInt4 Oid; #define MAX_CURSOR_LEN 32 /* Registry length limits */ -#define LARGE_REGISTRY_LEN 4096 /* used for special cases */ -#define MEDIUM_REGISTRY_LEN 256 /* normal size for user,database,etc. */ -#define SMALL_REGISTRY_LEN 10 /* for 1/0 settings */ +#define LARGE_REGISTRY_LEN 4096 /* used for special cases */ +#define MEDIUM_REGISTRY_LEN 256 /* normal size for + * user,database,etc. */ +#define SMALL_REGISTRY_LEN 10 /* for 1/0 settings */ /* These prefixes denote system tables */ -#define POSTGRES_SYS_PREFIX "pg_" +#define POSTGRES_SYS_PREFIX "pg_" #define KEYS_TABLE "dd_fkey" /* Info limits */ #define MAX_INFO_STRING 128 #define MAX_KEYPARTS 20 -#define MAX_KEYLEN 512 /* max key of the form "date+outlet+invoice" */ -#define MAX_ROW_SIZE 0 /* Unlimited rowsize with the Tuple Toaster */ -#define MAX_STATEMENT_LEN 0 /* Unlimited statement size with 7.0 */ +#define MAX_KEYLEN 512 /* max key of the form + * "date+outlet+invoice" */ +#define MAX_ROW_SIZE 0 /* Unlimited rowsize with the Tuple + * Toaster */ +#define MAX_STATEMENT_LEN 0 /* Unlimited statement size with 7.0 */ /* Previously, numerous query strings were defined of length MAX_STATEMENT_LEN */ /* Now that's 0, lets use this instead. DJP 24-1-2001 */ @@ -110,62 +118,72 @@ typedef struct lo_arg LO_ARG; typedef struct GlobalValues_ { - int fetch_max; - int socket_buffersize; - int unknown_sizes; - int max_varchar_size; - int max_longvarchar_size; - char debug; - char commlog; - char disable_optimizer; - char ksqo; - char unique_index; - char onlyread; /* readonly is reserved on Digital C++ compiler */ - char use_declarefetch; - char text_as_longvarchar; - char unknowns_as_longvarchar; - char bools_as_char; - char lie; - char parse; - char cancel_as_freestmt; - char extra_systable_prefixes[MEDIUM_REGISTRY_LEN]; - char conn_settings[LARGE_REGISTRY_LEN]; - /* Protocol is not used anymore, but kept in case - * it is useful in the future. bjm 2001-02-10 - */ - char protocol[SMALL_REGISTRY_LEN]; - FILE* mylogFP; - FILE* qlogFP; -} GLOBAL_VALUES; - -typedef struct StatementOptions_ { - int maxRows; - int maxLength; - int rowset_size; - int keyset_size; - int cursor_type; - int scroll_concurrency; - int retrieve_data; - int bind_size; /* size of each structure if using Row Binding */ - int use_bookmarks; -} StatementOptions; + int fetch_max; + int socket_buffersize; + int unknown_sizes; + int max_varchar_size; + int max_longvarchar_size; + char debug; + char commlog; + char disable_optimizer; + char ksqo; + char unique_index; + char onlyread; /* readonly is reserved on Digital C++ + * compiler */ + char use_declarefetch; + char text_as_longvarchar; + char unknowns_as_longvarchar; + char bools_as_char; + char lie; + char parse; + char cancel_as_freestmt; + char extra_systable_prefixes[MEDIUM_REGISTRY_LEN]; + char conn_settings[LARGE_REGISTRY_LEN]; + + /* + * Protocol is not used anymore, but kept in case it is useful in the + * future. bjm 2001-02-10 + */ + char protocol[SMALL_REGISTRY_LEN]; + FILE *mylogFP; + FILE *qlogFP; +} GLOBAL_VALUES; + +typedef struct StatementOptions_ +{ + int maxRows; + int maxLength; + int rowset_size; + int keyset_size; + int cursor_type; + int scroll_concurrency; + int retrieve_data; + int bind_size; /* size of each structure if using Row + * Binding */ + int use_bookmarks; +} StatementOptions; /* Used to pass extra query info to send_query */ -typedef struct QueryInfo_ { - int row_size; - QResultClass *result_in; - char *cursor; -} QueryInfo; +typedef struct QueryInfo_ +{ + int row_size; + QResultClass *result_in; + char *cursor; +} QueryInfo; -#define PG_TYPE_LO -999 /* hack until permanent type available */ +#define PG_TYPE_LO -999 /* hack until permanent type + * available */ #define PG_TYPE_LO_NAME "lo" -#define OID_ATTNUM -2 /* the attnum in pg_index of the oid */ +#define OID_ATTNUM -2 /* the attnum in pg_index of the + * oid */ /* sizes */ -#define TEXT_FIELD_SIZE 8190 /* size of text fields (not including null term) */ +#define TEXT_FIELD_SIZE 8190 /* size of text fields (not + * including null term) */ #define NAME_FIELD_SIZE 32 /* size of name fields */ -#define MAX_VARCHAR_SIZE 254 /* maximum size of a varchar (not including null term) */ +#define MAX_VARCHAR_SIZE 254 /* maximum size of a varchar (not + * including null term) */ #define PG_NUMERIC_MAX_PRECISION 1000 #define PG_NUMERIC_MAX_SCALE 1000 diff --git a/src/interfaces/odbc/qresult.c b/src/interfaces/odbc/qresult.c index eaffef5b79..bc28126cf7 100644 --- a/src/interfaces/odbc/qresult.c +++ b/src/interfaces/odbc/qresult.c @@ -1,19 +1,19 @@ -/* Module: qresult.c +/* Module: qresult.c * - * Description: This module contains functions related to - * managing result information (i.e, fetching rows from the backend, - * managing the tuple cache, etc.) and retrieving it. - * Depending on the situation, a QResultClass will hold either data - * from the backend or a manually built result (see "qresult.h" to - * see which functions/macros are for manual or backend results. - * For manually built results, the QResultClass simply points to - * TupleList and ColumnInfo structures, which actually hold the data. + * Description: This module contains functions related to + * managing result information (i.e, fetching rows from the backend, + * managing the tuple cache, etc.) and retrieving it. + * Depending on the situation, a QResultClass will hold either data + * from the backend or a manually built result (see "qresult.h" to + * see which functions/macros are for manual or backend results. + * For manually built results, the QResultClass simply points to + * TupleList and ColumnInfo structures, which actually hold the data. * - * Classes: QResultClass (Functions prefix: "QR_") + * Classes: QResultClass (Functions prefix: "QR_") * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -31,68 +31,70 @@ extern GLOBAL_VALUES globals; -/* Used for building a Manual Result only */ +/* Used for building a Manual Result only */ /* All info functions call this function to create the manual result set. */ -void -QR_set_num_fields(QResultClass *self, int new_num_fields) +void +QR_set_num_fields(QResultClass * self, int new_num_fields) { mylog("in QR_set_num_fields\n"); - CI_set_num_fields(self->fields, new_num_fields); - if(self->manual_tuples) - TL_Destructor(self->manual_tuples); + CI_set_num_fields(self->fields, new_num_fields); + if (self->manual_tuples) + TL_Destructor(self->manual_tuples); - self->manual_tuples = TL_Constructor(new_num_fields); + self->manual_tuples = TL_Constructor(new_num_fields); mylog("exit QR_set_num_fields\n"); } -void -QR_set_position(QResultClass *self, int pos) +void +QR_set_position(QResultClass * self, int pos) { self->tupleField = self->backend_tuples + ((self->base + pos) * self->num_fields); } void -QR_set_cache_size(QResultClass *self, int cache_size) +QR_set_cache_size(QResultClass * self, int cache_size) { self->cache_size = cache_size; } -void -QR_set_rowset_size(QResultClass *self, int rowset_size) +void +QR_set_rowset_size(QResultClass * self, int rowset_size) { self->rowset_size = rowset_size; } void -QR_inc_base(QResultClass *self, int base_inc) +QR_inc_base(QResultClass * self, int base_inc) { self->base += base_inc; } /************************************/ -/* CLASS QResult */ +/* CLASS QResult */ /************************************/ QResultClass * QR_Constructor(void) { -QResultClass *rv; + QResultClass *rv; mylog("in QR_Constructor\n"); rv = (QResultClass *) malloc(sizeof(QResultClass)); - if (rv != NULL) { + if (rv != NULL) + { rv->status = PGRES_EMPTY_QUERY; /* construct the column info */ - if ( ! (rv->fields = CI_Constructor())) { + if (!(rv->fields = CI_Constructor())) + { free(rv); return NULL; } - rv->manual_tuples = NULL; - rv->backend_tuples = NULL; + rv->manual_tuples = NULL; + rv->backend_tuples = NULL; rv->message = NULL; rv->command = NULL; rv->notice = NULL; @@ -116,7 +118,7 @@ QResultClass *rv; } void -QR_Destructor(QResultClass *self) +QR_Destructor(QResultClass * self) { mylog("QResult: in DESTRUCTOR\n"); @@ -124,26 +126,26 @@ QR_Destructor(QResultClass *self) if (self->manual_tuples) TL_Destructor(self->manual_tuples); - /* If conn is defined, then we may have used "backend_tuples", */ - /* so in case we need to, free it up. Also, close the cursor. */ + /* If conn is defined, then we may have used "backend_tuples", */ + /* so in case we need to, free it up. Also, close the cursor. */ if (self->conn && self->conn->sock && CC_is_in_trans(self->conn)) QR_close(self); /* close the cursor if there is one */ - QR_free_memory(self); /* safe to call anyway */ + QR_free_memory(self); /* safe to call anyway */ - /* Should have been freed in the close() but just in case... */ + /* Should have been freed in the close() but just in case... */ if (self->cursor) free(self->cursor); - /* Free up column info */ + /* Free up column info */ if (self->fields) CI_Destructor(self->fields); - /* Free command info (this is from strdup()) */ + /* Free command info (this is from strdup()) */ if (self->command) free(self->command); - /* Free notice info (this is from strdup()) */ + /* Free notice info (this is from strdup()) */ if (self->notice) free(self->notice); @@ -154,7 +156,7 @@ QR_Destructor(QResultClass *self) } void -QR_set_command(QResultClass *self, char *msg) +QR_set_command(QResultClass * self, char *msg) { if (self->command) free(self->command); @@ -162,8 +164,8 @@ QR_set_command(QResultClass *self, char *msg) self->command = msg ? strdup(msg) : NULL; } -void -QR_set_notice(QResultClass *self, char *msg) +void +QR_set_notice(QResultClass * self, char *msg) { if (self->notice) free(self->notice); @@ -171,27 +173,32 @@ QR_set_notice(QResultClass *self, char *msg) self->notice = msg ? strdup(msg) : NULL; } -void -QR_free_memory(QResultClass *self) +void +QR_free_memory(QResultClass * self) { -register int lf, row; -register TupleField *tuple = self->backend_tuples; -int fcount = self->fcount; -int num_fields = self->num_fields; + register int lf, + row; + register TupleField *tuple = self->backend_tuples; + int fcount = self->fcount; + int num_fields = self->num_fields; mylog("QResult: free memory in, fcount=%d\n", fcount); - if ( self->backend_tuples) { + if (self->backend_tuples) + { - for (row = 0; row < fcount; row++) { + for (row = 0; row < fcount; row++) + { mylog("row = %d, num_fields = %d\n", row, num_fields); - for (lf=0; lf < num_fields; lf++) { - if (tuple[lf].value != NULL) { + for (lf = 0; lf < num_fields; lf++) + { + if (tuple[lf].value != NULL) + { mylog("free [lf=%d] %u\n", lf, tuple[lf].value); free(tuple[lf].value); } } - tuple += num_fields; /* next row */ + tuple += num_fields;/* next row */ } free(self->backend_tuples); @@ -205,39 +212,44 @@ int num_fields = self->num_fields; /* This function is called by send_query() */ char -QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor) +QR_fetch_tuples(QResultClass * self, ConnectionClass * conn, char *cursor) { -int tuple_size; - - /* If called from send_query the first time (conn != NULL), */ - /* then set the inTuples state, */ - /* and read the tuples. If conn is NULL, */ - /* it implies that we are being called from next_tuple(), */ - /* like to get more rows so don't call next_tuple again! */ - if (conn != NULL) { + int tuple_size; + + /* If called from send_query the first time (conn != NULL), */ + /* then set the inTuples state, */ + /* and read the tuples. If conn is NULL, */ + /* it implies that we are being called from next_tuple(), */ + /* like to get more rows so don't call next_tuple again! */ + if (conn != NULL) + { self->conn = conn; - mylog("QR_fetch_tuples: cursor = '%s', self->cursor=%u\n", (cursor==NULL)?"":cursor, self->cursor); + mylog("QR_fetch_tuples: cursor = '%s', self->cursor=%u\n", (cursor == NULL) ? "" : cursor, self->cursor); if (self->cursor) free(self->cursor); - if ( globals.use_declarefetch) { - if (! cursor || cursor[0] == '\0') { + if (globals.use_declarefetch) + { + if (!cursor || cursor[0] == '\0') + { self->status = PGRES_INTERNAL_ERROR; QR_set_message(self, "Internal Error -- no cursor for fetch"); return FALSE; } self->cursor = strdup(cursor); } - - /* Read the field attributes. */ - /* $$$$ Should do some error control HERE! $$$$ */ - if ( CI_read_fields(self->fields, self->conn)) { + + /* Read the field attributes. */ + /* $$$$ Should do some error control HERE! $$$$ */ + if (CI_read_fields(self->fields, self->conn)) + { self->status = PGRES_FIELDS_OK; self->num_fields = CI_get_num_fields(self->fields); } - else { + else + { self->status = PGRES_BAD_RESPONSE; QR_set_message(self, "Error reading field information"); return FALSE; @@ -245,7 +257,7 @@ int tuple_size; mylog("QR_fetch_tuples: past CI_read_fields: num_fields = %d\n", self->num_fields); - if (globals.use_declarefetch) + if (globals.use_declarefetch) tuple_size = self->cache_size; else tuple_size = TUPLE_MALLOC_INC; @@ -253,8 +265,9 @@ int tuple_size; /* allocate memory for the tuple cache */ mylog("MALLOC: tuple_size = %d, size = %d\n", tuple_size, self->num_fields * sizeof(TupleField) * tuple_size); self->backend_tuples = (TupleField *) malloc(self->num_fields * sizeof(TupleField) * tuple_size); - if ( ! self->backend_tuples) { - self->status = PGRES_FATAL_ERROR; + if (!self->backend_tuples) + { + self->status = PGRES_FATAL_ERROR; QR_set_message(self, "Could not get memory for tuple cache."); return FALSE; } @@ -262,19 +275,21 @@ int tuple_size; self->inTuples = TRUE; - /* Force a read to occur in next_tuple */ - self->fcount = tuple_size+1; - self->fetch_count = tuple_size+1; + /* Force a read to occur in next_tuple */ + self->fcount = tuple_size + 1; + self->fetch_count = tuple_size + 1; self->base = 0; return QR_next_tuple(self); } - else { + else + { - /* Always have to read the field attributes. */ - /* But we dont have to reallocate memory for them! */ + /* Always have to read the field attributes. */ + /* But we dont have to reallocate memory for them! */ - if ( ! CI_read_fields(NULL, self->conn)) { + if (!CI_read_fields(NULL, self->conn)) + { self->status = PGRES_BAD_RESPONSE; QR_set_message(self, "Error reading field information"); return FALSE; @@ -286,12 +301,13 @@ int tuple_size; /* Close the cursor and end the transaction (if no cursors left) */ /* We only close cursor/end the transaction if a cursor was used. */ int -QR_close(QResultClass *self) +QR_close(QResultClass * self) { -QResultClass *res; + QResultClass *res; - if (globals.use_declarefetch && self->conn && self->cursor) { - char buf[64]; + if (globals.use_declarefetch && self->conn && self->cursor) + { + char buf[64]; sprintf(buf, "close %s", self->cursor); mylog("QResult: closing cursor: '%s'\n", buf); @@ -304,21 +320,24 @@ QResultClass *res; free(self->cursor); self->cursor = NULL; - if (res == NULL) { + if (res == NULL) + { self->status = PGRES_FATAL_ERROR; QR_set_message(self, "Error closing cursor."); return FALSE; } - /* End the transaction if there are no cursors left on this conn */ - if (CC_cursor_count(self->conn) == 0) { + /* End the transaction if there are no cursors left on this conn */ + if (CC_cursor_count(self->conn) == 0) + { mylog("QResult: END transaction on conn=%u\n", self->conn); res = CC_send_query(self->conn, "END", NULL); CC_set_no_trans(self->conn); - if (res == NULL) { + if (res == NULL) + { self->status = PGRES_FATAL_ERROR; QR_set_message(self, "Error ending transaction."); return FALSE; @@ -332,56 +351,67 @@ QResultClass *res; /* This function is called by fetch_tuples() AND SQLFetch() */ int -QR_next_tuple(QResultClass *self) +QR_next_tuple(QResultClass * self) { -int id; -QResultClass *res; -SocketClass *sock; + int id; + QResultClass *res; + SocketClass *sock; + /* Speed up access */ -int fetch_count = self->fetch_count; -int fcount = self->fcount; -int fetch_size, offset= 0; -int end_tuple = self->rowset_size + self->base; -char corrected = FALSE; -TupleField *the_tuples = self->backend_tuples; -static char msgbuffer[MAX_MESSAGE_LEN+1]; -char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont need static */ -char fetch[128]; -QueryInfo qi; - - if (fetch_count < fcount) { /* return a row from cache */ + int fetch_count = self->fetch_count; + int fcount = self->fcount; + int fetch_size, + offset = 0; + int end_tuple = self->rowset_size + self->base; + char corrected = FALSE; + TupleField *the_tuples = self->backend_tuples; + static char msgbuffer[MAX_MESSAGE_LEN + 1]; + char cmdbuffer[MAX_MESSAGE_LEN + 1]; /* QR_set_command() dups + * this string so dont + * need static */ + char fetch[128]; + QueryInfo qi; + + if (fetch_count < fcount) + { /* return a row from cache */ mylog("next_tuple: fetch_count < fcount: returning tuple %d, fcount = %d\n", fetch_count, fcount); - self->tupleField = the_tuples + (fetch_count * self->num_fields); /* next row */ + self->tupleField = the_tuples + (fetch_count * self->num_fields); /* next row */ self->fetch_count++; return TRUE; } - else if (self->fcount < self->cache_size) { /* last row from cache */ - /* We are done because we didn't even get CACHE_SIZE tuples */ - mylog("next_tuple: fcount < CACHE_SIZE: fcount = %d, fetch_count = %d\n", fcount, fetch_count); - self->tupleField = NULL; - self->status = PGRES_END_TUPLES; - return -1; /* end of tuples */ + else if (self->fcount < self->cache_size) + { /* last row from cache */ + /* We are done because we didn't even get CACHE_SIZE tuples */ + mylog("next_tuple: fcount < CACHE_SIZE: fcount = %d, fetch_count = %d\n", fcount, fetch_count); + self->tupleField = NULL; + self->status = PGRES_END_TUPLES; + return -1; /* end of tuples */ } - else { - /* See if we need to fetch another group of rows. - We may be being called from send_query(), and - if so, don't send another fetch, just fall through - and read the tuples. - */ + else + { + + /* + * See if we need to fetch another group of rows. We may be being + * called from send_query(), and if so, don't send another fetch, + * just fall through and read the tuples. + */ self->tupleField = NULL; - if ( ! self->inTuples) { + if (!self->inTuples) + { - if ( ! globals.use_declarefetch) { + if (!globals.use_declarefetch) + { mylog("next_tuple: ALL_ROWS: done, fcount = %d, fetch_count = %d\n", fcount, fetch_count); self->tupleField = NULL; self->status = PGRES_END_TUPLES; - return -1; /* end of tuples */ + return -1; /* end of tuples */ } - if (self->base == fcount) { /* not a correction */ + if (self->base == fcount) + { /* not a correction */ - /* Determine the optimum cache size. */ + /* Determine the optimum cache size. */ if (globals.fetch_max % self->rowset_size == 0) fetch_size = globals.fetch_max; else if (self->rowset_size < globals.fetch_max) @@ -390,9 +420,10 @@ QueryInfo qi; fetch_size = self->rowset_size; self->cache_size = fetch_size; - self->fetch_count = 1; - } - else { /* need to correct */ + self->fetch_count = 1; + } + else + { /* need to correct */ corrected = TRUE; @@ -407,8 +438,9 @@ QueryInfo qi; self->backend_tuples = (TupleField *) realloc(self->backend_tuples, self->num_fields * sizeof(TupleField) * self->cache_size); - if ( ! self->backend_tuples) { - self->status = PGRES_FATAL_ERROR; + if (!self->backend_tuples) + { + self->status = PGRES_FATAL_ERROR; QR_set_message(self, "Out of memory while reading tuples."); return FALSE; } @@ -416,29 +448,34 @@ QueryInfo qi; mylog("next_tuple: sending actual fetch (%d) query '%s'\n", fetch_size, fetch); - /* don't read ahead for the next tuple (self) ! */ + /* don't read ahead for the next tuple (self) ! */ qi.row_size = self->cache_size; qi.result_in = self; qi.cursor = NULL; res = CC_send_query(self->conn, fetch, &qi); - if (res == NULL) { + if (res == NULL) + { self->status = PGRES_FATAL_ERROR; QR_set_message(self, "Error fetching next group."); return FALSE; } self->inTuples = TRUE; } - else { + else + { mylog("next_tuple: inTuples = true, falling through: fcount = %d, fetch_count = %d\n", self->fcount, self->fetch_count); - /* This is a pre-fetch (fetching rows right after query - but before any real SQLFetch() calls. This is done - so the field attributes are available. - */ + + /* + * This is a pre-fetch (fetching rows right after query but + * before any real SQLFetch() calls. This is done so the + * field attributes are available. + */ self->fetch_count = 0; } } - if ( ! corrected) { + if (!corrected) + { self->base = 0; self->fcount = 0; } @@ -447,107 +484,118 @@ QueryInfo qi; sock = CC_get_socket(self->conn); self->tupleField = NULL; - for ( ; ;) { + for (;;) + { id = SOCK_get_char(sock); - switch (id) { - case 'T': /* Tuples within tuples cannot be handled */ - self->status = PGRES_BAD_RESPONSE; - QR_set_message(self, "Tuples within tuples cannot be handled"); - return FALSE; - case 'B': /* Tuples in binary format */ - case 'D': /* Tuples in ASCII format */ - - if ( ! globals.use_declarefetch && self->fcount > 0 && ! (self->fcount % TUPLE_MALLOC_INC)) { - size_t old_size = self->fcount * self->num_fields * sizeof(TupleField); - mylog("REALLOC: old_size = %d\n", old_size); + switch (id) + { + case 'T': /* Tuples within tuples cannot be handled */ + self->status = PGRES_BAD_RESPONSE; + QR_set_message(self, "Tuples within tuples cannot be handled"); + return FALSE; + case 'B': /* Tuples in binary format */ + case 'D': /* Tuples in ASCII format */ + + if (!globals.use_declarefetch && self->fcount > 0 && !(self->fcount % TUPLE_MALLOC_INC)) + { + size_t old_size = self->fcount * self->num_fields * sizeof(TupleField); + + mylog("REALLOC: old_size = %d\n", old_size); + + self->backend_tuples = (TupleField *) realloc(self->backend_tuples, old_size + (self->num_fields * sizeof(TupleField) * TUPLE_MALLOC_INC)); + if (!self->backend_tuples) + { + self->status = PGRES_FATAL_ERROR; + QR_set_message(self, "Out of memory while reading tuples."); + return FALSE; + } + } - self->backend_tuples = (TupleField *) realloc(self->backend_tuples, old_size + (self->num_fields * sizeof(TupleField) * TUPLE_MALLOC_INC)); - if ( ! self->backend_tuples) { - self->status = PGRES_FATAL_ERROR; - QR_set_message(self, "Out of memory while reading tuples."); + if (!QR_read_tuple(self, (char) (id == 0))) + { + self->status = PGRES_BAD_RESPONSE; + QR_set_message(self, "Error reading the tuple"); return FALSE; } - } - if ( ! QR_read_tuple(self, (char) (id == 0))) { - self->status = PGRES_BAD_RESPONSE; - QR_set_message(self, "Error reading the tuple"); - return FALSE; - } - - self->fcount++; - break; /* continue reading */ + self->fcount++; + break; /* continue reading */ - case 'C': /* End of tuple list */ - SOCK_get_string(sock, cmdbuffer, MAX_MESSAGE_LEN); - QR_set_command(self, cmdbuffer); + case 'C': /* End of tuple list */ + SOCK_get_string(sock, cmdbuffer, MAX_MESSAGE_LEN); + QR_set_command(self, cmdbuffer); - mylog("end of tuple list -- setting inUse to false: this = %u\n", self); + mylog("end of tuple list -- setting inUse to false: this = %u\n", self); - self->inTuples = FALSE; - if (self->fcount > 0) { + self->inTuples = FALSE; + if (self->fcount > 0) + { - qlog(" [ fetched %d rows ]\n", self->fcount); - mylog("_next_tuple: 'C' fetch_max && fcount = %d\n", self->fcount); + qlog(" [ fetched %d rows ]\n", self->fcount); + mylog("_next_tuple: 'C' fetch_max && fcount = %d\n", self->fcount); - /* set to first row */ - self->tupleField = self->backend_tuples + (offset * self->num_fields); - return TRUE; - } - else { /* We are surely done here (we read 0 tuples) */ - qlog(" [ fetched 0 rows ]\n"); - mylog("_next_tuple: 'C': DONE (fcount == 0)\n"); - return -1; /* end of tuples */ - } + /* set to first row */ + self->tupleField = self->backend_tuples + (offset * self->num_fields); + return TRUE; + } + else + { /* We are surely done here (we read 0 + * tuples) */ + qlog(" [ fetched 0 rows ]\n"); + mylog("_next_tuple: 'C': DONE (fcount == 0)\n"); + return -1; /* end of tuples */ + } - case 'E': /* Error */ - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - QR_set_message(self, msgbuffer); - self->status = PGRES_FATAL_ERROR; + case 'E': /* Error */ + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + QR_set_message(self, msgbuffer); + self->status = PGRES_FATAL_ERROR; - if ( ! strncmp(msgbuffer, "FATAL", 5)) - CC_set_no_trans(self->conn); + if (!strncmp(msgbuffer, "FATAL", 5)) + CC_set_no_trans(self->conn); - qlog("ERROR from backend in next_tuple: '%s'\n", msgbuffer); + qlog("ERROR from backend in next_tuple: '%s'\n", msgbuffer); - return FALSE; + return FALSE; - case 'N': /* Notice */ - SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); - QR_set_message(self, msgbuffer); - self->status = PGRES_NONFATAL_ERROR; - qlog("NOTICE from backend in next_tuple: '%s'\n", msgbuffer); - continue; - - default: /* this should only happen if the backend dumped core */ - mylog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id); - qlog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id); - QR_set_message(self, "Unexpected result from backend. It probably crashed"); - self->status = PGRES_FATAL_ERROR; - CC_set_no_trans(self->conn); - return FALSE; + case 'N': /* Notice */ + SOCK_get_string(sock, msgbuffer, ERROR_MSG_LENGTH); + QR_set_message(self, msgbuffer); + self->status = PGRES_NONFATAL_ERROR; + qlog("NOTICE from backend in next_tuple: '%s'\n", msgbuffer); + continue; + + default: /* this should only happen if the backend + * dumped core */ + mylog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id); + qlog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id); + QR_set_message(self, "Unexpected result from backend. It probably crashed"); + self->status = PGRES_FATAL_ERROR; + CC_set_no_trans(self->conn); + return FALSE; } } return TRUE; } char -QR_read_tuple(QResultClass *self, char binary) +QR_read_tuple(QResultClass * self, char binary) { -Int2 field_lf; -TupleField *this_tuplefield; -char bmp, bitmap[MAX_FIELDS]; /* Max. len of the bitmap */ -Int2 bitmaplen; /* len of the bitmap in bytes */ -Int2 bitmap_pos; -Int2 bitcnt; -Int4 len; -char *buffer; -int num_fields = self->num_fields; /* speed up access */ -SocketClass *sock = CC_get_socket(self->conn); -ColumnInfoClass *flds; + Int2 field_lf; + TupleField *this_tuplefield; + char bmp, + bitmap[MAX_FIELDS]; /* Max. len of the bitmap */ + Int2 bitmaplen; /* len of the bitmap in bytes */ + Int2 bitmap_pos; + Int2 bitcnt; + Int4 len; + char *buffer; + int num_fields = self->num_fields; /* speed up access */ + SocketClass *sock = CC_get_socket(self->conn); + ColumnInfoClass *flds; /* set the current row to read the fields into */ @@ -558,31 +606,36 @@ ColumnInfoClass *flds; bitmaplen++; /* - At first the server sends a bitmap that indicates which - database fields are null - */ + * At first the server sends a bitmap that indicates which database + * fields are null + */ SOCK_get_n_char(sock, bitmap, bitmaplen); bitmap_pos = 0; bitcnt = 0; bmp = bitmap[bitmap_pos]; - for(field_lf = 0; field_lf < num_fields; field_lf++) { + for (field_lf = 0; field_lf < num_fields; field_lf++) + { /* Check if the current field is NULL */ - if(!(bmp & 0200)) { + if (!(bmp & 0200)) + { /* YES, it is NULL ! */ this_tuplefield[field_lf].len = 0; this_tuplefield[field_lf].value = 0; - } else { + } + else + { + /* - NO, the field is not null. so get at first the - length of the field (four bytes) - */ + * NO, the field is not null. so get at first the length of + * the field (four bytes) + */ len = SOCK_get_int(sock, VARHDRSZ); if (!binary) len -= VARHDRSZ; - buffer = (char *)malloc(len+1); + buffer = (char *) malloc(len + 1); SOCK_get_n_char(sock, buffer, len); buffer[len] = '\0'; @@ -591,27 +644,31 @@ ColumnInfoClass *flds; this_tuplefield[field_lf].len = len; this_tuplefield[field_lf].value = buffer; - /* This can be used to set the longest length of the column for any - row in the tuple cache. It would not be accurate for varchar and - text fields to use this since a tuple cache is only 100 rows. - Bpchar can be handled since the strlen of all rows is fixed, - assuming there are not 100 nulls in a row! - */ + /* + * This can be used to set the longest length of the column + * for any row in the tuple cache. It would not be accurate + * for varchar and text fields to use this since a tuple cache + * is only 100 rows. Bpchar can be handled since the strlen of + * all rows is fixed, assuming there are not 100 nulls in a + * row! + */ flds = self->fields; if (flds->display_size[field_lf] < len) flds->display_size[field_lf] = len; } + /* - Now adjust for the next bit to be scanned in the - next loop. - */ + * Now adjust for the next bit to be scanned in the next loop. + */ bitcnt++; - if (BYTELEN == bitcnt) { + if (BYTELEN == bitcnt) + { bitmap_pos++; bmp = bitmap[bitmap_pos]; bitcnt = 0; - } else + } + else bmp <<= 1; } self->currTuple++; diff --git a/src/interfaces/odbc/qresult.h b/src/interfaces/odbc/qresult.h index 93f11cee1f..0c284ca017 100644 --- a/src/interfaces/odbc/qresult.h +++ b/src/interfaces/odbc/qresult.h @@ -1,9 +1,9 @@ -/* File: qresult.h +/* File: qresult.h * - * Description: See "qresult.c" + * Description: See "qresult.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -17,68 +17,75 @@ #include "psqlodbc.h" #include "tuple.h" -enum QueryResultCode_ { - PGRES_EMPTY_QUERY = 0, - PGRES_COMMAND_OK, /* a query command that doesn't return */ - /* anything was executed properly by the backend */ - PGRES_TUPLES_OK, /* a query command that returns tuples */ - /* was executed properly by the backend, PGresult */ - /* contains the resulttuples */ - PGRES_COPY_OUT, - PGRES_COPY_IN, - PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from the backend */ - PGRES_NONFATAL_ERROR, - PGRES_FATAL_ERROR, - PGRES_FIELDS_OK, /* field information from a query was successful */ - PGRES_END_TUPLES, - PGRES_INTERNAL_ERROR +enum QueryResultCode_ +{ + PGRES_EMPTY_QUERY = 0, + PGRES_COMMAND_OK, /* a query command that doesn't return */ + /* anything was executed properly by the backend */ + PGRES_TUPLES_OK, /* a query command that returns tuples */ + /* was executed properly by the backend, PGresult */ + /* contains the resulttuples */ + PGRES_COPY_OUT, + PGRES_COPY_IN, + PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from + * the backend */ + PGRES_NONFATAL_ERROR, + PGRES_FATAL_ERROR, + PGRES_FIELDS_OK, /* field information from a query was + * successful */ + PGRES_END_TUPLES, + PGRES_INTERNAL_ERROR }; typedef enum QueryResultCode_ QueryResultCode; -struct QResultClass_ { - ColumnInfoClass *fields; /* the Column information */ - TupleListClass *manual_tuples; /* manual result tuple list */ - ConnectionClass *conn; /* the connection this result is using (backend) */ +struct QResultClass_ +{ + ColumnInfoClass *fields; /* the Column information */ + TupleListClass *manual_tuples; /* manual result tuple list */ + ConnectionClass *conn; /* the connection this result is using + * (backend) */ - /* Stuff for declare/fetch tuples */ - int fetch_count; /* logical rows read so far */ - int fcount; /* actual rows read in the fetch */ - int currTuple; - int base; + /* Stuff for declare/fetch tuples */ + int fetch_count; /* logical rows read so far */ + int fcount; /* actual rows read in the fetch */ + int currTuple; + int base; - int num_fields; /* number of fields in the result */ - int cache_size; - int rowset_size; + int num_fields; /* number of fields in the result */ + int cache_size; + int rowset_size; - QueryResultCode status; + QueryResultCode status; - char *message; - char *cursor; /* The name of the cursor for select statements */ - char *command; - char *notice; + char *message; + char *cursor; /* The name of the cursor for select + * statements */ + char *command; + char *notice; - TupleField *backend_tuples; /* data from the backend (the tuple cache) */ - TupleField *tupleField; /* current backend tuple being retrieved */ + TupleField *backend_tuples; /* data from the backend (the tuple cache) */ + TupleField *tupleField; /* current backend tuple being retrieved */ - char inTuples; /* is a fetch of rows from the backend in progress? */ + char inTuples; /* is a fetch of rows from the backend in + * progress? */ }; #define QR_get_fields(self) (self->fields) /* These functions are for retrieving data from the qresult */ -#define QR_get_value_manual(self, tupleno, fieldno) (TL_get_fieldval(self->manual_tuples, tupleno, fieldno)) -#define QR_get_value_backend(self, fieldno) (self->tupleField[fieldno].value) +#define QR_get_value_manual(self, tupleno, fieldno) (TL_get_fieldval(self->manual_tuples, tupleno, fieldno)) +#define QR_get_value_backend(self, fieldno) (self->tupleField[fieldno].value) #define QR_get_value_backend_row(self, tupleno, fieldno) ((self->backend_tuples + (tupleno * self->num_fields))[fieldno].value) /* These functions are used by both manual and backend results */ #define QR_NumResultCols(self) (CI_get_num_fields(self->fields)) #define QR_get_fieldname(self, fieldno_) (CI_get_fieldname(self->fields, fieldno_)) -#define QR_get_fieldsize(self, fieldno_) (CI_get_fieldsize(self->fields, fieldno_)) -#define QR_get_display_size(self, fieldno_) (CI_get_display_size(self->fields, fieldno_)) -#define QR_get_atttypmod(self, fieldno_) (CI_get_atttypmod(self->fields, fieldno_)) -#define QR_get_field_type(self, fieldno_) (CI_get_oid(self->fields, fieldno_)) +#define QR_get_fieldsize(self, fieldno_) (CI_get_fieldsize(self->fields, fieldno_)) +#define QR_get_display_size(self, fieldno_) (CI_get_display_size(self->fields, fieldno_)) +#define QR_get_atttypmod(self, fieldno_) (CI_get_atttypmod(self->fields, fieldno_)) +#define QR_get_field_type(self, fieldno_) (CI_get_oid(self->fields, fieldno_)) /* These functions are used only for manual result sets */ #define QR_get_num_tuples(self) (self->manual_tuples ? TL_get_num_tuples(self->manual_tuples) : self->fcount) @@ -99,20 +106,20 @@ struct QResultClass_ { /* Core Functions */ QResultClass *QR_Constructor(void); -void QR_Destructor(QResultClass *self); -char QR_read_tuple(QResultClass *self, char binary); -int QR_next_tuple(QResultClass *self); -int QR_close(QResultClass *self); -char QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor); -void QR_free_memory(QResultClass *self); -void QR_set_command(QResultClass *self, char *msg); -void QR_set_notice(QResultClass *self, char *msg); - -void QR_set_num_fields(QResultClass *self, int new_num_fields); /* manual result only */ - -void QR_inc_base(QResultClass *self, int base_inc); -void QR_set_cache_size(QResultClass *self, int cache_size); -void QR_set_rowset_size(QResultClass *self, int rowset_size); -void QR_set_position(QResultClass *self, int pos); - +void QR_Destructor(QResultClass * self); +char QR_read_tuple(QResultClass * self, char binary); +int QR_next_tuple(QResultClass * self); +int QR_close(QResultClass * self); +char QR_fetch_tuples(QResultClass * self, ConnectionClass * conn, char *cursor); +void QR_free_memory(QResultClass * self); +void QR_set_command(QResultClass * self, char *msg); +void QR_set_notice(QResultClass * self, char *msg); + +void QR_set_num_fields(QResultClass * self, int new_num_fields); /* manual result only */ + +void QR_inc_base(QResultClass * self, int base_inc); +void QR_set_cache_size(QResultClass * self, int cache_size); +void QR_set_rowset_size(QResultClass * self, int rowset_size); +void QR_set_position(QResultClass * self, int pos); + #endif diff --git a/src/interfaces/odbc/resource.h b/src/interfaces/odbc/resource.h index cfe83cf10e..60e0e61f45 100644 --- a/src/interfaces/odbc/resource.h +++ b/src/interfaces/odbc/resource.h @@ -2,59 +2,59 @@ /* Microsoft Developer Studio generated include file. */ /* Used by psqlodbc.rc */ -#define IDS_BADDSN 1 -#define IDS_MSGTITLE 2 -#define DLG_OPTIONS_DRV 102 -#define DLG_OPTIONS_DS 103 -#define IDC_DSNAME 400 -#define IDC_DSNAMETEXT 401 -#define IDC_DESC 404 -#define IDC_SERVER 407 -#define IDC_DATABASE 408 -#define DLG_CONFIG 1001 -#define IDC_PORT 1002 -#define IDC_USER 1006 -#define IDC_PASSWORD 1009 -#define DS_READONLY 1011 -#define DS_SHOWOIDCOLUMN 1012 -#define DS_FAKEOIDINDEX 1013 -#define DRV_COMMLOG 1014 -#define IDC_DATASOURCE 1018 -#define DRV_OPTIMIZER 1019 -#define DS_CONNSETTINGS 1020 -#define IDC_DRIVER 1021 -#define DRV_CONNSETTINGS 1031 -#define DRV_UNIQUEINDEX 1032 -#define DRV_UNKNOWN_MAX 1035 -#define DRV_UNKNOWN_DONTKNOW 1036 -#define DRV_READONLY 1037 -#define IDC_DESCTEXT 1039 -#define DRV_MSG_LABEL 1040 -#define DRV_UNKNOWN_LONGEST 1041 -#define DRV_TEXT_LONGVARCHAR 1043 -#define DRV_UNKNOWNS_LONGVARCHAR 1044 -#define DRV_CACHE_SIZE 1045 -#define DRV_VARCHAR_SIZE 1046 -#define DRV_LONGVARCHAR_SIZE 1047 -#define IDDEFAULTS 1048 -#define DRV_USEDECLAREFETCH 1049 -#define DRV_BOOLS_CHAR 1050 -#define DS_SHOWSYSTEMTABLES 1051 -#define DRV_EXTRASYSTABLEPREFIXES 1051 -#define DS_ROWVERSIONING 1052 -#define DRV_PARSE 1052 -#define DRV_CANCELASFREESTMT 1053 -#define IDC_OPTIONS 1054 -#define DRV_KSQO 1055 -#define DS_PG64 1057 +#define IDS_BADDSN 1 +#define IDS_MSGTITLE 2 +#define DLG_OPTIONS_DRV 102 +#define DLG_OPTIONS_DS 103 +#define IDC_DSNAME 400 +#define IDC_DSNAMETEXT 401 +#define IDC_DESC 404 +#define IDC_SERVER 407 +#define IDC_DATABASE 408 +#define DLG_CONFIG 1001 +#define IDC_PORT 1002 +#define IDC_USER 1006 +#define IDC_PASSWORD 1009 +#define DS_READONLY 1011 +#define DS_SHOWOIDCOLUMN 1012 +#define DS_FAKEOIDINDEX 1013 +#define DRV_COMMLOG 1014 +#define IDC_DATASOURCE 1018 +#define DRV_OPTIMIZER 1019 +#define DS_CONNSETTINGS 1020 +#define IDC_DRIVER 1021 +#define DRV_CONNSETTINGS 1031 +#define DRV_UNIQUEINDEX 1032 +#define DRV_UNKNOWN_MAX 1035 +#define DRV_UNKNOWN_DONTKNOW 1036 +#define DRV_READONLY 1037 +#define IDC_DESCTEXT 1039 +#define DRV_MSG_LABEL 1040 +#define DRV_UNKNOWN_LONGEST 1041 +#define DRV_TEXT_LONGVARCHAR 1043 +#define DRV_UNKNOWNS_LONGVARCHAR 1044 +#define DRV_CACHE_SIZE 1045 +#define DRV_VARCHAR_SIZE 1046 +#define DRV_LONGVARCHAR_SIZE 1047 +#define IDDEFAULTS 1048 +#define DRV_USEDECLAREFETCH 1049 +#define DRV_BOOLS_CHAR 1050 +#define DS_SHOWSYSTEMTABLES 1051 +#define DRV_EXTRASYSTABLEPREFIXES 1051 +#define DS_ROWVERSIONING 1052 +#define DRV_PARSE 1052 +#define DRV_CANCELASFREESTMT 1053 +#define IDC_OPTIONS 1054 +#define DRV_KSQO 1055 +#define DS_PG64 1057 /* Next default values for new objects */ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 104 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1060 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1060 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/src/interfaces/odbc/results.c b/src/interfaces/odbc/results.c index 3ef098a91b..c3687ec250 100644 --- a/src/interfaces/odbc/results.c +++ b/src/interfaces/odbc/results.c @@ -1,16 +1,16 @@ -/* Module: results.c +/* Module: results.c * - * Description: This module contains functions related to - * retrieving result information through the ODBC API. + * Description: This module contains functions related to + * retrieving result information through the ODBC API. * - * Classes: n/a + * Classes: n/a * - * API functions: SQLRowCount, SQLNumResultCols, SQLDescribeCol, SQLColAttributes, - * SQLGetData, SQLFetch, SQLExtendedFetch, - * SQLMoreResults(NI), SQLSetPos, SQLSetScrollOptions(NI), - * SQLSetCursorName, SQLGetCursorName + * API functions: SQLRowCount, SQLNumResultCols, SQLDescribeCol, SQLColAttributes, + * SQLGetData, SQLFetch, SQLExtendedFetch, + * SQLMoreResults(NI), SQLSetPos, SQLSetScrollOptions(NI), + * SQLSetCursorName, SQLGetCursorName * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -27,7 +27,7 @@ #include "bind.h" #include "qresult.h" #include "convert.h" -#include "pgtypes.h" +#include "pgtypes.h" #include @@ -43,103 +43,122 @@ extern GLOBAL_VALUES globals; -RETCODE SQL_API SQLRowCount( - HSTMT hstmt, - SDWORD FAR *pcrow) +RETCODE SQL_API +SQLRowCount( + HSTMT hstmt, + SDWORD FAR * pcrow) { -static char *func="SQLRowCount"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; -char *msg, *ptr; - - if ( ! stmt) { + static char *func = "SQLRowCount"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; + char *msg, + *ptr; + + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if (stmt->manual_result) { + if (stmt->manual_result) + { if (pcrow) *pcrow = -1; return SQL_SUCCESS; } - if(stmt->statement_type == STMT_TYPE_SELECT) { - if (stmt->status == STMT_FINISHED) { + if (stmt->statement_type == STMT_TYPE_SELECT) + { + if (stmt->status == STMT_FINISHED) + { res = SC_get_Result(stmt); - if(res && pcrow) { + if (res && pcrow) + { *pcrow = globals.use_declarefetch ? -1 : QR_get_num_tuples(res); return SQL_SUCCESS; } } - } else { + } + else + { res = SC_get_Result(stmt); - if (res && pcrow) { + if (res && pcrow) + { msg = QR_get_command(res); mylog("*** msg = '%s'\n", msg); - trim(msg); /* get rid of trailing spaces */ + trim(msg); /* get rid of trailing spaces */ ptr = strrchr(msg, ' '); - if (ptr) { - *pcrow = atoi(ptr+1); + if (ptr) + { + *pcrow = atoi(ptr + 1); mylog("**** SQLRowCount(): THE ROWS: *pcrow = %d\n", *pcrow); } - else { + else + { *pcrow = -1; mylog("**** SQLRowCount(): NO ROWS: *pcrow = %d\n", *pcrow); } - return SQL_SUCCESS; + return SQL_SUCCESS; } } SC_log_error(func, "Bad return value", stmt); - return SQL_ERROR; + return SQL_ERROR; } -/* This returns the number of columns associated with the database */ -/* attached to "hstmt". */ +/* This returns the number of columns associated with the database */ +/* attached to "hstmt". */ -RETCODE SQL_API SQLNumResultCols( - HSTMT hstmt, - SWORD FAR *pccol) -{ -static char *func="SQLNumResultCols"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *result; -char parse_ok; +RETCODE SQL_API +SQLNumResultCols( + HSTMT hstmt, + SWORD FAR * pccol) +{ + static char *func = "SQLNumResultCols"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *result; + char parse_ok; - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - SC_clear_error(stmt); + SC_clear_error(stmt); parse_ok = FALSE; - if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) { + if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) + { - if (stmt->parse_status == STMT_PARSE_NONE) { + if (stmt->parse_status == STMT_PARSE_NONE) + { mylog("SQLNumResultCols: calling parse_statement on stmt=%u\n", stmt); parse_statement(stmt); } - if (stmt->parse_status != STMT_PARSE_FATAL) { + if (stmt->parse_status != STMT_PARSE_FATAL) + { parse_ok = TRUE; *pccol = stmt->nfld; mylog("PARSE: SQLNumResultCols: *pccol = %d\n", *pccol); } } - if ( ! parse_ok) { + if (!parse_ok) + { - SC_pre_execute(stmt); + SC_pre_execute(stmt); result = SC_get_Result(stmt); mylog("SQLNumResultCols: result = %u, status = %d, numcols = %d\n", result, stmt->status, result != NULL ? QR_NumResultCols(result) : -1); - if (( ! result) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE)) ) { + if ((!result) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE))) + { /* no query has been executed on this statement */ stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "No query has been executed with that handle"; @@ -154,59 +173,65 @@ char parse_ok; } -/* - - - - - - - - - */ +/* - - - - - - - - - */ -/* Return information about the database column the user wants */ -/* information about. */ -RETCODE SQL_API SQLDescribeCol( - HSTMT hstmt, - UWORD icol, - UCHAR FAR *szColName, - SWORD cbColNameMax, - SWORD FAR *pcbColName, - SWORD FAR *pfSqlType, - UDWORD FAR *pcbColDef, - SWORD FAR *pibScale, - SWORD FAR *pfNullable) +/* Return information about the database column the user wants */ +/* information about. */ +RETCODE SQL_API +SQLDescribeCol( + HSTMT hstmt, + UWORD icol, + UCHAR FAR * szColName, + SWORD cbColNameMax, + SWORD FAR * pcbColName, + SWORD FAR * pfSqlType, + UDWORD FAR * pcbColDef, + SWORD FAR * pibScale, + SWORD FAR * pfNullable) { -static char *func="SQLDescribeCol"; - /* gets all the information about a specific column */ -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; -char *col_name = NULL; -Int4 fieldtype = 0; -int precision = 0; -ConnInfo *ci; -char parse_ok; -char buf[255]; -int len = 0; -RETCODE result; + static char *func = "SQLDescribeCol"; + + /* gets all the information about a specific column */ + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; + char *col_name = NULL; + Int4 fieldtype = 0; + int precision = 0; + ConnInfo *ci; + char parse_ok; + char buf[255]; + int len = 0; + RETCODE result; mylog("%s: entering...\n", func); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; + return SQL_INVALID_HANDLE; } ci = &(stmt->hdbc->connInfo); - SC_clear_error(stmt); + SC_clear_error(stmt); - /* Dont check for bookmark column. This is the responsibility - of the driver manager. - */ + /* + * Dont check for bookmark column. This is the responsibility of the + * driver manager. + */ - icol--; /* use zero based column numbers */ + icol--; /* use zero based column numbers */ parse_ok = FALSE; - if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) { + if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) + { - if (stmt->parse_status == STMT_PARSE_NONE) { + if (stmt->parse_status == STMT_PARSE_NONE) + { mylog("SQLDescribeCol: calling parse_statement on stmt=%u\n", stmt); parse_statement(stmt); } @@ -214,9 +239,11 @@ RETCODE result; mylog("PARSE: DescribeCol: icol=%d, stmt=%u, stmt->nfld=%d, stmt->fi=%u\n", icol, stmt, stmt->nfld, stmt->fi); - if (stmt->parse_status != STMT_PARSE_FATAL && stmt->fi && stmt->fi[icol]) { + if (stmt->parse_status != STMT_PARSE_FATAL && stmt->fi && stmt->fi[icol]) + { - if (icol >= stmt->nfld) { + if (icol >= stmt->nfld) + { stmt->errornumber = STMT_INVALID_COLUMN_NUMBER_ERROR; stmt->errormsg = "Invalid column number in DescribeCol."; SC_log_error(func, "", stmt); @@ -235,16 +262,20 @@ RETCODE result; } - /* If couldn't parse it OR the field being described was not parsed (i.e., because - it was a function or expression, etc, then do it the old fashioned way. - */ - if ( ! parse_ok) { + /* + * If couldn't parse it OR the field being described was not parsed + * (i.e., because it was a function or expression, etc, then do it the + * old fashioned way. + */ + if (!parse_ok) + { SC_pre_execute(stmt); - + res = SC_get_Result(stmt); mylog("**** SQLDescribeCol: res = %u, stmt->status = %d, !finished=%d, !premature=%d\n", res, stmt->status, stmt->status != STMT_FINISHED, stmt->status != STMT_PREMATURE); - if ( (NULL == res) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE))) { + if ((NULL == res) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE))) + { /* no query has been executed on this statement */ stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "No query has been assigned to this statement."; @@ -252,7 +283,8 @@ RETCODE result; return SQL_ERROR; } - if (icol >= QR_NumResultCols(res)) { + if (icol >= QR_NumResultCols(res)) + { stmt->errornumber = STMT_INVALID_COLUMN_NUMBER_ERROR; stmt->errormsg = "Invalid column number in DescribeCol."; sprintf(buf, "Col#=%d, #Cols=%d", icol, QR_NumResultCols(res)); @@ -261,9 +293,10 @@ RETCODE result; } col_name = QR_get_fieldname(res, icol); - fieldtype = QR_get_field_type(res, icol); + fieldtype = QR_get_field_type(res, icol); - precision = pgtype_precision(stmt, fieldtype, icol, globals.unknown_sizes); /* atoi(ci->unknown_sizes) */ + precision = pgtype_precision(stmt, fieldtype, icol, globals.unknown_sizes); /* atoi(ci->unknown_sizes + * ) */ } mylog("describeCol: col %d fieldname = '%s'\n", icol, col_name); @@ -274,39 +307,43 @@ RETCODE result; result = SQL_SUCCESS; /************************/ - /* COLUMN NAME */ + /* COLUMN NAME */ /************************/ len = strlen(col_name); if (pcbColName) *pcbColName = len; - if (szColName) { + if (szColName) + { strncpy_null(szColName, col_name, cbColNameMax); - if (len >= cbColNameMax) { + if (len >= cbColNameMax) + { result = SQL_SUCCESS_WITH_INFO; stmt->errornumber = STMT_TRUNCATED; stmt->errormsg = "The buffer was too small for the result."; } - } + } /************************/ - /* SQL TYPE */ + /* SQL TYPE */ /************************/ - if (pfSqlType) { - *pfSqlType = pgtype_to_sqltype(stmt, fieldtype); + if (pfSqlType) + { + *pfSqlType = pgtype_to_sqltype(stmt, fieldtype); mylog("describeCol: col %d *pfSqlType = %d\n", icol, *pfSqlType); } /************************/ - /* PRECISION */ + /* PRECISION */ /************************/ - if (pcbColDef) { + if (pcbColDef) + { - if ( precision < 0) + if (precision < 0) precision = 0; /* "I dont know" */ *pcbColDef = precision; @@ -315,94 +352,110 @@ RETCODE result; } /************************/ - /* SCALE */ + /* SCALE */ /************************/ - if (pibScale) { - Int2 scale; - scale = pgtype_scale(stmt, fieldtype, icol); - if(scale == -1) { scale = 0; } - - *pibScale = scale; + if (pibScale) + { + Int2 scale; + + scale = pgtype_scale(stmt, fieldtype, icol); + if (scale == -1) + scale = 0; + + *pibScale = scale; mylog("describeCol: col %d *pibScale = %d\n", icol, *pibScale); - } + } /************************/ - /* NULLABILITY */ + /* NULLABILITY */ /************************/ - if (pfNullable) { + if (pfNullable) + { *pfNullable = (parse_ok) ? stmt->fi[icol]->nullable : pgtype_nullable(stmt, fieldtype); mylog("describeCol: col %d *pfNullable = %d\n", icol, *pfNullable); - } + } - return result; + return result; } -/* Returns result column descriptor information for a result set. */ - -RETCODE SQL_API SQLColAttributes( - HSTMT hstmt, - UWORD icol, - UWORD fDescType, - PTR rgbDesc, - SWORD cbDescMax, - SWORD FAR *pcbDesc, - SDWORD FAR *pfDesc) +/* Returns result column descriptor information for a result set. */ + +RETCODE SQL_API +SQLColAttributes( + HSTMT hstmt, + UWORD icol, + UWORD fDescType, + PTR rgbDesc, + SWORD cbDescMax, + SWORD FAR * pcbDesc, + SDWORD FAR * pfDesc) { -static char *func = "SQLColAttributes"; -StatementClass *stmt = (StatementClass *) hstmt; -Int4 field_type = 0; -ConnInfo *ci; -int unknown_sizes; -int cols = 0; -char parse_ok; -RETCODE result; -char *p = NULL; -int len = 0, value = 0; + static char *func = "SQLColAttributes"; + StatementClass *stmt = (StatementClass *) hstmt; + Int4 field_type = 0; + ConnInfo *ci; + int unknown_sizes; + int cols = 0; + char parse_ok; + RETCODE result; + char *p = NULL; + int len = 0, + value = 0; mylog("%s: entering...\n", func); - if( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } ci = &(stmt->hdbc->connInfo); - /* Dont check for bookmark column. This is the responsibility - of the driver manager. For certain types of arguments, the column - number is ignored anyway, so it may be 0. - */ + /* + * Dont check for bookmark column. This is the responsibility of the + * driver manager. For certain types of arguments, the column number + * is ignored anyway, so it may be 0. + */ icol--; - unknown_sizes = globals.unknown_sizes; /* atoi(ci->unknown_sizes); */ - if (unknown_sizes == UNKNOWNS_AS_DONTKNOW) /* not appropriate for SQLColAttributes() */ + unknown_sizes = globals.unknown_sizes; /* atoi(ci->unknown_sizes); + * */ + if (unknown_sizes == UNKNOWNS_AS_DONTKNOW) /* not appropriate for + * SQLColAttributes() */ unknown_sizes = UNKNOWNS_AS_MAX; parse_ok = FALSE; - if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) { + if (globals.parse && stmt->statement_type == STMT_TYPE_SELECT) + { - if (stmt->parse_status == STMT_PARSE_NONE) { + if (stmt->parse_status == STMT_PARSE_NONE) + { mylog("SQLColAttributes: calling parse_statement\n"); parse_statement(stmt); } cols = stmt->nfld; - /* Column Count is a special case. The Column number is ignored - in this case. - */ - if (fDescType == SQL_COLUMN_COUNT) { + /* + * Column Count is a special case. The Column number is ignored + * in this case. + */ + if (fDescType == SQL_COLUMN_COUNT) + { if (pfDesc) *pfDesc = cols; return SQL_SUCCESS; } - if (stmt->parse_status != STMT_PARSE_FATAL && stmt->fi && stmt->fi[icol]) { + if (stmt->parse_status != STMT_PARSE_FATAL && stmt->fi && stmt->fi[icol]) + { - if (icol >= cols) { + if (icol >= cols) + { stmt->errornumber = STMT_INVALID_COLUMN_NUMBER_ERROR; stmt->errormsg = "Invalid column number in DescribeCol."; SC_log_error(func, "", stmt); @@ -415,12 +468,14 @@ int len = 0, value = 0; } } - if ( ! parse_ok) { - SC_pre_execute(stmt); + if (!parse_ok) + { + SC_pre_execute(stmt); mylog("**** SQLColAtt: result = %u, status = %d, numcols = %d\n", stmt->result, stmt->status, stmt->result != NULL ? QR_NumResultCols(stmt->result) : -1); - if ( (NULL == stmt->result) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE)) ) { + if ((NULL == stmt->result) || ((stmt->status != STMT_FINISHED) && (stmt->status != STMT_PREMATURE))) + { stmt->errormsg = "Can't get column attributes: no result found."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); @@ -429,17 +484,20 @@ int len = 0, value = 0; cols = QR_NumResultCols(stmt->result); - /* Column Count is a special case. The Column number is ignored - in this case. - */ - if (fDescType == SQL_COLUMN_COUNT) { + /* + * Column Count is a special case. The Column number is ignored + * in this case. + */ + if (fDescType == SQL_COLUMN_COUNT) + { if (pfDesc) *pfDesc = cols; return SQL_SUCCESS; } - if (icol >= cols) { + if (icol >= cols) + { stmt->errornumber = STMT_INVALID_COLUMN_NUMBER_ERROR; stmt->errormsg = "Invalid column number in DescribeCol."; SC_log_error(func, "", stmt); @@ -451,137 +509,146 @@ int len = 0, value = 0; mylog("colAttr: col %d field_type = %d\n", icol, field_type); - switch(fDescType) { - case SQL_COLUMN_AUTO_INCREMENT: - value = pgtype_auto_increment(stmt, field_type); - if (value == -1) /* non-numeric becomes FALSE (ODBC Doc) */ - value = FALSE; - - break; + switch (fDescType) + { + case SQL_COLUMN_AUTO_INCREMENT: + value = pgtype_auto_increment(stmt, field_type); + if (value == -1) /* non-numeric becomes FALSE (ODBC Doc) */ + value = FALSE; - case SQL_COLUMN_CASE_SENSITIVE: - value = pgtype_case_sensitive(stmt, field_type); - break; + break; - /* This special case is handled above. + case SQL_COLUMN_CASE_SENSITIVE: + value = pgtype_case_sensitive(stmt, field_type); + break; - case SQL_COLUMN_COUNT: - */ + /* + * This special case is handled above. + * + * case SQL_COLUMN_COUNT: + */ - case SQL_COLUMN_DISPLAY_SIZE: - value = (parse_ok) ? stmt->fi[icol]->display_size : pgtype_display_size(stmt, field_type, icol, unknown_sizes); + case SQL_COLUMN_DISPLAY_SIZE: + value = (parse_ok) ? stmt->fi[icol]->display_size : pgtype_display_size(stmt, field_type, icol, unknown_sizes); - mylog("SQLColAttributes: col %d, display_size= %d\n", icol, value); + mylog("SQLColAttributes: col %d, display_size= %d\n", icol, value); - break; + break; - case SQL_COLUMN_LABEL: - if (parse_ok && stmt->fi[icol]->alias[0] != '\0') { - p = stmt->fi[icol]->alias; + case SQL_COLUMN_LABEL: + if (parse_ok && stmt->fi[icol]->alias[0] != '\0') + { + p = stmt->fi[icol]->alias; - mylog("SQLColAttr: COLUMN_LABEL = '%s'\n", p); - break; + mylog("SQLColAttr: COLUMN_LABEL = '%s'\n", p); + break; - } /* otherwise same as column name -- FALL THROUGH!!! */ + } /* otherwise same as column name -- FALL + * THROUGH!!! */ - case SQL_COLUMN_NAME: + case SQL_COLUMN_NAME: - p = (parse_ok) ? stmt->fi[icol]->name : QR_get_fieldname(stmt->result, icol); + p = (parse_ok) ? stmt->fi[icol]->name : QR_get_fieldname(stmt->result, icol); - mylog("SQLColAttr: COLUMN_NAME = '%s'\n", p); - break; + mylog("SQLColAttr: COLUMN_NAME = '%s'\n", p); + break; - case SQL_COLUMN_LENGTH: - value = (parse_ok) ? stmt->fi[icol]->length : pgtype_length(stmt, field_type, icol, unknown_sizes); + case SQL_COLUMN_LENGTH: + value = (parse_ok) ? stmt->fi[icol]->length : pgtype_length(stmt, field_type, icol, unknown_sizes); - mylog("SQLColAttributes: col %d, length = %d\n", icol, value); - break; + mylog("SQLColAttributes: col %d, length = %d\n", icol, value); + break; - case SQL_COLUMN_MONEY: - value = pgtype_money(stmt, field_type); - break; + case SQL_COLUMN_MONEY: + value = pgtype_money(stmt, field_type); + break; - case SQL_COLUMN_NULLABLE: - value = (parse_ok) ? stmt->fi[icol]->nullable : pgtype_nullable(stmt, field_type); - break; + case SQL_COLUMN_NULLABLE: + value = (parse_ok) ? stmt->fi[icol]->nullable : pgtype_nullable(stmt, field_type); + break; - case SQL_COLUMN_OWNER_NAME: - p = ""; - break; + case SQL_COLUMN_OWNER_NAME: + p = ""; + break; - case SQL_COLUMN_PRECISION: - value = (parse_ok) ? stmt->fi[icol]->precision : pgtype_precision(stmt, field_type, icol, unknown_sizes); + case SQL_COLUMN_PRECISION: + value = (parse_ok) ? stmt->fi[icol]->precision : pgtype_precision(stmt, field_type, icol, unknown_sizes); - mylog("SQLColAttributes: col %d, precision = %d\n", icol, value); - break; + mylog("SQLColAttributes: col %d, precision = %d\n", icol, value); + break; - case SQL_COLUMN_QUALIFIER_NAME: - p = ""; - break; + case SQL_COLUMN_QUALIFIER_NAME: + p = ""; + break; - case SQL_COLUMN_SCALE: - value = pgtype_scale(stmt, field_type, icol); - break; + case SQL_COLUMN_SCALE: + value = pgtype_scale(stmt, field_type, icol); + break; - case SQL_COLUMN_SEARCHABLE: - value = pgtype_searchable(stmt, field_type); - break; + case SQL_COLUMN_SEARCHABLE: + value = pgtype_searchable(stmt, field_type); + break; - case SQL_COLUMN_TABLE_NAME: + case SQL_COLUMN_TABLE_NAME: - p = (parse_ok && stmt->fi[icol]->ti) ? stmt->fi[icol]->ti->name : ""; + p = (parse_ok && stmt->fi[icol]->ti) ? stmt->fi[icol]->ti->name : ""; - mylog("SQLColAttr: TABLE_NAME = '%s'\n", p); - break; + mylog("SQLColAttr: TABLE_NAME = '%s'\n", p); + break; - case SQL_COLUMN_TYPE: - value = pgtype_to_sqltype(stmt, field_type); - break; + case SQL_COLUMN_TYPE: + value = pgtype_to_sqltype(stmt, field_type); + break; - case SQL_COLUMN_TYPE_NAME: - p = pgtype_to_name(stmt, field_type); - break; + case SQL_COLUMN_TYPE_NAME: + p = pgtype_to_name(stmt, field_type); + break; - case SQL_COLUMN_UNSIGNED: - value = pgtype_unsigned(stmt, field_type); - if(value == -1) /* non-numeric becomes TRUE (ODBC Doc) */ - value = TRUE; + case SQL_COLUMN_UNSIGNED: + value = pgtype_unsigned(stmt, field_type); + if (value == -1) /* non-numeric becomes TRUE (ODBC Doc) */ + value = TRUE; - break; + break; - case SQL_COLUMN_UPDATABLE: - /* Neither Access or Borland care about this. + case SQL_COLUMN_UPDATABLE: - if (field_type == PG_TYPE_OID) - *pfDesc = SQL_ATTR_READONLY; - else - */ + /* + * Neither Access or Borland care about this. + * + * if (field_type == PG_TYPE_OID) pfDesc = SQL_ATTR_READONLY; + * else + */ - value = SQL_ATTR_WRITE; + value = SQL_ATTR_WRITE; - mylog("SQLColAttr: UPDATEABLE = %d\n", value); - break; - } + mylog("SQLColAttr: UPDATEABLE = %d\n", value); + break; + } result = SQL_SUCCESS; - if (p) { /* char/binary data */ + if (p) + { /* char/binary data */ len = strlen(p); - if (rgbDesc) { - strncpy_null((char *)rgbDesc, p, (size_t)cbDescMax); + if (rgbDesc) + { + strncpy_null((char *) rgbDesc, p, (size_t) cbDescMax); - if (len >= cbDescMax) { + if (len >= cbDescMax) + { result = SQL_SUCCESS_WITH_INFO; stmt->errornumber = STMT_TRUNCATED; stmt->errormsg = "The buffer was too small for the result."; } } - if (pcbDesc) + if (pcbDesc) *pcbDesc = len; } - else { /* numeric data */ + else + { /* numeric data */ if (pfDesc) *pfDesc = value; @@ -589,79 +656,89 @@ int len = 0, value = 0; } - return result; + return result; } -/* Returns result data for a single column in the current row. */ +/* Returns result data for a single column in the current row. */ -RETCODE SQL_API SQLGetData( - HSTMT hstmt, - UWORD icol, - SWORD fCType, - PTR rgbValue, - SDWORD cbValueMax, - SDWORD FAR *pcbValue) +RETCODE SQL_API +SQLGetData( + HSTMT hstmt, + UWORD icol, + SWORD fCType, + PTR rgbValue, + SDWORD cbValueMax, + SDWORD FAR * pcbValue) { -static char *func="SQLGetData"; -QResultClass *res; -StatementClass *stmt = (StatementClass *) hstmt; -int num_cols, num_rows; -Int4 field_type; -void *value = NULL; -int result; -char get_bookmark = FALSE; - -mylog("SQLGetData: enter, stmt=%u\n", stmt); - - if( ! stmt) { + static char *func = "SQLGetData"; + QResultClass *res; + StatementClass *stmt = (StatementClass *) hstmt; + int num_cols, + num_rows; + Int4 field_type; + void *value = NULL; + int result; + char get_bookmark = FALSE; + + mylog("SQLGetData: enter, stmt=%u\n", stmt); + + if (!stmt) + { SC_log_error(func, "", NULL); - return SQL_INVALID_HANDLE; - } + return SQL_INVALID_HANDLE; + } res = stmt->result; - if (STMT_EXECUTING == stmt->status) { - stmt->errormsg = "Can't get data while statement is still executing."; - stmt->errornumber = STMT_SEQUENCE_ERROR; + if (STMT_EXECUTING == stmt->status) + { + stmt->errormsg = "Can't get data while statement is still executing."; + stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } - if (stmt->status != STMT_FINISHED) { - stmt->errornumber = STMT_STATUS_ERROR; - stmt->errormsg = "GetData can only be called after the successful execution on a SQL statement"; + if (stmt->status != STMT_FINISHED) + { + stmt->errornumber = STMT_STATUS_ERROR; + stmt->errormsg = "GetData can only be called after the successful execution on a SQL statement"; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } - if (icol == 0) { + if (icol == 0) + { - if (stmt->options.use_bookmarks == SQL_UB_OFF) { + if (stmt->options.use_bookmarks == SQL_UB_OFF) + { stmt->errornumber = STMT_COLNUM_ERROR; stmt->errormsg = "Attempt to retrieve bookmark with bookmark usage disabled"; SC_log_error(func, "", stmt); return SQL_ERROR; } - /* Make sure it is the bookmark data type */ - if (fCType != SQL_C_BOOKMARK) { + /* Make sure it is the bookmark data type */ + if (fCType != SQL_C_BOOKMARK) + { stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; SC_log_error(func, "", stmt); return SQL_ERROR; } - + get_bookmark = TRUE; - } + } - else { + else + { /* use zero-based column numbers */ icol--; /* make sure the column number is valid */ num_cols = QR_NumResultCols(res); - if (icol >= num_cols) { + if (icol >= num_cols) + { stmt->errormsg = "Invalid column number."; stmt->errornumber = STMT_INVALID_COLUMN_NUMBER_ERROR; SC_log_error(func, "", stmt); @@ -669,11 +746,13 @@ mylog("SQLGetData: enter, stmt=%u\n", stmt); } } - if ( stmt->manual_result || ! globals.use_declarefetch) { + if (stmt->manual_result || !globals.use_declarefetch) + { /* make sure we're positioned on a valid row */ num_rows = QR_get_num_tuples(res); - if((stmt->currTuple < 0) || - (stmt->currTuple >= num_rows)) { + if ((stmt->currTuple < 0) || + (stmt->currTuple >= num_rows)) + { stmt->errormsg = "Not positioned on a valid row for GetData."; stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; SC_log_error(func, "", stmt); @@ -681,31 +760,33 @@ mylog("SQLGetData: enter, stmt=%u\n", stmt); } mylog(" num_rows = %d\n", num_rows); - if ( ! get_bookmark) { - if ( stmt->manual_result) { + if (!get_bookmark) + { + if (stmt->manual_result) value = QR_get_value_manual(res, stmt->currTuple, icol); - } - else { + else value = QR_get_value_backend_row(res, stmt->currTuple, icol); - } mylog(" value = '%s'\n", value); } } - else { /* it's a SOCKET result (backend data) */ - if (stmt->currTuple == -1 || ! res || ! res->tupleField) { + else + { /* it's a SOCKET result (backend data) */ + if (stmt->currTuple == -1 || !res || !res->tupleField) + { stmt->errormsg = "Not positioned on a valid row for GetData."; stmt->errornumber = STMT_INVALID_CURSOR_STATE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - if ( ! get_bookmark) + if (!get_bookmark) value = QR_get_value_backend(res, icol); mylog(" socket: value = '%s'\n", value); } - if ( get_bookmark) { + if (get_bookmark) + { *((UDWORD *) rgbValue) = SC_get_bookmark(stmt); if (pcbValue) @@ -720,85 +801,91 @@ mylog("SQLGetData: enter, stmt=%u\n", stmt); stmt->current_col = icol; - result = copy_and_convert_field(stmt, field_type, value, - fCType, rgbValue, cbValueMax, pcbValue); + result = copy_and_convert_field(stmt, field_type, value, + fCType, rgbValue, cbValueMax, pcbValue); stmt->current_col = -1; - switch(result) { - case COPY_OK: - return SQL_SUCCESS; + switch (result) + { + case COPY_OK: + return SQL_SUCCESS; - case COPY_UNSUPPORTED_TYPE: - stmt->errormsg = "Received an unsupported type from Postgres."; - stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; + case COPY_UNSUPPORTED_TYPE: + stmt->errormsg = "Received an unsupported type from Postgres."; + stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; - case COPY_UNSUPPORTED_CONVERSION: - stmt->errormsg = "Couldn't handle the necessary data type conversion."; - stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; + case COPY_UNSUPPORTED_CONVERSION: + stmt->errormsg = "Couldn't handle the necessary data type conversion."; + stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; - case COPY_RESULT_TRUNCATED: - stmt->errornumber = STMT_TRUNCATED; - stmt->errormsg = "The buffer was too small for the result."; - return SQL_SUCCESS_WITH_INFO; + case COPY_RESULT_TRUNCATED: + stmt->errornumber = STMT_TRUNCATED; + stmt->errormsg = "The buffer was too small for the result."; + return SQL_SUCCESS_WITH_INFO; - case COPY_GENERAL_ERROR: /* error msg already filled in */ - SC_log_error(func, "", stmt); - return SQL_ERROR; + case COPY_GENERAL_ERROR: /* error msg already filled in */ + SC_log_error(func, "", stmt); + return SQL_ERROR; - case COPY_NO_DATA_FOUND: - /* SC_log_error(func, "no data found", stmt); */ - return SQL_NO_DATA_FOUND; + case COPY_NO_DATA_FOUND: + /* SC_log_error(func, "no data found", stmt); */ + return SQL_NO_DATA_FOUND; - default: - stmt->errormsg = "Unrecognized return value from copy_and_convert_field."; - stmt->errornumber = STMT_INTERNAL_ERROR; - SC_log_error(func, "", stmt); - return SQL_ERROR; - } + default: + stmt->errormsg = "Unrecognized return value from copy_and_convert_field."; + stmt->errornumber = STMT_INTERNAL_ERROR; + SC_log_error(func, "", stmt); + return SQL_ERROR; + } } -/* Returns data for bound columns in the current row ("hstmt->iCursor"), */ -/* advances the cursor. */ +/* Returns data for bound columns in the current row ("hstmt->iCursor"), */ +/* advances the cursor. */ -RETCODE SQL_API SQLFetch( - HSTMT hstmt) +RETCODE SQL_API +SQLFetch( + HSTMT hstmt) { -static char *func = "SQLFetch"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; + static char *func = "SQLFetch"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; -mylog("SQLFetch: stmt = %u, stmt->result= %u\n", stmt, stmt->result); + mylog("SQLFetch: stmt = %u, stmt->result= %u\n", stmt, stmt->result); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } SC_clear_error(stmt); - if ( ! (res = stmt->result)) { + if (!(res = stmt->result)) + { stmt->errormsg = "Null statement result in SQLFetch."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - /* Not allowed to bind a bookmark column when using SQLFetch. */ - if ( stmt->bookmark.buffer) { + /* Not allowed to bind a bookmark column when using SQLFetch. */ + if (stmt->bookmark.buffer) + { stmt->errornumber = STMT_COLNUM_ERROR; stmt->errormsg = "Not allowed to bind a bookmark column when using SQLFetch"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->status == STMT_EXECUTING) { + if (stmt->status == STMT_EXECUTING) + { stmt->errormsg = "Can't fetch while statement is still executing."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); @@ -806,14 +893,16 @@ mylog("SQLFetch: stmt = %u, stmt->result= %u\n", stmt, stmt->result); } - if (stmt->status != STMT_FINISHED) { + if (stmt->status != STMT_FINISHED) + { stmt->errornumber = STMT_STATUS_ERROR; stmt->errormsg = "Fetch can only be called after the successful execution on a SQL statement"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->bindings == NULL) { + if (stmt->bindings == NULL) + { /* just to avoid a crash if the user insists on calling this */ /* function even if SQL_ExecDirect has reported an Error */ stmt->errormsg = "Bindings were not allocated properly."; @@ -823,36 +912,43 @@ mylog("SQLFetch: stmt = %u, stmt->result= %u\n", stmt, stmt->result); } QR_set_rowset_size(res, 1); - QR_inc_base(res, stmt->last_fetch_count); + QR_inc_base(res, stmt->last_fetch_count); return SC_fetch(stmt); } -/* This fetchs a block of data (rowset). */ +/* This fetchs a block of data (rowset). */ -RETCODE SQL_API SQLExtendedFetch( - HSTMT hstmt, - UWORD fFetchType, - SDWORD irow, - UDWORD FAR *pcrow, - UWORD FAR *rgfRowStatus) +RETCODE SQL_API +SQLExtendedFetch( + HSTMT hstmt, + UWORD fFetchType, + SDWORD irow, + UDWORD FAR * pcrow, + UWORD FAR * rgfRowStatus) { -static char *func = "SQLExtendedFetch"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; -int num_tuples, i, save_rowset_size; -RETCODE result; -char truncated, error; - -mylog("SQLExtendedFetch: stmt=%u\n", stmt); - - if ( ! stmt) { + static char *func = "SQLExtendedFetch"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; + int num_tuples, + i, + save_rowset_size; + RETCODE result; + char truncated, + error; + + mylog("SQLExtendedFetch: stmt=%u\n", stmt); + + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if ( globals.use_declarefetch && ! stmt->manual_result) { - if ( fFetchType != SQL_FETCH_NEXT) { + if (globals.use_declarefetch && !stmt->manual_result) + { + if (fFetchType != SQL_FETCH_NEXT) + { stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; stmt->errormsg = "Unsupported fetch type for SQLExtendedFetch with UseDeclareFetch option."; return SQL_ERROR; @@ -861,36 +957,44 @@ mylog("SQLExtendedFetch: stmt=%u\n", stmt); SC_clear_error(stmt); - if ( ! (res = stmt->result)) { + if (!(res = stmt->result)) + { stmt->errormsg = "Null statement result in SQLExtendedFetch."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - /* If a bookmark colunmn is bound but bookmark usage is off, then error */ - if (stmt->bookmark.buffer && stmt->options.use_bookmarks == SQL_UB_OFF) { + /* + * If a bookmark colunmn is bound but bookmark usage is off, then + * error + */ + if (stmt->bookmark.buffer && stmt->options.use_bookmarks == SQL_UB_OFF) + { stmt->errornumber = STMT_COLNUM_ERROR; stmt->errormsg = "Attempt to retrieve bookmark with bookmark usage disabled"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->status == STMT_EXECUTING) { + if (stmt->status == STMT_EXECUTING) + { stmt->errormsg = "Can't fetch while statement is still executing."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->status != STMT_FINISHED) { + if (stmt->status != STMT_FINISHED) + { stmt->errornumber = STMT_STATUS_ERROR; stmt->errormsg = "ExtendedFetch can only be called after the successful execution on a SQL statement"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (stmt->bindings == NULL) { + if (stmt->bindings == NULL) + { /* just to avoid a crash if the user insists on calling this */ /* function even if SQL_ExecDirect has reported an Error */ stmt->errormsg = "Bindings were not allocated properly."; @@ -899,7 +1003,7 @@ mylog("SQLExtendedFetch: stmt=%u\n", stmt); return SQL_ERROR; } - /* Initialize to no rows fetched */ + /* Initialize to no rows fetched */ if (rgfRowStatus) for (i = 0; i < stmt->options.rowset_size; i++) *(rgfRowStatus + i) = SQL_ROW_NOROW; @@ -909,150 +1013,170 @@ mylog("SQLExtendedFetch: stmt=%u\n", stmt); num_tuples = QR_get_num_tuples(res); - /* Save and discard the saved rowset size */ + /* Save and discard the saved rowset size */ save_rowset_size = stmt->save_rowset_size; stmt->save_rowset_size = -1; - switch (fFetchType) { - case SQL_FETCH_NEXT: + switch (fFetchType) + { + case SQL_FETCH_NEXT: - /* From the odbc spec... If positioned before the start of the RESULT SET, - then this should be equivalent to SQL_FETCH_FIRST. - */ + /* + * From the odbc spec... If positioned before the start of the + * RESULT SET, then this should be equivalent to + * SQL_FETCH_FIRST. + */ - if (stmt->rowset_start < 0) - stmt->rowset_start = 0; + if (stmt->rowset_start < 0) + stmt->rowset_start = 0; - else { - - stmt->rowset_start += (save_rowset_size > 0 ? save_rowset_size : stmt->options.rowset_size); - } + else + { - mylog("SQL_FETCH_NEXT: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); - break; + stmt->rowset_start += (save_rowset_size > 0 ? save_rowset_size : stmt->options.rowset_size); + } - case SQL_FETCH_PRIOR: - mylog("SQL_FETCH_PRIOR: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); + mylog("SQL_FETCH_NEXT: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); + break; + case SQL_FETCH_PRIOR: + mylog("SQL_FETCH_PRIOR: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); - /* From the odbc spec... If positioned after the end of the RESULT SET, - then this should be equivalent to SQL_FETCH_LAST. - */ - if (stmt->rowset_start >= num_tuples) { - stmt->rowset_start = num_tuples <= 0 ? 0 : (num_tuples - stmt->options.rowset_size); + /* + * From the odbc spec... If positioned after the end of the + * RESULT SET, then this should be equivalent to + * SQL_FETCH_LAST. + */ - } - else { + if (stmt->rowset_start >= num_tuples) + { + stmt->rowset_start = num_tuples <= 0 ? 0 : (num_tuples - stmt->options.rowset_size); - stmt->rowset_start -= stmt->options.rowset_size; + } + else + { - } + stmt->rowset_start -= stmt->options.rowset_size; - break; + } - case SQL_FETCH_FIRST: - mylog("SQL_FETCH_FIRST: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); + break; - stmt->rowset_start = 0; - break; + case SQL_FETCH_FIRST: + mylog("SQL_FETCH_FIRST: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); - case SQL_FETCH_LAST: - mylog("SQL_FETCH_LAST: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); + stmt->rowset_start = 0; + break; - stmt->rowset_start = num_tuples <= 0 ? 0 : (num_tuples - stmt->options.rowset_size) ; - break; + case SQL_FETCH_LAST: + mylog("SQL_FETCH_LAST: num_tuples=%d, currtuple=%d\n", num_tuples, stmt->currTuple); - case SQL_FETCH_ABSOLUTE: - mylog("SQL_FETCH_ABSOLUTE: num_tuples=%d, currtuple=%d, irow=%d\n", num_tuples, stmt->currTuple, irow); + stmt->rowset_start = num_tuples <= 0 ? 0 : (num_tuples - stmt->options.rowset_size); + break; - /* Position before result set, but dont fetch anything */ - if (irow == 0) { - stmt->rowset_start = -1; - stmt->currTuple = -1; - return SQL_NO_DATA_FOUND; - } - /* Position before the desired row */ - else if (irow > 0) { - stmt->rowset_start = irow - 1; - } - /* Position with respect to the end of the result set */ - else { - stmt->rowset_start = num_tuples + irow; - } + case SQL_FETCH_ABSOLUTE: + mylog("SQL_FETCH_ABSOLUTE: num_tuples=%d, currtuple=%d, irow=%d\n", num_tuples, stmt->currTuple, irow); - break; + /* Position before result set, but dont fetch anything */ + if (irow == 0) + { + stmt->rowset_start = -1; + stmt->currTuple = -1; + return SQL_NO_DATA_FOUND; + } + /* Position before the desired row */ + else if (irow > 0) + stmt->rowset_start = irow - 1; + /* Position with respect to the end of the result set */ + else + stmt->rowset_start = num_tuples + irow; - case SQL_FETCH_RELATIVE: - - /* Refresh the current rowset -- not currently implemented, but lie anyway */ - if (irow == 0) { break; - } - stmt->rowset_start += irow; + case SQL_FETCH_RELATIVE: - - break; + /* + * Refresh the current rowset -- not currently implemented, + * but lie anyway + */ + if (irow == 0) + break; - case SQL_FETCH_BOOKMARK: + stmt->rowset_start += irow; - stmt->rowset_start = irow - 1; - break; - default: - SC_log_error(func, "Unsupported SQLExtendedFetch Direction", stmt); - return SQL_ERROR; + break; - } + case SQL_FETCH_BOOKMARK: + + stmt->rowset_start = irow - 1; + break; + + default: + SC_log_error(func, "Unsupported SQLExtendedFetch Direction", stmt); + return SQL_ERROR; + + } /***********************************/ - /* CHECK FOR PROPER CURSOR STATE */ + /* CHECK FOR PROPER CURSOR STATE */ /***********************************/ - /* Handle Declare Fetch style specially because the end is not really the end... */ - if ( globals.use_declarefetch && ! stmt->manual_result) { - if (QR_end_tuples(res)) { + + /* + * Handle Declare Fetch style specially because the end is not really + * the end... + */ + if (globals.use_declarefetch && !stmt->manual_result) + { + if (QR_end_tuples(res)) return SQL_NO_DATA_FOUND; - } } - else { - /* If *new* rowset is after the result_set, return no data found */ - if (stmt->rowset_start >= num_tuples) { + else + { + /* If *new* rowset is after the result_set, return no data found */ + if (stmt->rowset_start >= num_tuples) + { stmt->rowset_start = num_tuples; return SQL_NO_DATA_FOUND; } } - /* If *new* rowset is prior to result_set, return no data found */ - if (stmt->rowset_start < 0) { - if (stmt->rowset_start + stmt->options.rowset_size <= 0) { + /* If *new* rowset is prior to result_set, return no data found */ + if (stmt->rowset_start < 0) + { + if (stmt->rowset_start + stmt->options.rowset_size <= 0) + { stmt->rowset_start = -1; return SQL_NO_DATA_FOUND; } - else { /* overlap with beginning of result set, so get first rowset */ + else + { /* overlap with beginning of result set, + * so get first rowset */ stmt->rowset_start = 0; } } - /* currTuple is always 1 row prior to the rowset */ + /* currTuple is always 1 row prior to the rowset */ stmt->currTuple = stmt->rowset_start - 1; - /* increment the base row in the tuple cache */ + /* increment the base row in the tuple cache */ QR_set_rowset_size(res, stmt->options.rowset_size); - QR_inc_base(res, stmt->last_fetch_count); - - /* Physical Row advancement occurs for each row fetched below */ + QR_inc_base(res, stmt->last_fetch_count); + + /* Physical Row advancement occurs for each row fetched below */ mylog("SQLExtendedFetch: new currTuple = %d\n", stmt->currTuple); truncated = error = FALSE; - for (i = 0; i < stmt->options.rowset_size; i++) { + for (i = 0; i < stmt->options.rowset_size; i++) + { stmt->bind_row = i; /* set the binding location */ result = SC_fetch(stmt); - /* Determine Function status */ + /* Determine Function status */ if (result == SQL_NO_DATA_FOUND) break; else if (result == SQL_SUCCESS_WITH_INFO) @@ -1060,35 +1184,36 @@ mylog("SQLExtendedFetch: stmt=%u\n", stmt); else if (result == SQL_ERROR) error = TRUE; - /* Determine Row Status */ - if (rgfRowStatus) { - if (result == SQL_ERROR) + /* Determine Row Status */ + if (rgfRowStatus) + { + if (result == SQL_ERROR) *(rgfRowStatus + i) = SQL_ROW_ERROR; else - *(rgfRowStatus + i)= SQL_ROW_SUCCESS; + *(rgfRowStatus + i) = SQL_ROW_SUCCESS; } } - /* Save the fetch count for SQLSetPos */ - stmt->last_fetch_count= i; + /* Save the fetch count for SQLSetPos */ + stmt->last_fetch_count = i; - /* Reset next binding row */ + /* Reset next binding row */ stmt->bind_row = 0; - /* Move the cursor position to the first row in the result set. */ + /* Move the cursor position to the first row in the result set. */ stmt->currTuple = stmt->rowset_start; - /* For declare/fetch, need to reset cursor to beginning of rowset */ - if (globals.use_declarefetch && ! stmt->manual_result) { + /* For declare/fetch, need to reset cursor to beginning of rowset */ + if (globals.use_declarefetch && !stmt->manual_result) QR_set_position(res, 0); - } - /* Set the number of rows retrieved */ + /* Set the number of rows retrieved */ if (pcrow) *pcrow = i; if (i == 0) - return SQL_NO_DATA_FOUND; /* Only DeclareFetch should wind up here */ + return SQL_NO_DATA_FOUND; /* Only DeclareFetch should wind + * up here */ else if (error) return SQL_ERROR; else if (truncated) @@ -1099,43 +1224,49 @@ mylog("SQLExtendedFetch: stmt=%u\n", stmt); } -/* This determines whether there are more results sets available for */ -/* the "hstmt". */ +/* This determines whether there are more results sets available for */ +/* the "hstmt". */ /* CC: return SQL_NO_DATA_FOUND since we do not support multiple result sets */ -RETCODE SQL_API SQLMoreResults( - HSTMT hstmt) +RETCODE SQL_API +SQLMoreResults( + HSTMT hstmt) { return SQL_NO_DATA_FOUND; } -/* This positions the cursor within a rowset, that was positioned using SQLExtendedFetch. */ +/* This positions the cursor within a rowset, that was positioned using SQLExtendedFetch. */ /* This will be useful (so far) only when using SQLGetData after SQLExtendedFetch. */ -RETCODE SQL_API SQLSetPos( - HSTMT hstmt, - UWORD irow, - UWORD fOption, - UWORD fLock) +RETCODE SQL_API +SQLSetPos( + HSTMT hstmt, + UWORD irow, + UWORD fOption, + UWORD fLock) { -static char *func = "SQLSetPos"; -StatementClass *stmt = (StatementClass *) hstmt; -QResultClass *res; -int num_cols, i; -BindInfoClass *bindings = stmt->bindings; - - if ( ! stmt) { + static char *func = "SQLSetPos"; + StatementClass *stmt = (StatementClass *) hstmt; + QResultClass *res; + int num_cols, + i; + BindInfoClass *bindings = stmt->bindings; + + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if (fOption != SQL_POSITION && fOption != SQL_REFRESH) { + if (fOption != SQL_POSITION && fOption != SQL_REFRESH) + { stmt->errornumber = STMT_NOT_IMPLEMENTED_ERROR; stmt->errormsg = "Only SQL_POSITION/REFRESH is supported for SQLSetPos"; SC_log_error(func, "", stmt); return SQL_ERROR; } - if ( ! (res = stmt->result)) { + if (!(res = stmt->result)) + { stmt->errormsg = "Null statement result in SQLSetPos."; stmt->errornumber = STMT_SEQUENCE_ERROR; SC_log_error(func, "", stmt); @@ -1143,14 +1274,16 @@ BindInfoClass *bindings = stmt->bindings; } num_cols = QR_NumResultCols(res); - if (irow == 0) { + if (irow == 0) + { stmt->errornumber = STMT_ROW_OUT_OF_RANGE; stmt->errormsg = "Driver does not support Bulk operations."; SC_log_error(func, "", stmt); return SQL_ERROR; } - if (irow > stmt->last_fetch_count) { + if (irow > stmt->last_fetch_count) + { stmt->errornumber = STMT_ROW_OUT_OF_RANGE; stmt->errormsg = "Row value out of range"; SC_log_error(func, "", stmt); @@ -1159,7 +1292,7 @@ BindInfoClass *bindings = stmt->bindings; irow--; - /* Reset for SQLGetData */ + /* Reset for SQLGetData */ for (i = 0; i < num_cols; i++) bindings[i].data_left = -1; @@ -1171,73 +1304,80 @@ BindInfoClass *bindings = stmt->bindings; } -/* Sets options that control the behavior of cursors. */ +/* Sets options that control the behavior of cursors. */ -RETCODE SQL_API SQLSetScrollOptions( - HSTMT hstmt, - UWORD fConcurrency, - SDWORD crowKeyset, - UWORD crowRowset) +RETCODE SQL_API +SQLSetScrollOptions( + HSTMT hstmt, + UWORD fConcurrency, + SDWORD crowKeyset, + UWORD crowRowset) { -static char *func = "SQLSetScrollOptions"; + static char *func = "SQLSetScrollOptions"; SC_log_error(func, "Function not implemented", (StatementClass *) hstmt); return SQL_ERROR; } -/* Set the cursor name on a statement handle */ +/* Set the cursor name on a statement handle */ -RETCODE SQL_API SQLSetCursorName( - HSTMT hstmt, - UCHAR FAR *szCursor, - SWORD cbCursor) +RETCODE SQL_API +SQLSetCursorName( + HSTMT hstmt, + UCHAR FAR * szCursor, + SWORD cbCursor) { -static char *func="SQLSetCursorName"; -StatementClass *stmt = (StatementClass *) hstmt; -int len; + static char *func = "SQLSetCursorName"; + StatementClass *stmt = (StatementClass *) hstmt; + int len; -mylog("SQLSetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d\n", hstmt, szCursor, cbCursor); + mylog("SQLSetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d\n", hstmt, szCursor, cbCursor); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } len = (cbCursor == SQL_NTS) ? strlen(szCursor) : cbCursor; - if (len <= 0 || len > sizeof(stmt->cursor_name) - 1) { + if (len <= 0 || len > sizeof(stmt->cursor_name) - 1) + { stmt->errornumber = STMT_INVALID_CURSOR_NAME; stmt->errormsg = "Invalid Cursor Name"; SC_log_error(func, "", stmt); return SQL_ERROR; } - strncpy_null(stmt->cursor_name, szCursor, len+1); + strncpy_null(stmt->cursor_name, szCursor, len + 1); return SQL_SUCCESS; } -/* Return the cursor name for a statement handle */ +/* Return the cursor name for a statement handle */ -RETCODE SQL_API SQLGetCursorName( - HSTMT hstmt, - UCHAR FAR *szCursor, - SWORD cbCursorMax, - SWORD FAR *pcbCursor) +RETCODE SQL_API +SQLGetCursorName( + HSTMT hstmt, + UCHAR FAR * szCursor, + SWORD cbCursorMax, + SWORD FAR * pcbCursor) { -static char *func="SQLGetCursorName"; -StatementClass *stmt = (StatementClass *) hstmt; -int len = 0; -RETCODE result; + static char *func = "SQLGetCursorName"; + StatementClass *stmt = (StatementClass *) hstmt; + int len = 0; + RETCODE result; -mylog("SQLGetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d, pcbCursor=%u\n", hstmt, szCursor, cbCursorMax, pcbCursor); + mylog("SQLGetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d, pcbCursor=%u\n", hstmt, szCursor, cbCursorMax, pcbCursor); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if ( stmt->cursor_name[0] == '\0') { + if (stmt->cursor_name[0] == '\0') + { stmt->errornumber = STMT_NO_CURSOR_NAME; stmt->errormsg = "No Cursor name available"; SC_log_error(func, "", stmt); @@ -1247,10 +1387,12 @@ mylog("SQLGetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d, pcbCursor=%u\n", result = SQL_SUCCESS; len = strlen(stmt->cursor_name); - if (szCursor) { + if (szCursor) + { strncpy_null(szCursor, stmt->cursor_name, cbCursorMax); - if (len >= cbCursorMax) { + if (len >= cbCursorMax) + { result = SQL_SUCCESS_WITH_INFO; stmt->errornumber = STMT_TRUNCATED; stmt->errormsg = "The buffer was too small for the result."; @@ -1262,5 +1404,3 @@ mylog("SQLGetCursorName: hstmt=%u, szCursor=%u, cbCursorMax=%d, pcbCursor=%u\n", return result; } - - diff --git a/src/interfaces/odbc/setup.c b/src/interfaces/odbc/setup.c index 4c31afed49..51cf6482c8 100644 --- a/src/interfaces/odbc/setup.c +++ b/src/interfaces/odbc/setup.c @@ -1,14 +1,14 @@ -/* Module: setup.c +/* Module: setup.c * - * Description: This module contains the setup functions for - * adding/modifying a Data Source in the ODBC.INI portion - * of the registry. + * Description: This module contains the setup functions for + * adding/modifying a Data Source in the ODBC.INI portion + * of the registry. * - * Classes: n/a + * Classes: n/a * - * API functions: ConfigDSN + * API functions: ConfigDSN * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * *************************************************************************************/ @@ -25,288 +25,313 @@ #define INTFUNC __stdcall -extern HINSTANCE NEAR s_hModule; /* Saved module handle. */ +extern HINSTANCE NEAR s_hModule;/* Saved module handle. */ extern GLOBAL_VALUES globals; /* Constants --------------------------------------------------------------- */ -#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) #ifdef WIN32 -#define MAXPGPATH (255+1) +#define MAXPGPATH (255+1) #endif -#define MAXKEYLEN (15+1) /* Max keyword length */ -#define MAXDESC (255+1) /* Max description length */ -#define MAXDSNAME (32+1) /* Max data source name length */ +#define MAXKEYLEN (15+1) /* Max keyword length */ +#define MAXDESC (255+1) /* Max description length */ +#define MAXDSNAME (32+1) /* Max data source name length */ /* Globals ----------------------------------------------------------------- */ /* NOTE: All these are used by the dialog procedures */ -typedef struct tagSETUPDLG { - HWND hwndParent; /* Parent window handle */ - LPCSTR lpszDrvr; /* Driver description */ - ConnInfo ci; - char szDSN[MAXDSNAME]; /* Original data source name */ - BOOL fNewDSN; /* New data source flag */ - BOOL fDefault; /* Default data source flag */ +typedef struct tagSETUPDLG +{ + HWND hwndParent; /* Parent window handle */ + LPCSTR lpszDrvr; /* Driver description */ + ConnInfo ci; + char szDSN[MAXDSNAME]; /* Original data source name */ + BOOL fNewDSN; /* New data source flag */ + BOOL fDefault; /* Default data source flag */ -} SETUPDLG, FAR *LPSETUPDLG; +} SETUPDLG, FAR * LPSETUPDLG; /* Prototypes -------------------------------------------------------------- */ void INTFUNC CenterDialog(HWND hdlg); -int CALLBACK ConfigDlgProc(HWND hdlg, WORD wMsg, WPARAM wParam, LPARAM lParam); -void INTFUNC ParseAttributes (LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg); +int CALLBACK ConfigDlgProc(HWND hdlg, WORD wMsg, WPARAM wParam, LPARAM lParam); +void INTFUNC ParseAttributes(LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg); BOOL INTFUNC SetDSNAttributes(HWND hwnd, LPSETUPDLG lpsetupdlg); /* ConfigDSN --------------------------------------------------------------- - Description: ODBC Setup entry point - This entry point is called by the ODBC Installer - (see file header for more details) - Input : hwnd ----------- Parent window handle - fRequest ------- Request type (i.e., add, config, or remove) - lpszDriver ----- Driver name - lpszAttributes - data source attribute string - Output : TRUE success, FALSE otherwise + Description: ODBC Setup entry point + This entry point is called by the ODBC Installer + (see file header for more details) + Input : hwnd ----------- Parent window handle + fRequest ------- Request type (i.e., add, config, or remove) + lpszDriver ----- Driver name + lpszAttributes - data source attribute string + Output : TRUE success, FALSE otherwise --------------------------------------------------------------------------*/ -BOOL CALLBACK ConfigDSN (HWND hwnd, - WORD fRequest, - LPCSTR lpszDriver, - LPCSTR lpszAttributes) +BOOL CALLBACK +ConfigDSN(HWND hwnd, + WORD fRequest, + LPCSTR lpszDriver, + LPCSTR lpszAttributes) { -BOOL fSuccess; /* Success/fail flag */ -GLOBALHANDLE hglbAttr; -LPSETUPDLG lpsetupdlg; - + BOOL fSuccess; /* Success/fail flag */ + GLOBALHANDLE hglbAttr; + LPSETUPDLG lpsetupdlg; + /* Allocate attribute array */ - hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG)); - if (!hglbAttr) - return FALSE; - lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr); - - /* Parse attribute string */ - if (lpszAttributes) - ParseAttributes(lpszAttributes, lpsetupdlg); - - /* Save original data source name */ - if (lpsetupdlg->ci.dsn[0]) - lstrcpy(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn); - else - lpsetupdlg->szDSN[0] = '\0'; - - /* Remove data source */ - if (ODBC_REMOVE_DSN == fRequest) { + hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG)); + if (!hglbAttr) + return FALSE; + lpsetupdlg = (LPSETUPDLG) GlobalLock(hglbAttr); + + /* Parse attribute string */ + if (lpszAttributes) + ParseAttributes(lpszAttributes, lpsetupdlg); + + /* Save original data source name */ + if (lpsetupdlg->ci.dsn[0]) + lstrcpy(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn); + else + lpsetupdlg->szDSN[0] = '\0'; + + /* Remove data source */ + if (ODBC_REMOVE_DSN == fRequest) + { /* Fail if no data source name was supplied */ - if (!lpsetupdlg->ci.dsn[0]) - fSuccess = FALSE; + if (!lpsetupdlg->ci.dsn[0]) + fSuccess = FALSE; - /* Otherwise remove data source from ODBC.INI */ - else - fSuccess = SQLRemoveDSNFromIni(lpsetupdlg->ci.dsn); - } + /* Otherwise remove data source from ODBC.INI */ + else + fSuccess = SQLRemoveDSNFromIni(lpsetupdlg->ci.dsn); + } - /* Add or Configure data source */ - else { + /* Add or Configure data source */ + else + { /* Save passed variables for global access (e.g., dialog access) */ - lpsetupdlg->hwndParent = hwnd; - lpsetupdlg->lpszDrvr = lpszDriver; - lpsetupdlg->fNewDSN = (ODBC_ADD_DSN == fRequest); - lpsetupdlg->fDefault = !lstrcmpi(lpsetupdlg->ci.dsn, INI_DSN); - - /* Display the appropriate dialog (if parent window handle supplied) */ - if (hwnd) { - /* Display dialog(s) */ - fSuccess = (IDOK == DialogBoxParam(s_hModule, - MAKEINTRESOURCE(DLG_CONFIG), - hwnd, - ConfigDlgProc, - (LONG)(LPSTR)lpsetupdlg)); - } - - else if (lpsetupdlg->ci.dsn[0]) - fSuccess = SetDSNAttributes(hwnd, lpsetupdlg); - else - fSuccess = FALSE; - } - - GlobalUnlock(hglbAttr); - GlobalFree(hglbAttr); - - return fSuccess; + lpsetupdlg->hwndParent = hwnd; + lpsetupdlg->lpszDrvr = lpszDriver; + lpsetupdlg->fNewDSN = (ODBC_ADD_DSN == fRequest); + lpsetupdlg->fDefault = !lstrcmpi(lpsetupdlg->ci.dsn, INI_DSN); + + /* + * Display the appropriate dialog (if parent window handle + * supplied) + */ + if (hwnd) + { + /* Display dialog(s) */ + fSuccess = (IDOK == DialogBoxParam(s_hModule, + MAKEINTRESOURCE(DLG_CONFIG), + hwnd, + ConfigDlgProc, + (LONG) (LPSTR) lpsetupdlg)); + } + + else if (lpsetupdlg->ci.dsn[0]) + fSuccess = SetDSNAttributes(hwnd, lpsetupdlg); + else + fSuccess = FALSE; + } + + GlobalUnlock(hglbAttr); + GlobalFree(hglbAttr); + + return fSuccess; } /* CenterDialog ------------------------------------------------------------ - Description: Center the dialog over the frame window - Input : hdlg -- Dialog window handle - Output : None + Description: Center the dialog over the frame window + Input : hdlg -- Dialog window handle + Output : None --------------------------------------------------------------------------*/ -void INTFUNC CenterDialog(HWND hdlg) +void INTFUNC +CenterDialog(HWND hdlg) { - HWND hwndFrame; - RECT rcDlg, rcScr, rcFrame; - int cx, cy; - - hwndFrame = GetParent(hdlg); - - GetWindowRect(hdlg, &rcDlg); - cx = rcDlg.right - rcDlg.left; - cy = rcDlg.bottom - rcDlg.top; - - GetClientRect(hwndFrame, &rcFrame); - ClientToScreen(hwndFrame, (LPPOINT)(&rcFrame.left)); - ClientToScreen(hwndFrame, (LPPOINT)(&rcFrame.right)); - rcDlg.top = rcFrame.top + (((rcFrame.bottom - rcFrame.top) - cy) >> 1); - rcDlg.left = rcFrame.left + (((rcFrame.right - rcFrame.left) - cx) >> 1); - rcDlg.bottom = rcDlg.top + cy; - rcDlg.right = rcDlg.left + cx; - - GetWindowRect(GetDesktopWindow(), &rcScr); - if (rcDlg.bottom > rcScr.bottom) - { - rcDlg.bottom = rcScr.bottom; - rcDlg.top = rcDlg.bottom - cy; - } - if (rcDlg.right > rcScr.right) - { - rcDlg.right = rcScr.right; - rcDlg.left = rcDlg.right - cx; - } - - if (rcDlg.left < 0) rcDlg.left = 0; - if (rcDlg.top < 0) rcDlg.top = 0; - - MoveWindow(hdlg, rcDlg.left, rcDlg.top, cx, cy, TRUE); - return; + HWND hwndFrame; + RECT rcDlg, + rcScr, + rcFrame; + int cx, + cy; + + hwndFrame = GetParent(hdlg); + + GetWindowRect(hdlg, &rcDlg); + cx = rcDlg.right - rcDlg.left; + cy = rcDlg.bottom - rcDlg.top; + + GetClientRect(hwndFrame, &rcFrame); + ClientToScreen(hwndFrame, (LPPOINT) (&rcFrame.left)); + ClientToScreen(hwndFrame, (LPPOINT) (&rcFrame.right)); + rcDlg.top = rcFrame.top + (((rcFrame.bottom - rcFrame.top) - cy) >> 1); + rcDlg.left = rcFrame.left + (((rcFrame.right - rcFrame.left) - cx) >> 1); + rcDlg.bottom = rcDlg.top + cy; + rcDlg.right = rcDlg.left + cx; + + GetWindowRect(GetDesktopWindow(), &rcScr); + if (rcDlg.bottom > rcScr.bottom) + { + rcDlg.bottom = rcScr.bottom; + rcDlg.top = rcDlg.bottom - cy; + } + if (rcDlg.right > rcScr.right) + { + rcDlg.right = rcScr.right; + rcDlg.left = rcDlg.right - cx; + } + + if (rcDlg.left < 0) + rcDlg.left = 0; + if (rcDlg.top < 0) + rcDlg.top = 0; + + MoveWindow(hdlg, rcDlg.left, rcDlg.top, cx, cy, TRUE); + return; } /* ConfigDlgProc ----------------------------------------------------------- - Description: Manage add data source name dialog - Input : hdlg --- Dialog window handle - wMsg --- Message - wParam - Message parameter - lParam - Message parameter - Output : TRUE if message processed, FALSE otherwise + Description: Manage add data source name dialog + Input : hdlg --- Dialog window handle + wMsg --- Message + wParam - Message parameter + lParam - Message parameter + Output : TRUE if message processed, FALSE otherwise --------------------------------------------------------------------------*/ -int CALLBACK ConfigDlgProc(HWND hdlg, - WORD wMsg, - WPARAM wParam, - LPARAM lParam) +int CALLBACK +ConfigDlgProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam) { - switch (wMsg) { - /* Initialize the dialog */ - case WM_INITDIALOG: + switch (wMsg) { - LPSETUPDLG lpsetupdlg = (LPSETUPDLG) lParam; - ConnInfo *ci = &lpsetupdlg->ci; + /* Initialize the dialog */ + case WM_INITDIALOG: + { + LPSETUPDLG lpsetupdlg = (LPSETUPDLG) lParam; + ConnInfo *ci = &lpsetupdlg->ci; - /* Hide the driver connect message */ - ShowWindow(GetDlgItem(hdlg, DRV_MSG_LABEL), SW_HIDE); + /* Hide the driver connect message */ + ShowWindow(GetDlgItem(hdlg, DRV_MSG_LABEL), SW_HIDE); - SetWindowLong(hdlg, DWL_USER, lParam); - CenterDialog(hdlg); /* Center dialog */ + SetWindowLong(hdlg, DWL_USER, lParam); + CenterDialog(hdlg); /* Center dialog */ - /* NOTE: Values supplied in the attribute string will always */ - /* override settings in ODBC.INI */ + /* + * NOTE: Values supplied in the attribute string will + * always + */ + /* override settings in ODBC.INI */ - /* Get the rest of the common attributes */ - getDSNinfo(ci, CONN_DONT_OVERWRITE); + /* Get the rest of the common attributes */ + getDSNinfo(ci, CONN_DONT_OVERWRITE); - /* Fill in any defaults */ - getDSNdefaults(ci); + /* Fill in any defaults */ + getDSNdefaults(ci); - /* Initialize dialog fields */ - SetDlgStuff(hdlg, ci); + /* Initialize dialog fields */ + SetDlgStuff(hdlg, ci); - if (lpsetupdlg->fDefault) { - EnableWindow(GetDlgItem(hdlg, IDC_DSNAME), FALSE); - EnableWindow(GetDlgItem(hdlg, IDC_DSNAMETEXT), FALSE); - } - else - SendDlgItemMessage(hdlg, IDC_DSNAME, - EM_LIMITTEXT, (WPARAM)(MAXDSNAME-1), 0L); + if (lpsetupdlg->fDefault) + { + EnableWindow(GetDlgItem(hdlg, IDC_DSNAME), FALSE); + EnableWindow(GetDlgItem(hdlg, IDC_DSNAMETEXT), FALSE); + } + else + SendDlgItemMessage(hdlg, IDC_DSNAME, + EM_LIMITTEXT, (WPARAM) (MAXDSNAME - 1), 0L); - SendDlgItemMessage(hdlg, IDC_DESC, - EM_LIMITTEXT, (WPARAM)(MAXDESC-1), 0L); - return TRUE; /* Focus was not set */ - } + SendDlgItemMessage(hdlg, IDC_DESC, + EM_LIMITTEXT, (WPARAM) (MAXDESC - 1), 0L); + return TRUE; /* Focus was not set */ + } - /* Process buttons */ - case WM_COMMAND: + /* Process buttons */ + case WM_COMMAND: - switch (GET_WM_COMMAND_ID(wParam, lParam)) { - /* Ensure the OK button is enabled only when a data source name */ - /* is entered */ - case IDC_DSNAME: - if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) + switch (GET_WM_COMMAND_ID(wParam, lParam)) { - char szItem[MAXDSNAME]; /* Edit control text */ - /* Enable/disable the OK button */ - EnableWindow(GetDlgItem(hdlg, IDOK), - GetDlgItemText(hdlg, IDC_DSNAME, - szItem, sizeof(szItem))); + /* + * Ensure the OK button is enabled only when a data + * source name + */ + /* is entered */ + case IDC_DSNAME: + if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) + { + char szItem[MAXDSNAME]; /* Edit control text */ - return TRUE; - } - break; + /* Enable/disable the OK button */ + EnableWindow(GetDlgItem(hdlg, IDOK), + GetDlgItemText(hdlg, IDC_DSNAME, + szItem, sizeof(szItem))); - /* Accept results */ - case IDOK: - { - LPSETUPDLG lpsetupdlg; + return TRUE; + } + break; - lpsetupdlg = (LPSETUPDLG)GetWindowLong(hdlg, DWL_USER); - /* Retrieve dialog values */ - if (!lpsetupdlg->fDefault) - GetDlgItemText(hdlg, IDC_DSNAME, - lpsetupdlg->ci.dsn, - sizeof(lpsetupdlg->ci.dsn)); + /* Accept results */ + case IDOK: + { + LPSETUPDLG lpsetupdlg; + lpsetupdlg = (LPSETUPDLG) GetWindowLong(hdlg, DWL_USER); + /* Retrieve dialog values */ + if (!lpsetupdlg->fDefault) + GetDlgItemText(hdlg, IDC_DSNAME, + lpsetupdlg->ci.dsn, + sizeof(lpsetupdlg->ci.dsn)); - /* Get Dialog Values */ - GetDlgStuff(hdlg, &lpsetupdlg->ci); - /* Update ODBC.INI */ - SetDSNAttributes(hdlg, lpsetupdlg); - } + /* Get Dialog Values */ + GetDlgStuff(hdlg, &lpsetupdlg->ci); - /* Return to caller */ - case IDCANCEL: - EndDialog(hdlg, wParam); - return TRUE; + /* Update ODBC.INI */ + SetDSNAttributes(hdlg, lpsetupdlg); + } - case IDC_DRIVER: + /* Return to caller */ + case IDCANCEL: + EndDialog(hdlg, wParam); + return TRUE; - DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DRV), - hdlg, driver_optionsProc, (LPARAM) NULL); + case IDC_DRIVER: - return TRUE; + DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DRV), + hdlg, driver_optionsProc, (LPARAM) NULL); - case IDC_DATASOURCE: - { - LPSETUPDLG lpsetupdlg; + return TRUE; + + case IDC_DATASOURCE: + { + LPSETUPDLG lpsetupdlg; - lpsetupdlg = (LPSETUPDLG)GetWindowLong(hdlg, DWL_USER); + lpsetupdlg = (LPSETUPDLG) GetWindowLong(hdlg, DWL_USER); - DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DS), - hdlg, ds_optionsProc, (LPARAM) &lpsetupdlg->ci); + DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_OPTIONS_DS), + hdlg, ds_optionsProc, (LPARAM) & lpsetupdlg->ci); - return TRUE; + return TRUE; + } } - } - break; + break; } /* Message not processed */ @@ -315,97 +340,98 @@ int CALLBACK ConfigDlgProc(HWND hdlg, /* ParseAttributes --------------------------------------------------------- - Description: Parse attribute string moving values into the aAttr array - Input : lpszAttributes - Pointer to attribute string - Output : None (global aAttr normally updated) + Description: Parse attribute string moving values into the aAttr array + Input : lpszAttributes - Pointer to attribute string + Output : None (global aAttr normally updated) --------------------------------------------------------------------------*/ -void INTFUNC ParseAttributes(LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg) +void INTFUNC +ParseAttributes(LPCSTR lpszAttributes, LPSETUPDLG lpsetupdlg) { -LPCSTR lpsz; -LPCSTR lpszStart; -char aszKey[MAXKEYLEN]; -int cbKey; -char value[MAXPGPATH]; - - memset(&lpsetupdlg->ci, 0, sizeof(ConnInfo)); - - for (lpsz=lpszAttributes; *lpsz; lpsz++) - { /* Extract key name (e.g., DSN), it must be terminated by an equals */ - lpszStart = lpsz; - for (;; lpsz++) - { - if (!*lpsz) - return; /* No key was found */ - else if (*lpsz == '=') - break; /* Valid key found */ - } - /* Determine the key's index in the key table (-1 if not found) */ - cbKey = lpsz - lpszStart; - if (cbKey < sizeof(aszKey)) - { - - _fmemcpy(aszKey, lpszStart, cbKey); - aszKey[cbKey] = '\0'; - } - - /* Locate end of key value */ - lpszStart = ++lpsz; - for (; *lpsz; lpsz++); - - - /* lpsetupdlg->aAttr[iElement].fSupplied = TRUE; */ - _fmemcpy(value, lpszStart, MIN(lpsz-lpszStart+1, MAXPGPATH)); - - mylog("aszKey='%s', value='%s'\n", aszKey, value); - - /* Copy the appropriate value to the conninfo */ - copyAttributes(&lpsetupdlg->ci, aszKey, value); - } - return; + LPCSTR lpsz; + LPCSTR lpszStart; + char aszKey[MAXKEYLEN]; + int cbKey; + char value[MAXPGPATH]; + + memset(&lpsetupdlg->ci, 0, sizeof(ConnInfo)); + + for (lpsz = lpszAttributes; *lpsz; lpsz++) + { /* Extract key name (e.g., DSN), it must + * be terminated by an equals */ + lpszStart = lpsz; + for (;; lpsz++) + { + if (!*lpsz) + return; /* No key was found */ + else if (*lpsz == '=') + break; /* Valid key found */ + } + /* Determine the key's index in the key table (-1 if not found) */ + cbKey = lpsz - lpszStart; + if (cbKey < sizeof(aszKey)) + { + + _fmemcpy(aszKey, lpszStart, cbKey); + aszKey[cbKey] = '\0'; + } + + /* Locate end of key value */ + lpszStart = ++lpsz; + for (; *lpsz; lpsz++); + + + /* lpsetupdlg->aAttr[iElement].fSupplied = TRUE; */ + _fmemcpy(value, lpszStart, MIN(lpsz - lpszStart + 1, MAXPGPATH)); + + mylog("aszKey='%s', value='%s'\n", aszKey, value); + + /* Copy the appropriate value to the conninfo */ + copyAttributes(&lpsetupdlg->ci, aszKey, value); + } + return; } /* SetDSNAttributes -------------------------------------------------------- - Description: Write data source attributes to ODBC.INI - Input : hwnd - Parent window handle (plus globals) - Output : TRUE if successful, FALSE otherwise + Description: Write data source attributes to ODBC.INI + Input : hwnd - Parent window handle (plus globals) + Output : TRUE if successful, FALSE otherwise --------------------------------------------------------------------------*/ -BOOL INTFUNC SetDSNAttributes(HWND hwndParent, LPSETUPDLG lpsetupdlg) +BOOL INTFUNC +SetDSNAttributes(HWND hwndParent, LPSETUPDLG lpsetupdlg) { -LPCSTR lpszDSN; /* Pointer to data source name */ - - lpszDSN = lpsetupdlg->ci.dsn; + LPCSTR lpszDSN; /* Pointer to data source name */ - /* Validate arguments */ - if (lpsetupdlg->fNewDSN && !*lpsetupdlg->ci.dsn) - return FALSE; + lpszDSN = lpsetupdlg->ci.dsn; - /* Write the data source name */ - if (!SQLWriteDSNToIni(lpszDSN, lpsetupdlg->lpszDrvr)) - { - if (hwndParent) - { - char szBuf[MAXPGPATH]; - char szMsg[MAXPGPATH]; + /* Validate arguments */ + if (lpsetupdlg->fNewDSN && !*lpsetupdlg->ci.dsn) + return FALSE; - LoadString(s_hModule, IDS_BADDSN, szBuf, sizeof(szBuf)); - wsprintf(szMsg, szBuf, lpszDSN); - LoadString(s_hModule, IDS_MSGTITLE, szBuf, sizeof(szBuf)); - MessageBox(hwndParent, szMsg, szBuf, MB_ICONEXCLAMATION | MB_OK); - } - return FALSE; - } + /* Write the data source name */ + if (!SQLWriteDSNToIni(lpszDSN, lpsetupdlg->lpszDrvr)) + { + if (hwndParent) + { + char szBuf[MAXPGPATH]; + char szMsg[MAXPGPATH]; + + LoadString(s_hModule, IDS_BADDSN, szBuf, sizeof(szBuf)); + wsprintf(szMsg, szBuf, lpszDSN); + LoadString(s_hModule, IDS_MSGTITLE, szBuf, sizeof(szBuf)); + MessageBox(hwndParent, szMsg, szBuf, MB_ICONEXCLAMATION | MB_OK); + } + return FALSE; + } - /* Update ODBC.INI */ - writeDSNinfo(&lpsetupdlg->ci); + /* Update ODBC.INI */ + writeDSNinfo(&lpsetupdlg->ci); /* If the data source name has changed, remove the old name */ - if (lstrcmpi(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn)) - { - SQLRemoveDSNFromIni(lpsetupdlg->szDSN); - } - return TRUE; + if (lstrcmpi(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn)) + SQLRemoveDSNFromIni(lpsetupdlg->szDSN); + return TRUE; } diff --git a/src/interfaces/odbc/socket.c b/src/interfaces/odbc/socket.c index 917951f49d..dfc8175db9 100644 --- a/src/interfaces/odbc/socket.c +++ b/src/interfaces/odbc/socket.c @@ -1,13 +1,13 @@ -/* Module: socket.c +/* Module: socket.c * - * Description: This module contains functions for low level socket - * operations (connecting/reading/writing to the backend) + * Description: This module contains functions for low level socket + * operations (connecting/reading/writing to the backend) * - * Classes: SocketClass (Functions prefix: "SOCK_") + * Classes: SocketClass (Functions prefix: "SOCK_") * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -19,7 +19,7 @@ #ifndef WIN32 #include -#include /* for memset */ +#include /* for memset */ #endif extern GLOBAL_VALUES globals; @@ -36,47 +36,49 @@ extern GLOBAL_VALUES globals; void -SOCK_clear_error(SocketClass *self) +SOCK_clear_error(SocketClass * self) { - self->errornumber = 0; - self->errormsg = NULL; + self->errornumber = 0; + self->errormsg = NULL; } -SocketClass * +SocketClass * SOCK_Constructor() { -SocketClass *rv; + SocketClass *rv; - rv = (SocketClass *) malloc(sizeof(SocketClass)); + rv = (SocketClass *) malloc(sizeof(SocketClass)); - if (rv != NULL) { - rv->socket = (SOCKETFD) -1; + if (rv != NULL) + { + rv->socket = (SOCKETFD) - 1; rv->buffer_filled_in = 0; rv->buffer_filled_out = 0; rv->buffer_read_in = 0; rv->buffer_in = (unsigned char *) malloc(globals.socket_buffersize); - if ( ! rv->buffer_in) + if (!rv->buffer_in) return NULL; rv->buffer_out = (unsigned char *) malloc(globals.socket_buffersize); - if ( ! rv->buffer_out) + if (!rv->buffer_out) return NULL; - - rv->errormsg = NULL; - rv->errornumber = 0; + + rv->errormsg = NULL; + rv->errornumber = 0; rv->reverse = FALSE; - } - return rv; + } + return rv; } void -SOCK_Destructor(SocketClass *self) +SOCK_Destructor(SocketClass * self) { - if (self->socket != -1) { - if ( ! shutdown(self->socket, 2)) /* no sends or receives */ + if (self->socket != -1) + { + if (!shutdown(self->socket, 2)) /* no sends or receives */ { SOCK_put_char(self, 'X'); SOCK_flush_output(self); @@ -95,28 +97,31 @@ SOCK_Destructor(SocketClass *self) } -char -SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname) +char +SOCK_connect_to(SocketClass * self, unsigned short port, char *hostname) { -struct hostent *host; -struct sockaddr_in sadr; -unsigned long iaddr; + struct hostent *host; + struct sockaddr_in sadr; + unsigned long iaddr; - if (self->socket != -1) { + if (self->socket != -1) + { self->errornumber = SOCKET_ALREADY_CONNECTED; self->errormsg = "Socket is already connected"; return 0; } - memset((char *)&sadr, 0, sizeof(sadr)); + memset((char *) &sadr, 0, sizeof(sadr)); - /* If it is a valid IP address, use it. - Otherwise use hostname lookup. - */ + /* + * If it is a valid IP address, use it. Otherwise use hostname lookup. + */ iaddr = inet_addr(hostname); - if (iaddr == INADDR_NONE) { + if (iaddr == INADDR_NONE) + { host = gethostbyname(hostname); - if (host == NULL) { + if (host == NULL) + { self->errornumber = SOCKET_HOST_NOT_FOUND; self->errormsg = "Could not resolve hostname."; return 0; @@ -124,176 +129,186 @@ unsigned long iaddr; memcpy(&(sadr.sin_addr), host->h_addr, host->h_length); } else - memcpy(&(sadr.sin_addr), (struct in_addr *) &iaddr, sizeof(iaddr)); + memcpy(&(sadr.sin_addr), (struct in_addr *) & iaddr, sizeof(iaddr)); sadr.sin_family = AF_INET; sadr.sin_port = htons(port); self->socket = socket(AF_INET, SOCK_STREAM, 0); - if (self->socket == -1) { + if (self->socket == -1) + { self->errornumber = SOCKET_COULD_NOT_CREATE_SOCKET; self->errormsg = "Could not create Socket."; return 0; } - if ( connect(self->socket, (struct sockaddr *)&(sadr), - sizeof(sadr)) < 0) { + if (connect(self->socket, (struct sockaddr *) & (sadr), + sizeof(sadr)) < 0) + { self->errornumber = SOCKET_COULD_NOT_CONNECT; self->errormsg = "Could not connect to remote socket."; closesocket(self->socket); - self->socket = (SOCKETFD) -1; + self->socket = (SOCKETFD) - 1; return 0; } return 1; } -void -SOCK_get_n_char(SocketClass *self, char *buffer, int len) +void +SOCK_get_n_char(SocketClass * self, char *buffer, int len) { -int lf; + int lf; - if ( ! buffer) { + if (!buffer) + { self->errornumber = SOCKET_NULLPOINTER_PARAMETER; self->errormsg = "get_n_char was called with NULL-Pointer"; return; } - for(lf=0; lf < len; lf++) + for (lf = 0; lf < len; lf++) buffer[lf] = SOCK_get_next_byte(self); } -void -SOCK_put_n_char(SocketClass *self, char *buffer, int len) +void +SOCK_put_n_char(SocketClass * self, char *buffer, int len) { -int lf; + int lf; - if ( ! buffer) { + if (!buffer) + { self->errornumber = SOCKET_NULLPOINTER_PARAMETER; self->errormsg = "put_n_char was called with NULL-Pointer"; return; } - for(lf=0; lf < len; lf++) - SOCK_put_next_byte(self, (unsigned char)buffer[lf]); + for (lf = 0; lf < len; lf++) + SOCK_put_next_byte(self, (unsigned char) buffer[lf]); } -/* bufsize must include room for the null terminator - will read at most bufsize-1 characters + null. +/* bufsize must include room for the null terminator + will read at most bufsize-1 characters + null. */ -void -SOCK_get_string(SocketClass *self, char *buffer, int bufsize) +void +SOCK_get_string(SocketClass * self, char *buffer, int bufsize) { -register int lf = 0; + register int lf = 0; for (lf = 0; lf < bufsize; lf++) - if ( ! (buffer[lf] = SOCK_get_next_byte(self))) + if (!(buffer[lf] = SOCK_get_next_byte(self))) return; - - buffer[bufsize-1] = '\0'; + + buffer[bufsize - 1] = '\0'; } -void -SOCK_put_string(SocketClass *self, char *string) +void +SOCK_put_string(SocketClass * self, char *string) { -register int lf; -int len; + register int lf; + int len; - len = strlen(string)+1; + len = strlen(string) + 1; - for(lf = 0; lf < len; lf++) - SOCK_put_next_byte(self, (unsigned char)string[lf]); + for (lf = 0; lf < len; lf++) + SOCK_put_next_byte(self, (unsigned char) string[lf]); } -int -SOCK_get_int(SocketClass *self, short len) +int +SOCK_get_int(SocketClass * self, short len) { -char buf[4]; - - switch (len) { - case 2: - SOCK_get_n_char(self, buf, len); - if (self->reverse) - return *((unsigned short *) buf); - else - return ntohs( *((unsigned short *) buf) ); - - case 4: - SOCK_get_n_char(self, buf, len); - if (self->reverse) - return *((unsigned int *) buf); - else - return ntohl( *((unsigned int *) buf) ); - - default: - self->errornumber = SOCKET_GET_INT_WRONG_LENGTH; - self->errormsg = "Cannot read ints of that length"; - return 0; + char buf[4]; + + switch (len) + { + case 2: + SOCK_get_n_char(self, buf, len); + if (self->reverse) + return *((unsigned short *) buf); + else + return ntohs(*((unsigned short *) buf)); + + case 4: + SOCK_get_n_char(self, buf, len); + if (self->reverse) + return *((unsigned int *) buf); + else + return ntohl(*((unsigned int *) buf)); + + default: + self->errornumber = SOCKET_GET_INT_WRONG_LENGTH; + self->errormsg = "Cannot read ints of that length"; + return 0; } } -void -SOCK_put_int(SocketClass *self, int value, short len) +void +SOCK_put_int(SocketClass * self, int value, short len) { -unsigned int rv; + unsigned int rv; - switch (len) { - case 2: - rv = self->reverse ? value : htons( (unsigned short) value); - SOCK_put_n_char(self, (char *) &rv, 2); - return; + switch (len) + { + case 2: + rv = self->reverse ? value : htons((unsigned short) value); + SOCK_put_n_char(self, (char *) &rv, 2); + return; - case 4: - rv = self->reverse ? value : htonl( (unsigned int) value); - SOCK_put_n_char(self, (char *) &rv, 4); - return; + case 4: + rv = self->reverse ? value : htonl((unsigned int) value); + SOCK_put_n_char(self, (char *) &rv, 4); + return; - default: - self->errornumber = SOCKET_PUT_INT_WRONG_LENGTH; - self->errormsg = "Cannot write ints of that length"; - return; - } + default: + self->errornumber = SOCKET_PUT_INT_WRONG_LENGTH; + self->errormsg = "Cannot write ints of that length"; + return; + } } -void -SOCK_flush_output(SocketClass *self) +void +SOCK_flush_output(SocketClass * self) { -int written; + int written; - written = send(self->socket, (char *)self->buffer_out, self->buffer_filled_out, 0); - if (written != self->buffer_filled_out) { + written = send(self->socket, (char *) self->buffer_out, self->buffer_filled_out, 0); + if (written != self->buffer_filled_out) + { self->errornumber = SOCKET_WRITE_ERROR; self->errormsg = "Could not flush socket buffer."; } self->buffer_filled_out = 0; } -unsigned char -SOCK_get_next_byte(SocketClass *self) +unsigned char +SOCK_get_next_byte(SocketClass * self) { - if (self->buffer_read_in >= self->buffer_filled_in) { + if (self->buffer_read_in >= self->buffer_filled_in) + { /* there are no more bytes left in the buffer -> */ - /* reload the buffer */ + /* reload the buffer */ self->buffer_read_in = 0; - self->buffer_filled_in = recv(self->socket, (char *)self->buffer_in, globals.socket_buffersize, 0); + self->buffer_filled_in = recv(self->socket, (char *) self->buffer_in, globals.socket_buffersize, 0); mylog("read %d, global_socket_buffersize=%d\n", self->buffer_filled_in, globals.socket_buffersize); - if (self->buffer_filled_in == -1) { + if (self->buffer_filled_in == -1) + { self->errornumber = SOCKET_READ_ERROR; self->errormsg = "Error while reading from the socket."; self->buffer_filled_in = 0; } - if (self->buffer_filled_in == 0) { + if (self->buffer_filled_in == 0) + { self->errornumber = SOCKET_CLOSED; self->errormsg = "Socket has been closed."; self->buffer_filled_in = 0; @@ -303,17 +318,19 @@ SOCK_get_next_byte(SocketClass *self) return self->buffer_in[self->buffer_read_in++]; } -void -SOCK_put_next_byte(SocketClass *self, unsigned char next_byte) +void +SOCK_put_next_byte(SocketClass * self, unsigned char next_byte) { -int bytes_sent; + int bytes_sent; self->buffer_out[self->buffer_filled_out++] = next_byte; - if (self->buffer_filled_out == globals.socket_buffersize) { + if (self->buffer_filled_out == globals.socket_buffersize) + { /* buffer is full, so write it out */ - bytes_sent = send(self->socket, (char *)self->buffer_out, globals.socket_buffersize, 0); - if (bytes_sent != globals.socket_buffersize) { + bytes_sent = send(self->socket, (char *) self->buffer_out, globals.socket_buffersize, 0); + if (bytes_sent != globals.socket_buffersize) + { self->errornumber = SOCKET_WRITE_ERROR; self->errormsg = "Error while writing to the socket."; } diff --git a/src/interfaces/odbc/socket.h b/src/interfaces/odbc/socket.h index 0b4b9101d6..08bd63528c 100644 --- a/src/interfaces/odbc/socket.h +++ b/src/interfaces/odbc/socket.h @@ -1,9 +1,9 @@ -/* File: socket.h +/* File: socket.h * - * Description: See "socket.c" + * Description: See "socket.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -25,10 +25,11 @@ #define closesocket(xxx) close(xxx) #define SOCKETFD int -#ifndef INADDR_NONE +#ifndef INADDR_NONE #ifndef _IN_ADDR_T #define _IN_ADDR_T -typedef unsigned int in_addr_t; +typedef unsigned int in_addr_t; + #endif #define INADDR_NONE ((in_addr_t)-1) #endif @@ -52,20 +53,22 @@ typedef unsigned int in_addr_t; #define SOCKET_CLOSED 10 -struct SocketClass_ { +struct SocketClass_ +{ - int buffer_filled_in; - int buffer_filled_out; - int buffer_read_in; + int buffer_filled_in; + int buffer_filled_out; + int buffer_read_in; unsigned char *buffer_in; unsigned char *buffer_out; - SOCKETFD socket; + SOCKETFD socket; - char *errormsg; - int errornumber; + char *errormsg; + int errornumber; - char reverse; /* used to handle Postgres 6.2 protocol (reverse byte order) */ + char reverse; /* used to handle Postgres 6.2 protocol + * (reverse byte order) */ }; @@ -80,17 +83,17 @@ struct SocketClass_ { /* Socket prototypes */ SocketClass *SOCK_Constructor(void); -void SOCK_Destructor(SocketClass *self); -char SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname); -void SOCK_get_n_char(SocketClass *self, char *buffer, int len); -void SOCK_put_n_char(SocketClass *self, char *buffer, int len); -void SOCK_get_string(SocketClass *self, char *buffer, int bufsize); -void SOCK_put_string(SocketClass *self, char *string); -int SOCK_get_int(SocketClass *self, short len); -void SOCK_put_int(SocketClass *self, int value, short len); -void SOCK_flush_output(SocketClass *self); -unsigned char SOCK_get_next_byte(SocketClass *self); -void SOCK_put_next_byte(SocketClass *self, unsigned char next_byte); -void SOCK_clear_error(SocketClass *self); +void SOCK_Destructor(SocketClass * self); +char SOCK_connect_to(SocketClass * self, unsigned short port, char *hostname); +void SOCK_get_n_char(SocketClass * self, char *buffer, int len); +void SOCK_put_n_char(SocketClass * self, char *buffer, int len); +void SOCK_get_string(SocketClass * self, char *buffer, int bufsize); +void SOCK_put_string(SocketClass * self, char *string); +int SOCK_get_int(SocketClass * self, short len); +void SOCK_put_int(SocketClass * self, int value, short len); +void SOCK_flush_output(SocketClass * self); +unsigned char SOCK_get_next_byte(SocketClass * self); +void SOCK_put_next_byte(SocketClass * self, unsigned char next_byte); +void SOCK_clear_error(SocketClass * self); #endif diff --git a/src/interfaces/odbc/statement.c b/src/interfaces/odbc/statement.c index 82eaffefd5..0069d5e341 100644 --- a/src/interfaces/odbc/statement.c +++ b/src/interfaces/odbc/statement.c @@ -1,13 +1,13 @@ -/* Module: statement.c +/* Module: statement.c * - * Description: This module contains functions related to creating - * and manipulating a statement. + * Description: This module contains functions related to creating + * and manipulating a statement. * - * Classes: StatementClass (Functions prefix: "SC_") + * Classes: StatementClass (Functions prefix: "SC_") * - * API functions: SQLAllocStmt, SQLFreeStmt + * API functions: SQLAllocStmt, SQLFreeStmt * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -38,40 +38,65 @@ extern GLOBAL_VALUES globals; #ifndef WIN32 #ifndef HAVE_STRICMP -#define stricmp(s1,s2) strcasecmp(s1,s2) +#define stricmp(s1,s2) strcasecmp(s1,s2) #define strnicmp(s1,s2,n) strncasecmp(s1,s2,n) #endif #endif #define PRN_NULLCHECK /* Map sql commands to statement types */ -static struct { - int type; - char *s; -} Statement_Type[] = { - { STMT_TYPE_SELECT, "SELECT" }, - { STMT_TYPE_INSERT, "INSERT" }, - { STMT_TYPE_UPDATE, "UPDATE" }, - { STMT_TYPE_DELETE, "DELETE" }, - { STMT_TYPE_CREATE, "CREATE" }, - { STMT_TYPE_ALTER, "ALTER" }, - { STMT_TYPE_DROP, "DROP" }, - { STMT_TYPE_GRANT, "GRANT" }, - { STMT_TYPE_REVOKE, "REVOKE" }, - { 0, NULL } +static struct +{ + int type; + char *s; +} Statement_Type[] = + +{ + { + STMT_TYPE_SELECT, "SELECT" + }, + { + STMT_TYPE_INSERT, "INSERT" + }, + { + STMT_TYPE_UPDATE, "UPDATE" + }, + { + STMT_TYPE_DELETE, "DELETE" + }, + { + STMT_TYPE_CREATE, "CREATE" + }, + { + STMT_TYPE_ALTER, "ALTER" + }, + { + STMT_TYPE_DROP, "DROP" + }, + { + STMT_TYPE_GRANT, "GRANT" + }, + { + STMT_TYPE_REVOKE, "REVOKE" + }, + { + 0, NULL + } }; -RETCODE SQL_API SQLAllocStmt(HDBC hdbc, - HSTMT FAR *phstmt) +RETCODE SQL_API +SQLAllocStmt(HDBC hdbc, + HSTMT FAR * phstmt) { -static char *func="SQLAllocStmt"; -ConnectionClass *conn = (ConnectionClass *) hdbc; -StatementClass *stmt; + static char *func = "SQLAllocStmt"; + ConnectionClass *conn = (ConnectionClass *) hdbc; + StatementClass *stmt; mylog("%s: entering...\n", func); - if( ! conn) { + if (!conn) + { CC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } @@ -80,7 +105,8 @@ StatementClass *stmt; mylog("**** SQLAllocStmt: hdbc = %u, stmt = %u\n", hdbc, stmt); - if ( ! stmt) { + if (!stmt) + { conn->errornumber = CONN_STMT_ALLOC_ERROR; conn->errormsg = "No more memory to allocate a further SQL-statement"; *phstmt = SQL_NULL_HSTMT; @@ -88,56 +114,65 @@ StatementClass *stmt; return SQL_ERROR; } - if ( ! CC_add_statement(conn, stmt)) { - conn->errormsg = "Maximum number of connections exceeded."; - conn->errornumber = CONN_STMT_ALLOC_ERROR; + if (!CC_add_statement(conn, stmt)) + { + conn->errormsg = "Maximum number of connections exceeded."; + conn->errornumber = CONN_STMT_ALLOC_ERROR; CC_log_error(func, "", conn); - SC_Destructor(stmt); + SC_Destructor(stmt); *phstmt = SQL_NULL_HSTMT; - return SQL_ERROR; - } + return SQL_ERROR; + } *phstmt = (HSTMT) stmt; - /* Copy default statement options based from Connection options - */ + /* + * Copy default statement options based from Connection options + */ stmt->options = conn->stmtOptions; - /* Save the handle for later */ + /* Save the handle for later */ stmt->phstmt = phstmt; - return SQL_SUCCESS; + return SQL_SUCCESS; } -RETCODE SQL_API SQLFreeStmt(HSTMT hstmt, - UWORD fOption) +RETCODE SQL_API +SQLFreeStmt(HSTMT hstmt, + UWORD fOption) { -static char *func="SQLFreeStmt"; -StatementClass *stmt = (StatementClass *) hstmt; + static char *func = "SQLFreeStmt"; + StatementClass *stmt = (StatementClass *) hstmt; mylog("%s: entering...hstmt=%u, fOption=%d\n", func, hstmt, fOption); - if ( ! stmt) { + if (!stmt) + { SC_log_error(func, "", NULL); return SQL_INVALID_HANDLE; } - if (fOption == SQL_DROP) { + if (fOption == SQL_DROP) + { ConnectionClass *conn = stmt->hdbc; /* Remove the statement from the connection's statement list */ - if ( conn) { - if ( ! CC_remove_statement(conn, stmt)) { + if (conn) + { + if (!CC_remove_statement(conn, stmt)) + { stmt->errornumber = STMT_SEQUENCE_ERROR; stmt->errormsg = "Statement is currently executing a transaction."; SC_log_error(func, "", stmt); - return SQL_ERROR; /* stmt may be executing a transaction */ + return SQL_ERROR; /* stmt may be executing a + * transaction */ } - /* Free any cursors and discard any result info */ - if (stmt->result) { + /* Free any cursors and discard any result info */ + if (stmt->result) + { QR_Destructor(stmt->result); stmt->result = NULL; } @@ -146,29 +181,38 @@ StatementClass *stmt = (StatementClass *) hstmt; /* Destroy the statement and free any results, cursors, etc. */ SC_Destructor(stmt); - } else if (fOption == SQL_UNBIND) { + } + else if (fOption == SQL_UNBIND) + { SC_unbind_cols(stmt); - } else if (fOption == SQL_CLOSE) { + } + else if (fOption == SQL_CLOSE) + { /* this should discard all the results, but leave the statement */ /* itself in place (it can be executed again) */ - if (!SC_recycle_statement(stmt)) { - /* errormsg passed in above */ + if (!SC_recycle_statement(stmt)) + { + /* errormsg passed in above */ SC_log_error(func, "", stmt); - return SQL_ERROR; + return SQL_ERROR; } - } else if(fOption == SQL_RESET_PARAMS) { + } + else if (fOption == SQL_RESET_PARAMS) + { SC_free_params(stmt, STMT_FREE_PARAMS_ALL); - } else { - stmt->errormsg = "Invalid option passed to SQLFreeStmt."; - stmt->errornumber = STMT_OPTION_OUT_OF_RANGE_ERROR; + } + else + { + stmt->errormsg = "Invalid option passed to SQLFreeStmt."; + stmt->errornumber = STMT_OPTION_OUT_OF_RANGE_ERROR; SC_log_error(func, "", stmt); - return SQL_ERROR; - } + return SQL_ERROR; + } - return SQL_SUCCESS; + return SQL_SUCCESS; } @@ -177,7 +221,7 @@ StatementClass *stmt = (StatementClass *) hstmt; * StatementClass implementation */ void -InitializeStatementOptions(StatementOptions *opt) +InitializeStatementOptions(StatementOptions * opt) { opt->maxRows = 0; /* driver returns all rows */ opt->maxLength = 0; /* driver returns all data for char/binary */ @@ -193,11 +237,12 @@ InitializeStatementOptions(StatementOptions *opt) StatementClass * SC_Constructor(void) { -StatementClass *rv; + StatementClass *rv; rv = (StatementClass *) malloc(sizeof(StatementClass)); - if (rv) { - rv->hdbc = NULL; /* no connection associated yet */ + if (rv) + { + rv->hdbc = NULL; /* no connection associated yet */ rv->phstmt = NULL; rv->result = NULL; rv->manual_result = FALSE; @@ -236,7 +281,7 @@ StatementClass *rv; rv->lobj_fd = -1; rv->cursor_name[0] = '\0'; - /* Parse Stuff */ + /* Parse Stuff */ rv->ti = NULL; rv->fi = NULL; rv->ntab = 0; @@ -244,26 +289,28 @@ StatementClass *rv; rv->parse_status = STMT_PARSE_NONE; - /* Clear Statement Options -- defaults will be set in AllocStmt */ + /* Clear Statement Options -- defaults will be set in AllocStmt */ memset(&rv->options, 0, sizeof(StatementOptions)); } return rv; } char -SC_Destructor(StatementClass *self) +SC_Destructor(StatementClass * self) { mylog("SC_Destructor: self=%u, self->result=%u, self->hdbc=%u\n", self, self->result, self->hdbc); - if (STMT_EXECUTING == self->status) { + if (STMT_EXECUTING == self->status) + { self->errornumber = STMT_SEQUENCE_ERROR; self->errormsg = "Statement is currently executing a transaction."; return FALSE; } - if (self->result) { - if ( ! self->hdbc) - self->result->conn = NULL; /* prevent any dbase activity */ + if (self->result) + { + if (!self->hdbc) + self->result->conn = NULL; /* prevent any dbase activity */ QR_Destructor(self->result); } @@ -273,29 +320,38 @@ SC_Destructor(StatementClass *self) SC_free_params(self, STMT_FREE_PARAMS_ALL); - /* the memory pointed to by the bindings is not deallocated by the driver */ - /* by by the application that uses that driver, so we don't have to care */ + /* + * the memory pointed to by the bindings is not deallocated by the + * driver + */ + + /* + * by by the application that uses that driver, so we don't have to + * care + */ /* about that here. */ if (self->bindings) free(self->bindings); - /* Free the parsed table information */ - if (self->ti) { - int i; - for (i = 0; i < self->ntab; i++) { + /* Free the parsed table information */ + if (self->ti) + { + int i; + + for (i = 0; i < self->ntab; i++) free(self->ti[i]); - } free(self->ti); } - /* Free the parsed field information */ - if (self->fi) { - int i; - for (i = 0; i < self->nfld; i++) { + /* Free the parsed field information */ + if (self->fi) + { + int i; + + for (i = 0; i < self->nfld; i++) free(self->fi[i]); - } free(self->fi); } @@ -311,24 +367,28 @@ SC_Destructor(StatementClass *self) data-at-execution parameters that was allocated in SQLPutData. */ void -SC_free_params(StatementClass *self, char option) +SC_free_params(StatementClass * self, char option) { -int i; + int i; mylog("SC_free_params: ENTER, self=%d\n", self); - if( ! self->parameters) + if (!self->parameters) return; - for (i = 0; i < self->parameters_allocated; i++) { - if (self->parameters[i].data_at_exec == TRUE) { + for (i = 0; i < self->parameters_allocated; i++) + { + if (self->parameters[i].data_at_exec == TRUE) + { - if (self->parameters[i].EXEC_used) { + if (self->parameters[i].EXEC_used) + { free(self->parameters[i].EXEC_used); self->parameters[i].EXEC_used = NULL; } - if (self->parameters[i].EXEC_buffer) { + if (self->parameters[i].EXEC_buffer) + { if (self->parameters[i].SQLType != SQL_LONGVARBINARY) free(self->parameters[i].EXEC_buffer); self->parameters[i].EXEC_buffer = NULL; @@ -339,7 +399,8 @@ int i; self->current_exec_param = -1; self->put_data = FALSE; - if (option == STMT_FREE_PARAMS_ALL) { + if (option == STMT_FREE_PARAMS_ALL) + { free(self->parameters); self->parameters = NULL; self->parameters_allocated = 0; @@ -352,14 +413,14 @@ int i; int statement_type(char *statement) { -int i; + int i; /* ignore leading whitespace in query string */ while (*statement && isspace((unsigned char) *statement)) statement++; for (i = 0; Statement_Type[i].s; i++) - if ( ! strnicmp(statement, Statement_Type[i].s, strlen(Statement_Type[i].s))) + if (!strnicmp(statement, Statement_Type[i].s, strlen(Statement_Type[i].s))) return Statement_Type[i].type; return STMT_TYPE_OTHER; @@ -371,14 +432,15 @@ int i; from SQLFreeStmt(SQL_CLOSE) */ char -SC_recycle_statement(StatementClass *self) +SC_recycle_statement(StatementClass * self) { -ConnectionClass *conn; + ConnectionClass *conn; -mylog("recycle statement: self= %u\n", self); + mylog("recycle statement: self= %u\n", self); - /* This would not happen */ - if (self->status == STMT_EXECUTING) { + /* This would not happen */ + if (self->status == STMT_EXECUTING) + { self->errornumber = STMT_SEQUENCE_ERROR; self->errormsg = "Statement is currently executing a transaction."; return FALSE; @@ -388,71 +450,79 @@ mylog("recycle statement: self= %u\n", self); self->errornumber = 0; self->errormsg_created = FALSE; - switch (self->status) { - case STMT_ALLOCATED: - /* this statement does not need to be recycled */ - return TRUE; + switch (self->status) + { + case STMT_ALLOCATED: + /* this statement does not need to be recycled */ + return TRUE; - case STMT_READY: - break; + case STMT_READY: + break; - case STMT_PREMATURE: - /* Premature execution of the statement might have caused the start of a transaction. - If so, we have to rollback that transaction. - */ - conn = SC_get_conn(self); - if ( ! CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) { + case STMT_PREMATURE: - CC_send_query(conn, "ABORT", NULL); - CC_set_no_trans(conn); - } - break; + /* + * Premature execution of the statement might have caused the + * start of a transaction. If so, we have to rollback that + * transaction. + */ + conn = SC_get_conn(self); + if (!CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) + { - case STMT_FINISHED: - break; + CC_send_query(conn, "ABORT", NULL); + CC_set_no_trans(conn); + } + break; - default: - self->errormsg = "An internal error occured while recycling statements"; - self->errornumber = STMT_INTERNAL_ERROR; - return FALSE; + case STMT_FINISHED: + break; + + default: + self->errormsg = "An internal error occured while recycling statements"; + self->errornumber = STMT_INTERNAL_ERROR; + return FALSE; } - /* Free the parsed table information */ - if (self->ti) { - int i; - for (i = 0; i < self->ntab; i++) { + /* Free the parsed table information */ + if (self->ti) + { + int i; + + for (i = 0; i < self->ntab; i++) free(self->ti[i]); - } free(self->ti); self->ti = NULL; self->ntab = 0; } - /* Free the parsed field information */ - if (self->fi) { - int i; - for (i = 0; i < self->nfld; i++) { + /* Free the parsed field information */ + if (self->fi) + { + int i; + + for (i = 0; i < self->nfld; i++) free(self->fi[i]); - } free(self->fi); self->fi = NULL; self->nfld = 0; } self->parse_status = STMT_PARSE_NONE; - /* Free any cursors */ - if (self->result) { + /* Free any cursors */ + if (self->result) + { QR_Destructor(self->result); self->result = NULL; } /****************************************************************/ - /* Reset only parameters that have anything to do with results */ + /* Reset only parameters that have anything to do with results */ /****************************************************************/ self->status = STMT_READY; - self->manual_result = FALSE; /* very important */ + self->manual_result = FALSE;/* very important */ self->currTuple = -1; self->rowset_start = -1; @@ -466,9 +536,9 @@ mylog("recycle statement: self= %u\n", self); self->lobj_fd = -1; - /* Free any data at exec params before the statement is executed */ - /* again. If not, then there will be a memory leak when */ - /* the next SQLParamData/SQLPutData is called. */ + /* Free any data at exec params before the statement is executed */ + /* again. If not, then there will be a memory leak when */ + /* the next SQLParamData/SQLPutData is called. */ SC_free_params(self, STMT_FREE_PARAMS_DATA_AT_EXEC_ONLY); return TRUE; @@ -476,17 +546,19 @@ mylog("recycle statement: self= %u\n", self); /* Pre-execute a statement (SQLPrepare/SQLDescribeCol) */ void -SC_pre_execute(StatementClass *self) +SC_pre_execute(StatementClass * self) { mylog("SC_pre_execute: status = %d\n", self->status); - if (self->status == STMT_READY) { + if (self->status == STMT_READY) + { mylog(" preprocess: status = READY\n"); SQLExecute(self); - if (self->status == STMT_FINISHED) { + if (self->status == STMT_FINISHED) + { mylog(" preprocess: after status = FINISHED, so set PREMATURE\n"); self->status = STMT_PREMATURE; } @@ -495,11 +567,12 @@ SC_pre_execute(StatementClass *self) /* This is only called from SQLFreeStmt(SQL_UNBIND) */ char -SC_unbind_cols(StatementClass *self) +SC_unbind_cols(StatementClass * self) { -Int2 lf; + Int2 lf; - for(lf = 0; lf < self->bindings_allocated; lf++) { + for (lf = 0; lf < self->bindings_allocated; lf++) + { self->bindings[lf].data_left = -1; self->bindings[lf].buflen = 0; self->bindings[lf].buffer = NULL; @@ -510,11 +583,11 @@ Int2 lf; self->bookmark.buffer = NULL; self->bookmark.used = NULL; - return 1; + return 1; } void -SC_clear_error(StatementClass *self) +SC_clear_error(StatementClass * self) { self->errornumber = 0; self->errormsg = NULL; @@ -525,12 +598,12 @@ SC_clear_error(StatementClass *self) /* This function creates an error msg which is the concatenation */ /* of the result, statement, connection, and socket messages. */ char * -SC_create_errormsg(StatementClass *self) +SC_create_errormsg(StatementClass * self) { -QResultClass *res = self->result; -ConnectionClass *conn = self->hdbc; -int pos; -static char msg[4096]; + QResultClass *res = self->result; + ConnectionClass *conn = self->hdbc; + int pos; + static char msg[4096]; msg[0] = '\0'; @@ -540,15 +613,18 @@ static char msg[4096]; else if (self->errormsg) strcpy(msg, self->errormsg); - if (conn) { + if (conn) + { SocketClass *sock = conn->sock; - if (conn->errormsg && conn->errormsg[0] != '\0') { + if (conn->errormsg && conn->errormsg[0] != '\0') + { pos = strlen(msg); sprintf(&msg[pos], ";\n%s", conn->errormsg); } - if (sock && sock->errormsg && sock->errormsg[0] != '\0') { + if (sock && sock->errormsg && sock->errormsg[0] != '\0') + { pos = strlen(msg); sprintf(&msg[pos], ";\n%s", sock->errormsg); } @@ -558,17 +634,19 @@ static char msg[4096]; } char -SC_get_error(StatementClass *self, int *number, char **message) +SC_get_error(StatementClass * self, int *number, char **message) { -char rv; + char rv; /* Create a very informative errormsg if it hasn't been done yet. */ - if ( ! self->errormsg_created) { + if (!self->errormsg_created) + { self->errormsg = SC_create_errormsg(self); self->errormsg_created = TRUE; } - if ( self->errornumber) { + if (self->errornumber) + { *number = self->errornumber; *message = self->errormsg; self->errormsg = NULL; @@ -585,36 +663,42 @@ char rv; someday, such as mapping a key to a 32 bit value */ unsigned long -SC_get_bookmark(StatementClass *self) +SC_get_bookmark(StatementClass * self) { return (self->currTuple + 1); } RETCODE -SC_fetch(StatementClass *self) +SC_fetch(StatementClass * self) { -static char *func = "SC_fetch"; -QResultClass *res = self->result; -int retval, result; -Int2 num_cols, lf; -Oid type; -char *value; -ColumnInfoClass *ci; + static char *func = "SC_fetch"; + QResultClass *res = self->result; + int retval, + result; + Int2 num_cols, + lf; + Oid type; + char *value; + ColumnInfoClass *ci; + /* TupleField *tupleField; */ self->last_fetch_count = 0; - ci = QR_get_fields(res); /* the column info */ + ci = QR_get_fields(res); /* the column info */ mylog("manual_result = %d, use_declarefetch = %d\n", self->manual_result, globals.use_declarefetch); - if ( self->manual_result || ! globals.use_declarefetch) { + if (self->manual_result || !globals.use_declarefetch) + { - if (self->currTuple >= QR_get_num_tuples(res) -1 || - (self->options.maxRows > 0 && self->currTuple == self->options.maxRows - 1)) { + if (self->currTuple >= QR_get_num_tuples(res) - 1 || + (self->options.maxRows > 0 && self->currTuple == self->options.maxRows - 1)) + { - /* if at the end of the tuples, return "no data found" - and set the cursor past the end of the result set - */ + /* + * if at the end of the tuples, return "no data found" and set + * the cursor past the end of the result set + */ self->currTuple = QR_get_num_tuples(res); return SQL_NO_DATA_FOUND; } @@ -622,18 +706,21 @@ ColumnInfoClass *ci; mylog("**** SQLFetch: manual_result\n"); (self->currTuple)++; } - else { + else + { /* read from the cache or the physical next tuple */ retval = QR_next_tuple(res); - if (retval < 0) { + if (retval < 0) + { mylog("**** SQLFetch: end_tuples\n"); return SQL_NO_DATA_FOUND; } else if (retval > 0) - (self->currTuple)++; /* all is well */ + (self->currTuple)++;/* all is well */ - else { + else + { mylog("SQLFetch: error\n"); self->errornumber = STMT_EXEC_ERROR; self->errormsg = "Error fetching next row"; @@ -647,89 +734,95 @@ ColumnInfoClass *ci; result = SQL_SUCCESS; self->last_fetch_count = 1; - /* If the bookmark column was bound then return a bookmark. - Since this is used with SQLExtendedFetch, and the rowset size - may be greater than 1, and an application can use row or column wise - binding, use the code in copy_and_convert_field() to handle that. - */ - if (self->bookmark.buffer) { - char buf[32]; + /* + * If the bookmark column was bound then return a bookmark. Since this + * is used with SQLExtendedFetch, and the rowset size may be greater + * than 1, and an application can use row or column wise binding, use + * the code in copy_and_convert_field() to handle that. + */ + if (self->bookmark.buffer) + { + char buf[32]; sprintf(buf, "%ld", SC_get_bookmark(self)); result = copy_and_convert_field(self, 0, buf, - SQL_C_ULONG, self->bookmark.buffer, 0, self->bookmark.used); + SQL_C_ULONG, self->bookmark.buffer, 0, self->bookmark.used); } - for (lf=0; lf < num_cols; lf++) { + for (lf = 0; lf < num_cols; lf++) + { mylog("fetch: cols=%d, lf=%d, self = %u, self->bindings = %u, buffer[] = %u\n", num_cols, lf, self, self->bindings, self->bindings[lf].buffer); - /* reset for SQLGetData */ + /* reset for SQLGetData */ self->bindings[lf].data_left = -1; - if (self->bindings[lf].buffer != NULL) { + if (self->bindings[lf].buffer != NULL) + { /* this column has a binding */ /* type = QR_get_field_type(res, lf); */ - type = CI_get_oid(ci, lf); /* speed things up */ + type = CI_get_oid(ci, lf); /* speed things up */ mylog("type = %d\n", type); - if (self->manual_result) { + if (self->manual_result) + { value = QR_get_value_manual(res, self->currTuple, lf); mylog("manual_result\n"); } else if (globals.use_declarefetch) value = QR_get_value_backend(res, lf); - else { + else value = QR_get_value_backend_row(res, self->currTuple, lf); - } - mylog("value = '%s'\n", (value==NULL)?"":value); + mylog("value = '%s'\n", (value == NULL) ? "" : value); retval = copy_and_convert_field_bindinfo(self, type, value, lf); mylog("copy_and_convert: retval = %d\n", retval); - switch(retval) { - case COPY_OK: - break; /* OK, do next bound column */ - - case COPY_UNSUPPORTED_TYPE: - self->errormsg = "Received an unsupported type from Postgres."; - self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; - SC_log_error(func, "", self); - result = SQL_ERROR; - break; - - case COPY_UNSUPPORTED_CONVERSION: - self->errormsg = "Couldn't handle the necessary data type conversion."; - self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; - SC_log_error(func, "", self); - result = SQL_ERROR; - break; - - case COPY_RESULT_TRUNCATED: - self->errornumber = STMT_TRUNCATED; - self->errormsg = "The buffer was too small for the result."; - result = SQL_SUCCESS_WITH_INFO; - break; - - case COPY_GENERAL_ERROR: /* error msg already filled in */ - SC_log_error(func, "", self); - result = SQL_ERROR; - break; - - /* This would not be meaningful in SQLFetch. */ - case COPY_NO_DATA_FOUND: - break; - - default: - self->errormsg = "Unrecognized return value from copy_and_convert_field."; - self->errornumber = STMT_INTERNAL_ERROR; - SC_log_error(func, "", self); - result = SQL_ERROR; - break; + switch (retval) + { + case COPY_OK: + break; /* OK, do next bound column */ + + case COPY_UNSUPPORTED_TYPE: + self->errormsg = "Received an unsupported type from Postgres."; + self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; + SC_log_error(func, "", self); + result = SQL_ERROR; + break; + + case COPY_UNSUPPORTED_CONVERSION: + self->errormsg = "Couldn't handle the necessary data type conversion."; + self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR; + SC_log_error(func, "", self); + result = SQL_ERROR; + break; + + case COPY_RESULT_TRUNCATED: + self->errornumber = STMT_TRUNCATED; + self->errormsg = "The buffer was too small for the result."; + result = SQL_SUCCESS_WITH_INFO; + break; + + case COPY_GENERAL_ERROR: /* error msg already + * filled in */ + SC_log_error(func, "", self); + result = SQL_ERROR; + break; + + /* This would not be meaningful in SQLFetch. */ + case COPY_NO_DATA_FOUND: + break; + + default: + self->errormsg = "Unrecognized return value from copy_and_convert_field."; + self->errornumber = STMT_INTERNAL_ERROR; + SC_log_error(func, "", self); + result = SQL_ERROR; + break; } } } @@ -738,35 +831,40 @@ ColumnInfoClass *ci; } -RETCODE SC_execute(StatementClass *self) +RETCODE +SC_execute(StatementClass * self) { -static char *func="SC_execute"; -ConnectionClass *conn; -QResultClass *res; -char ok, was_ok, was_nonfatal; -Int2 oldstatus, numcols; -QueryInfo qi; + static char *func = "SC_execute"; + ConnectionClass *conn; + QResultClass *res; + char ok, + was_ok, + was_nonfatal; + Int2 oldstatus, + numcols; + QueryInfo qi; conn = SC_get_conn(self); - /* Begin a transaction if one is not already in progress */ + /* Begin a transaction if one is not already in progress */ + /* - Basically we don't have to begin a transaction in - autocommit mode because Postgres backend runs in - autocomit mode. - We issue "BEGIN" in the following cases. - 1) we use declare/fetch and the statement is SELECT - (because declare/fetch must be called in a transaction). - 2) we are not in autocommit state and the statement - is of type UPDATE. - */ - if ( ! self->internal && ! CC_is_in_trans(conn) && - ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || (! CC_is_in_autocommit(conn) && STMT_UPDATE(self)))) { + * Basically we don't have to begin a transaction in autocommit mode + * because Postgres backend runs in autocomit mode. We issue "BEGIN" + * in the following cases. 1) we use declare/fetch and the statement + * is SELECT (because declare/fetch must be called in a transaction). + * 2) we are not in autocommit state and the statement is of type + * UPDATE. + */ + if (!self->internal && !CC_is_in_trans(conn) && + ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || (!CC_is_in_autocommit(conn) && STMT_UPDATE(self)))) + { mylog(" about to begin a transaction on statement = %u\n", self); res = CC_send_query(conn, "BEGIN", NULL); - if ( ! res) { + if (!res) + { self->errormsg = "Could not begin a transaction"; self->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", self); @@ -779,7 +877,8 @@ QueryInfo qi; QR_Destructor(res); - if (!ok) { + if (!ok) + { self->errormsg = "Could not begin a transaction"; self->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", self); @@ -794,73 +893,92 @@ QueryInfo qi; self->status = STMT_EXECUTING; - /* If it's a SELECT statement, use a cursor. */ - /* Note that the declare cursor has already been prepended to the statement */ - /* in copy_statement... */ - if (self->statement_type == STMT_TYPE_SELECT) { + /* If it's a SELECT statement, use a cursor. */ + + /* + * Note that the declare cursor has already been prepended to the + * statement + */ + /* in copy_statement... */ + if (self->statement_type == STMT_TYPE_SELECT) + { - char fetch[128]; + char fetch[128]; mylog(" Sending SELECT statement on stmt=%u, cursor_name='%s'\n", self, self->cursor_name); - /* send the declare/select */ + /* send the declare/select */ self->result = CC_send_query(conn, self->stmt_with_params, NULL); if (globals.use_declarefetch && self->result != NULL && - QR_command_successful(self->result)) { + QR_command_successful(self->result)) + { QR_Destructor(self->result); - /* That worked, so now send the fetch to start getting data back */ + /* + * That worked, so now send the fetch to start getting data + * back + */ qi.result_in = NULL; qi.cursor = self->cursor_name; qi.row_size = globals.fetch_max; - /* Most likely the rowset size will not be set by the application until - after the statement is executed, so might as well use the cache size. - The qr_next_tuple() function will correct for any discrepancies in - sizes and adjust the cache accordingly. - */ + /* + * Most likely the rowset size will not be set by the + * application until after the statement is executed, so might + * as well use the cache size. The qr_next_tuple() function + * will correct for any discrepancies in sizes and adjust the + * cache accordingly. + */ sprintf(fetch, "fetch %d in %s", qi.row_size, self->cursor_name); - self->result = CC_send_query( conn, fetch, &qi); + self->result = CC_send_query(conn, fetch, &qi); } mylog(" done sending the query:\n"); } - else { /* not a SELECT statement so don't use a cursor */ + else + { /* not a SELECT statement so don't use a + * cursor */ mylog(" it's NOT a select statement: stmt=%u\n", self); self->result = CC_send_query(conn, self->stmt_with_params, NULL); - /* We shouldn't send COMMIT. Postgres backend does the - autocommit if neccessary. (Zoltan, 04/26/2000) - */ - /* Even in case of autocommit, started transactions - must be committed. (Hiroshi, 09/02/2001) - */ - if ( ! self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn) && STMT_UPDATE(self)) { - res = CC_send_query(conn, "COMMIT", NULL); + /* + * We shouldn't send COMMIT. Postgres backend does the autocommit + * if neccessary. (Zoltan, 04/26/2000) + */ + + /* + * Even in case of autocommit, started transactions must be + * committed. (Hiroshi, 09/02/2001) + */ + if (!self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn) && STMT_UPDATE(self)) + { + res = CC_send_query(conn, "COMMIT", NULL); QR_Destructor(res); CC_set_no_trans(conn); - } + } } conn->status = oldstatus; self->status = STMT_FINISHED; - /* Check the status of the result */ - if (self->result) { + /* Check the status of the result */ + if (self->result) + { was_ok = QR_command_successful(self->result); was_nonfatal = QR_command_nonfatal(self->result); - if ( was_ok) + if (was_ok) self->errornumber = STMT_OK; else self->errornumber = was_nonfatal ? STMT_INFO_ONLY : STMT_ERROR_TAKEN_FROM_BACKEND; - self->currTuple = -1; /* set cursor before the first tuple in the list */ + self->currTuple = -1; /* set cursor before the first tuple in + * the list */ self->current_col = -1; self->rowset_start = -1; @@ -868,59 +986,70 @@ QueryInfo qi; numcols = QR_NumResultCols(self->result); /* now allocate the array to hold the binding info */ - if (numcols > 0) { + if (numcols > 0) + { extend_bindings(self, numcols); - if (self->bindings == NULL) { + if (self->bindings == NULL) + { self->errornumber = STMT_NO_MEMORY_ERROR; self->errormsg = "Could not get enough free memory to store the binding information"; SC_log_error(func, "", self); return SQL_ERROR; } } - /* in autocommit mode declare/fetch error must be aborted */ - if ( ! was_ok && ! self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) + /* in autocommit mode declare/fetch error must be aborted */ + if (!was_ok && !self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) CC_abort(conn); - } else { /* Bad Error -- The error message will be in the Connection */ + } + else + { /* Bad Error -- The error message will be + * in the Connection */ - if (self->statement_type == STMT_TYPE_CREATE) { + if (self->statement_type == STMT_TYPE_CREATE) + { self->errornumber = STMT_CREATE_TABLE_ERROR; self->errormsg = "Error creating the table"; - /* This would allow the table to already exists, thus appending - rows to it. BUT, if the table didn't have the same attributes, - it would fail. - return SQL_SUCCESS_WITH_INFO; - */ + + /* + * This would allow the table to already exists, thus + * appending rows to it. BUT, if the table didn't have the + * same attributes, it would fail. return + * SQL_SUCCESS_WITH_INFO; + */ } - else { + else + { self->errornumber = STMT_EXEC_ERROR; self->errormsg = "Error while executing the query"; } - if ( ! self->internal) + if (!self->internal) CC_abort(conn); } if (self->errornumber == STMT_OK) return SQL_SUCCESS; - else { + else + { /* Modified, 2000-04-29, Zoltan */ if (self->errornumber == STMT_INFO_ONLY) - self->errormsg = "Error while executing the query (non-fatal)"; + self->errormsg = "Error while executing the query (non-fatal)"; else - self->errormsg = "Unknown error"; + self->errormsg = "Unknown error"; SC_log_error(func, "", self); return SQL_ERROR; } } void -SC_log_error(char *func, char *desc, StatementClass *self) +SC_log_error(char *func, char *desc, StatementClass * self) { #ifdef PRN_NULLCHECK #define nullcheck(a) (a ? a : "(NULL)") #endif - if (self) { + if (self) + { qlog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck(self->errormsg)); mylog("STATEMENT ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->errornumber, nullcheck(self->errormsg)); qlog(" ------------------------------------------------------------\n"); @@ -937,15 +1066,17 @@ SC_log_error(char *func, char *desc, StatementClass *self) qlog(" ----------------QResult Info -------------------------------\n"); - if (self->result) { - QResultClass *res = self->result; - qlog(" fields=%u, manual_tuples=%u, backend_tuples=%u, tupleField=%d, conn=%u\n", res->fields, res->manual_tuples, res->backend_tuples, res->tupleField, res->conn); - qlog(" fetch_count=%d, fcount=%d, num_fields=%d, cursor='%s'\n", res->fetch_count, res->fcount, res->num_fields, nullcheck(res->cursor)); - qlog(" message='%s', command='%s', notice='%s'\n", nullcheck(res->message), nullcheck(res->command), nullcheck(res->notice)); - qlog(" status=%d, inTuples=%d\n", res->status, res->inTuples); + if (self->result) + { + QResultClass *res = self->result; + + qlog(" fields=%u, manual_tuples=%u, backend_tuples=%u, tupleField=%d, conn=%u\n", res->fields, res->manual_tuples, res->backend_tuples, res->tupleField, res->conn); + qlog(" fetch_count=%d, fcount=%d, num_fields=%d, cursor='%s'\n", res->fetch_count, res->fcount, res->num_fields, nullcheck(res->cursor)); + qlog(" message='%s', command='%s', notice='%s'\n", nullcheck(res->message), nullcheck(res->command), nullcheck(res->notice)); + qlog(" status=%d, inTuples=%d\n", res->status, res->inTuples); } - /* Log the connection error if there is one */ + /* Log the connection error if there is one */ CC_log_error(func, desc, self->hdbc); } else diff --git a/src/interfaces/odbc/statement.h b/src/interfaces/odbc/statement.h index ae2df856b2..20402b5390 100644 --- a/src/interfaces/odbc/statement.h +++ b/src/interfaces/odbc/statement.h @@ -1,9 +1,9 @@ -/* File: statement.h +/* File: statement.h * - * Description: See "statement.c" + * Description: See "statement.c" * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -33,21 +33,28 @@ #define TRUE (BOOL)1 #endif -typedef enum { - STMT_ALLOCATED, /* The statement handle is allocated, but not used so far */ - STMT_READY, /* the statement is waiting to be executed */ - STMT_PREMATURE, /* ODBC states that it is legal to call e.g. SQLDescribeCol before - a call to SQLExecute, but after SQLPrepare. To get all the necessary - information in such a case, we simply execute the query _before_ the - actual call to SQLExecute, so that statement is considered to be "premature". - */ - STMT_FINISHED, /* statement execution has finished */ - STMT_EXECUTING /* statement execution is still going on */ -} STMT_Status; +typedef enum +{ + STMT_ALLOCATED, /* The statement handle is allocated, but + * not used so far */ + STMT_READY, /* the statement is waiting to be executed */ + STMT_PREMATURE, /* ODBC states that it is legal to call + * e.g. SQLDescribeCol before a call to + * SQLExecute, but after SQLPrepare. To + * get all the necessary information in + * such a case, we simply execute the + * query _before_ the actual call to + * SQLExecute, so that statement is + * considered to be "premature". */ + STMT_FINISHED, /* statement execution has finished */ + STMT_EXECUTING /* statement execution is still going on */ +} STMT_Status; #define STMT_TRUNCATED -2 -#define STMT_INFO_ONLY -1 /* not an error message, just a notification to be returned by SQLError */ -#define STMT_OK 0 /* will be interpreted as "no error pending" */ +#define STMT_INFO_ONLY -1 /* not an error message, just a + * notification to be returned by SQLError */ +#define STMT_OK 0 /* will be interpreted as "no error + * pending" */ #define STMT_EXEC_ERROR 1 #define STMT_STATUS_ERROR 2 #define STMT_SEQUENCE_ERROR 3 @@ -77,7 +84,8 @@ typedef enum { #define STMT_BAD_ERROR 27 /* statement types */ -enum { +enum +{ STMT_TYPE_UNKNOWN = -2, STMT_TYPE_OTHER = -1, STMT_TYPE_SELECT = 0, @@ -95,7 +103,8 @@ enum { /* Parsing status */ -enum { +enum +{ STMT_PARSE_NONE = 0, STMT_PARSE_COMPLETE, STMT_PARSE_INCOMPLETE, @@ -103,92 +112,110 @@ enum { }; /* Result style */ -enum { +enum +{ STMT_FETCH_NONE = 0, STMT_FETCH_NORMAL, STMT_FETCH_EXTENDED, }; -typedef struct { - COL_INFO *col_info; /* cached SQLColumns info for this table */ - char name[MAX_TABLE_LEN+1]; - char alias[MAX_TABLE_LEN+1]; -} TABLE_INFO; - -typedef struct { - TABLE_INFO *ti; /* resolve to explicit table names */ - int precision; - int display_size; - int length; - int type; - char nullable; - char func; - char expr; - char quote; - char dquote; - char numeric; - char dot[MAX_TABLE_LEN+1]; - char name[MAX_COLUMN_LEN+1]; - char alias[MAX_COLUMN_LEN+1]; -} FIELD_INFO; +typedef struct +{ + COL_INFO *col_info; /* cached SQLColumns info for this table */ + char name[MAX_TABLE_LEN + 1]; + char alias[MAX_TABLE_LEN + 1]; +} TABLE_INFO; + +typedef struct +{ + TABLE_INFO *ti; /* resolve to explicit table names */ + int precision; + int display_size; + int length; + int type; + char nullable; + char func; + char expr; + char quote; + char dquote; + char numeric; + char dot[MAX_TABLE_LEN + 1]; + char name[MAX_COLUMN_LEN + 1]; + char alias[MAX_COLUMN_LEN + 1]; +} FIELD_INFO; /******** Statement Handle ***********/ -struct StatementClass_ { - ConnectionClass *hdbc; /* pointer to ConnectionClass this statement belongs to */ - QResultClass *result; /* result of the current statement */ - HSTMT FAR *phstmt; +struct StatementClass_ +{ + ConnectionClass *hdbc; /* pointer to ConnectionClass this + * statement belongs to */ + QResultClass *result; /* result of the current statement */ + HSTMT FAR *phstmt; StatementOptions options; - STMT_Status status; - char *errormsg; - int errornumber; + STMT_Status status; + char *errormsg; + int errornumber; - /* information on bindings */ - BindInfoClass *bindings; /* array to store the binding information */ + /* information on bindings */ + BindInfoClass *bindings; /* array to store the binding information */ BindInfoClass bookmark; - int bindings_allocated; - - /* information on statement parameters */ - int parameters_allocated; - ParameterInfoClass *parameters; - - Int4 currTuple; /* current absolute row number (GetData, SetPos, SQLFetch) */ - int save_rowset_size; /* saved rowset size in case of change/FETCH_NEXT */ - int rowset_start; /* start of rowset (an absolute row number) */ - int bind_row; /* current offset for Multiple row/column binding */ - int last_fetch_count; /* number of rows retrieved in last fetch/extended fetch */ - int current_col; /* current column for GetData -- used to handle multiple calls */ - int lobj_fd; /* fd of the current large object */ - - char *statement; /* if non--null pointer to the SQL statement that has been executed */ - - TABLE_INFO **ti; - FIELD_INFO **fi; + int bindings_allocated; + + /* information on statement parameters */ + int parameters_allocated; + ParameterInfoClass *parameters; + + Int4 currTuple; /* current absolute row number (GetData, + * SetPos, SQLFetch) */ + int save_rowset_size; /* saved rowset size in case of + * change/FETCH_NEXT */ + int rowset_start; /* start of rowset (an absolute row + * number) */ + int bind_row; /* current offset for Multiple row/column + * binding */ + int last_fetch_count; /* number of rows retrieved in + * last fetch/extended fetch */ + int current_col; /* current column for GetData -- used to + * handle multiple calls */ + int lobj_fd; /* fd of the current large object */ + + char *statement; /* if non--null pointer to the SQL + * statement that has been executed */ + + TABLE_INFO **ti; + FIELD_INFO **fi; int nfld; int ntab; - int parse_status; + int parse_status; - int statement_type; /* According to the defines above */ - int data_at_exec; /* Number of params needing SQLPutData */ - int current_exec_param; /* The current parameter for SQLPutData */ + int statement_type; /* According to the defines above */ + int data_at_exec; /* Number of params needing SQLPutData */ + int current_exec_param; /* The current parameter for + * SQLPutData */ - char put_data; /* Has SQLPutData been called yet? */ + char put_data; /* Has SQLPutData been called yet? */ - char errormsg_created; /* has an informative error msg been created? */ - char manual_result; /* Is the statement result manually built? */ - char prepare; /* is this statement a prepared statement or direct */ + char errormsg_created; /* has an informative error msg + * been created? */ + char manual_result; /* Is the statement result manually built? */ + char prepare; /* is this statement a prepared statement + * or direct */ - char internal; /* Is this statement being called internally? */ + char internal; /* Is this statement being called + * internally? */ - char cursor_name[MAX_CURSOR_LEN+1]; + char cursor_name[MAX_CURSOR_LEN + 1]; - char stmt_with_params[STD_STATEMENT_LEN]; /* statement after parameter substitution */ + char stmt_with_params[STD_STATEMENT_LEN]; /* statement after + * parameter + * substitution */ }; -#define SC_get_conn(a) (a->hdbc) +#define SC_get_conn(a) (a->hdbc) #define SC_get_Result(a) (a->result); /* options for SC_free_params() */ @@ -197,22 +224,22 @@ struct StatementClass_ { /* Statement prototypes */ StatementClass *SC_Constructor(void); -void InitializeStatementOptions(StatementOptions *opt); -char SC_Destructor(StatementClass *self); -int statement_type(char *statement); -char parse_statement(StatementClass *stmt); -void SC_pre_execute(StatementClass *self); -char SC_unbind_cols(StatementClass *self); -char SC_recycle_statement(StatementClass *self); - -void SC_clear_error(StatementClass *self); -char SC_get_error(StatementClass *self, int *number, char **message); -char *SC_create_errormsg(StatementClass *self); -RETCODE SC_execute(StatementClass *self); -RETCODE SC_fetch(StatementClass *self); -void SC_free_params(StatementClass *self, char option); -void SC_log_error(char *func, char *desc, StatementClass *self); -unsigned long SC_get_bookmark(StatementClass *self); +void InitializeStatementOptions(StatementOptions * opt); +char SC_Destructor(StatementClass * self); +int statement_type(char *statement); +char parse_statement(StatementClass * stmt); +void SC_pre_execute(StatementClass * self); +char SC_unbind_cols(StatementClass * self); +char SC_recycle_statement(StatementClass * self); + +void SC_clear_error(StatementClass * self); +char SC_get_error(StatementClass * self, int *number, char **message); +char *SC_create_errormsg(StatementClass * self); +RETCODE SC_execute(StatementClass * self); +RETCODE SC_fetch(StatementClass * self); +void SC_free_params(StatementClass * self, char option); +void SC_log_error(char *func, char *desc, StatementClass * self); +unsigned long SC_get_bookmark(StatementClass * self); #endif diff --git a/src/interfaces/odbc/tuple.c b/src/interfaces/odbc/tuple.c index 968f098a80..daf0fc6785 100644 --- a/src/interfaces/odbc/tuple.c +++ b/src/interfaces/odbc/tuple.c @@ -1,16 +1,16 @@ -/* Module: tuple.c +/* Module: tuple.c * - * Description: This module contains functions for setting the data for individual - * fields (TupleField structure) of a manual result set. + * Description: This module contains functions for setting the data for individual + * fields (TupleField structure) of a manual result set. * - * Important Note: These functions are ONLY used in building manual result sets for - * info functions (SQLTables, SQLColumns, etc.) + * Important Note: These functions are ONLY used in building manual result sets for + * info functions (SQLTables, SQLColumns, etc.) * - * Classes: n/a + * Classes: n/a * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -18,39 +18,43 @@ #include #include -void set_tuplefield_null(TupleField *tuple_field) +void +set_tuplefield_null(TupleField * tuple_field) { tuple_field->len = 0; - tuple_field->value = NULL; /* strdup(""); */ + tuple_field->value = NULL; /* strdup(""); */ } -void set_tuplefield_string(TupleField *tuple_field, char *string) +void +set_tuplefield_string(TupleField * tuple_field, char *string) { tuple_field->len = strlen(string); - tuple_field->value = malloc(strlen(string)+1); + tuple_field->value = malloc(strlen(string) + 1); strcpy(tuple_field->value, string); } -void set_tuplefield_int2(TupleField *tuple_field, Int2 value) +void +set_tuplefield_int2(TupleField * tuple_field, Int2 value) { -char buffer[10]; + char buffer[10]; - sprintf(buffer,"%d", value); + sprintf(buffer, "%d", value); - tuple_field->len = strlen(buffer)+1; + tuple_field->len = strlen(buffer) + 1; /* +1 ... is this correct (better be on the save side-...) */ tuple_field->value = strdup(buffer); } -void set_tuplefield_int4(TupleField *tuple_field, Int4 value) +void +set_tuplefield_int4(TupleField * tuple_field, Int4 value) { -char buffer[15]; + char buffer[15]; - sprintf(buffer,"%ld", value); + sprintf(buffer, "%ld", value); - tuple_field->len = strlen(buffer)+1; + tuple_field->len = strlen(buffer) + 1; /* +1 ... is this correct (better be on the save side-...) */ tuple_field->value = strdup(buffer); } diff --git a/src/interfaces/odbc/tuple.h b/src/interfaces/odbc/tuple.h index 628d5ce449..07f353af17 100644 --- a/src/interfaces/odbc/tuple.h +++ b/src/interfaces/odbc/tuple.h @@ -1,13 +1,13 @@ -/* File: tuple.h +/* File: tuple.h * - * Description: See "tuple.c" + * Description: See "tuple.c" * - * Important NOTE: The TupleField structure is used both to hold backend data and - * manual result set data. The "set_" functions and the TupleNode - * structure are only used for manual result sets by info routines. + * Important NOTE: The TupleField structure is used both to hold backend data and + * manual result set data. The "set_" functions and the TupleNode + * structure are only used for manual result sets by info routines. * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -17,15 +17,18 @@ #include "psqlodbc.h" /* Used by backend data AND manual result sets */ -struct TupleField_ { - Int4 len; /* length of the current Tuple */ - void *value; /* an array representing the value */ +struct TupleField_ +{ + Int4 len; /* length of the current Tuple */ + void *value; /* an array representing the value */ }; /* Used ONLY for manual result sets */ -struct TupleNode_ { - struct TupleNode_ *prev, *next; - TupleField tuple[1]; +struct TupleNode_ +{ + struct TupleNode_ *prev, + *next; + TupleField tuple[1]; }; /* These macros are wrappers for the corresponding set_tuplefield functions @@ -36,9 +39,9 @@ struct TupleNode_ { #define set_nullfield_int2(FLD, VAL) ((VAL) != -1 ? set_tuplefield_int2(FLD, (VAL)) : set_tuplefield_null(FLD)) #define set_nullfield_int4(FLD, VAL) ((VAL) != -1 ? set_tuplefield_int4(FLD, (VAL)) : set_tuplefield_null(FLD)) -void set_tuplefield_null(TupleField *tuple_field); -void set_tuplefield_string(TupleField *tuple_field, char *string); -void set_tuplefield_int2(TupleField *tuple_field, Int2 value); -void set_tuplefield_int4(TupleField *tuple_field, Int4 value); +void set_tuplefield_null(TupleField * tuple_field); +void set_tuplefield_string(TupleField * tuple_field, char *string); +void set_tuplefield_int2(TupleField * tuple_field, Int2 value); +void set_tuplefield_int4(TupleField * tuple_field, Int4 value); #endif diff --git a/src/interfaces/odbc/tuplelist.c b/src/interfaces/odbc/tuplelist.c index 75110896a7..a5745e350f 100644 --- a/src/interfaces/odbc/tuplelist.c +++ b/src/interfaces/odbc/tuplelist.c @@ -1,13 +1,13 @@ -/* Module: tuplelist.c +/* Module: tuplelist.c * - * Description: This module contains functions for creating a manual result set - * (the TupleList) and retrieving data from it for a specific row/column. + * Description: This module contains functions for creating a manual result set + * (the TupleList) and retrieving data from it for a specific row/column. * - * Classes: TupleListClass (Functions prefix: "TL_") + * Classes: TupleListClass (Functions prefix: "TL_") * - * API functions: none + * API functions: none * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -18,19 +18,20 @@ TupleListClass * TL_Constructor(UInt4 fieldcnt) { -TupleListClass *rv; + TupleListClass *rv; mylog("in TL_Constructor\n"); rv = (TupleListClass *) malloc(sizeof(TupleListClass)); - if (rv) { - - rv->num_fields = fieldcnt; - rv->num_tuples = 0; - rv->list_start = NULL; - rv->list_end = NULL; - rv->lastref = NULL; - rv->last_indexed = -1; + if (rv) + { + + rv->num_fields = fieldcnt; + rv->num_tuples = 0; + rv->list_start = NULL; + rv->list_end = NULL; + rv->lastref = NULL; + rv->last_indexed = -1; } mylog("exit TL_Constructor\n"); @@ -39,37 +40,40 @@ TupleListClass *rv; } void -TL_Destructor(TupleListClass *self) +TL_Destructor(TupleListClass * self) { -int lf; -TupleNode *node, *tp; + int lf; + TupleNode *node, + *tp; mylog("TupleList: in DESTRUCTOR\n"); - node = self->list_start; - while(node != NULL) { - for (lf=0; lf < self->num_fields; lf++) - if (node->tuple[lf].value != NULL) { - free(node->tuple[lf].value); - } - tp = node->next; - free(node); - node = tp; - } + node = self->list_start; + while (node != NULL) + { + for (lf = 0; lf < self->num_fields; lf++) + if (node->tuple[lf].value != NULL) + free(node->tuple[lf].value); + tp = node->next; + free(node); + node = tp; + } free(self); mylog("TupleList: exit DESTRUCTOR\n"); } - + void * -TL_get_fieldval(TupleListClass *self, Int4 tupleno, Int2 fieldno) +TL_get_fieldval(TupleListClass * self, Int4 tupleno, Int2 fieldno) { -Int4 lf; -Int4 delta, from_end; -char end_is_closer, start_is_closer; -TupleNode *rv; + Int4 lf; + Int4 delta, + from_end; + char end_is_closer, + start_is_closer; + TupleNode *rv; if (self->last_indexed == -1) /* we have an empty tuple list */ @@ -84,67 +88,88 @@ TupleNode *rv; /* illegel field number range */ return NULL; - /* check if we are accessing the same tuple that was used in - the last fetch (e.g: for fetching all the fields one after - another. Do this to speed things up - */ + /* + * check if we are accessing the same tuple that was used in the last + * fetch (e.g: for fetching all the fields one after another. Do this + * to speed things up + */ if (tupleno == self->last_indexed) return self->lastref->tuple[fieldno].value; - /* now for the tricky part... */ + /* now for the tricky part... */ - /* - Since random access is quite inefficient for linked lists we use - the lastref pointer that points to the last element referenced - by a get_fieldval() call in conjunction with the its index number - that is stored in last_indexed. (So we use some locality of - reference principle to speed things up) - */ + /* + * Since random access is quite inefficient for linked lists we use + * the lastref pointer that points to the last element referenced by a + * get_fieldval() call in conjunction with the its index number that + * is stored in last_indexed. (So we use some locality of reference + * principle to speed things up) + */ delta = tupleno - self->last_indexed; /* if delta is positive, we have to go forward */ - /* now check if we are closer to the start or the end of the list - than to our last_indexed pointer - */ + /* + * now check if we are closer to the start or the end of the list than + * to our last_indexed pointer + */ from_end = (self->num_tuples - 1) - tupleno; start_is_closer = labs(delta) > tupleno; - /* true if we are closer to the start of the list than to the - last_indexed pointer - */ + + /* + * true if we are closer to the start of the list than to the + * last_indexed pointer + */ end_is_closer = labs(delta) > from_end; /* true if we are closer at the end of the list */ - if (end_is_closer) { + if (end_is_closer) + { /* scanning from the end is the shortest way. so we do that... */ rv = self->list_end; - for (lf=0; lf < from_end; lf++) + for (lf = 0; lf < from_end; lf++) rv = rv->prev; - } else if (start_is_closer) { - /* the shortest way is to start the search from the head of the list */ + } + else if (start_is_closer) + { + + /* + * the shortest way is to start the search from the head of the + * list + */ rv = self->list_start; - for (lf=0; lf < tupleno; lf++) + for (lf = 0; lf < tupleno; lf++) rv = rv->next; - } else { + } + else + { /* the closest way is starting from our lastref - pointer */ rv = self->lastref; - /* at first determine whether we have to search forward or backwards */ - if (delta < 0) { + + /* + * at first determine whether we have to search forward or + * backwards + */ + if (delta < 0) + { /* we have to search backwards */ - for(lf=0; lf < (-1)*delta; lf++) + for (lf = 0; lf < (-1) * delta; lf++) rv = rv->prev; - } else { + } + else + { /* ok, we have to search forward... */ - for (lf=0; lf < delta; lf++) - rv = rv->next; + for (lf = 0; lf < delta; lf++) + rv = rv->next; } } - /* now we have got our return pointer, so update the lastref - and the last_indexed values - */ + /* + * now we have got our return pointer, so update the lastref and the + * last_indexed values + */ self->lastref = rv; self->last_indexed = tupleno; @@ -154,25 +179,32 @@ TupleNode *rv; char -TL_add_tuple(TupleListClass *self, TupleNode *new_field) +TL_add_tuple(TupleListClass * self, TupleNode * new_field) { - /* we append the tuple at the end of the doubly linked list - of the tuples we have already read in - */ + + /* + * we append the tuple at the end of the doubly linked list of the + * tuples we have already read in + */ new_field->prev = NULL; new_field->next = NULL; - if (self->list_start == NULL) { + if (self->list_start == NULL) + { /* the list is empty, we have to add the first tuple */ self->list_start = new_field; self->list_end = new_field; self->lastref = new_field; self->last_indexed = 0; - } else { - /* there is already an element in the list, so add the new - one at the end of the list - */ + } + else + { + + /* + * there is already an element in the list, so add the new one at + * the end of the list + */ self->list_end->next = new_field; new_field->prev = self->list_end; self->list_end = new_field; @@ -182,5 +214,3 @@ TL_add_tuple(TupleListClass *self, TupleNode *new_field) /* this method of building a list cannot fail, so we return 1 */ return 1; } - - diff --git a/src/interfaces/odbc/tuplelist.h b/src/interfaces/odbc/tuplelist.h index 0f0bdb42ff..1517e3336e 100644 --- a/src/interfaces/odbc/tuplelist.h +++ b/src/interfaces/odbc/tuplelist.h @@ -1,12 +1,12 @@ -/* File: tuplelist.h +/* File: tuplelist.h * - * Description: See "tuplelist.c" + * Description: See "tuplelist.c" * - * Important Note: This structure and its functions are ONLY used in building manual result - * sets for info functions (SQLTables, SQLColumns, etc.) + * Important Note: This structure and its functions are ONLY used in building manual result + * sets for info functions (SQLTables, SQLColumns, etc.) * - * Comments: See "notice.txt" for copyright and license information. + * Comments: See "notice.txt" for copyright and license information. * */ @@ -15,19 +15,22 @@ #include "psqlodbc.h" -struct TupleListClass_ { - Int4 num_fields; - Int4 num_tuples; - TupleNode *list_start, *list_end, *lastref; - Int4 last_indexed; +struct TupleListClass_ +{ + Int4 num_fields; + Int4 num_tuples; + TupleNode *list_start, + *list_end, + *lastref; + Int4 last_indexed; }; #define TL_get_num_tuples(x) (x->num_tuples) /* Create a TupleList. Each tuple consits of fieldcnt columns */ TupleListClass *TL_Constructor(UInt4 fieldcnt); -void TL_Destructor(TupleListClass *self); -void *TL_get_fieldval(TupleListClass *self, Int4 tupleno, Int2 fieldno); -char TL_add_tuple(TupleListClass *self, TupleNode *new_field); +void TL_Destructor(TupleListClass * self); +void *TL_get_fieldval(TupleListClass * self, Int4 tupleno, Int2 fieldno); +char TL_add_tuple(TupleListClass * self, TupleNode * new_field); #endif diff --git a/src/tools/pgindent/README b/src/tools/pgindent/README index 446010c9c5..ec12fd8f74 100644 --- a/src/tools/pgindent/README +++ b/src/tools/pgindent/README @@ -3,7 +3,7 @@ This can format all PostgreSQL *.c and *.h files, excluding libpq++, On 09/06/1997, from the top directory, I ran: - find . -name '*.[ch]' -type f -print | egrep -v '\+\+|/odbc/|s_lock.h' | xargs -n100 pgindent + find . -name '*.[ch]' -type f -print | egrep -v '\+\+|s_lock.h' | xargs -n100 pgindent The stock BSD indent has two bugs. First, a comment after the word 'else' causes the rest of the file to be ignored. Second, it silently ignores -- GitLab