1 /****************************************************************************
5 * Purpose: Helper functions for mysql.cl to handle 64-bit parts of API
6 * Programmer: Kevin M. Rosenberg
7 * Date Started: Mar 2002
9 * This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
11 * CLSQL users are granted the rights to distribute and use this software
12 * as governed by the terms of the Lisp Lesser GNU Public License
13 * (http://opensource.franz.com/preamble.html), also known as the LLGPL.
14 ***************************************************************************/
16 #if defined(WIN32)||defined(WIN64)
19 BOOL WINAPI DllEntryPoint(HINSTANCE hinstdll, DWORD fdwReason,
25 #define DLLEXPORT __declspec(dllexport)
34 /* Need to assemble a 64-bit integer to send to MySQL */
37 clsql_mysql_data_seek (MYSQL_RES* res, unsigned int offset_high32,
38 unsigned int offset_low32)
42 offset = offset_high32;
43 offset = offset << 32;
44 offset += offset_low32;
46 mysql_data_seek (res, offset);
49 /* The following functions are used to return 64-bit integers to Lisp.
50 They return the 32-bit low part and store in upper 32-bits in a
51 located sent via a pointer */
53 static const unsigned int bitmask_32bits = 0xFFFFFFFF;
54 #define lower_32bits(int64) ((unsigned int) int64 & bitmask_32bits)
55 #define upper_32bits(int64) ((unsigned int) (int64 >> 32))
59 clsql_mysql_num_rows (MYSQL_RES* res, unsigned int* pHigh32)
61 my_ulonglong nRows = mysql_num_rows (res);
62 *pHigh32 = upper_32bits(nRows);
63 return lower_32bits(nRows);
68 clsql_mysql_affected_rows (MYSQL* res, unsigned int* pHigh32)
70 my_ulonglong nAffected = mysql_affected_rows (res);
71 *pHigh32 = upper_32bits(nAffected);
72 return lower_32bits(nAffected);
77 clsql_mysql_insert_id (MYSQL* mysql, unsigned int* pHigh32)
79 my_ulonglong insert_id = mysql_insert_id (mysql);
80 *pHigh32 = upper_32bits(insert_id);
81 return lower_32bits(insert_id);
85 /* Accessor functions to hide the differences across MySQL versions */
89 clsql_mysql_field_flags (MYSQL_FIELD* field)
97 clsql_mysql_field_type (MYSQL_FIELD* field)
104 clsql_mysql_field_name (MYSQL_FIELD* field)
111 clsql_mysql_field_length (MYSQL_FIELD* field)
113 return field->length;
118 clsql_mysql_field_max_length (MYSQL_FIELD* field)
120 return field->max_length;
124 #if MYSQL_VERSION_ID >= 40102
129 allocate_bind (unsigned int n)
131 return (MYSQL_BIND*) malloc (n * sizeof(MYSQL_BIND));
136 bind_param (MYSQL_BIND bind[], unsigned int n, unsigned long length, unsigned short is_null,
137 void* buffer, unsigned short buffer_type, unsigned long buffer_length)
139 *bind[n].length = length;
140 *bind[n].is_null = is_null;
141 bind[n].buffer = buffer;
142 bind[n].buffer_type = buffer_type;
143 bind[n].buffer_length = buffer_length;
149 clsql_mysql_stmt_affected_rows (MYSQL_STMT* stmt, unsigned int* pHigh32)
151 my_ulonglong nAffected = mysql_stmt_affected_rows (stmt);
152 *pHigh32 = upper_32bits(nAffected);
153 return lower_32bits(nAffected);