Update changelog for recent changes
[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  * $Id$
10  *
11  * This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
12  *
13  * CLSQL users are granted the rights to distribute and use this software
14  * as governed by the terms of the Lisp Lesser GNU Public License
15  * (http://opensource.franz.com/preamble.html), also known as the LLGPL.
16  ***************************************************************************/
17
18 #if defined(WIN32)||defined(WIN64)
19 #include <windows.h>
20
21 BOOL WINAPI DllEntryPoint(HINSTANCE hinstdll, DWORD fdwReason,
22                           LPVOID lpvReserved)
23 {
24         return 1;
25 }
26
27 #define DLLEXPORT __declspec(dllexport)
28
29 #else
30 #define DLLEXPORT
31 #endif
32
33
34 #include <mysql.h>
35
36 /* Need to assemble a 64-bit integer to send to MySQL */
37 DLLEXPORT
38 void
39 clsql_mysql_data_seek (MYSQL_RES* res, unsigned int offset_high32,
40                        unsigned int offset_low32)
41 {
42   my_ulonglong offset;
43
44   offset = offset_high32;
45   offset = offset << 32;
46   offset += offset_low32;
47
48   mysql_data_seek (res, offset);
49 }
50
51 /* The following functions are used to return 64-bit integers to Lisp.
52    They return the 32-bit low part and store in upper 32-bits in a
53    located sent via a pointer */
54
55 static const unsigned int bitmask_32bits = 0xFFFFFFFF;
56 #define lower_32bits(int64) ((unsigned int) int64 & bitmask_32bits)
57 #define upper_32bits(int64) ((unsigned int) (int64 >> 32))
58
59 DLLEXPORT
60 unsigned int
61 clsql_mysql_num_rows (MYSQL_RES* res, unsigned int* pHigh32)
62 {
63   my_ulonglong nRows = mysql_num_rows (res);
64   *pHigh32 = upper_32bits(nRows);
65   return lower_32bits(nRows);
66 }
67
68 DLLEXPORT
69 unsigned int
70 clsql_mysql_affected_rows (MYSQL* res, unsigned int* pHigh32)
71 {
72   my_ulonglong nAffected = mysql_affected_rows (res);
73   *pHigh32 = upper_32bits(nAffected);
74   return lower_32bits(nAffected);
75 }
76
77 DLLEXPORT
78 unsigned int
79 clsql_mysql_insert_id (MYSQL* mysql, unsigned int* pHigh32)
80 {
81   my_ulonglong insert_id = mysql_insert_id (mysql);
82   *pHigh32 = upper_32bits(insert_id);
83   return lower_32bits(insert_id);
84 }
85
86
87 /* Accessor functions to hide the differences across MySQL versions */
88
89 DLLEXPORT
90 short int
91 clsql_mysql_field_type (MYSQL_FIELD* field)
92 {
93   return field->type;
94 }
95
96 DLLEXPORT
97 char*
98 clsql_mysql_field_name (MYSQL_FIELD* field)
99 {
100   return field->name;
101 }
102
103 DLLEXPORT
104 unsigned long
105 clsql_mysql_field_length (MYSQL_FIELD* field)
106 {
107   return field->length;
108 }
109
110 DLLEXPORT
111 unsigned long
112 clsql_mysql_field_max_length (MYSQL_FIELD* field)
113 {
114   return field->max_length;
115 }
116
117
118 #if MYSQL_VERSION_ID >= 40102
119 #include <stdlib.h>
120
121 DLLEXPORT
122 MYSQL_BIND*
123 allocate_bind (unsigned int n)
124 {
125   return (MYSQL_BIND*) malloc (n * sizeof(MYSQL_BIND));
126 }
127
128 DLLEXPORT
129 void
130 bind_param (MYSQL_BIND bind[], unsigned int n, unsigned long length, unsigned short is_null,
131            void* buffer, unsigned short buffer_type, unsigned long buffer_length)
132 {
133   *bind[n].length = length;
134   *bind[n].is_null = is_null;
135   bind[n].buffer = buffer;
136   bind[n].buffer_type = buffer_type;
137   bind[n].buffer_length = buffer_length;
138 }
139
140
141 DLLEXPORT
142 DLLEXPORT
143 unsigned int
144 clsql_mysql_stmt_affected_rows (MYSQL_STMT* stmt, unsigned int* pHigh32)
145 {
146   my_ulonglong nAffected = mysql_stmt_affected_rows (stmt);
147   *pHigh32 = upper_32bits(nAffected);
148   return lower_32bits(nAffected);
149 }
150
151
152 #endif
153