diff options
author | Bruce Momjian <bruce@momjian.us> | 2001-02-10 07:01:19 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2001-02-10 07:01:19 +0000 |
commit | 755a87332adccd3ad8d08bd16ad490e82b009496 (patch) | |
tree | f3fb28c376384c5b671020d751f988bd32e14beb | |
parent | 505a828a661cb4ec8ff9dc3abc69db5fb939bc54 (diff) | |
download | postgresql-755a87332adccd3ad8d08bd16ad490e82b009496.tar.gz postgresql-755a87332adccd3ad8d08bd16ad490e82b009496.zip |
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.
44 files changed, 10952 insertions, 9161 deletions
diff --git a/src/interfaces/odbc/bind.c b/src/interfaces/odbc/bind.c index ce25c4a1c3a..5589db97374 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; i<stmt->bindings_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 39e594f3460..11ac37a0af5 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 75fdd9f4f68..4969846e14b 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 3ec1cc92d50..43b21473b70 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 cc09c4aa2fd..aa283f48820 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 <odbcinst.h> #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 9169583e457..7bd22f00677 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 f033ce4b3ff..8542936d5c7 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)?"<NULL>":value, cbValueMax); + mylog("copy_and_convert: field_type = %d, fctype = %d, value = '%s', cbValueMax=%d\n", field_type, fCType, (value == NULL) ? "<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 7fd82547790..1660f8084f2 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 2bbf46faea9..5f8e276a0ab 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 <string.h> -# 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 <string.h> +#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 5be8b4fa508..05486a34f1b 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 cbc25467266..3ced0103f97 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 637b5fc160b..d769234e441 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 47018e7b38f..7b208e7eae9 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 57199f73966..229579708e1 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 <MAX_CONNECTIONS; lf++) { + /* + * 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 < MAX_CONNECTIONS; lf++) + { conn = conns[lf]; if (conn && conn->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 f14e95f2ce4..6f693009659 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 <stdio.h> @@ -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 c2c81965f09..03e2db9c445 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 9ee92c0687f..f777a71707d 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 <ctype.h> #else #include <windows.h> -#include <sql.h> +#include <sql.h> #include <sqlext.h> #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:"<NULL>", len, value, cbInfoValueMax); + mylog("SQLGetInfo: p='%s', len=%d, value=%d, cbMax=%d\n", p ? p : "<NULL>", 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 ab6a6015ada..ef3df399a6c 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 <stdlib.h> -# include <sys/types.h> - -# 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 <windows.h> -# include <windowsx.h> - -# 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 <stdlib.h> +#include <sys/types.h> + +#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 <windows.h> +#include <windowsx.h> + +#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 deeddd3db04..de50b892487 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 b14b15af198..06bace95d48 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 c31591a65bb..0f1fd3b7c10 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 8c4a3075d15..d8ab76bd247 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 b35c5c3d5b6..3dd6c93e0b4 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 <sys/types.h> #include <unistd.h> #else -#include <process.h> /* Byron: is this where Windows keeps def. of getpid ? */ +#include <process.h> /* 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 ebe56ea9d80..e5e916465ed 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 67c973ec0ac..acb36a2a967 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 dd85e66dceb..20fedccccd7 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 91a1b3d37ff..7139f57a19e 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 f9c48ff64f1..0c82f6487f3 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 c5770f9d33c..ef6345cdd2d 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 96588de5906..1db83bd9a05 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 <stdio.h> /* for FILE* pointers: see GLOBAL_VALUES */ +#include <stdio.h> /* 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 eaffef5b793..bc28126cf73 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 93f11cee1f4..0c284ca0170 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 cfe83cf10e8..60e0e61f454 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 3ef098a91b7..c3687ec250b 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 <stdio.h> @@ -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 4c31afed49e..51cf6482c83 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 917951f49d4..dfc8175db9c 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 <stdlib.h> -#include <string.h> /* for memset */ +#include <string.h> /* 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 0b4b9101d6f..08bd63528c3 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 82eaffefd55..0069d5e3413 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)?"<NULL>":value); + mylog("value = '%s'\n", (value == NULL) ? "<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 ae2df856b25..20402b5390b 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 968f098a80c..daf0fc67859 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 <string.h> #include <stdlib.h> -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 628d5ce449c..07f353af179 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 75110896a72..a5745e350ff 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 0f0bdb42ffb..1517e3336ed 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 446010c9c50..ec12fd8f740 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 |