diff options
Diffstat (limited to 'src/interfaces/odbc/convert.c')
-rw-r--r-- | src/interfaces/odbc/convert.c | 1879 |
1 files changed, 871 insertions, 1008 deletions
diff --git a/src/interfaces/odbc/convert.c b/src/interfaces/odbc/convert.c index 532f58a7c57..95ac701247b 100644 --- a/src/interfaces/odbc/convert.c +++ b/src/interfaces/odbc/convert.c @@ -1,17 +1,18 @@ -/* 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,7 +53,6 @@ #endif #ifndef SCHAR typedef signed char SCHAR; - #endif #endif @@ -64,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 ************** @@ -145,10 +145,10 @@ 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 ******************************************************************************/ @@ -156,71 +156,69 @@ char *conv_to_octal(unsigned char val); int 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, +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; + } 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); } @@ -228,125 +226,108 @@ 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; + 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; - if (s[0] == 'T' || s[0] == 't') - s[0] = '1'; - else - s[0] = '0'; - } - break; + nval++; - /* 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; - } + /* 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; + 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); @@ -355,315 +336,300 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 rgbValueBindRow = (char *) rgbValue + rgbValueOffset; - if (fCType == SQL_C_CHAR) - { - /* Special character formatting as required */ + if(fCType == SQL_C_CHAR) { - /* - * 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_TIME: - len = 8; - if (cbValueMax > len) - sprintf(rgbValueBindRow, "%.2d:%.2d:%.2d", st.hh, st.mm, st.ss); - break; + /* 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; - 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; + case PG_TYPE_TIME: + len = 8; + if (cbValueMax > len) + sprintf(rgbValueBindRow, "%.2d:%.2d:%.2d", st.hh, st.mm, st.ss); + 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_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; - /* - * 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; + case PG_TYPE_BOOL: + len = 1; + if (cbValueMax > len) { + strcpy(rgbValueBindRow, value); + mylog("PG_TYPE_BOOL: rgbValueBindRow = '%s'\n", rgbValueBindRow); + } + 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; - } - else - stmt->bindings[stmt->current_col].data_left = strlen(ptr); + /* 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; } + 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; - - 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; + 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_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_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_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_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; - /* - * 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); + } + /* mylog("SQL_C_BIT: val = %d, cb = %d, rgb=%d\n", atoi(value), cbValueMax, *((UCHAR *)rgbValue)); */ + 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_BINARY: + case SQL_C_BINARY: - /* truncate if necessary */ - /* convert octal escapes to bytes */ + /* truncate if necessary */ + /* convert octal escapes to bytes */ - len = convert_from_pgbinary(value, tempBuf, sizeof(tempBuf)); - ptr = tempBuf; + len = convert_from_pgbinary(value, tempBuf, sizeof(tempBuf)); + ptr = tempBuf; - if (stmt->current_col >= 0) - { - /* 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; } - if (cbValueMax > 0) - { - copy_len = (len > cbValueMax) ? cbValueMax : len; + /* First call to SQLGetData so initialize data_left */ + else + stmt->bindings[stmt->current_col].data_left = 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; - } + if (cbValueMax > 0) { + copy_len = (len > cbValueMax) ? cbValueMax : len; - /* - * Finally, check for truncation so that proper status can - * be returned - */ - if (len > cbValueMax) - result = COPY_RESULT_TRUNCATED; + /* Copy the data */ + memcpy(rgbValueBindRow, ptr, copy_len); - mylog("SQL_C_BINARY: len = %d, copy_len = %d\n", len, copy_len); - break; + /* Adjust data_left for next time */ + if (stmt->current_col >= 0) { + stmt->bindings[stmt->current_col].data_left -= copy_len; + } + } - default: - return COPY_UNSUPPORTED_TYPE; + /* 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; } } - /* 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; + } @@ -674,95 +640,80 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 int 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++) - { - /* Squeeze carriage-return/linefeed pairs to linefeed only */ - if (old_statement[opos] == '\r' && opos + 1 < oldstmtlen && - old_statement[opos + 1] == '\n') + 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') { 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; } @@ -774,15 +725,12 @@ copy_statement_with_parameters(StatementClass *stmt) 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); @@ -793,396 +741,363 @@ copy_statement_with_parameters(StatementClass *stmt) /****************************************************/ - /* 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; - /* 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; - case SQL_C_DOUBLE: - sprintf(param_string, "%f", - *((SDOUBLE *) buffer)); - break; + case SQL_C_FLOAT: + sprintf(param_string, "%f", + *((SFLOAT *) buffer)); + break; - case SQL_C_FLOAT: - sprintf(param_string, "%f", - *((SFLOAT *) buffer)); - break; + case SQL_C_SLONG: + case SQL_C_LONG: + sprintf(param_string, "%ld", + *((SDWORD *) buffer)); + break; - case SQL_C_SLONG: - case SQL_C_LONG: - sprintf(param_string, "%ld", - *((SDWORD *) buffer)); - break; + case SQL_C_SSHORT: + case SQL_C_SHORT: + sprintf(param_string, "%d", + *((SWORD *) buffer)); + break; - case SQL_C_SSHORT: - case SQL_C_SHORT: - sprintf(param_string, "%d", - *((SWORD *) buffer)); - break; + case SQL_C_STINYINT: + case SQL_C_TINYINT: + sprintf(param_string, "%d", + *((SCHAR *) buffer)); + break; - case SQL_C_STINYINT: - case SQL_C_TINYINT: - sprintf(param_string, "%d", - *((SCHAR *) buffer)); - break; + case SQL_C_ULONG: + sprintf(param_string, "%lu", + *((UDWORD *) buffer)); + break; - case SQL_C_ULONG: - sprintf(param_string, "%lu", - *((UDWORD *) buffer)); - break; + case SQL_C_USHORT: + sprintf(param_string, "%u", + *((UWORD *) buffer)); + break; - case SQL_C_USHORT: - sprintf(param_string, "%u", - *((UWORD *) buffer)); - break; + case SQL_C_UTINYINT: + sprintf(param_string, "%u", + *((UCHAR *) buffer)); + break; - case SQL_C_UTINYINT: - sprintf(param_string, "%u", - *((UCHAR *) buffer)); - break; + case SQL_C_BIT: { + int i = *((UCHAR *) buffer); + + sprintf(param_string, "%d", i ? 1 : 0); + break; + } - case SQL_C_BIT: - { - int i = *((UCHAR *) buffer); + case SQL_C_DATE: { + DATE_STRUCT *ds = (DATE_STRUCT *) buffer; + st.m = ds->month; + st.d = ds->day; + st.y = ds->year; - sprintf(param_string, "%d", i ? 1 : 0); - break; - } + break; + } - case SQL_C_DATE: - { - DATE_STRUCT *ds = (DATE_STRUCT *) buffer; + case SQL_C_TIME: { + TIME_STRUCT *ts = (TIME_STRUCT *) buffer; + st.hh = ts->hour; + st.mm = ts->minute; + st.ss = ts->second; - st.m = ds->month; - st.d = ds->day; - st.y = ds->year; + break; + } - break; - } + 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; - case SQL_C_TIME: - { - TIME_STRUCT *ts = (TIME_STRUCT *) buffer; + 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); - st.hh = ts->hour; - st.mm = ts->minute; - st.ss = ts->second; + break; - break; - } + } + 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; + } - case SQL_C_TIMESTAMP: - { - TIMESTAMP_STRUCT *tss = (TIMESTAMP_STRUCT *) buffer; + /* Now that the input data is in a neutral format, convert it to + the desired output format (sqltype) + */ - st.m = tss->month; - st.d = tss->day; - st.y = tss->year; - st.hh = tss->hour; - st.mm = tss->minute; - st.ss = tss->second; + switch(param_sqltype) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: - 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); + new_statement[npos++] = '\''; /* Open Quote */ - break; - } - 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 a SQL_C_CHAR */ + if (buf) { + convert_special_chars(buf, &new_statement[npos], used); + npos += strlen(&new_statement[npos]); + } - /* - * Now that the input data is in a neutral format, convert it to - * the desired output format (sqltype) - */ + /* it was a numeric type */ + else if (param_string[0] != '\0') { + strcpy(&new_statement[npos], param_string); + npos += strlen(param_string); + } - switch (param_sqltype) - { - case SQL_CHAR: - case SQL_VARCHAR: - case SQL_LONGVARCHAR: + /* 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); - new_statement[npos++] = '\''; /* Open Quote */ + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + } - /* it was a SQL_C_CHAR */ - if (buf) - { - convert_special_chars(buf, &new_statement[npos], used); - npos += strlen(&new_statement[npos]); - } + new_statement[npos++] = '\''; /* Close Quote */ - /* it was a numeric type */ - else if (param_string[0] != '\0') - { - strcpy(&new_statement[npos], param_string); - npos += strlen(param_string); - } + break; - /* 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); + case SQL_DATE: + 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, "'%.4d-%.2d-%.2d'", st.y, st.m, st.d); - new_statement[npos++] = '\''; /* Close Quote */ + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + break; - break; + case SQL_TIME: + if (buf) { /* copy char data to time */ + my_strcpy(cbuf, sizeof(cbuf), buf, used); + parse_datetime(cbuf, &st); + } - case SQL_DATE: - if (buf) - { /* copy char data to time */ - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + sprintf(tmp, "'%.2d:%.2d:%.2d'", st.hh, st.mm, st.ss); - sprintf(tmp, "'%.4d-%.2d-%.2d'", st.y, st.m, st.d); + strcpy(&new_statement[npos], tmp); + npos += strlen(tmp); + break; - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); - break; + case SQL_TIMESTAMP: - case SQL_TIME: - if (buf) - { /* copy char data to time */ - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + if (buf) { + my_strcpy(cbuf, sizeof(cbuf), buf, used); + parse_datetime(cbuf, &st); + } - sprintf(tmp, "'%.2d:%.2d:%.2d'", st.hh, st.mm, st.ss); + 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_TIMESTAMP: + break; - if (buf) - { - my_strcpy(cbuf, sizeof(cbuf), buf, used); - parse_datetime(cbuf, &st); - } + case SQL_BINARY: + case SQL_VARBINARY: /* non-ascii characters should be converted to octal */ + new_statement[npos++] = '\''; /* Open Quote */ - sprintf(tmp, "'%.4d-%.2d-%.2d %.2d:%.2d:%.2d'", - st.y, st.m, st.d, st.hh, st.mm, st.ss); + mylog("SQL_VARBINARY: about to call convert_to_pgbinary, used = %d\n", used); - strcpy(&new_statement[npos], tmp); - npos += strlen(tmp); + npos += convert_to_pgbinary(buf, &new_statement[npos], used); - break; + new_statement[npos++] = '\''; /* Close Quote */ + + break; + + case SQL_LONGVARBINARY: + + 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) - lobj_oid = stmt->parameters[param_number].lobj_oid; - 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; - } + lo_close(stmt->hdbc, lobj_fd); - CC_set_in_trans(stmt->hdbc); - } + /* commit transaction if needed */ + if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) { + QResultClass *res; + char ok; - /* store the oid */ - lobj_oid = lo_creat(stmt->hdbc, INV_READ | INV_WRITE); - if (lobj_oid == 0) - { + res = CC_send_query(stmt->hdbc, "COMMIT", NULL); + if (!res) { + stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; - stmt->errormsg = "Couldnt create (in-line) large object."; SC_log_error(func, "", stmt); return SQL_ERROR; } - - /* store the fd */ - lobj_fd = lo_open(stmt->hdbc, lobj_oid, INV_WRITE); - if (lobj_fd < 0) - { + ok = QR_command_successful(res); + QR_Destructor(res); + if (!ok) { + stmt->errormsg = "Could not commit (in-line) a transaction"; stmt->errornumber = STMT_EXEC_ERROR; - stmt->errormsg = "Couldnt open (in-line) large object for writing."; SC_log_error(func, "", stmt); return SQL_ERROR; } - retval = lo_write(stmt->hdbc, lobj_fd, buffer, used); + CC_set_no_trans(stmt->hdbc); + } + } - lo_close(stmt->hdbc, lobj_fd); + /* 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); - /* commit transaction if needed */ - if (!globals.use_declarefetch && CC_is_in_autocommit(stmt->hdbc)) - { - QResultClass *res; - char ok; + break; - 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; - } + /* because of no conversion operator for bool and int4, SQL_BIT */ + /* must be quoted (0 or 1 is ok to use inside the quotes) */ - CC_set_no_trans(stmt->hdbc); - } - } + default: /* a numeric type or SQL_BIT */ + if (param_sqltype == SQL_BIT) + new_statement[npos++] = '\''; /* Open Quote */ - /* - * 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); + 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); + } - 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 (param_sqltype == SQL_BIT) + new_statement[npos++] = '\''; /* Close 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; - 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); } @@ -1192,10 +1107,10 @@ copy_statement_with_parameters(StatementClass *stmt) 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; @@ -1207,40 +1122,34 @@ mapFunction(char *func) 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'; @@ -1249,51 +1158,45 @@ convert_escape(char *value) 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; } return escape; + } 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 @@ -1310,23 +1213,17 @@ convert_money(char *s) char 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; @@ -1337,13 +1234,12 @@ parse_datetime(char *buf, SIMPLE_TIME *st) 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; @@ -1352,8 +1248,7 @@ parse_datetime(char *buf, SIMPLE_TIME *st) } 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; @@ -1368,16 +1263,12 @@ parse_datetime(char *buf, SIMPLE_TIME *st) 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; } @@ -1392,17 +1283,15 @@ convert_linefeeds(char *si, char *dst, size_t max) 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; @@ -1416,9 +1305,8 @@ convert_special_chars(char *si, char *dst, int used) 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++] = '\\'; @@ -1442,32 +1330,31 @@ 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; + } unsigned int conv_from_hex(unsigned char *s) { - int i, - y = 0, - val; - - 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'; +int i, y=0, val; + + 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'; - y += val * (int) pow(16, 2 - i); + y += val * (int) pow(16, 2-i); } return y; @@ -1477,24 +1364,23 @@ conv_from_hex(unsigned char *s) 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; } @@ -1503,15 +1389,14 @@ convert_from_pgbinary(unsigned char *value, unsigned char *rgbValue, int cbValue 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; } @@ -1523,20 +1408,19 @@ conv_to_octal(unsigned char val) 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; } + } mylog("convert_to_pgbinary: returning %d, out='%.*s'\n", o, o, out); @@ -1548,20 +1432,17 @@ convert_to_pgbinary(unsigned char *in, char *out, int len) 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; } @@ -1575,17 +1456,14 @@ 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]; @@ -1605,52 +1483,45 @@ decode(char *in, char *out) 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, +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; @@ -1661,58 +1532,53 @@ 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; @@ -1737,31 +1603,27 @@ 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; @@ -1770,9 +1632,10 @@ 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 */ } return result; + } |