Remove CVS $Id$ keyword
[clsql.git] / db-mysql / clsql_mysql.c
1 /****************************************************************************
2  * FILE IDENTIFICATION
3  *
4  *   Name:          clsql-mysql.c
5  *   Purpose:       Helper functions for mysql.cl to handle 64-bit parts of API
6  *   Programmer:    Kevin M. Rosenberg
7  *   Date Started:  Mar 2002
8  *
9  * This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
10  *
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  ***************************************************************************/
15
16 #if defined(WIN32)||defined(WIN64)
17 #include <windows.h>
18
19 BOOL WINAPI DllEntryPoint(HINSTANCE hinstdll, DWORD fdwReason,
20                           LPVOID lpvReserved)
21 {
22         return 1;
23 }
24
25 #define DLLEXPORT __declspec(dllexport)
26
27 #else
28 #define DLLEXPORT
29 #endif
30
31
32 #include <mysql.h>
33
34 /* Need to assemble a 64-bit integer to send to MySQL */
35 DLLEXPORT
36 void
37 clsql_mysql_data_seek (MYSQL_RES* res, unsigned int offset_high32,
38                        unsigned int offset_low32)
39 {
40   my_ulonglong offset;
41
42   offset = offset_high32;
43   offset = offset << 32;
44   offset += offset_low32;
45
46   mysql_data_seek (res, offset);
47 }
48
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 */
52
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))
56
57 DLLEXPORT
58 unsigned int
59 clsql_mysql_num_rows (MYSQL_RES* res, unsigned int* pHigh32)
60 {
61   my_ulonglong nRows = mysql_num_rows (res);
62   *pHigh32 = upper_32bits(nRows);
63   return lower_32bits(nRows);
64 }
65
66 DLLEXPORT
67 unsigned int
68 clsql_mysql_affected_rows (MYSQL* res, unsigned int* pHigh32)
69 {
70   my_ulonglong nAffected = mysql_affected_rows (res);
71   *pHigh32 = upper_32bits(nAffected);
72   return lower_32bits(nAffected);
73 }
74
75 DLLEXPORT
76 unsigned int
77 clsql_mysql_insert_id (MYSQL* mysql, unsigned int* pHigh32)
78 {
79   my_ulonglong insert_id = mysql_insert_id (mysql);
80   *pHigh32 = upper_32bits(insert_id);
81   return lower_32bits(insert_id);
82 }
83
84
85 /* Accessor functions to hide the differences across MySQL versions */
86
87 DLLEXPORT
88 unsigned int
89 clsql_mysql_field_flags (MYSQL_FIELD* field)
90 {
91   return field->flags;
92 }
93
94
95 DLLEXPORT
96 unsigned int
97 clsql_mysql_field_type (MYSQL_FIELD* field)
98 {
99   return field->type;
100 }
101
102 DLLEXPORT
103 char*
104 clsql_mysql_field_name (MYSQL_FIELD* field)
105 {
106   return field->name;
107 }
108
109 DLLEXPORT
110 unsigned long
111 clsql_mysql_field_length (MYSQL_FIELD* field)
112 {
113   return field->length;
114 }
115
116 DLLEXPORT
117 unsigned long
118 clsql_mysql_field_max_length (MYSQL_FIELD* field)
119 {
120   return field->max_length;
121 }
122
123
124 #if MYSQL_VERSION_ID >= 40102
125 #include <stdlib.h>
126
127 DLLEXPORT
128 MYSQL_BIND*
129 allocate_bind (unsigned int n)
130 {
131   return (MYSQL_BIND*) malloc (n * sizeof(MYSQL_BIND));
132 }
133
134 DLLEXPORT
135 void
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)
138 {
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;
144 }
145
146
147 DLLEXPORT
148 unsigned int
149 clsql_mysql_stmt_affected_rows (MYSQL_STMT* stmt, unsigned int* pHigh32)
150 {
151   my_ulonglong nAffected = mysql_stmt_affected_rows (stmt);
152   *pHigh32 = upper_32bits(nAffected);
153   return lower_32bits(nAffected);
154 }
155
156 #endif
157