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.10 by root, Fri Aug 2 04:08:56 2013 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"
56
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
25 67
26#define CoMy_MAGIC 0x436f4d79 68#define CoMy_MAGIC 0x436f4d79
27 69
28typedef struct { 70typedef struct {
71#if PVIO
72 /* must be first member */
73 struct st_ma_pvio_methods methods;
74#else
29#if DESC_IS_PTR 75#if DESC_IS_PTR
30 char desc[30]; 76 char desc[30];
31 const char *old_desc; 77 const char *old_desc;
32#endif 78#endif
79#endif
33 int magic; 80 int magic;
34 SV *corohandle_sv, *corohandle; 81 SV *corohandle_sv, *corohandle;
35 int bufofs, bufcnt; 82 int bufofs, bufcnt;
36#if HAVE_EV 83#if HAVE_EV
37 ev_io rw, ww; 84 ev_io rw, ww;
38#endif 85#endif
39 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
40} ourdata; 94} ourdata;
41 95
96#ifndef OURDATAPTR
42#if DESC_IS_PTR 97#if DESC_IS_PTR
43# define OURDATAPTR (*(ourdata **)&((vio)->desc)) 98# define OURDATAPTR (*(ourdata **)&((vio)->desc))
44#else 99#else
45# define DESC_OFFSET 22 100# define DESC_OFFSET 22
46# define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET))) 101# define OURDATAPTR (*((ourdata **)((vio)->desc + DESC_OFFSET)))
47#endif 102#endif
103#endif
48 104
49static xlen 105static xssize_t
50our_read (Vio *vio, xgptr p, xlen len) 106our_read (VIOPTR vio, xgptr p, xsize_t len)
51{ 107{
52 ourdata *our = OURDATAPTR; 108 ourdata *our = OURDATAPTR;
53 109
54 if (!our->bufcnt) 110 if (!our->bufcnt)
55 { 111 {
56 int rd; 112 int rd;
57 my_bool dummy; 113 my_bool dummy;
58 114
59 vio->vioblocking (vio, 0, &dummy); 115 VIOM (vio)->vioblocking (vio, 0, &dummy);
60 116
61 for (;;) 117 for (;;)
62 { 118 {
63 rd = recv (vio->sd, our->buf, sizeof (our->buf), 0); 119 rd = recv (VIOSD (vio), our->buf, sizeof (our->buf), 0);
64 120
65 if (rd >= 0 || errno != EAGAIN) 121 if (rd >= 0 || errno != EAGAIN)
66 break; 122 break;
67 123
68#if HAVE_EV 124#if HAVE_EV
99 our->bufcnt -= len; 155 our->bufcnt -= len;
100 156
101 return len; 157 return len;
102} 158}
103 159
104static xlen 160static xssize_t
105our_write (Vio *vio, cxgptr p, xlen len) 161our_write (VIOPTR vio, cxgptr p, xsize_t len)
106{ 162{
107 char *ptr = (char *)p; 163 char *ptr = (char *)p;
108 my_bool dummy; 164 my_bool dummy;
109 165
110 vio->vioblocking (vio, 0, &dummy); 166 VIOM (vio)->vioblocking (vio, 0, &dummy);
111 167
112 while (len > 0) 168 while (len > 0)
113 { 169 {
114 int wr = send (vio->sd, ptr, len, 0); 170 int wr = send (VIOSD (vio), ptr, len, 0);
115 171
116 if (wr > 0) 172 if (wr > 0)
117 { 173 {
118 ptr += wr; 174 ptr += wr;
119 len -= wr; 175 len -= wr;
147 } 203 }
148 204
149 return ptr - (char *)p; 205 return ptr - (char *)p;
150} 206}
151 207
152static int 208static xmy_bool
153our_close (Vio *vio) 209our_close (VIOPTR vio)
154{ 210{
155 ourdata *our = OURDATAPTR; 211 ourdata *our = OURDATAPTR;
156 212
157 if (vio->read != our_read) 213 if (VIOM (vio)->read != our_read)
158 croak ("vio.read has unexpected content during unpatch - wtf?"); 214 croak ("vio.read has unexpected content during unpatch - wtf?");
159 215
160 if (vio->write != our_write) 216 if (VIOM (vio)->write != our_write)
161 croak ("vio.write has unexpected content during unpatch - wtf?"); 217 croak ("vio.write has unexpected content during unpatch - wtf?");
162 218
163 if (vio->vioclose != our_close) 219 if (VIOM (vio)->vioclose != our_close)
164 croak ("vio.vioclose has unexpected content during unpatch - wtf?"); 220 croak ("vio.vioclose has unexpected content during unpatch - wtf?");
165 221
166#if HAVE_EV 222#if HAVE_EV
167 if (use_ev) 223 if (use_ev)
168 { 224 {
176 232
177#if DESC_IS_PTR 233#if DESC_IS_PTR
178 vio->desc = our->old_desc; 234 vio->desc = our->old_desc;
179#endif 235#endif
180 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
181 Safefree (our); 245 Safefree (our);
182 246
183 vio->read = vio_read;
184 vio->write = vio_write;
185 vio->vioclose = vio_close;
186
187 vio->vioclose (vio); 247 VIOM (vio)->vioclose (vio);
188} 248}
189 249
190#if HAVE_EV 250#if HAVE_EV
191static void 251static void
192iocb (EV_P_ ev_io *w, int revents) 252iocb (EV_P_ ev_io *w, int revents)
228void 288void
229_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)
230 CODE: 290 CODE:
231{ 291{
232 MYSQL *my = (MYSQL *)sock; 292 MYSQL *my = (MYSQL *)sock;
233 Vio *vio = my->net.vio; 293 VIOPTR vio = my_to_vio (my);
234 ourdata *our; 294 ourdata *our;
235 295
236 /* matching versions are required but not sufficient */ 296 /* matching versions are required but not sufficient */
237 if (client_version != mysql_get_client_version ()) 297 if (client_version != mysql_get_client_version ())
238 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).",
239 client_version, mysql_get_client_version ()); 299 client_version, mysql_get_client_version ());
240 300
241 if (fd != my->net.fd) 301 if (fd != my->net.fd)
242 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?");
243 303
244 if (fd != vio->sd) 304 if (fd != VIOSD (vio))
245 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?");
246 306#if MYSQL_VERSION_ID < 100010 && !defined(MARIADB_BASE_VERSION)
247 if (vio->vioclose != vio_close) 307 if (VIOM (vio)->vioclose != vio_close)
248 croak ("vio.vioclose has unexpected content - library mismatch, unsupported transport or API changes?"); 308 croak ("vio.vioclose has unexpected content - library mismatch, unsupported transport or API changes?");
249 309
250 if (vio->write != vio_write) 310 if (VIOM (vio)->write != vio_write)
251 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?");
252 312
253 if (vio->read != vio_read 313 if (VIOM (vio)->read != vio_read
254 && vio->read != vio_read_buff) 314 && VIOM (vio)->read != vio_read_buff)
255 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
256 321
257 Newz (0, our, 1, ourdata); 322 Newz (0, our, 1, ourdata);
258 our->magic = CoMy_MAGIC; 323 our->magic = CoMy_MAGIC;
259 our->corohandle_sv = newSVsv (corohandle_sv); 324 our->corohandle_sv = newSVsv (corohandle_sv);
260 our->corohandle = newSVsv (corohandle); 325 our->corohandle = newSVsv (corohandle);
261#if HAVE_EV 326#if HAVE_EV
262 if (use_ev) 327 if (use_ev)
263 { 328 {
264 ev_io_init (&(our->rw), iocb, vio->sd, EV_READ); 329 ev_io_init (&(our->rw), iocb, VIOSD (vio), EV_READ);
265 ev_io_init (&(our->ww), iocb, vio->sd, EV_WRITE); 330 ev_io_init (&(our->ww), iocb, VIOSD (vio), EV_WRITE);
266 } 331 }
267#endif 332#endif
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;
268#if DESC_IS_PTR 344#if DESC_IS_PTR
269 our->old_desc = vio->desc; 345 our->old_desc = vio->desc;
270 strncpy (our->desc, vio->desc, sizeof (our->desc)); 346 strncpy (our->desc, vio->desc, sizeof (our->desc));
271 our->desc [sizeof (our->desc) - 1] = 0; 347 our->desc [sizeof (our->desc) - 1] = 0;
272#else 348#else
273 vio->desc [DESC_OFFSET - 1] = 0; 349 vio->desc [DESC_OFFSET - 1] = 0;
274#endif 350#endif
275 OURDATAPTR = our; 351 our->old_close = VIOM (vio)->vioclose;
352 our->old_write = VIOM (vio)->write;
353 our->old_read = VIOM (vio)->read;
354#endif
276 355
356 /* with pvio, this patches our own struct */
277 vio->vioclose = our_close; 357 VIOM (vio)->vioclose = our_close;
278 vio->write = our_write; 358 VIOM (vio)->write = our_write;
279 vio->read = our_read; 359 VIOM (vio)->read = our_read;
280} 360}
281 361

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines