]> granicus.if.org Git - postgresql/commitdiff
Bug fixes for the 2002-03-08 change.
authorHiroshi Inoue <inoue@tpf.co.jp>
Mon, 11 Mar 2002 10:25:57 +0000 (10:25 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Mon, 11 Mar 2002 10:25:57 +0000 (10:25 +0000)
1) Put back the error message for SQLError().
2) Change Disallow premature to handle the SELECTed
   result.
3) Put back the behavior of AUTUCOMMIT mode change.
4) Fix SQLColumns for ODBC3.0.

5) Improve the handling of variable bookmark in ODBC3.0.
6) Enable Recognize Unique Index Button.

src/interfaces/odbc/bind.c
src/interfaces/odbc/connection.c
src/interfaces/odbc/convert.c
src/interfaces/odbc/dlg_specific.c
src/interfaces/odbc/info.c
src/interfaces/odbc/options.c
src/interfaces/odbc/psqlodbc.h
src/interfaces/odbc/results.c
src/interfaces/odbc/statement.c

index 6ce32c7982b8848d0c783b7786383b9e95506a05..b7303c478593a53ed4893993c961964f5b9083db 100644 (file)
@@ -199,12 +199,20 @@ PGAPI_BindCol(
                else
                {
                        /* Make sure it is the bookmark data type */
-                       if (fCType != SQL_C_BOOKMARK)
+                       if (fCType == SQL_C_BOOKMARK)
+                       switch (fCType)
                        {
-                               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;
+                               case SQL_C_BOOKMARK:
+#if (ODBCVER >= 0x0300)
+                               case SQL_C_VARBOOKMARK:
+#endif /* ODBCVER */
+                                       break;
+                               default:
+                                       stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK";
+inolog("Column 0 is type %d not of type SQL_C_BOOKMARK", fCType);
+                                       stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE;
+                                       SC_log_error(func, "", stmt);
+                                       return SQL_ERROR;
                        }
 
                        stmt->bookmark.buffer = rgbValue;
index 44d7589496a478da99e2adc33eef5207437562de..d176d925d4ada5669e0b2c65ef81de7b073eeda1 100644 (file)
@@ -1322,7 +1322,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
                                if ((swallow != '\0') || SOCK_get_errcode(sock) != 0)
                                {
                                        self->errornumber = CONNECTION_BACKEND_CRAZY;
-                                       self->errormsg = "Unexpected protocol character from backend (send_query - I)";
+                                       QR_set_message(res, "Unexpected protocol character from backend (send_query - I)");
                                        QR_set_status(res, PGRES_FATAL_ERROR);
                                        ReadyToReturn = TRUE;
                                        retres = cmdres;
@@ -1346,14 +1346,13 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
                                if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer) - 1] == '\n')
                                        msgbuffer[strlen(msgbuffer) - 1] = '\0';
 
-                               self->errormsg = msgbuffer;
 
-                               mylog("send_query: 'E' - %s\n", self->errormsg);
-                               qlog("ERROR from backend during send_query: '%s'\n", self->errormsg);
+                               mylog("send_query: 'E' - %s\n", msgbuffer);
+                               qlog("ERROR from backend during send_query: '%s'\n", msgbuffer);
 
                                /* We should report that an error occured. Zoltan */
 
-                               if (!strncmp(self->errormsg, "FATAL", 5))
+                               if (!strncmp(msgbuffer, "FATAL", 5))
                                {
                                        self->errornumber = CONNECTION_SERVER_REPORTED_ERROR;
                                        CC_set_no_trans(self);
@@ -1361,6 +1360,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
                                else
                                        self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
                                QR_set_status(res, PGRES_FATAL_ERROR);
+                               QR_set_message(res, msgbuffer);
                                QR_set_aborted(res, TRUE);
                                aborted = TRUE;
                                while (msg_truncated)
@@ -1487,7 +1487,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
                                        retres = NULL;
                                }
                        }
-                       else
+                       if (retres)
                        {
                                /*
                                 *      discard results other than errors.
@@ -1501,6 +1501,11 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
                                        qres->next = NULL;
                                        QR_Destructor(qres);
                                }
+                               /*
+                                *      If error message isn't set
+                                */
+                               if (retres && (!self->errormsg || !self->errormsg[0]))
+                                       self->errormsg = QR_get_message(retres);
                        }
                }
        }
index a38ffd1de8313605238d294136112c2c5ac3cb3f..6ba6587f6406e0896a4dc15843d1c748464fb667 100644 (file)
@@ -349,8 +349,8 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2
        {
                pbic = &stmt->bindings[stmt->current_col];
                if (pbic->data_left == -2)
-                       pbic->data_left = (cbValueMax > 0) ? 0 : -1;            /* This seems to be *
-                                                                                                                                * needed for ADO ? */
+                       pbic->data_left = (cbValueMax > 0) ? 0 : -1; /* This seems to be *
+                                                * needed for ADO ? */
                if (pbic->data_left == 0)
                {
                        if (pbic->ttlbuf != NULL)
index 4fbf037cec204d01bedf905d08aea74b9eff3d90..d165f1300f1cb9230eec0a8004bc89f4077759e0 100644 (file)
@@ -175,9 +175,9 @@ driver_options_update(HWND hdlg, ConnInfo *ci, BOOL updateProfile)
        comval->commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG);
        comval->disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER);
        comval->ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO);
+       comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
        if (!ci)
        {
-               comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
                comval->onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY);
        }
        comval->use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH);
@@ -442,15 +442,13 @@ updateCommons(const ConnInfo *ci)
        SQLWritePrivateProfileString(sectionName,
                                                                 INI_KSQO, tmp, fileName);
 
+       sprintf(tmp, "%d", comval->unique_index);
+       SQLWritePrivateProfileString(sectionName, INI_UNIQUEINDEX, tmp, fileName);
        /*
-        * Never update the onlyread, unique_index from this module.
+        * Never update the onlyread from this module.
         */
        if (!ci)
        {
-               sprintf(tmp, "%d", comval->unique_index);
-               SQLWritePrivateProfileString(sectionName, INI_UNIQUEINDEX, tmp,
-                                                                        fileName);
-
                sprintf(tmp, "%d", comval->onlyread);
                SQLWritePrivateProfileString(sectionName, INI_READONLY, tmp,
                                                                         fileName);
index fc5dcef34152a309d7b1eaddb45953c3fb3df315..10a900207c61e4e2409386abbaccd0f45d93c321 100644 (file)
@@ -1734,7 +1734,11 @@ PGAPI_Columns(
         * a statement is actually executed, so we'll have to do this
         * ourselves.
         */
+#if (ODBCVER >= 0x0300)
+       result_cols = 18;
+#else
        result_cols = 14;
+#endif /* ODBCVER */
        extend_bindings(stmt, result_cols);
 
        /* set the field names */
@@ -1803,7 +1807,12 @@ PGAPI_Columns(
                        set_tuplefield_string(&row->tuple[11], "");
 
 #if (ODBCVER >= 0x0300)
+                       set_tuplefield_null(&row->tuple[12]);
                        set_tuplefield_int2(&row->tuple[13], sqltype);
+                       set_tuplefield_null(&row->tuple[14]);
+                       set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC));
+                       set_tuplefield_int4(&row->tuple[16], 0);
+                       set_tuplefield_string(&row->tuple[17], "No");
 #else
                        set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC));
                        set_tuplefield_int4(&row->tuple[13], the_type);
@@ -1918,9 +1927,12 @@ PGAPI_Columns(
                                break;
                        default:
                                set_tuplefield_int2(&row->tuple[13], sqltype);
+                               set_tuplefield_null(&row->tuple[14]);
                                break;
                }
+               set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, field_type, PG_STATIC, PG_STATIC));
                set_tuplefield_int4(&row->tuple[16], field_number);
+               set_tuplefield_null(&row->tuple[17]);
 #else
                set_tuplefield_int4(&row->tuple[13], field_type);
 #endif /* ODBCVER */
@@ -1956,7 +1968,8 @@ PGAPI_Columns(
                set_tuplefield_string(&row->tuple[1], "");
                set_tuplefield_string(&row->tuple[2], table_name);
                set_tuplefield_string(&row->tuple[3], "xmin");
-               set_tuplefield_int2(&row->tuple[4], pgtype_to_sqltype(stmt, the_type));
+               sqltype = pgtype_to_sqltype(stmt, the_type);
+               set_tuplefield_int2(&row->tuple[4], sqltype);
                set_tuplefield_string(&row->tuple[5], pgtype_to_name(stmt, the_type));
                set_tuplefield_int4(&row->tuple[6], pgtype_precision(stmt, the_type, PG_STATIC, PG_STATIC));
                set_tuplefield_int4(&row->tuple[7], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC));
@@ -1964,8 +1977,17 @@ PGAPI_Columns(
                set_nullfield_int2(&row->tuple[9], pgtype_radix(stmt, the_type));
                set_tuplefield_int2(&row->tuple[10], SQL_NO_NULLS);
                set_tuplefield_string(&row->tuple[11], "");
+#if (ODBCVER >= 0x0300)
+               set_tuplefield_null(&row->tuple[12]);
+               set_tuplefield_int2(&row->tuple[13], sqltype);
+               set_tuplefield_null(&row->tuple[14]);
+               set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC));
+               set_tuplefield_int4(&row->tuple[16], 0);
+               set_tuplefield_string(&row->tuple[17], "No");
+#else
                set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC));
                set_tuplefield_int4(&row->tuple[13], the_type);
+#endif /* ODBCVER */
 
                QR_add_tuple(res, row);
        }
index d58f84916fc0b8086675882415be48b62a45bde5..c8e07700c836a79652a13e51748b7f549a57c907 100644 (file)
@@ -342,9 +342,9 @@ PGAPI_SetConnectOption(
                        break;
 
                case SQL_AUTOCOMMIT:
-                       if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_trans(conn))
+                       if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_autocommit(conn))
                                break;
-                       else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_trans(conn))
+                       else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_autocommit(conn))
                                break;
                        if (CC_is_in_trans(conn))
                                CC_commit(conn);
index 534678e2802e28060924a5e1e084a6074f9e6256..8fba1abd30d77d064f505779c6e4334bc3f9d92b 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Comments:           See "notice.txt" for copyright and license information.
  *
- * $Id: psqlodbc.h,v 1.58 2002/03/08 08:52:53 inoue Exp $
+ * $Id: psqlodbc.h,v 1.59 2002/03/11 10:25:57 inoue Exp $
  *
  */
 
index e43c0e3db45df71f06d6c9ca89f458d7894821a1..13f223b7205fbd1d315639bbe544728242ea7774 100644 (file)
@@ -189,6 +189,7 @@ PGAPI_DescribeCol(
 
        /* gets all the information about a specific column */
        StatementClass *stmt = (StatementClass *) hstmt;
+       ConnectionClass *conn;
        QResultClass *res;
        char       *col_name = NULL;
        Int4            fieldtype = 0;
@@ -200,7 +201,7 @@ PGAPI_DescribeCol(
        int                     len = 0;
        RETCODE         result;
 
-       mylog("%s: entering...\n", func);
+       mylog("%s: entering.%d..\n", func, icol);
 
        if (!stmt)
        {
@@ -208,14 +209,16 @@ PGAPI_DescribeCol(
                return SQL_INVALID_HANDLE;
        }
 
-       ci = &(SC_get_conn(stmt)->connInfo);
+       conn = SC_get_conn(stmt);
+       ci = &(conn->connInfo);
 
        SC_clear_error(stmt);
 
 #if (ODBCVER >= 0x0300)
        if (0 == icol) /* bookmark column */
        {
-               SQLSMALLINT     fType = SQL_INTEGER;
+               SQLSMALLINT     fType = stmt->options.use_bookmarks == SQL_UB_VARIABLE ? SQL_BINARY : SQL_INTEGER;
+
                if (szColName && cbColNameMax > 0)
                        *szColName = '\0';
                if (pcbColName)
@@ -440,7 +443,7 @@ PGAPI_ColAttributes(
                                break;
                        case SQL_DESC_TYPE:
                                if (pfDesc)
-                                       *pfDesc = SQL_INTEGER;
+                                       *pfDesc = stmt->options.use_bookmarks == SQL_UB_VARIABLE ? SQL_BINARY : SQL_INTEGER;
                                break;
                }
                return SQL_SUCCESS;
@@ -813,12 +816,19 @@ PGAPI_GetData(
                }
 
                /* Make sure it is the bookmark data type */
-               if (fCType != SQL_C_BOOKMARK)
+               switch (fCType)
                {
-                       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;
+                       case SQL_C_BOOKMARK:
+#if (ODBCVER >= 0x0300)
+                       case SQL_C_VARBOOKMARK:
+#endif /* ODBCVER */
+                               break;
+                       default:
+                               stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK";
+inolog("Column 0 is type %d not of type SQL_C_BOOKMARK", fCType);
+                               stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE;
+                               SC_log_error(func, "", stmt);
+                               return SQL_ERROR;
                }
 
                get_bookmark = TRUE;
index 513c916019a51bb95cdf2bd3a5d17e788fa9bb6e..4bb884dbf8fff890540c0234692c080234be189d 100644 (file)
@@ -959,8 +959,7 @@ SC_execute(StatementClass *self)
                mylog("       Sending SELECT statement on stmt=%u, cursor_name='%s'\n", self, self->cursor_name);
 
                /* send the declare/select */
-               res = CC_send_query(conn, self->stmt_with_params, NULL, TRUE);
-
+               res = CC_send_query(conn, self->stmt_with_params, NULL, FALSE);
                if (SC_is_fetchcursor(self) && res != NULL &&
                        QR_command_successful(res))
                {
@@ -1068,7 +1067,7 @@ SC_execute(StatementClass *self)
                else
                {
                        self->errornumber = STMT_EXEC_ERROR;
-                       self->errormsg = "Error while executing the query";
+                       self->errormsg = conn->errormsg;
                }
 
                if (!self->internal)