You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by ni...@apache.org on 2006/07/12 11:55:24 UTC

svn commit: r421212 - /apr/apr-util/trunk/dbd/apr_dbd_oracle.c

Author: niq
Date: Wed Jul 12 02:55:23 2006
New Revision: 421212

URL: http://svn.apache.org/viewvc?rev=421212&view=rev
Log:
Prepared statement handling & params format patch for Oracle Driver
(Chris Darroch, under PR#37664)

Modified:
    apr/apr-util/trunk/dbd/apr_dbd_oracle.c

Modified: apr/apr-util/trunk/dbd/apr_dbd_oracle.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_oracle.c?rev=421212&r1=421211&r2=421212&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_oracle.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_oracle.c Wed Jul 12 02:55:23 2006
@@ -236,29 +236,37 @@
 {
     apr_status_t rv = APR_SUCCESS;
     OCIStmt *stmt;
-    OCIError *err;
     apr_hash_index_t *index;
     apr_pool_t *cachepool = apr_hash_pool_get(oracle_statements);
 
+#ifdef PREPARE2
+    OCIError *err;
+
     if (OCIHandleAlloc(dbd_oracle_env, (dvoid**)&err, OCI_HTYPE_ERROR, 0, NULL)
        != OCI_SUCCESS) {
         return APR_EGENERAL;
     }
+#endif
 
     for (index = apr_hash_first(cachepool, oracle_statements);
          index != NULL;
          index = apr_hash_next(index)) {
         apr_hash_this(index, NULL, NULL, (void**)&stmt);
+#ifdef PREPARE2
         if (OCIStmtRelease(stmt, err, NULL, 0, OCI_DEFAULT) != OCI_SUCCESS) {
             rv = APR_EGENERAL;
         }
+#else
         if (OCIHandleFree(stmt, OCI_HTYPE_STMT) != OCI_SUCCESS) {
             rv = APR_EGENERAL;
         }
+#endif
     }
+#ifdef PREPARE2
     if (OCIHandleFree(err, OCI_HTYPE_ERROR) != OCI_SUCCESS) {
         rv = APR_EGENERAL;
     }
+#endif
     return rv;
 }
 #endif
@@ -621,33 +629,31 @@
     }
 }
 
-static int freeStatement(void *statement)
+static apr_status_t freeStatement(void *statement)
 {
-    int ret = 0;
-
-    apr_dbd_t *sql = ((apr_dbd_prepared_t*)statement)->handle;
+    int rv = APR_SUCCESS;
     OCIStmt *stmt = ((apr_dbd_prepared_t*)statement)->stmt;
-    OCIError *err = sql->err;
 
-    sql->status = OCIStmtRelease(stmt, err, NULL, 0, OCI_DEFAULT);
-    switch (sql->status) {
-    case OCI_SUCCESS:
-        break;
-    default:
-        ++ret;
-        break;
-    }
+#ifdef PREPARE2
+    OCIError *err;
 
-    sql->status = OCIHandleFree(stmt, OCI_HTYPE_STMT);
-    switch (sql->status) {
-    case OCI_SUCCESS:
-        break;
-    default:
-        ++ret;
-        break;
+    if (OCIHandleAlloc(dbd_oracle_env, (dvoid**)&err, OCI_HTYPE_ERROR,
+                       0, NULL) != OCI_SUCCESS) {
+        return APR_EGENERAL;
+    }
+    if (OCIStmtRelease(stmt, err, NULL, 0, OCI_DEFAULT) != OCI_SUCCESS) {
+        rv = APR_EGENERAL;
+    }
+    if (OCIHandleFree(err, OCI_HTYPE_ERROR) != OCI_SUCCESS) {
+        rv = APR_EGENERAL;
+    }
+#else
+    if (OCIHandleFree(stmt, OCI_HTYPE_STMT) != OCI_SUCCESS) {
+        rv = APR_EGENERAL;
     }
+#endif
 
-    return ret;
+    return rv;
 }
 
 static int dbd_oracle_select(apr_pool_t *pool, apr_dbd_t *sql,
@@ -675,6 +681,7 @@
     int ret = 0;
     apr_pool_t *pool;
     apr_dbd_prepared_t *statement = NULL;
+    sword status;
 
     if (sql->trans && sql->trans->status == TRANS_ERROR) {
         return 1;
@@ -763,6 +770,7 @@
     }
 #endif
     /* translate from apr_dbd to native query format */
+    stmt->nargs = 0;
     for (sqlptr = (char*)query; *sqlptr; ++sqlptr) {
         if ((sqlptr[0] == '%') && isalnum(sqlptr[1])) {
             ++stmt->nargs;
@@ -1011,9 +1019,8 @@
         break;
     case OCI_ERROR:
 #ifdef DEBUG
-        sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                  sql->buf, sizeof(sql->buf),
-                                  OCI_HTYPE_ERROR);
+        OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                    sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
         printf("Describing prepared statement: %s\n", sql->buf);
 #endif
     default:
@@ -1151,7 +1158,6 @@
     OCISnapshot *newsnapshot = NULL;
     apr_dbd_transaction_t* trans = sql->trans;
     int i;
-    int n;
     int exec_mode;
     int_errorcode;
 
@@ -1183,15 +1189,18 @@
     for (i=0; i<statement->nargs; ++i) {
         switch (statement->args[i].type) {
         case APR_DBD_ORACLE_INT:
-            n = va_arg(args, int);
-            sprintf(statement->args[i].value.stringval, "%d", n);
+            arg = va_arg(args, char*);
+            sscanf(arg, "%d", statement->args[i].value.ival);
             break;
         case APR_DBD_ORACLE_FLOAT:
-            *statement->args[i].value.floatval = va_arg(args, double);
+            arg = va_arg(args, char*);
+            sscanf(arg, "%lf", statement->args[i].value.floatval);
             break;
         case APR_DBD_ORACLE_BLOB:
         case APR_DBD_ORACLE_CLOB:
-            /* Nothing works */
+            sql->status = OCIAttrSet(statement->args[i].value.lobval,
+                                     OCI_DTYPE_LOB, &null, 0,
+                                     OCI_ATTR_LOBEMPTY, sql->err);
             break;
         case APR_DBD_ORACLE_LOB:
             /* requires strlen() over large data, which may fail for binary */
@@ -1229,8 +1238,8 @@
         break;
     case OCI_ERROR:
 #ifdef DEBUG
-        sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                  sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+        OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                    sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
         printf("Execute error %d: %s\n", sql->status, sql->buf);
 #endif
         /* fallthrough */
@@ -1241,50 +1250,6 @@
         return 1;
     }
 
-    for (i=0; i<statement->nargs; ++i) {
-        /* what should these really be? */
-        ub1 csfrm = SQLCS_IMPLICIT;
-        ub2 csid = 0;
-        ub4 len = statement->args[i].len;
-        switch (statement->args[i].type) {
-        case APR_DBD_ORACLE_BLOB:
-        case APR_DBD_ORACLE_CLOB:
-            /* doesn't work - use APR_DBD_ORACLE_LOB instead */
-            sql->status = OCILobEnableBuffering(sql->svc, sql->err,statement->args[i].value.lobval);
-#ifdef DEBUG
-            if (sql->status == OCI_ERROR) {
-                sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                          sql->buf, sizeof(sql->buf),
-                                          OCI_HTYPE_ERROR);
-                printf("LOB error %d: %s\n", sql->status, sql->buf);
-            }
-#endif
-            sql->status = OCILobWrite(sql->svc, sql->err,
-                                      statement->args[i].value.lobval,
-                                      &len, 0, (dvoid*) arg, strlen(arg),
-                                      OCI_ONE_PIECE, NULL, NULL, csid, csfrm);
-            break;
-        default:
-            break;
-        }
-        switch (sql->status) {
-        case OCI_SUCCESS:
-            break;
-        case OCI_ERROR:
-#ifdef DEBUG
-            sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                      sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
-            printf("LOB error %d: %s\n", sql->status, sql->buf);
-#endif
-            /* fallthrough */
-        default:
-            if (TXN_NOTICE_ERRORS(trans)) {
-                trans->status = TRANS_ERROR;
-            }
-            return 1;
-        }
-    }
-
     sql->status = OCIAttrGet(statement->stmt, OCI_HTYPE_STMT, nrows, 0,
                              OCI_ATTR_ROW_COUNT, sql->err);
     return 0;
@@ -1378,8 +1343,8 @@
         break;
     case OCI_ERROR:
 #ifdef DEBUG
-        sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                  sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+        OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                    sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
         printf("Execute error %d: %s\n", sql->status, sql->buf);
 #endif
         /* fallthrough */
@@ -1433,10 +1398,12 @@
         int len;
         switch (statement->args[i].type) {
         case APR_DBD_ORACLE_INT:
-            *statement->args[i].value.ival = va_arg(args, int);
+            arg = va_arg(args, char*);
+            sscanf(arg, "%d", statement->args[i].value.ival);
             break;
         case APR_DBD_ORACLE_FLOAT:
-            *statement->args[i].value.floatval = va_arg(args, double);
+            arg = va_arg(args, char*);
+            sscanf(arg, "%lf", statement->args[i].value.floatval);
             break;
         case APR_DBD_ORACLE_BLOB:
         case APR_DBD_ORACLE_CLOB:
@@ -1471,11 +1438,11 @@
         break;
     case OCI_ERROR:
 #ifdef DEBUG
-        sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                  sql->buf, sizeof(sql->buf),
-                                  OCI_HTYPE_ERROR);
+        OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                    sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
         printf("Executing prepared statement: %s\n", sql->buf);
 #endif
+        /* fallthrough */
     default:
         if (TXN_NOTICE_ERRORS(trans)) {
             trans->status = TRANS_ERROR;
@@ -1530,11 +1497,9 @@
         nargs = statement->nargs;
     }
     for (i=0; i<nargs; ++i) {
-        int foo;
         switch (statement->args[i].type) {
         case APR_DBD_ORACLE_INT:
-            sscanf(values[i], "%d", &foo);
-            *statement->args[i].value.ival = foo;
+            sscanf(values[i], "%d", statement->args[i].value.ival);
             break;
         case APR_DBD_ORACLE_FLOAT:
             sscanf(values[i], "%lf", statement->args[i].value.floatval);
@@ -1566,11 +1531,11 @@
         break;
     case OCI_ERROR:
 #ifdef DEBUG
-        sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                  sql->buf, sizeof(sql->buf),
-                                  OCI_HTYPE_ERROR);
+        OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                    sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
         printf("Executing prepared statement: %s\n", sql->buf);
 #endif
+        /* fallthrough */
     default:
         if (TXN_NOTICE_ERRORS(trans)) {
             trans->status = TRANS_ERROR;
@@ -1737,9 +1702,8 @@
             break;
         case OCI_ERROR:
 #ifdef DEBUG
-            sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                      sql->buf, sizeof(sql->buf),
-                                      OCI_HTYPE_ERROR);
+            OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                        sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
             printf("Finding LOB length: %s\n", sql->buf);
             break;
 #endif
@@ -1770,9 +1734,8 @@
                 break;
 #ifdef DEBUG
             case OCI_ERROR:
-                sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                          sql->buf, sizeof(sql->buf),
-                                          OCI_HTYPE_ERROR);
+                OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                            sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
                 printf("Reading LOB character set: %s\n", sql->buf);
                 break; /*** XXX?? ***/
 #endif
@@ -1804,9 +1767,8 @@
             break;
 #ifdef DEBUG
         case OCI_ERROR:
-            sql->status = OCIErrorGet(sql->err, 1, NULL, &errorcode,
-                                      sql->buf, sizeof(sql->buf),
-                                      OCI_HTYPE_ERROR);
+            OCIErrorGet(sql->err, 1, NULL, &errorcode,
+                        sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
             printf("Reading LOB: %s\n", sql->buf);
             buf = NULL; /*** XXX?? ***/
             break;