r1670: updated mysql to handle :longlong field translation
authorKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 27 Mar 2002 05:40:49 +0000 (05:40 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 27 Mar 2002 05:40:49 +0000 (05:40 +0000)
ChangeLog
interfaces/mysql/clsql-mysql.c
interfaces/mysql/mysql-package.cl
interfaces/mysql/mysql-sql.cl

index 3b5363be9cb47ebe687d365e5e94eb3e8afa2d3b..96e95b2181c606da3f629d0e98fdcf3f31832c4c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,10 @@
 
        * interfaces/mysql/mysql-sql.cl
        Fixed type specifiers in ato* calls
+
+       * interfaces/mysql/clsql-mysql.c
+       * interfaces/mysql/mysql-sql.cl
+       Added atol64 function, :longlong translations
        
 25 Mar 2002 Kevin Rosenberg (kevin@rosenberg.net)
 
index 7557589f3a6c3e8ba084a4db968cf350ffe288f1..4fd36dbaa989de099a0a38258c6bb5aef8ee3786 100644 (file)
@@ -6,7 +6,7 @@
  *   Programmer:    Kevin M. Rosenberg
  *   Date Started:  Mar 2002
  *
- * $Id: clsql-mysql.c,v 1.1 2002/03/23 14:04:52 kevin Exp $
+ * $Id: clsql-mysql.c,v 1.2 2002/03/27 05:37:35 kevin Exp $
  *
  * This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
  *
@@ -57,15 +57,6 @@ const unsigned int bitmask_32bits = 0xFFFFFFFF;
 #define lower_32bits(int64) ((unsigned int) int64 & bitmask_32bits)
 #define upper_32bits(int64) ((unsigned int) (int64 >> 32))
 
-DLLEXPORT
-unsigned int
-clsql_mysql_num_rows (MYSQL_RES* res, unsigned int* pHigh32)
-{
-  my_ulonglong nRows = mysql_num_rows (res);
-  *pHigh32 = upper_32bits(nRows);
-  return lower_32bits(nRows);
-}
-
 DLLEXPORT
 unsigned int
 clsql_mysql_affected_rows (MYSQL* res, unsigned int* pHigh32)
@@ -85,6 +76,27 @@ clsql_mysql_insert_id (MYSQL* mysql, unsigned int* pHigh32)
 }
 
 
+/* Reads a 64-bit integer string, returns result as two 32-bit integers */
+
+DLLEXPORT
+unsigned int
+atol64 (const unsigned char* str, int* pHigh32)
+{
+  long long result = 0;
+  int minus = 0;
+
+  while (*str) {
+    int i = *str - '0';
+    if (i < 0 || i > 9) /* Non-numeric character -- quit */
+      break;
+    result = i + (10 * result);
+    str++;
+  }
+
+  *pHigh32 = upper_32bits(result);
+  return lower_32bits(result);
+}
 
   
   
+
index 618ab3ee6405fd0948e9121690404da77e5999e6..0d101a0e5a6cc0ae480adb7e9cded18a5fbfc851 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmers:   Kevin M. Rosenberg
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: mysql-package.cl,v 1.5 2002/03/25 14:26:23 kevin Exp $
+;;;; $Id: mysql-package.cl,v 1.6 2002/03/27 05:37:35 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
      #:mysql-info
      #:mysql-info-string
      #:mysql-data-seek
+     
+     #:make-64-bit-integer
      )
     (:documentation "This is the low-level interface MySQL."))
index 79bf774ea6a327928eed1357901d43646df8b1c6..9d14dc888b6c4dd3df4186cbc359281f6b4439e0 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: mysql-sql.cl,v 1.12 2002/03/27 04:33:19 kevin Exp $
+;;;; $Id: mysql-sql.cl,v 1.13 2002/03/27 05:37:35 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -73,6 +73,8 @@
               #.mysql-field-types#int24
               #.mysql-field-types#long)
              :int)
+            (#.mysql-field-types#longlong
+             :longlong)
             ((#.mysql-field-types#double
               #.mysql-field-types#float
               #.mysql-field-types#decimal)
     ((str (* :unsigned-char)))
   :returning :long)
 
+(uffi:def-function "atol64"
+    ((str (* :unsigned-char))
+     (high32 (* :int)))
+  :returning :int)
+
 (uffi:def-function "atof"
     ((str (* :unsigned-char)))
   :returning :double)
        (atol char-ptr))
       (:double
        (atof char-ptr))
+      (:longlong
+       (uffi:with-foreign-object (high32-ptr :int)
+        (let ((low32 (atol64 char-ptr high32-ptr))
+              (high32 (uffi:deref-pointer high32-ptr :int)))
+          (if (zerop high32)
+              low32
+              (mysql:make-64-bit-integer high32 low32)))))
       (otherwise
        (uffi:convert-from-foreign-string char-ptr)))))