1
/* Copyright (C) 2000 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
HFTODO this must be hidden if we don't want client capabilities in
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
21
#include <drizzled/global.h>
22
#include <drizzled/error.h>
23
#include <mysys/my_sys.h>
24
#include <vio/violite.h>
22
#include "libdrizzle.h"
23
#include "libdrizzle_priv.h"
24
#include <libdrizzle/errmsg.h>
25
#include <libdrizzle/vio.h>
25
30
#include <signal.h>
32
#include <sys/socket.h>
27
33
#include <sys/poll.h>
30
37
The following handles the differences when this is linked between the
68
if (vio != 0) /* If real connection */
70
if (vio != 0) /* If real connection */
70
net->fd = vio_fd(vio); /* For perl DBI/DBD */
72
net->fd = vio_fd(vio); /* For perl DBI/DBD */
78
bool net_init_sock(NET * net, int sock, int flags)
81
Vio *vio_tmp= vio_new(sock, VIO_TYPE_TCPIP, flags);
85
if (my_net_init(net, vio_tmp))
87
/* Only delete the temporary vio if we didn't already attach it to the
90
if (vio_tmp && (net->vio != vio_tmp))
94
(void) shutdown(sock, SHUT_RDWR);
77
102
void net_end(NET *net)
79
my_free(net->buff,MYF(MY_ALLOW_ZERO_PTR));
104
if (net->buff != NULL)
110
void net_close(NET *net)
112
if (net->vio != NULL)
114
vio_delete(net->vio);
119
bool net_peer_addr(NET *net, char *buf, uint16_t *port, size_t buflen)
121
return vio_peer_addr(net->vio, buf, port, buflen);
124
void net_keepalive(NET *net, bool flag)
126
vio_keepalive(net->vio, flag);
129
int net_get_sd(NET *net)
134
bool net_should_close(NET *net)
136
return net->error || (net->vio == 0);
139
bool net_more_data(NET *net)
141
return (net->vio == 0 || net->vio->read_pos < net->vio->read_end);
85
144
/** Realloc the packet buffer. */
87
146
bool net_realloc(NET *net, size_t length)
90
149
size_t pkt_length;
92
151
if (length >= net->max_packet_size)
94
153
/* @todo: 1 and 2 codes are identical. */
96
net->last_errno= ER_NET_PACKET_TOO_LARGE;
155
net->last_errno= CR_NET_PACKET_TOO_LARGE;
99
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
158
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
101
160
We must allocate some extra bytes for the end 0 and to be able to
102
161
read big compressed blocks
104
if (!(buff= (uchar*) my_realloc((char*) net->buff, pkt_length +
105
NET_HEADER_SIZE + COMP_HEADER_SIZE,
163
if (!(buff= (unsigned char*) realloc((char*) net->buff, pkt_length +
164
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
108
166
/* @todo: 1 and 2 codes are identical. */
110
net->last_errno= ER_OUT_OF_RESOURCES;
168
net->last_errno= CR_OUT_OF_MEMORY;
111
169
/* In the server the error is reported by MY_WME flag. */
148
Remove unwanted characters from connection
149
and check if disconnected.
151
Read from socket until there is nothing more to read. Discard
154
If there is anything when to read 'net_clear' is called this
155
normally indicates an error in the protocol.
157
When connection is properly closed (for TCP it means with
158
a FIN packet), then select() considers a socket "ready to read",
159
in the sense that there's EOF to read, but read() returns 0.
161
@param net NET handler
162
@param clear_buffer if <> 0, then clear all data from comm buff
206
Remove unwanted characters from connection
207
and check if disconnected.
209
Read from socket until there is nothing more to read. Discard
212
If there is anything when to read 'net_clear' is called this
213
normally indicates an error in the protocol.
215
When connection is properly closed (for TCP it means with
216
a FIN packet), then select() considers a socket "ready to read",
217
in the sense that there's EOF to read, but read() returns 0.
219
@param net NET handler
220
@param clear_buffer if <> 0, then clear all data from comm buff
165
223
void net_clear(NET *net, bool clear_buffer)
204
262
/*****************************************************************************
205
** Write something to server/client buffer
206
*****************************************************************************/
263
** Write something to server/client buffer
264
*****************************************************************************/
209
Write a logical packet with packet header.
211
Format: Packet length (3 bytes), packet number(1 byte)
212
When compression is used a 3 byte compression length is added
215
If compression is used the original package is modified!
267
Write a logical packet with packet header.
269
Format: Packet length (3 bytes), packet number(1 byte)
270
When compression is used a 3 byte compression length is added
273
If compression is used the original package is modified!
219
my_net_write(NET *net,const uchar *packet,size_t len)
277
my_net_write(NET *net,const unsigned char *packet,size_t len)
221
uchar buff[NET_HEADER_SIZE];
279
unsigned char buff[NET_HEADER_SIZE];
222
280
if (unlikely(!net->vio)) /* nowhere to write */
231
289
const uint32_t z_size = MAX_PACKET_LENGTH;
232
290
int3store(buff, z_size);
233
buff[3]= (uchar) net->pkt_nr++;
291
buff[3]= (unsigned char) net->pkt_nr++;
234
292
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
235
net_write_buff(net, packet, z_size))
293
net_write_buff(net, packet, z_size))
237
295
packet += z_size;
240
298
/* Write last packet */
241
299
int3store(buff,len);
242
buff[3]= (uchar) net->pkt_nr++;
300
buff[3]= (unsigned char) net->pkt_nr++;
243
301
if (net_write_buff(net, buff, NET_HEADER_SIZE))
245
return test(net_write_buff(net,packet,len));
303
return net_write_buff(net,packet,len) ? 1 : 0;
249
Send a command to the server.
251
The reason for having both header and packet is so that libdrizzle
252
can easy add a header to a special command (like prepared statements)
253
without having to re-alloc the string.
255
As the command is part of the first data packet, we have to do some data
256
juggling to put the command in there, without having to create a new
259
This function will split big packets into sub-packets if needed.
260
(Each sub packet can only be 2^24 bytes)
262
@param net NET handler
263
@param command Command in MySQL server (enum enum_server_command)
264
@param header Header to write after command
265
@param head_len Length of header
266
@param packet Query or parameter to query
267
@param len Length of packet
307
Send a command to the server.
309
The reason for having both header and packet is so that libdrizzle
310
can easy add a header to a special command (like prepared statements)
311
without having to re-alloc the string.
313
As the command is part of the first data packet, we have to do some data
314
juggling to put the command in there, without having to create a new
317
This function will split big packets into sub-packets if needed.
318
(Each sub packet can only be 2^24 bytes)
320
@param net NET handler
321
@param command Command in MySQL server (enum enum_server_command)
322
@param header Header to write after command
323
@param head_len Length of header
324
@param packet Query or parameter to query
325
@param len Length of packet
276
net_write_command(NET *net,uchar command,
277
const uchar *header, size_t head_len,
278
const uchar *packet, size_t len)
334
net_write_command(NET *net,unsigned char command,
335
const unsigned char *header, size_t head_len,
336
const unsigned char *packet, size_t len)
280
uint32_t length=len+1+head_len; /* 1 extra byte for command */
281
uchar buff[NET_HEADER_SIZE+1];
282
uint header_size=NET_HEADER_SIZE+1;
338
uint32_t length=len+1+head_len; /* 1 extra byte for command */
339
unsigned char buff[NET_HEADER_SIZE+1];
340
uint32_t header_size=NET_HEADER_SIZE+1;
284
buff[4]=command; /* For first packet */
342
buff[4]=command; /* For first packet */
286
344
if (length >= MAX_PACKET_LENGTH)
292
350
int3store(buff, MAX_PACKET_LENGTH);
293
buff[3]= (uchar) net->pkt_nr++;
351
buff[3]= (unsigned char) net->pkt_nr++;
294
352
if (net_write_buff(net, buff, header_size) ||
295
net_write_buff(net, header, head_len) ||
296
net_write_buff(net, packet, len))
353
net_write_buff(net, header, head_len) ||
354
net_write_buff(net, packet, len))
299
357
length-= MAX_PACKET_LENGTH;
300
358
len= MAX_PACKET_LENGTH;
302
360
header_size= NET_HEADER_SIZE;
303
361
} while (length >= MAX_PACKET_LENGTH);
304
len=length; /* Data left to be written */
362
len=length; /* Data left to be written */
306
364
int3store(buff,length);
307
buff[3]= (uchar) net->pkt_nr++;
308
return(test(net_write_buff(net, buff, header_size) ||
309
(head_len && net_write_buff(net, header, head_len)) ||
310
net_write_buff(net, packet, len) || net_flush(net)));
365
buff[3]= (unsigned char) net->pkt_nr++;
366
return((net_write_buff(net, buff, header_size) ||
367
(head_len && net_write_buff(net, header, head_len)) ||
368
net_write_buff(net, packet, len) || net_flush(net)) ? 1 : 0 );
314
Caching the data in a local buffer before sending it.
372
Caching the data in a local buffer before sending it.
316
374
Fill up net->buffer and send it to the client when full.
318
If the rest of the to-be-sent-packet is bigger than buffer,
319
send it in one big block (to avoid copying to internal buffer).
320
If not, copy the rest of the data to the buffer and return without
323
@param net Network handler
324
@param packet Packet to send
325
@param len Length of packet
328
The cached buffer can be sent as it is with 'net_flush()'.
329
In this code we have to be careful to not send a packet longer than
330
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
331
protocol as we store the length of the compressed packet in 3 bytes.
376
If the rest of the to-be-sent-packet is bigger than buffer,
377
send it in one big block (to avoid copying to internal buffer).
378
If not, copy the rest of the data to the buffer and return without
381
@param net Network handler
382
@param packet Packet to send
383
@param len Length of packet
386
The cached buffer can be sent as it is with 'net_flush()'.
387
In this code we have to be careful to not send a packet longer than
388
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
389
protocol as we store the length of the compressed packet in 3 bytes.
396
454
in the server, yield to another process and come back later.
399
net_real_write(NET *net,const uchar *packet, size_t len)
457
net_real_write(NET *net, const unsigned char *packet, size_t len)
402
const uchar *pos,*end;
460
const unsigned char *pos, *end;
461
uint32_t retry_count= 0;
405
463
/* Backup of the original SO_RCVTIMEO timeout */
406
struct timeval backtime;
465
struct timespec backtime;
409
469
if (net->error == 2)
410
return(-1); /* socket can't be used */
470
return(-1); /* socket can't be used */
412
472
net->reading_or_writing=2;
413
473
if (net->compress)
417
const uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
418
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
419
COMP_HEADER_SIZE, MYF(MY_WME))))
477
const uint32_t header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
478
if (!(b= (unsigned char*) malloc(len + NET_HEADER_SIZE +
422
net->last_errno= ER_OUT_OF_RESOURCES;
482
net->last_errno= CR_OUT_OF_MEMORY;
423
483
/* In the server, the error is reported by MY_WME flag. */
424
484
net->reading_or_writing= 0;
427
487
memcpy(b+header_length,packet,len);
429
if (my_compress(b+header_length, &len, &complen))
489
complen= len * 120 / 100 + 12;
490
unsigned char * compbuf= (unsigned char *) malloc(complen);
493
uLongf tmp_complen= complen;
494
int res= compress((Bytef*) compbuf, &tmp_complen,
495
(Bytef*) (b+header_length),
497
complen= tmp_complen;
501
if ((res != Z_OK) || (complen >= len))
505
size_t tmplen= complen;
431
514
int3store(&b[NET_HEADER_SIZE],complen);
432
515
int3store(b,len);
433
b[3]=(uchar) (net->compress_pkt_nr++);
516
b[3]=(unsigned char) (net->compress_pkt_nr++);
434
517
len+= header_length;
438
522
/* Check for error, currently assert */
439
523
if (net->write_timeout)
441
struct timeval waittime;
525
struct timespec waittime;
442
526
socklen_t length;
444
528
waittime.tv_sec= net->write_timeout;
447
memset(&backtime, 0, sizeof(struct timeval));
448
length= sizeof(struct timeval);
449
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
531
memset(&backtime, 0, sizeof(struct timespec));
532
length= sizeof(struct timespec);
533
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
450
534
&backtime, &length);
453
537
perror("getsockopt");
454
538
assert(error == 0);
456
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
457
&waittime, (socklen_t)sizeof(struct timeval));
540
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
541
&waittime, (socklen_t)sizeof(struct timespec));
458
542
assert(error == 0);
462
548
/* Loop until we have read everything */
463
549
while (pos != end)
465
if ((long) (length= vio_write(net->vio,pos,(size_t) (end-pos))) <= 0)
552
if ((long) (length= vio_write(net->vio, pos, (size_t) (end-pos))) <= 0)
467
554
const bool interrupted= vio_should_retry(net->vio);
469
If we read 0, or we were interrupted this means that
470
we need to switch to blocking mode and wait until the timeout
556
If we read 0, or we were interrupted this means that
557
we need to switch to blocking mode and wait until the timeout
471
558
on the socket kicks in.
473
560
if ((interrupted || length == 0))
490
577
if (retry_count++ < net->retry_count)
494
if (vio_errno(net->vio) == SOCKET_EINTR)
581
if (vio_errno(net->vio) == EINTR)
498
net->error= 2; /* Close socket */
499
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
500
ER_NET_ERROR_ON_WRITE);
585
net->error= 2; /* Close socket */
586
net->last_errno= (interrupted ? CR_NET_WRITE_INTERRUPTED :
587
CR_NET_ERROR_ON_WRITE);
504
update_statistics(thd_increment_bytes_sent(length));
508
my_free((char*) packet,MYF(0));
593
if ((net->compress) && (packet != NULL))
594
free((char*) packet);
509
595
net->reading_or_writing=0;
511
598
if (net->write_timeout)
512
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
513
&backtime, (socklen_t)sizeof(struct timeval));
599
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
600
&backtime, (socklen_t)sizeof(struct timespec));
515
603
return(((int) (pos != end)));
520
Reads one packet to net->buff + net->where_b.
521
Long packets are handled by my_net_read().
522
This function reallocates the net->buff buffer if necessary.
608
Reads one packet to net->buff + net->where_b.
609
Long packets are handled by my_net_read().
610
This function reallocates the net->buff buffer if necessary.
525
Returns length of packet.
613
Returns length of packet.
529
617
my_real_read(NET *net, size_t *complen)
533
uint i,retry_count=0;
621
uint32_t i,retry_count=0;
534
622
uint32_t len=packet_error;
535
623
uint32_t remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
537
627
/* Backup of the original SO_RCVTIMEO timeout */
538
struct timeval backtime;
628
struct timespec backtime;
543
634
net->reading_or_writing= 1;
544
635
/* Read timeout is set in my_net_set_read_timeout */
546
pos = net->buff + net->where_b; /* net->packet -4 */
637
pos = net->buff + net->where_b; /* net->packet -4 */
549
641
/* Check for error, currently assert */
550
642
if (net->read_timeout)
552
struct timeval waittime;
644
struct timespec waittime;
553
645
socklen_t length;
555
647
waittime.tv_sec= net->read_timeout;
558
memset(&backtime, 0, sizeof(struct timeval));
559
length= sizeof(struct timeval);
560
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
650
memset(&backtime, 0, sizeof(struct timespec));
651
length= sizeof(struct timespec);
652
error= getsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
561
653
&backtime, &length);
564
656
perror("getsockopt");
565
657
assert(error == 0);
567
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
568
&waittime, (socklen_t)sizeof(struct timeval));
659
error= setsockopt(net->vio->sd, SOL_SOCKET, SO_RCVTIMEO,
660
&waittime, (socklen_t)sizeof(struct timespec));
569
661
assert(error == 0);
572
665
for (i= 0; i < 2 ; i++)
579
672
const bool interrupted = vio_should_retry(net->vio);
582
{ /* Probably in MIT threads */
675
{ /* Probably in MIT threads */
583
676
if (retry_count++ < net->retry_count)
586
if (vio_errno(net->vio) == SOCKET_EINTR)
679
if (vio_errno(net->vio) == EINTR)
590
683
len= packet_error;
591
net->error= 2; /* Close socket */
684
net->error= 2; /* Close socket */
592
685
net->last_errno= (vio_was_interrupted(net->vio) ?
593
ER_NET_READ_INTERRUPTED :
595
my_error(net->last_errno, MYF(0));
686
CR_NET_READ_INTERRUPTED :
598
691
remain -= (uint32_t) length;
600
update_statistics(thd_increment_bytes_received(length));
603
{ /* First parts is packet length */
695
{ /* First parts is packet length */
604
696
uint32_t helping;
606
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
698
if (net->buff[net->where_b + 3] != (unsigned char) net->pkt_nr)
608
700
len= packet_error;
609
701
/* Not a NET error on the client. XXX: why? */
652
Read a packet from the client/server and return it without the internal
655
If the packet is the first packet of a multi-packet packet
656
(which is indicated by the length of the packet = 0xffffff) then
657
all sub packets are read and concatenated.
659
If the packet was compressed, its uncompressed and the length of the
660
uncompressed packet is returned.
663
The function returns the length of the found packet or packet_error.
664
net->read_pos points to the read data.
746
Read a packet from the client/server and return it without the internal
749
If the packet is the first packet of a multi-packet packet
750
(which is indicated by the length of the packet = 0xffffff) then
751
all sub packets are read and concatenated.
753
If the packet was compressed, its uncompressed and the length of the
754
uncompressed packet is returned.
757
The function returns the length of the found packet or packet_error.
758
net->read_pos points to the read data.
721
815
if (buf_length - start_of_packet >= NET_HEADER_SIZE)
723
read_length = uint3korr(net->buff+start_of_packet);
726
/* End of multi-byte packet */
727
start_of_packet += NET_HEADER_SIZE;
730
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
732
if (multi_byte_packet)
734
/* Remove packet header for second packet */
735
memmove(net->buff + first_packet_offset + start_of_packet,
736
net->buff + first_packet_offset + start_of_packet +
738
buf_length - start_of_packet);
739
start_of_packet += read_length;
740
buf_length -= NET_HEADER_SIZE;
743
start_of_packet+= read_length + NET_HEADER_SIZE;
817
read_length = uint3korr(net->buff+start_of_packet);
820
/* End of multi-byte packet */
821
start_of_packet += NET_HEADER_SIZE;
824
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
826
if (multi_byte_packet)
828
/* Remove packet header for second packet */
829
memmove(net->buff + first_packet_offset + start_of_packet,
830
net->buff + first_packet_offset + start_of_packet +
832
buf_length - start_of_packet);
833
start_of_packet += read_length;
834
buf_length -= NET_HEADER_SIZE;
837
start_of_packet+= read_length + NET_HEADER_SIZE;
745
if (read_length != MAX_PACKET_LENGTH) /* last package */
747
multi_byte_packet= 0; /* No last zero len packet */
750
multi_byte_packet= NET_HEADER_SIZE;
751
/* Move data down to read next data packet after current one */
752
if (first_packet_offset)
754
memmove(net->buff,net->buff+first_packet_offset,
755
buf_length-first_packet_offset);
756
buf_length-=first_packet_offset;
757
start_of_packet -= first_packet_offset;
758
first_packet_offset=0;
839
if (read_length != MAX_PACKET_LENGTH) /* last package */
841
multi_byte_packet= 0; /* No last zero len packet */
844
multi_byte_packet= NET_HEADER_SIZE;
845
/* Move data down to read next data packet after current one */
846
if (first_packet_offset)
848
memmove(net->buff,net->buff+first_packet_offset,
849
buf_length-first_packet_offset);
850
buf_length-=first_packet_offset;
851
start_of_packet -= first_packet_offset;
852
first_packet_offset=0;
763
857
/* Move data down to read next data packet after current one */
764
858
if (first_packet_offset)
766
memmove(net->buff,net->buff+first_packet_offset,
767
buf_length-first_packet_offset);
768
buf_length-=first_packet_offset;
769
start_of_packet -= first_packet_offset;
770
first_packet_offset=0;
860
memmove(net->buff,net->buff+first_packet_offset,
861
buf_length-first_packet_offset);
862
buf_length-=first_packet_offset;
863
start_of_packet -= first_packet_offset;
864
first_packet_offset=0;
773
867
net->where_b=buf_length;
774
868
if ((packet_len = my_real_read(net,&complen)) == packet_error)
776
if (my_uncompress(net->buff + net->where_b, packet_len,
779
net->error= 2; /* caller will close socket */
780
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
873
unsigned char * compbuf= (unsigned char *) malloc(complen);
876
uLongf tmp_complen= complen;
877
int error= uncompress((Bytef*) compbuf, &tmp_complen,
878
(Bytef*) (net->buff + net->where_b),
880
complen= tmp_complen;
884
net->error= 2; /* caller will close socket */
885
net->last_errno= CR_NET_UNCOMPRESS_ERROR;
889
memcpy((net->buff + net->where_b), compbuf, complen);
783
buf_length+= complen;
898
buf_length+= complen;
786
900
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
787
901
net->buf_length= buf_length;
788
902
net->remain_in_buf= (uint32_t) (buf_length - start_of_packet);
789
903
len = ((uint32_t) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
790
904
multi_byte_packet);
791
net->save_char= net->read_pos[len]; /* Must be saved */
792
net->read_pos[len]=0; /* Safeguard for drizzle_use_result */
905
net->save_char= net->read_pos[len]; /* Must be saved */
906
net->read_pos[len]=0; /* Safeguard for drizzle_use_result */
798
void my_net_set_read_timeout(NET *net, uint timeout)
912
void my_net_set_read_timeout(NET *net, uint32_t timeout)
800
914
net->read_timeout= timeout;
802
917
vio_timeout(net->vio, 0, timeout);
807
void my_net_set_write_timeout(NET *net, uint timeout)
923
void my_net_set_write_timeout(NET *net, uint32_t timeout)
809
925
net->write_timeout= timeout;
811
928
vio_timeout(net->vio, 1, timeout);
933
Clear possible error state of struct NET
935
@param net clear the state of the argument
938
void net_clear_error(NET *net)
941
net->last_error[0]= '\0';
942
strcpy(net->sqlstate, sqlstate_get_not_error());