2) (Maybe) fix a bug reported by Mika Muntila.
if (buf)
{
- CVT_APPEND_DATA(buf, used);
+ switch (used)
+ {
+ case SQL_NULL_DATA:
+ break;
+ case SQL_NTS:
+ CVT_APPEND_STR(buf);
+ break;
+ default:
+ CVT_APPEND_DATA(buf, used);
+ }
}
else
- {
CVT_APPEND_STR(param_string);
- }
if (param_sqltype == SQL_BIT)
CVT_APPEND_CHAR('\''); /* Close Quote */
if (len >= cbConnStrOutMax)
{
+ int clen;
+ for (clen = strlen(szConnStrOut) - 1; clen >= 0 && szConnStrOut[clen] != ';'; clen--)
+ szConnStrOut[clen] = '\0';
result = SQL_SUCCESS_WITH_INFO;
conn->errornumber = CONN_TRUNCATED;
conn->errormsg = "The buffer was too small for the ConnStrOut.";
{
char *msg;
int status;
+ BOOL once_again = FALSE;
+ SWORD msglen;
mylog("**** PGAPI_Error: henv=%u, hdbc=%u, hstmt=%u <%d>\n", henv, hdbc, hstmt, cbErrorMsgMax);
{
/* CC: return an error of a hstmt */
StatementClass *stmt = (StatementClass *) hstmt;
- SWORD msglen;
- BOOL once_again = FALSE;
if (SC_get_error(stmt, &status, &msg))
{
return SQL_NO_DATA_FOUND;
}
+ msglen = strlen(msg);
if (NULL != pcbErrorMsg)
- *pcbErrorMsg = (SWORD) strlen(msg);
+ {
+ *pcbErrorMsg = msglen;
+ if (cbErrorMsgMax == 0)
+ once_again = TRUE;
+ else if (msglen >= cbErrorMsgMax)
+ *pcbErrorMsg = cbErrorMsgMax - 1;
+ }
if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0))
strncpy_null(szErrorMsg, msg, cbErrorMsgMax);
if (NULL != pfNativeError)
return SQL_NO_DATA_FOUND;
}
- return SQL_SUCCESS;
+ if (once_again)
+ {
+ conn->errornumber = status;
+ return SQL_SUCCESS_WITH_INFO;
+ }
+ else
+ return SQL_SUCCESS;
}
else if (SQL_NULL_HENV != henv)
{
SWORD cbProcName)
{
static char *func = "PGAPI_Procedures";
+ StatementClass *stmt = (StatementClass *) hstmt;
+ Int2 result_cols;
mylog("%s: entering...\n", func);
+ /*
+ * a statement is actually executed, so we'll have to do this
+ * ourselves.
+ */
+ result_cols = 8;
+ extend_bindings(stmt, result_cols);
+
+ /* set the field names */
+ QR_set_num_fields(stmt->result, result_cols);
+ QR_set_field_info(stmt->result, 0, "PROCEDURE_CAT", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 1, "PROCEDURE_SCHEM", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 2, "PROCEDURE_NAME", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 3, "NUM_INPUT_PARAMS", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 4, "NUM_OUTPUT_PARAMS", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 5, "NUM_RESULT_SET", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 6, "REMARKS", PG_TYPE_TEXT, MAX_INFO_STRING);
+ QR_set_field_info(stmt->result, 7, "PROCEDURE_TYPE", PG_TYPE_INT2, 2);
+
SC_log_error(func, "Function not implemented", (StatementClass *) hstmt);
return SQL_ERROR;
}
/* Character types (and NUMERIC) use the default precision */
case PG_TYPE_VARCHAR:
case PG_TYPE_BPCHAR:
+#ifdef MULTIBYTE
+ /* after 7.2 */
+ if (PG_VERSION_GE(SC_get_conn(stmt), 7.2)
+ return 3 * pgtype_precision(stmt, type, col, handle_unknown_size_as);
+ else
+#else
+ /* CR -> CR/LF */
return 2 * pgtype_precision(stmt, type, col, handle_unknown_size_as);
+#endif /* MULTIBYTE */
default:
return pgtype_precision(stmt, type, col, handle_unknown_size_as);
}
SQLSetScrollOptions @69
SQLTablePrivileges @70
SQLBindParameter @72
-
-SQLAllocHandle @80
-SQLBindParam @81
-SQLCloseCursor @82
-SQLColAttribute @83
-SQLCopyDesc @84
-SQLEndTran @85
-SQLFetchScroll @86
-SQLFreeHandle @87
-SQLGetDescField @88
-SQLGetDescRec @89
-SQLGetDiagField @90
-SQLGetDiagRec @91
-SQLGetEnvAttr @92
-SQLGetConnectAttr @93
-SQLGetStmtAttr @94
-SQLSetConnectAttr @95
-SQLSetDescField @96
-SQLSetDescRec @97
-SQLSetEnvAttr @98
-SQLSetStmtAttr @99
-
SQLDummyOrdinal @199
dconn_FDriverConnectProc @200
DllMain @201