ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro-Mysql/Mysql.xs
(Generate patch)

Comparing Coro-Mysql/Mysql.xs (file contents):
Revision 1.8 by root, Thu Jul 26 21:38:00 2012 UTC vs.
Revision 1.16 by root, Mon Mar 4 05:34:52 2019 UTC

1#include <sys/errno.h> 1#include <errno.h>
2#include <unistd.h> 2#include <unistd.h>
3#include <fcntl.h> 3#include <fcntl.h>
4
5/* mariadb/mysql uses all these reserved macro names, and probably more :( */
6#undef read
7#undef write
8#undef close
4 9
5#include <mysql.h> 10#include <mysql.h>
6 11
7#include "EXTERN.h" 12#include "EXTERN.h"
8#include "perl.h" 13#include "perl.h"
19 24
20/* cached function gv's */ 25/* cached function gv's */
21static CV *readable, *writable; 26static CV *readable, *writable;
22static int use_ev; 27static int use_ev;
23 28
29#if MARIADB_VERSION_ID >= 100300
30
31 typedef unsigned char uchar; /* bug? */
32 #include <ma_pvio.h>
33
34 #define PVIO 1
35 #define VIOPTR MARIADB_PVIO *
36 #define VIOM(vio) (vio)->methods
37 #define vioblocking blocking
38 #define vioclose close
39 #define VIODATA(vio) (vio)->data
40 /* ma_pvio_get_socket would be it, but it's only declared, not defined */
41 #define VIOSD(vio) mysql_get_socket ((vio)->mysql)
42 #define VIO_READ_BUFFER_SIZE PVIO_READ_AHEAD_CACHE_SIZE
43 #define my_to_vio(sock) (sock)->net.pvio
44
45 #define OURDATAPTR ((ourdata *)vio->methods)
46
47 typedef uchar *xgptr;
48 typedef const uchar *cxgptr;
49 typedef size_t xsize_t;
50 typedef ssize_t xssize_t;
51 typedef my_bool xmy_bool;
52
53#else
54
24#include "violite.h" 55 #include "violite.h"
25 56
26#define DESC_OFFSET 22 57 #define PVIO 0
58 #define VIOPTR Vio *
59 #define VIOM(vio) vio
60 #define VIODATA(vio) (vio)->desc
61 #define VIOSD(vio) (vio)->sd
62 #define my_to_vio(sock) (sock)->net.vio
63
64 typedef int xmy_bool;
65
66#endif
27 67
28#define CoMy_MAGIC 0x436f4d79 68#define CoMy_MAGIC 0x436f4d79
29 69
30typedef struct { 70typedef struct {
71#if PVIO
72 /* must be first member */
73 struct st_ma_pvio_methods methods;
74#else
75#if DESC_IS_PTR
76 char desc[30];
77 const char *old_desc;
78#endif
79#endif
31 int magic; 80 int magic;
32 SV *corohandle_sv, *corohandle; 81 SV *corohandle_sv, *corohandle;
33 int bufofs, bufcnt; 82 int bufofs, bufcnt;
34#if HAVE_EV 83#if HAVE_EV
35 ev_io rw, ww; 84 ev_io rw, ww;
36#endif 85#endif
37 char buf[VIO_READ_BUFFER_SIZE]; 86 char buf[VIO_READ_BUFFER_SIZE];
87#if PVIO
88 struct st_ma_pvio_methods *oldmethods;
89#else
90 xssize_t (*old_read)(VIOPTR, uchar *, size_t);
91 xssize_t (*old_write)(VIOPTR, const uchar *, size_t);
92 xmy_bool (*old_close)(VIOPTR);
93#endif
38} ourdata; 94} ourdata;
39 95
96#ifndef OURDATAPTR
97#if DESC_IS_PTR
98# define OURDATAPTR (*(ourdata **)&((vio)->desc))
99#else
100# define DESC_OFFSET 22
40#define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET))) 101# define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET)))
102#endif
103#endif
41 104
42static xlen 105static xssize_t
43our_read (Vio *vio, xgptr p, xlen len) 106our_read (VIOPTR vio, xgptr p, xsize_t len)
44{ 107{
45 ourdata *our = OURDATAPTR; 108 ourdata *our = OURDATAPTR;
46 109
47 if (!our->bufcnt) 110 if (!our->bufcnt)
48 { 111 {
49 int rd; 112 int rd;
50 my_bool dummy; 113 my_bool dummy;
51 114
52 vio->vioblocking (vio, 0, &dummy); 115 VIOM (vio)->vioblocking (vio, 0, &dummy);
53 116
54 for (;;) 117 for (;;)
55 { 118 {
56 rd = recv (vio->sd, our->buf, sizeof (our->buf), 0); 119 rd = recv (VIOSD (vio), our->buf, sizeof (our->buf), 0);
57 120
58 if (rd >= 0 || errno != EAGAIN) 121 if (rd >= 0 || errno != EAGAIN)
59 break; 122 break;
60 123
61#if HAVE_EV 124#if HAVE_EV
92 our->bufcnt -= len; 155 our->bufcnt -= len;
93 156
94 return len; 157 return len;
95} 158}
96 159
97static xlen 160static xssize_t
98our_write (Vio *vio, cxgptr p, xlen len) 161our_write (VIOPTR vio, cxgptr p, xsize_t len)
99{ 162{
100 char *ptr = (char *)p; 163 char *ptr = (char *)p;
101 my_bool dummy; 164 my_bool dummy;
102 165
103 vio->vioblocking (vio, 0, &dummy); 166 VIOM (vio)->vioblocking (vio, 0, &dummy);
104 167
105 while (len > 0) 168 while (len > 0)
106 { 169 {
107 int wr = send (vio->sd, ptr, len, 0); 170 int wr = send (VIOSD (vio), ptr, len, 0);
108 171
109 if (wr > 0) 172 if (wr > 0)
110 { 173 {
111 ptr += wr; 174 ptr += wr;
112 len -= wr; 175 len -= wr;
140 } 203 }
141 204
142 return ptr - (char *)p; 205 return ptr - (char *)p;
143} 206}
144 207
145static int 208static xmy_bool
146our_close (Vio *vio) 209our_close (VIOPTR vio)
147{ 210{
148 ourdata *our = OURDATAPTR; 211 ourdata *our = OURDATAPTR;
149 212
150 if (vio->read != our_read) 213 if (VIOM (vio)->read != our_read)
151 croak ("vio.read has unexpected content during unpatch - wtf?"); 214 croak ("vio.read has unexpected content during unpatch - wtf?");
152 215
153 if (vio->write != our_write) 216 if (VIOM (vio)->write != our_write)
154 croak ("vio.write has unexpected content during unpatch - wtf?"); 217 croak ("vio.write has unexpected content during unpatch - wtf?");
155 218
156 if (vio->vioclose != our_close) 219 if (VIOM (vio)->vioclose != our_close)
157 croak ("vio.vioclose has unexpected content during unpatch - wtf?"); 220 croak ("vio.vioclose has unexpected content during unpatch - wtf?");
158 221
159#if HAVE_EV 222#if HAVE_EV
160 if (use_ev) 223 if (use_ev)
161 { 224 {
165#endif 228#endif
166 229
167 SvREFCNT_dec (our->corohandle); 230 SvREFCNT_dec (our->corohandle);
168 SvREFCNT_dec (our->corohandle_sv); 231 SvREFCNT_dec (our->corohandle_sv);
169 232
233#if DESC_IS_PTR
234 vio->desc = our->old_desc;
235#endif
236
237#if PVIO
238 vio->methods = our->oldmethods;
239#else
240 VIOM (vio)->vioclose = our->old_close;
241 VIOM (vio)->write = our->old_write;
242 VIOM (vio)->read = our->old_read;
243#endif
244
170 Safefree (our); 245 Safefree (our);
171 246
172 vio->read = vio_read;
173 vio->write = vio_write;
174 vio->vioclose = vio_close;
175
176 vio->vioclose (vio); 247 VIOM (vio)->vioclose (vio);
177} 248}
178 249
179#if HAVE_EV 250#if HAVE_EV
180static void 251static void
181iocb (EV_P_ ev_io *w, int revents) 252iocb (EV_P_ ev_io *w, int revents)
217void 288void
218_patch (IV sock, int fd, unsigned long client_version, SV *corohandle_sv, SV *corohandle) 289_patch (IV sock, int fd, unsigned long client_version, SV *corohandle_sv, SV *corohandle)
219 CODE: 290 CODE:
220{ 291{
221 MYSQL *my = (MYSQL *)sock; 292 MYSQL *my = (MYSQL *)sock;
222 Vio *vio = my->net.vio; 293 VIOPTR vio = my_to_vio (my);
223 ourdata *our; 294 ourdata *our;
224 295
225 /* matching versions are required but not sufficient */ 296 /* matching versions are required but not sufficient */
226 if (client_version != mysql_get_client_version ()) 297 if (client_version != mysql_get_client_version ())
227 croak ("DBD::mysql linked against different libmysqlclient library than Coro::Mysql (%lu vs. %lu).", 298 croak ("DBD::mysql linked against different libmysqlclient library than Coro::Mysql (%lu vs. %lu).",
228 client_version, mysql_get_client_version ()); 299 client_version, mysql_get_client_version ());
229 300
230 if (fd != my->net.fd) 301 if (fd != my->net.fd)
231 croak ("DBD::mysql fd and libmysql disagree - library mismatch, unsupported transport or API changes?"); 302 croak ("DBD::mysql fd and libmysql disagree - library mismatch, unsupported transport or API changes?");
232 303
233 if (fd != vio->sd) 304 if (fd != VIOSD (vio))
234 croak ("DBD::mysql fd and vio-sd disagree - library mismatch, unsupported transport or API changes?"); 305 croak ("DBD::mysql fd and vio-sd disagree - library mismatch, unsupported transport or API changes?");
235 306#if MYSQL_VERSION_ID < 100010 && !defined(MARIADB_BASE_VERSION)
236 if (vio->vioclose != vio_close) 307 if (VIOM (vio)->vioclose != vio_close)
308 croak ("vio.vioclose has unexpected content - library mismatch, unsupported transport or API changes?");
309
310 if (VIOM (vio)->write != vio_write)
237 croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?"); 311 croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?");
238 312
239 if (vio->write != vio_write)
240 croak ("vio.write has unexpected content - library mismatch, unsupported transport or API changes?");
241
242 if (vio->read != vio_read 313 if (VIOM (vio)->read != vio_read
243 && vio->read != vio_read_buff) 314 && VIOM (vio)->read != vio_read_buff)
244 croak ("vio.read has unexpected content - library mismatch, unsupported transport or API changes?"); 315 croak ("vio.read has unexpected content - library mismatch, unsupported transport or API changes?");
316#endif
317#if PVIO
318 if (vio->type != PVIO_TYPE_UNIXSOCKET && vio->type != PVIO_TYPE_SOCKET)
319 croak ("connection type mismatch: Coro::Mysql only supports 'unixsocket' and 'socket' types at this time");
320#endif
245 321
246 Newz (0, our, 1, ourdata); 322 Newz (0, our, 1, ourdata);
247 our->magic = CoMy_MAGIC; 323 our->magic = CoMy_MAGIC;
248 our->corohandle_sv = newSVsv (corohandle_sv); 324 our->corohandle_sv = newSVsv (corohandle_sv);
249 our->corohandle = newSVsv (corohandle); 325 our->corohandle = newSVsv (corohandle);
250#if HAVE_EV 326#if HAVE_EV
251 if (use_ev) 327 if (use_ev)
252 { 328 {
253 ev_io_init (&(our->rw), iocb, vio->sd, EV_READ); 329 ev_io_init (&(our->rw), iocb, VIOSD (vio), EV_READ);
254 ev_io_init (&(our->ww), iocb, vio->sd, EV_WRITE); 330 ev_io_init (&(our->ww), iocb, VIOSD (vio), EV_WRITE);
255 } 331 }
256#endif 332#endif
257 333#if PVIO
334 /* with pvio, we replace methods by our own struct,
335 * both becauase the original might be read-only,
336 * and because we have no private data member, so the
337 * methods pointer includes our data as well
338 */
339 our->methods = *vio->methods;
340 our->oldmethods = vio->methods;
341 vio->methods = &our->methods;
342#else
343 OURDATAPTR = our;
344#if DESC_IS_PTR
345 our->old_desc = vio->desc;
346 strncpy (our->desc, vio->desc, sizeof (our->desc));
347 our->desc [sizeof (our->desc) - 1] = 0;
348#else
258 vio->desc [DESC_OFFSET - 1] = 0; 349 vio->desc [DESC_OFFSET - 1] = 0;
259 OURDATAPTR = our; 350#endif
351 our->old_close = VIOM (vio)->vioclose;
352 our->old_write = VIOM (vio)->write;
353 our->old_read = VIOM (vio)->read;
354#endif
260 355
356 /* with pvio, this patches our own struct */
261 vio->vioclose = our_close; 357 VIOM (vio)->vioclose = our_close;
262 vio->write = our_write; 358 VIOM (vio)->write = our_write;
263 vio->read = our_read; 359 VIOM (vio)->read = our_read;
264} 360}
265 361

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines