From 2668bbdc8521921b0d06fbe534fdd3a30143c3f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Fri, 15 Aug 1997 22:20:11 +0200
Subject: [PATCH] Fixed some bugs and made fetch_row() only return strings and
 zeroes.

Rev: src/modules/Odbc/odbc.c:1.4
Rev: src/modules/Odbc/odbc_result.c:1.4
---
 src/modules/Odbc/odbc.c        | 19 ++++++++++++++-----
 src/modules/Odbc/odbc_result.c | 33 +++++++++++++++++----------------
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/src/modules/Odbc/odbc.c b/src/modules/Odbc/odbc.c
index 23775a2adb..c9dc22fce4 100644
--- a/src/modules/Odbc/odbc.c
+++ b/src/modules/Odbc/odbc.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc.c,v 1.3 1997/06/10 03:21:41 grubba Exp $
+ * $Id: odbc.c,v 1.4 1997/08/15 20:20:10 grubba Exp $
  *
  * Pike interface to ODBC compliant databases.
  *
@@ -15,7 +15,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include "global.h"
-RCSID("$Id: odbc.c,v 1.3 1997/06/10 03:21:41 grubba Exp $");
+RCSID("$Id: odbc.c,v 1.4 1997/08/15 20:20:10 grubba Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -87,8 +87,18 @@ volatile void odbc_error(const char *fun, const char *msg,
   case SQL_SUCCESS_WITH_INFO:
     error("%s():%s: %d:%s:%s\n", fun, msg, code, errcode, errmsg);
     break;
+  case SQL_ERROR:
+    error("%s():%s: SQLError failed (%d:SQL_ERROR)\n", fun, msg, code);
+    break;
+  case SQL_NO_DATA_FOUND:
+    error("%s():%s: SQLError failed (%d:SQL_NO_DATA_FOUND)\n", fun, msg, code);
+    break;
+  case SQL_INVALID_HANDLE:
+    error("%s():%s: SQLError failed (%d:SQL_INVALID_HANDLE)\n", fun, msg, code);
+    break;
   default:
     error("%s():%s: SQLError failed (%d:%d)\n", fun, msg, code, _code);
+    break;
   }
 }
 
@@ -231,6 +241,7 @@ static void f_big_query(INT32 args)
 
   odbc_check_error("odbc->big_query", "Statement allocation failed",
 		   SQLAllocStmt(PIKE_ODBC->hdbc, &hstmt), NULL);
+  PIKE_ODBC->hstmt = hstmt;
   odbc_check_error("odbc->big_query", "Query failed",
 		   SQLExecDirect(hstmt, q->str, q->len), NULL);
   pop_n_elems(args);
@@ -241,10 +252,8 @@ static void f_big_query(INT32 args)
   odbc_check_error("odbc->big_query", "Couldn't get the number of rows",
 		   SQLRowCount(hstmt, &(PIKE_ODBC->affected_rows)), NULL);
 
-  pop_n_elems(args);
-
   if (PIKE_ODBC->num_fields) {
-    PIKE_ODBC->hstmt=hstmt;
+    /* PIKE_ODBC->hstmt=hstmt; */
     push_object(fp->current_object);
     fp->current_object->refs++;
 
diff --git a/src/modules/Odbc/odbc_result.c b/src/modules/Odbc/odbc_result.c
index 08b05e02b2..4a89c3f51c 100644
--- a/src/modules/Odbc/odbc_result.c
+++ b/src/modules/Odbc/odbc_result.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc_result.c,v 1.3 1997/06/10 03:21:42 grubba Exp $
+ * $Id: odbc_result.c,v 1.4 1997/08/15 20:20:11 grubba Exp $
  *
  * Pike  interface to ODBC compliant databases
  *
@@ -17,7 +17,7 @@
 #ifdef HAVE_ODBC
 
 #include "global.h"
-RCSID("$Id: odbc_result.c,v 1.3 1997/06/10 03:21:42 grubba Exp $");
+RCSID("$Id: odbc_result.c,v 1.4 1997/08/15 20:20:11 grubba Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -155,7 +155,7 @@ static void odbc_fix_fields(void)
       break;
     case SQL_DATE:
       push_text("date");
-      odbc_fields[i].size = 7;
+       odbc_fields[i].size = 7;
       break;
     case SQL_DECIMAL:
       push_text("decimal");
@@ -163,13 +163,13 @@ static void odbc_fix_fields(void)
       break;
     case SQL_DOUBLE:
       push_text("double");
-      odbc_fields[i].size = 8;
-      odbc_fields[i].type = T_FLOAT;
+      /* odbc_fields[i].size = 8; */
+      /* odbc_fields[i].type = T_FLOAT; */
       break;
     case SQL_INTEGER:
       push_text("integer");
-      odbc_fields[i].size = 4;
-      odbc_fields[i].type = T_INT;
+      /* odbc_fields[i].size = 4; */
+      /* odbc_fields[i].type = T_INT; */
       break;
     case SQL_LONGVARBINARY:
       push_text("long blob");
@@ -179,13 +179,13 @@ static void odbc_fix_fields(void)
       break;
     case SQL_REAL:
       push_text("float");
-      odbc_fields[i].size = 4;
-      odbc_fields[i].type = T_FLOAT;
+      /* odbc_fields[i].size = 4; */
+      /* odbc_fields[i].type = T_FLOAT; */
       break;
     case SQL_SMALLINT:
       push_text("short");
-      odbc_fields[i].size = 4;
-      odbc_fields[i].type = T_INT;
+      /* odbc_fields[i].size = 4; */
+      /* odbc_fields[i].type = T_INT; */
       break;
     case SQL_TIMESTAMP:
       push_text("time");
@@ -215,9 +215,9 @@ static void odbc_fix_fields(void)
 
     f_aggregate_mapping(5*2);
 
-    /* Align to long-word size */
-    odbc_fields[i].size += 3;
-    odbc_fields[i].size &= ~3;
+    /* Align to longlong-word size */
+    odbc_fields[i].size += 7;
+    odbc_fields[i].size &= ~7;
 
     membuf_size += odbc_fields[i].size;
   }
@@ -280,13 +280,14 @@ static void f_create(INT32 args)
     error("Too few arguments to odbc_result()\n");
   }
   if ((sp[-args].type != T_OBJECT) ||
-      (sp[-args].u.object->prog != odbc_program)) {
+      (!(PIKE_ODBC_RES->odbc =
+	 (struct precompiled_odbc *)get_storage(sp[-args].u.object,
+						odbc_program)))) {
     error("Bad argument 1 to odbc_result()\n");
   }
  
   PIKE_ODBC_RES->obj = sp[-args].u.object;
   PIKE_ODBC_RES->obj->refs++;
-  PIKE_ODBC_RES->odbc = ((struct precompiled_odbc *)sp[-args].u.object->storage);
   PIKE_ODBC_RES->hstmt = PIKE_ODBC_RES->odbc->hstmt;
   PIKE_ODBC_RES->odbc->hstmt = SQL_NULL_HSTMT;
   
-- 
GitLab