85
if (vio != 0) /* If real connection */
87
net->fd = drizzleclient_vio_fd(vio); /* For perl DBI/DBD */
88
drizzleclient_vio_fastsend(vio);
93
bool drizzleclient_net_init_sock(NET * net, int sock, int flags,
94
uint32_t buffer_length)
97
Vio *drizzleclient_vio_tmp= drizzleclient_vio_new(sock, VIO_TYPE_TCPIP, flags);
98
if (drizzleclient_vio_tmp == NULL)
101
if (drizzleclient_net_init(net, drizzleclient_vio_tmp, buffer_length))
103
/* Only delete the temporary vio if we didn't already attach it to the
106
if (drizzleclient_vio_tmp && (net->vio != drizzleclient_vio_tmp))
107
drizzleclient_vio_delete(drizzleclient_vio_tmp);
110
(void) shutdown(sock, SHUT_RDWR);
118
void drizzleclient_net_end(NET *net)
120
if (net->buff != NULL)
126
void drizzleclient_net_close(NET *net)
128
if (net->vio != NULL)
130
drizzleclient_vio_delete(net->vio);
135
bool drizzleclient_net_peer_addr(NET *net, char *buf, uint16_t *port, size_t buflen)
137
return drizzleclient_vio_peer_addr(net->vio, buf, port, buflen);
140
void drizzleclient_net_keepalive(NET *net, bool flag)
142
drizzleclient_vio_keepalive(net->vio, flag);
145
int drizzleclient_net_get_sd(NET *net)
150
bool drizzleclient_net_more_data(NET *net)
152
return (net->vio == 0 || net->vio->read_pos < net->vio->read_end);
76
if (vio != 0) /* If real connection */
78
net->fd = vio_fd(vio); /* For perl DBI/DBD */
85
void net_end(NET *net)
87
DBUG_ENTER("net_end");
88
my_free(net->buff,MYF(MY_ALLOW_ZERO_PTR));
155
94
/** Realloc the packet buffer. */
157
static bool drizzleclient_net_realloc(NET *net, size_t length)
96
my_bool net_realloc(NET *net, size_t length)
160
99
size_t pkt_length;
100
DBUG_ENTER("net_realloc");
101
DBUG_PRINT("enter",("length: %lu", (ulong) length));
162
103
if (length >= net->max_packet_size)
105
DBUG_PRINT("error", ("Packet too large. Max size: %lu",
106
net->max_packet_size));
164
107
/* @todo: 1 and 2 codes are identical. */
166
net->last_errno= CR_NET_PACKET_TOO_LARGE;
109
net->last_errno= ER_NET_PACKET_TOO_LARGE;
169
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
112
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
171
114
We must allocate some extra bytes for the end 0 and to be able to
172
115
read big compressed blocks
174
if (!(buff= (unsigned char*) realloc((char*) net->buff, pkt_length +
175
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
117
if (!(buff= (uchar*) my_realloc((char*) net->buff, pkt_length +
118
NET_HEADER_SIZE + COMP_HEADER_SIZE,
177
121
/* @todo: 1 and 2 codes are identical. */
179
net->last_errno= CR_OUT_OF_MEMORY;
123
net->last_errno= ER_OUT_OF_RESOURCES;
180
124
/* In the server the error is reported by MY_WME flag. */
183
127
net->buff=net->write_pos=buff;
184
net->buff_end=buff+(net->max_packet= (uint32_t) pkt_length);
128
net->buff_end=buff+(net->max_packet= (ulong) pkt_length);
190
Check if there is any data to be read from the socket.
192
@param sd socket descriptor
197
1 Data or EOF to read
199
-1 Don't know if data is ready or not
134
Check if there is any data to be read from the socket.
136
@param sd socket descriptor
141
1 Data or EOF to read
143
-1 Don't know if data is ready or not
202
static bool net_data_is_ready(int sd)
146
static int net_data_is_ready(my_socket sd)
204
149
struct pollfd ufds;
211
156
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
164
/* Windows uses an _array_ of 64 fd's as default, so it's safe */
165
if (sd >= FD_SETSIZE)
167
#define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
172
tv.tv_sec= tv.tv_usec= 0;
174
if ((res= select(sd+1, &sfds, NULL, NULL, &tv)) < 0)
177
return test(res ? FD_ISSET(sd, &sfds) : 0);
178
#endif /* HAVE_POLL */
217
Remove unwanted characters from connection
218
and check if disconnected.
220
Read from socket until there is nothing more to read. Discard
223
If there is anything when to read 'drizzleclient_net_clear' is called this
224
normally indicates an error in the protocol.
226
When connection is properly closed (for TCP it means with
227
a FIN packet), then select() considers a socket "ready to read",
228
in the sense that there's EOF to read, but read() returns 0.
230
@param net NET handler
231
@param clear_buffer if <> 0, then clear all data from comm buff
182
Remove unwanted characters from connection
183
and check if disconnected.
185
Read from socket until there is nothing more to read. Discard
188
If there is anything when to read 'net_clear' is called this
189
normally indicates an error in the protocol.
191
When connection is properly closed (for TCP it means with
192
a FIN packet), then select() considers a socket "ready to read",
193
in the sense that there's EOF to read, but read() returns 0.
195
@param net NET handler
196
@param clear_buffer if <> 0, then clear all data from comm buff
234
void drizzleclient_net_clear(NET *net, bool clear_buffer)
199
void net_clear(NET *net, my_bool clear_buffer)
203
DBUG_ENTER("net_clear");
236
205
if (clear_buffer)
238
while (net_data_is_ready(net->vio->sd) > 0)
207
while ((ready= net_data_is_ready(net->vio->sd)) > 0)
240
209
/* The socket is ready */
241
if (drizzleclient_vio_read(net->vio, net->buff,
242
(size_t) net->max_packet) <= 0)
210
if ((long) (count= vio_read(net->vio, net->buff,
211
(size_t) net->max_packet)) > 0)
213
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
214
(long) count, vio_description(net->vio)));
218
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
223
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
224
/* 'net_data_is_ready' returned "don't know" */
227
/* Read unblocking to clear net */
229
if (!vio_blocking(net->vio, FALSE, &old_mode))
231
while ((long) (count= vio_read(net->vio, net->buff,
232
(size_t) net->max_packet)) > 0)
233
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
234
(long) count, vio_description(net->vio)));
235
vio_blocking(net->vio, TRUE, &old_mode);
238
#endif /* NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE */
249
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
240
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
250
241
net->write_pos=net->buff;
255
246
/** Flush write_buffer if not empty. */
257
bool drizzleclient_net_flush(NET *net)
248
my_bool net_flush(NET *net)
251
DBUG_ENTER("net_flush");
260
252
if (net->buff != net->write_pos)
262
error=drizzleclient_net_real_write(net, net->buff,
263
(size_t) (net->write_pos - net->buff)) ? 1 : 0;
254
error=test(net_real_write(net, net->buff,
255
(size_t) (net->write_pos - net->buff)));
264
256
net->write_pos=net->buff;
266
258
/* Sync packet number if using compression */
267
259
if (net->compress)
268
260
net->pkt_nr=net->compress_pkt_nr;
273
265
/*****************************************************************************
274
** Write something to server/client buffer
275
*****************************************************************************/
266
** Write something to server/client buffer
267
*****************************************************************************/
278
Write a logical packet with packet header.
280
Format: Packet length (3 bytes), packet number(1 byte)
281
When compression is used a 3 byte compression length is added
284
If compression is used the original package is modified!
270
Write a logical packet with packet header.
272
Format: Packet length (3 bytes), packet number(1 byte)
273
When compression is used a 3 byte compression length is added
276
If compression is used the original package is modified!
288
drizzleclient_net_write(NET *net,const unsigned char *packet,size_t len)
280
my_net_write(NET *net,const uchar *packet,size_t len)
290
unsigned char buff[NET_HEADER_SIZE];
282
uchar buff[NET_HEADER_SIZE];
291
283
if (unlikely(!net->vio)) /* nowhere to write */
298
290
while (len >= MAX_PACKET_LENGTH)
300
const uint32_t z_size = MAX_PACKET_LENGTH;
292
const ulong z_size = MAX_PACKET_LENGTH;
301
293
int3store(buff, z_size);
302
buff[3]= (unsigned char) net->pkt_nr++;
294
buff[3]= (uchar) net->pkt_nr++;
303
295
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
304
net_write_buff(net, packet, z_size))
296
net_write_buff(net, packet, z_size))
306
298
packet += z_size;
309
301
/* Write last packet */
310
302
int3store(buff,len);
311
buff[3]= (unsigned char) net->pkt_nr++;
303
buff[3]= (uchar) net->pkt_nr++;
312
304
if (net_write_buff(net, buff, NET_HEADER_SIZE))
314
return net_write_buff(net,packet,len) ? 1 : 0;
306
#ifndef DEBUG_DATA_PACKETS
307
DBUG_DUMP("packet_header", buff, NET_HEADER_SIZE);
309
return test(net_write_buff(net,packet,len));
318
Send a command to the server.
320
The reason for having both header and packet is so that libdrizzle
321
can easy add a header to a special command (like prepared statements)
322
without having to re-alloc the string.
324
As the command is part of the first data packet, we have to do some data
325
juggling to put the command in there, without having to create a new
328
This function will split big packets into sub-packets if needed.
329
(Each sub packet can only be 2^24 bytes)
331
@param net NET handler
332
@param command Command in MySQL server (enum enum_server_command)
333
@param header Header to write after command
334
@param head_len Length of header
335
@param packet Query or parameter to query
336
@param len Length of packet
313
Send a command to the server.
315
The reason for having both header and packet is so that libmysql
316
can easy add a header to a special command (like prepared statements)
317
without having to re-alloc the string.
319
As the command is part of the first data packet, we have to do some data
320
juggling to put the command in there, without having to create a new
323
This function will split big packets into sub-packets if needed.
324
(Each sub packet can only be 2^24 bytes)
326
@param net NET handler
327
@param command Command in MySQL server (enum enum_server_command)
328
@param header Header to write after command
329
@param head_len Length of header
330
@param packet Query or parameter to query
331
@param len Length of packet
345
drizzleclient_net_write_command(NET *net,unsigned char command,
346
const unsigned char *header, size_t head_len,
347
const unsigned char *packet, size_t len)
340
net_write_command(NET *net,uchar command,
341
const uchar *header, size_t head_len,
342
const uchar *packet, size_t len)
349
uint32_t length=len+1+head_len; /* 1 extra byte for command */
350
unsigned char buff[NET_HEADER_SIZE+1];
351
uint32_t header_size=NET_HEADER_SIZE+1;
344
ulong length=len+1+head_len; /* 1 extra byte for command */
345
uchar buff[NET_HEADER_SIZE+1];
346
uint header_size=NET_HEADER_SIZE+1;
347
DBUG_ENTER("net_write_command");
348
DBUG_PRINT("enter",("length: %lu", (ulong) len));
353
buff[4]=command; /* For first packet */
350
buff[4]=command; /* For first packet */
355
352
if (length >= MAX_PACKET_LENGTH)
361
358
int3store(buff, MAX_PACKET_LENGTH);
362
buff[3]= (unsigned char) net->pkt_nr++;
359
buff[3]= (uchar) net->pkt_nr++;
363
360
if (net_write_buff(net, buff, header_size) ||
364
net_write_buff(net, header, head_len) ||
365
net_write_buff(net, packet, len))
361
net_write_buff(net, header, head_len) ||
362
net_write_buff(net, packet, len))
368
365
length-= MAX_PACKET_LENGTH;
369
366
len= MAX_PACKET_LENGTH;
371
368
header_size= NET_HEADER_SIZE;
372
369
} while (length >= MAX_PACKET_LENGTH);
373
len=length; /* Data left to be written */
370
len=length; /* Data left to be written */
375
372
int3store(buff,length);
376
buff[3]= (unsigned char) net->pkt_nr++;
377
return((net_write_buff(net, buff, header_size) ||
378
(head_len && net_write_buff(net, header, head_len)) ||
379
net_write_buff(net, packet, len) || drizzleclient_net_flush(net)) ? 1 : 0 );
373
buff[3]= (uchar) net->pkt_nr++;
374
DBUG_RETURN(test(net_write_buff(net, buff, header_size) ||
375
(head_len && net_write_buff(net, header, head_len)) ||
376
net_write_buff(net, packet, len) || net_flush(net)));
383
Caching the data in a local buffer before sending it.
380
Caching the data in a local buffer before sending it.
385
382
Fill up net->buffer and send it to the client when full.
387
If the rest of the to-be-sent-packet is bigger than buffer,
388
send it in one big block (to avoid copying to internal buffer).
389
If not, copy the rest of the data to the buffer and return without
392
@param net Network handler
393
@param packet Packet to send
394
@param len Length of packet
397
The cached buffer can be sent as it is with 'drizzleclient_net_flush()'.
398
In this code we have to be careful to not send a packet longer than
399
MAX_PACKET_LENGTH to drizzleclient_net_real_write() if we are using the compressed
400
protocol as we store the length of the compressed packet in 3 bytes.
384
If the rest of the to-be-sent-packet is bigger than buffer,
385
send it in one big block (to avoid copying to internal buffer).
386
If not, copy the rest of the data to the buffer and return without
389
@param net Network handler
390
@param packet Packet to send
391
@param len Length of packet
394
The cached buffer can be sent as it is with 'net_flush()'.
395
In this code we have to be careful to not send a packet longer than
396
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
397
protocol as we store the length of the compressed packet in 3 bytes.
409
net_write_buff(NET *net, const unsigned char *packet, uint32_t len)
406
net_write_buff(NET *net, const uchar *packet, ulong len)
411
uint32_t left_length;
412
409
if (net->compress && net->max_packet > MAX_PACKET_LENGTH)
413
410
left_length= MAX_PACKET_LENGTH - (net->write_pos - net->buff);
415
left_length= (uint32_t) (net->buff_end - net->write_pos);
412
left_length= (ulong) (net->buff_end - net->write_pos);
414
#ifdef DEBUG_DATA_PACKETS
415
DBUG_DUMP("data", packet, len);
417
417
if (len > left_length)
419
419
if (net->write_pos != net->buff)
421
421
/* Fill up already used packet and write it */
422
memcpy(net->write_pos,packet,left_length);
423
if (drizzleclient_net_real_write(net, net->buff,
424
(size_t) (net->write_pos - net->buff) + left_length))
422
memcpy((char*) net->write_pos,packet,left_length);
423
if (net_real_write(net, net->buff,
424
(size_t) (net->write_pos - net->buff) + left_length))
426
426
net->write_pos= net->buff;
427
427
packet+= left_length;
428
428
len-= left_length;
430
430
if (net->compress)
433
We can't have bigger packets than 16M with compression
434
Because the uncompressed length is stored in 3 bytes
433
We can't have bigger packets than 16M with compression
434
Because the uncompressed length is stored in 3 bytes
436
436
left_length= MAX_PACKET_LENGTH;
437
437
while (len > left_length)
439
if (drizzleclient_net_real_write(net, packet, left_length))
441
packet+= left_length;
439
if (net_real_write(net, packet, left_length))
441
packet+= left_length;
445
445
if (len > net->max_packet)
446
return drizzleclient_net_real_write(net, packet, len) ? 1 : 0;
446
return net_real_write(net, packet, len) ? 1 : 0;
447
447
/* Send out rest of the blocks as full sized blocks */
449
memcpy(net->write_pos,packet,len);
449
memcpy((char*) net->write_pos,packet,len);
450
450
net->write_pos+= len;
456
Read and write one packet using timeouts.
457
If needed, the packet is compressed before sending.
460
- TODO is it needed to set this variable if we have no socket
464
TODO: rewrite this in a manner to do non-block writes. If a write can not be made, and we are
465
in the server, yield to another process and come back later.
468
drizzleclient_net_real_write(NET *net, const unsigned char *packet, size_t len)
456
Read and write one packet using timeouts.
457
If needed, the packet is compressed before sending.
460
- TODO is it needed to set this variable if we have no socket
464
net_real_write(NET *net,const uchar *packet, size_t len)
471
const unsigned char *pos, *end;
472
uint32_t retry_count= 0;
474
/* Backup of the original SO_RCVTIMEO timeout */
467
const uchar *pos,*end;
470
my_bool net_blocking = vio_is_blocking(net->vio);
471
DBUG_ENTER("net_real_write");
476
473
if (net->error == 2)
477
return(-1); /* socket can't be used */
474
DBUG_RETURN(-1); /* socket can't be used */
479
476
net->reading_or_writing=2;
480
477
if (net->compress)
484
const uint32_t header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
485
if (!(b= (unsigned char*) malloc(len + NET_HEADER_SIZE +
481
uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
482
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
483
COMP_HEADER_SIZE, MYF(MY_WME))))
489
net->last_errno= CR_OUT_OF_MEMORY;
486
net->last_errno= ER_OUT_OF_RESOURCES;
490
487
/* In the server, the error is reported by MY_WME flag. */
491
488
net->reading_or_writing= 0;
494
491
memcpy(b+header_length,packet,len);
496
complen= len * 120 / 100 + 12;
497
unsigned char * compbuf= (unsigned char *) malloc(complen);
500
uLongf tmp_complen= complen;
501
int res= compress((Bytef*) compbuf, &tmp_complen,
502
(Bytef*) (b+header_length),
504
complen= tmp_complen;
508
if ((res != Z_OK) || (complen >= len))
512
size_t tmplen= complen;
493
if (my_compress(b+header_length, &len, &complen))
521
495
int3store(&b[NET_HEADER_SIZE],complen);
522
496
int3store(b,len);
523
b[3]=(unsigned char) (net->compress_pkt_nr++);
497
b[3]=(uchar) (net->compress_pkt_nr++);
524
498
len+= header_length;
502
#ifdef DEBUG_DATA_PACKETS
503
DBUG_DUMP("data", packet, len);
507
/* Write timeout is set in my_net_set_write_timeout */
530
/* Loop until we have read everything */
531
511
while (pos != end)
534
if ((long) (length= drizzleclient_vio_write(net->vio, pos, (size_t) (end-pos))) <= 0)
513
if ((long) (length= vio_write(net->vio,pos,(size_t) (end-pos))) <= 0)
537
* We could end up here with net->vio == NULL
539
* If that is the case, we exit the while loop
541
if (net->vio == NULL)
544
const bool interrupted= drizzleclient_vio_should_retry(net->vio);
546
If we read 0, or we were interrupted this means that
547
we need to switch to blocking mode and wait until the timeout
548
on the socket kicks in.
550
if ((interrupted || length == 0))
515
my_bool interrupted = vio_should_retry(net->vio);
516
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
554
while (drizzleclient_vio_blocking(net->vio, true, &old_mode) < 0)
556
if (drizzleclient_vio_should_retry(net->vio) && retry_count++ < net->retry_count)
558
net->error= 2; /* Close socket */
559
net->last_errno= CR_NET_PACKET_TOO_LARGE;
518
if (!thr_alarm(&alarmed, net->write_timeout, &alarm_buff))
519
{ /* Always true for client */
521
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
523
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
527
"%s: my_net_write: fcntl returned error %d, aborting thread\n",
528
my_progname,vio_errno(net->vio));
529
#endif /* EXTRA_DEBUG */
530
net->error= 2; /* Close socket */
531
net->last_errno= ER_NET_PACKET_TOO_LARGE;
567
if (retry_count++ < net->retry_count)
571
if (drizzleclient_vio_errno(net->vio) == EINTR)
575
net->error= 2; /* Close socket */
576
net->last_errno= (interrupted ? CR_NET_WRITE_INTERRUPTED :
577
CR_NET_ERROR_ON_WRITE);
539
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
542
if (retry_count++ < net->retry_count)
545
fprintf(stderr, "%s: write looped, aborting thread\n",
547
#endif /* EXTRA_DEBUG */
549
if (vio_errno(net->vio) == SOCKET_EINTR)
551
DBUG_PRINT("warning",("Interrupted write. Retrying..."));
554
net->error= 2; /* Close socket */
555
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
556
ER_NET_ERROR_ON_WRITE);
583
if ((net->compress) && (packet != NULL))
584
free((char*) packet);
560
update_statistics(thd_increment_bytes_sent(length));
564
my_free((char*) packet,MYF(0));
565
if (thr_alarm_in_use(&alarmed))
568
thr_end_alarm(&alarmed);
569
vio_blocking(net->vio, net_blocking, &old_mode);
585
571
net->reading_or_writing=0;
587
return(((int) (pos != end)));
572
DBUG_RETURN(((int) (pos != end)));
592
Reads one packet to net->buff + net->where_b.
593
Long packets are handled by drizzleclient_net_read().
594
This function reallocates the net->buff buffer if necessary.
577
Reads one packet to net->buff + net->where_b.
578
Long packets are handled by my_net_read().
579
This function reallocates the net->buff buffer if necessary.
597
Returns length of packet.
582
Returns length of packet.
601
586
my_real_read(NET *net, size_t *complen)
605
uint32_t i,retry_count=0;
606
size_t len=packet_error;
607
uint32_t remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
590
uint i,retry_count=0;
591
ulong len=packet_error;
593
my_bool net_blocking=vio_is_blocking(net->vio);
594
uint32 remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
612
net->reading_or_writing= 1;
613
/* Read timeout is set in drizzleclient_net_set_read_timeout */
615
pos = net->buff + net->where_b; /* net->packet -4 */
617
for (i= 0; i < 2 ; i++)
598
net->reading_or_writing=1;
599
thr_alarm_init(&alarmed);
600
/* Read timeout is set in my_net_set_read_timeout */
602
pos = net->buff + net->where_b; /* net->packet -4 */
603
for (i=0 ; i < 2 ; i++)
607
/* First read is done with non blocking mode */
608
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
610
my_bool interrupted = vio_should_retry(net->vio);
612
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
613
(long) length, vio_errno(net->vio)));
614
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
616
{ /* Probably in MIT threads */
617
if (retry_count++ < net->retry_count)
620
fprintf(stderr, "%s: read looped with error %d, aborting thread\n",
621
my_progname,vio_errno(net->vio));
622
#endif /* EXTRA_DEBUG */
624
if (vio_errno(net->vio) == SOCKET_EINTR)
626
DBUG_PRINT("warning",("Interrupted read. Retrying..."));
629
DBUG_PRINT("error",("Couldn't read packet: remain: %u errno: %d length: %ld",
630
remain, vio_errno(net->vio), (long) length));
632
net->error= 2; /* Close socket */
633
net->last_errno= (vio_was_interrupted(net->vio) ?
634
ER_NET_READ_INTERRUPTED :
638
remain -= (uint32) length;
640
update_statistics(thd_increment_bytes_received(length));
643
{ /* First parts is packet length */
645
DBUG_DUMP("packet_header", net->buff+net->where_b,
647
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
649
if (net->buff[net->where_b] != (uchar) 255)
652
("Packets out of order (Found: %d, expected %u)",
653
(int) net->buff[net->where_b + 3],
657
fprintf(stderr,"Error: Packets out of order (Found: %d, expected %d)\n",
658
(int) net->buff[net->where_b + 3],
659
(uint) (uchar) net->pkt_nr);
665
/* Not a NET error on the client. XXX: why? */
668
net->compress_pkt_nr= ++net->pkt_nr;
672
If the packet is compressed then complen > 0 and contains the
673
number of bytes in the uncompressed packet
675
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
678
len=uint3korr(net->buff+net->where_b);
679
if (!len) /* End of big multi-packet */
681
helping = max(len,*complen) + net->where_b;
682
/* The necessary size of net->buff */
683
if (helping >= net->max_packet)
685
if (net_realloc(net,helping))
687
len= packet_error; /* Return error and close connection */
691
pos=net->buff + net->where_b;
692
remain = (uint32) len;
697
if (thr_alarm_in_use(&alarmed))
621
/* First read is done with non blocking mode */
622
if ((long) (length= drizzleclient_vio_read(net->vio, pos, remain)) <= 0L)
624
if (net->vio == NULL)
627
const bool interrupted = drizzleclient_vio_should_retry(net->vio);
630
{ /* Probably in MIT threads */
631
if (retry_count++ < net->retry_count)
634
if (drizzleclient_vio_errno(net->vio) == EINTR)
639
net->error= 2; /* Close socket */
640
net->last_errno= (drizzleclient_vio_was_interrupted(net->vio) ?
641
CR_NET_READ_INTERRUPTED :
646
remain -= (uint32_t) length;
650
{ /* First parts is packet length */
653
if (net->buff[net->where_b + 3] != (unsigned char) net->pkt_nr)
656
/* Not a NET error on the client. XXX: why? */
659
net->compress_pkt_nr= ++net->pkt_nr;
663
If the packet is compressed then complen > 0 and contains the
664
number of bytes in the uncompressed packet
666
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
669
len=uint3korr(net->buff+net->where_b);
670
if (!len) /* End of big multi-packet */
672
helping = max(len,*complen) + net->where_b;
673
/* The necessary size of net->buff */
674
if (helping >= net->max_packet)
676
if (drizzleclient_net_realloc(net,helping))
678
len= packet_error; /* Return error and close connection */
682
pos=net->buff + net->where_b;
683
remain = (uint32_t) len;
700
thr_end_alarm(&alarmed);
701
vio_blocking(net->vio, net_blocking, &old_mode);
688
net->reading_or_writing= 0;
703
net->reading_or_writing=0;
704
#ifdef DEBUG_DATA_PACKETS
705
if (len != packet_error)
706
DBUG_DUMP("data", net->buff+net->where_b, len);
695
Read a packet from the client/server and return it without the internal
698
If the packet is the first packet of a multi-packet packet
699
(which is indicated by the length of the packet = 0xffffff) then
700
all sub packets are read and concatenated.
702
If the packet was compressed, its uncompressed and the length of the
703
uncompressed packet is returned.
706
The function returns the length of the found packet or packet_error.
707
net->read_pos points to the read data.
713
Read a packet from the client/server and return it without the internal
716
If the packet is the first packet of a multi-packet packet
717
(which is indicated by the length of the packet = 0xffffff) then
718
all sub packets are read and concatenated.
720
If the packet was compressed, its uncompressed and the length of the
721
uncompressed packet is returned.
724
The function returns the length of the found packet or packet_error.
725
net->read_pos points to the read data.
711
drizzleclient_net_read(NET *net)
729
my_net_read(NET *net)
713
731
size_t len, complen;
764
782
if (buf_length - start_of_packet >= NET_HEADER_SIZE)
766
read_length = uint3korr(net->buff+start_of_packet);
769
/* End of multi-byte packet */
770
start_of_packet += NET_HEADER_SIZE;
773
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
775
if (multi_byte_packet)
777
/* Remove packet header for second packet */
778
memmove(net->buff + first_packet_offset + start_of_packet,
779
net->buff + first_packet_offset + start_of_packet +
781
buf_length - start_of_packet);
782
start_of_packet += read_length;
783
buf_length -= NET_HEADER_SIZE;
786
start_of_packet+= read_length + NET_HEADER_SIZE;
784
read_length = uint3korr(net->buff+start_of_packet);
787
/* End of multi-byte packet */
788
start_of_packet += NET_HEADER_SIZE;
791
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
793
if (multi_byte_packet)
795
/* Remove packet header for second packet */
796
memmove(net->buff + first_packet_offset + start_of_packet,
797
net->buff + first_packet_offset + start_of_packet +
799
buf_length - start_of_packet);
800
start_of_packet += read_length;
801
buf_length -= NET_HEADER_SIZE;
804
start_of_packet+= read_length + NET_HEADER_SIZE;
788
if (read_length != MAX_PACKET_LENGTH) /* last package */
790
multi_byte_packet= 0; /* No last zero len packet */
793
multi_byte_packet= NET_HEADER_SIZE;
794
/* Move data down to read next data packet after current one */
795
if (first_packet_offset)
797
memmove(net->buff,net->buff+first_packet_offset,
798
buf_length-first_packet_offset);
799
buf_length-=first_packet_offset;
800
start_of_packet -= first_packet_offset;
801
first_packet_offset=0;
806
if (read_length != MAX_PACKET_LENGTH) /* last package */
808
multi_byte_packet= 0; /* No last zero len packet */
811
multi_byte_packet= NET_HEADER_SIZE;
812
/* Move data down to read next data packet after current one */
813
if (first_packet_offset)
815
memmove(net->buff,net->buff+first_packet_offset,
816
buf_length-first_packet_offset);
817
buf_length-=first_packet_offset;
818
start_of_packet -= first_packet_offset;
819
first_packet_offset=0;
806
824
/* Move data down to read next data packet after current one */
807
825
if (first_packet_offset)
809
memmove(net->buff,net->buff+first_packet_offset,
810
buf_length-first_packet_offset);
811
buf_length-=first_packet_offset;
812
start_of_packet -= first_packet_offset;
813
first_packet_offset=0;
827
memmove(net->buff,net->buff+first_packet_offset,
828
buf_length-first_packet_offset);
829
buf_length-=first_packet_offset;
830
start_of_packet -= first_packet_offset;
831
first_packet_offset=0;
816
834
net->where_b=buf_length;
817
835
if ((packet_len = my_real_read(net,&complen)) == packet_error)
837
if (my_uncompress(net->buff + net->where_b, packet_len,
822
unsigned char * compbuf= (unsigned char *) malloc(complen);
825
uLongf tmp_complen= complen;
826
int error= uncompress((Bytef*) compbuf, &tmp_complen,
827
(Bytef*) (net->buff + net->where_b),
829
complen= tmp_complen;
833
net->error= 2; /* caller will close socket */
834
net->last_errno= CR_NET_UNCOMPRESS_ERROR;
838
memcpy((net->buff + net->where_b), compbuf, complen);
840
net->error= 2; /* caller will close socket */
841
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
844
buf_length+= complen;
847
buf_length+= complen;
849
847
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
850
848
net->buf_length= buf_length;
851
net->remain_in_buf= (uint32_t) (buf_length - start_of_packet);
852
len = ((uint32_t) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
849
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
850
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
853
851
multi_byte_packet);
854
net->save_char= net->read_pos[len]; /* Must be saved */
855
net->read_pos[len]=0; /* Safeguard for drizzleclient_use_result */
852
net->save_char= net->read_pos[len]; /* Must be saved */
853
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
861
void drizzleclient_net_set_read_timeout(NET *net, uint32_t timeout)
859
void my_net_set_read_timeout(NET *net, uint timeout)
861
DBUG_ENTER("my_net_set_read_timeout");
862
DBUG_PRINT("enter", ("timeout: %d", timeout));
863
863
net->read_timeout= timeout;
866
drizzleclient_vio_timeout(net->vio, 0, timeout);
865
vio_timeout(net->vio, 0, timeout);
872
void drizzleclient_net_set_write_timeout(NET *net, uint32_t timeout)
870
void my_net_set_write_timeout(NET *net, uint timeout)
872
DBUG_ENTER("my_net_set_write_timeout");
873
DBUG_PRINT("enter", ("timeout: %d", timeout));
874
874
net->write_timeout= timeout;
877
drizzleclient_vio_timeout(net->vio, 1, timeout);
882
Clear possible error state of struct NET
884
@param net clear the state of the argument
887
void drizzleclient_drizzleclient_net_clear_error(NET *net)
890
net->last_error[0]= '\0';
891
strcpy(net->sqlstate, not_error_sqlstate);
894
} /* namespace drizzle_protocol */
876
vio_timeout(net->vio, 1, timeout);