17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include <libdrizzle/drizzle_com.h>
23
#include <libdrizzle/libdrizzle.h>
24
#include <libdrizzle/errmsg.h>
25
#include <libdrizzle/drizzle.h>
26
#include <libdrizzle/gettext.h>
27
#include <libdrizzle/net_serv.h>
28
#include <libdrizzle/drizzle_data.h>
29
#include <libdrizzle/local_infile.h>
20
#include <drizzled/global.h>
21
#include <drizzled/common.h>
31
23
#include "libdrizzle_priv.h"
33
#include <vio/violite.h>
25
#include "libdrizzle.h"
30
#include "drizzle_data.h"
35
#include <drizzled/version.h>
32
#include <drizzled/gettext.h>
38
35
#include <stdlib.h>
42
39
#include <assert.h>
44
41
#include <sys/socket.h>
44
#include <arpa/inet.h>
45
#include <netinet/in.h>
47
48
#define CONNECT_TIMEOUT 0
49
#define PROTOCOL_VERSION 10
49
52
static bool drizzle_client_init= false;
50
53
unsigned int drizzle_server_last_errno;
52
55
/* Server error code and message */
53
char drizzle_server_last_error[DRIZZLE_ERRMSG_SIZE];
56
char drizzle_server_last_error[LIBDRIZZLE_ERRMSG_SIZE];
56
59
Note that the drizzle argument must be initialized with drizzle_init()
57
before calling drizzle_connect !
60
before calling drizzleclient_connect !
62
65
static DRIZZLE_METHODS client_methods=
64
cli_read_query_result, /* read_query_result */
65
cli_advanced_command, /* advanced_command */
66
cli_read_rows, /* read_rows */
67
cli_use_result, /* use_result */
68
cli_fetch_lengths, /* fetch_lengths */
69
cli_flush_use_result, /* flush_use_result */
70
cli_list_fields, /* list_fields */
71
cli_unbuffered_fetch, /* unbuffered_fetch */
72
cli_read_statistics, /* read_statistics */
73
cli_read_query_result, /* next_result */
74
cli_read_change_user_result, /* read_change_user_result */
67
drizzleclient_cli_read_query_result, /* read_query_result */
68
drizzleclient_cli_advanced_command, /* advanced_command */
69
drizzleclient_cli_read_rows, /* read_rows */
70
drizzleclient_cli_use_result, /* use_result */
71
drizzleclient_cli_fetch_lengths, /* fetch_lengths */
72
drizzleclient_cli_flush_use_result, /* flush_use_result */
73
drizzleclient_cli_list_fields, /* list_fields */
74
drizzleclient_cli_unbuffered_fetch, /* unbuffered_fetch */
75
drizzleclient_cli_read_statistics, /* read_statistics */
76
drizzleclient_cli_read_query_result, /* next_result */
81
83
****************************************************************************/
84
drizzle_create(DRIZZLE *ptr)
86
drizzleclient_create(DRIZZLE *ptr)
87
89
if (!drizzle_client_init)
89
91
drizzle_client_init=true;
91
if (!drizzle_get_default_port())
93
if (!drizzleclient_get_default_port())
93
drizzle_set_default_port(DRIZZLE_PORT);
95
drizzleclient_set_default_port(DRIZZLE_TCP_PORT);
95
97
struct servent *serv_ptr;
108
#if DRIZZLE_PORT_DEFAULT == 0
110
#if DRIZZLE_TCP_PORT_DEFAULT == 0
109
111
if ((serv_ptr = getservbyname("drizzle", "tcp")))
110
drizzle_set_default_port((uint32_t) ntohs((uint16_t) serv_ptr->s_port));
112
drizzleclient_set_default_port((uint32_t) ntohs((uint16_t) serv_ptr->s_port));
112
114
if ((env = getenv("DRIZZLE_TCP_PORT")))
113
drizzle_set_default_port((uint32_t) atoi(env));
115
drizzleclient_set_default_port((uint32_t) atoi(env));
116
118
#if defined(SIGPIPE)
127
drizzle_set_error(NULL, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
129
drizzleclient_set_error(NULL, CR_OUT_OF_MEMORY, drizzleclient_sqlstate_get_unknown());
130
132
memset(ptr, 0, sizeof(DRIZZLE));
138
140
ptr->options.connect_timeout= CONNECT_TIMEOUT;
139
strcpy(ptr->net.sqlstate, sqlstate_get_not_error());
141
strcpy(ptr->net.sqlstate, drizzleclient_sqlstate_get_not_error());
142
144
Only enable LOAD DATA INFILE by default if configured with
154
156
By default we don't reconnect because it could silently corrupt data (after
155
157
reconnection you potentially lose table locks, user variables, session
156
158
variables (transactions but they are specifically dealt with in
157
drizzle_reconnect()).
159
drizzleclient_reconnect()).
158
160
This is a change: < 5.0.3 drizzle->reconnect was set to 1 by default.
159
161
How this change impacts existing apps:
160
162
- existing apps which relyed on the default will see a behaviour change;
161
they will have to set reconnect=1 after drizzle_connect().
163
they will have to set reconnect=1 after drizzleclient_connect().
162
164
- existing apps which explicitely asked for reconnection (the only way they
163
could do it was by setting drizzle.reconnect to 1 after drizzle_connect())
165
could do it was by setting drizzle.reconnect to 1 after drizzleclient_connect())
164
166
will not see a behaviour change.
165
167
- existing apps which explicitely asked for no reconnection
166
168
(drizzle.reconnect=0) will not see a behaviour change.
202
drizzle_connect(DRIZZLE *drizzle,const char *host, const char *user,
204
drizzleclient_connect(DRIZZLE *drizzle,const char *host, const char *user,
203
205
const char *passwd, const char *db,
205
const char * unix_port __attribute__((__unused__)),
207
const char * unix_port,
206
208
uint32_t client_flag)
208
211
char buff[NAME_LEN+USERNAME_LENGTH+100];
209
212
char *end,*host_info=NULL;
210
213
uint32_t pkt_length;
246
249
char port_buf[NI_MAXSERV];
252
port= drizzleclient_get_default_port();
252
255
host= LOCAL_HOST;
254
snprintf(host_info=buff, sizeof(buff)-1, ER(CR_TCP_CONNECTION), host);
257
snprintf(host_info=buff, sizeof(buff)-1, _("%-.100s via TCP/IP"), host);
256
259
memset(&hints, 0, sizeof(hints));
257
260
hints.ai_socktype= SOCK_STREAM;
262
265
if (gai_errno != 0)
264
drizzle_set_extended_error(drizzle, CR_UNKNOWN_HOST, sqlstate_get_unknown(),
267
drizzleclient_set_extended_error(drizzle, CR_UNKNOWN_HOST, drizzleclient_sqlstate_get_unknown(),
265
268
ER(CR_UNKNOWN_HOST), host, errno);
277
net->vio= vio_new(sock, VIO_TYPE_TCPIP, VIO_BUFFERED_READ);
280
net->vio= drizzleclient_vio_new(sock, VIO_TYPE_TCPIP, VIO_BUFFERED_READ);
284
if (connect_with_timeout(sock, t_res->ai_addr, t_res->ai_addrlen, drizzle->options.connect_timeout))
287
if (drizzleclient_connect_with_timeout(sock, t_res->ai_addr, t_res->ai_addrlen, drizzle->options.connect_timeout))
286
vio_delete(net->vio);
289
drizzleclient_vio_delete(net->vio);
298
drizzle_set_extended_error(drizzle, CR_CONN_HOST_ERROR, sqlstate_get_unknown(),
299
ER(CR_CONN_HOST_ERROR), host, errno);
301
drizzleclient_set_extended_error(drizzle, CR_CONN_HOST_ERROR,
302
drizzleclient_sqlstate_get_unknown(),
303
ER(CR_CONN_HOST_ERROR),
303
if (my_net_init(net, net->vio))
308
if (drizzleclient_net_init(net, net->vio))
305
vio_delete(net->vio);
310
drizzleclient_vio_delete(net->vio);
307
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
312
drizzleclient_set_error(drizzle, CR_OUT_OF_MEMORY, drizzleclient_sqlstate_get_unknown());
310
vio_keepalive(net->vio,true);
315
drizzleclient_vio_keepalive(net->vio,true);
312
317
/* If user set read_timeout, let it override the default */
313
318
if (drizzle->options.read_timeout)
314
my_net_set_read_timeout(net, drizzle->options.read_timeout);
319
drizzleclient_net_set_read_timeout(net, drizzle->options.read_timeout);
316
321
/* If user set write_timeout, let it override the default */
317
322
if (drizzle->options.write_timeout)
318
my_net_set_write_timeout(net, drizzle->options.write_timeout);
323
drizzleclient_net_set_write_timeout(net, drizzle->options.write_timeout);
320
325
if (drizzle->options.max_allowed_packet)
321
326
net->max_packet_size= drizzle->options.max_allowed_packet;
323
328
/* Get version info */
324
329
drizzle->protocol_version= PROTOCOL_VERSION; /* Assume this */
325
330
if (drizzle->options.connect_timeout &&
326
vio_poll_read(net->vio, drizzle->options.connect_timeout))
331
drizzleclient_vio_poll_read(net->vio, drizzle->options.connect_timeout))
328
drizzle_set_extended_error(drizzle, CR_SERVER_LOST, sqlstate_get_unknown(),
333
drizzleclient_set_extended_error(drizzle, CR_SERVER_LOST, drizzleclient_sqlstate_get_unknown(),
329
334
ER(CR_SERVER_LOST_INITIAL_COMM_WAIT),
335
340
Part 1: Connection established, read and parse first packet
338
if ((pkt_length=cli_safe_read(drizzle)) == packet_error)
343
if ((pkt_length=drizzleclient_cli_safe_read(drizzle)) == packet_error)
340
345
if (drizzle->net.last_errno == CR_SERVER_LOST)
341
drizzle_set_extended_error(drizzle, CR_SERVER_LOST, sqlstate_get_unknown(),
346
drizzleclient_set_extended_error(drizzle, CR_SERVER_LOST, drizzleclient_sqlstate_get_unknown(),
342
347
ER(CR_SERVER_LOST_INITIAL_COMM_READ),
348
353
drizzle->protocol_version= net->read_pos[0];
349
354
if (drizzle->protocol_version != PROTOCOL_VERSION)
351
drizzle_set_extended_error(drizzle, CR_VERSION_ERROR, sqlstate_get_unknown(),
356
drizzleclient_set_extended_error(drizzle, CR_VERSION_ERROR, drizzleclient_sqlstate_get_unknown(),
352
357
ER(CR_VERSION_ERROR), drizzle->protocol_version,
353
358
PROTOCOL_VERSION);
382
387
if (drizzle->options.secure_auth && passwd[0] &&
383
388
!(drizzle->server_capabilities & CLIENT_SECURE_CONNECTION))
385
drizzle_set_error(drizzle, CR_SECURE_AUTH, sqlstate_get_unknown());
390
drizzleclient_set_error(drizzle, CR_SECURE_AUTH, drizzleclient_sqlstate_get_unknown());
392
397
!(drizzle->user=strdup(user)) ||
393
398
!(drizzle->passwd=strdup(passwd)))
395
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
400
drizzleclient_set_error(drizzle, CR_OUT_OF_MEMORY, drizzleclient_sqlstate_get_unknown());
398
403
drizzle->host= drizzle->host_info+strlen(host_info)+1;
451
456
/* Add database if needed */
452
457
if (db && (drizzle->server_capabilities & CLIENT_CONNECT_WITH_DB))
454
end= strncpy(end, db, NAME_LEN) + NAME_LEN + 1;
459
size_t db_len= strlen(db);
461
if (db_len >= NAME_LEN)
462
db_len= NAME_LEN - 1;
463
end= (char *)memcpy(end, db, db_len);
455
467
drizzle->db= strdup(db);
458
470
/* Write authentication package */
459
if (my_net_write(net, (unsigned char*) buff, (size_t) (end-buff)) || net_flush(net))
471
if (drizzleclient_net_write(net, (unsigned char*) buff, (size_t) (end-buff)) || drizzleclient_net_flush(net))
461
drizzle_set_extended_error(drizzle, CR_SERVER_LOST, sqlstate_get_unknown(),
473
drizzleclient_set_extended_error(drizzle, CR_SERVER_LOST, drizzleclient_sqlstate_get_unknown(),
462
474
ER(CR_SERVER_LOST_SEND_AUTH),
469
481
OK-packet, or re-request scrambled password.
472
if ((pkt_length=cli_safe_read(drizzle)) == packet_error)
484
if ((pkt_length=drizzleclient_cli_safe_read(drizzle)) == packet_error)
474
486
if (drizzle->net.last_errno == CR_SERVER_LOST)
475
drizzle_set_extended_error(drizzle, CR_SERVER_LOST, sqlstate_get_unknown(),
487
drizzleclient_set_extended_error(drizzle, CR_SERVER_LOST, drizzleclient_sqlstate_get_unknown(),
476
488
ER(CR_SERVER_LOST_READ_AUTH),
485
if (db && drizzle_select_db(drizzle, db))
497
if (db && drizzleclient_select_db(drizzle, db))
487
499
if (drizzle->net.last_errno == CR_SERVER_LOST)
488
drizzle_set_extended_error(drizzle, CR_SERVER_LOST, sqlstate_get_unknown(),
500
drizzleclient_set_extended_error(drizzle, CR_SERVER_LOST, drizzleclient_sqlstate_get_unknown(),
489
501
ER(CR_SERVER_LOST_SETTING_DB),
499
511
/* Free alloced memory */
500
drizzle_disconnect(drizzle);
501
drizzle_close_free(drizzle);
512
drizzleclient_disconnect(drizzle);
513
drizzleclient_close_free(drizzle);
502
514
if (!(((uint32_t) client_flag) & CLIENT_REMEMBER_OPTIONS))
503
drizzle_close_free_options(drizzle);
515
drizzleclient_close_free_options(drizzle);
537
549
/* Allow reconnect next time */
538
550
drizzle->server_status&= ~SERVER_STATUS_IN_TRANS;
539
drizzle_set_error(drizzle, CR_SERVER_GONE_ERROR, sqlstate_get_unknown());
551
drizzleclient_set_error(drizzle, CR_SERVER_GONE_ERROR, drizzleclient_sqlstate_get_unknown());
542
drizzle_create(&tmp_drizzle);
554
drizzleclient_create(&tmp_drizzle);
543
555
tmp_drizzle.options= drizzle->options;
544
556
tmp_drizzle.options.my_cnf_file= tmp_drizzle.options.my_cnf_group= 0;
546
if (!drizzle_connect(&tmp_drizzle,drizzle->host,drizzle->user,drizzle->passwd,
558
if (!drizzleclient_connect(&tmp_drizzle,drizzle->host,drizzle->user,drizzle->passwd,
547
559
drizzle->db, drizzle->port, 0,
548
560
drizzle->client_flag | CLIENT_REMEMBER_OPTIONS))
559
571
/* Don't free options as these are now used in tmp_drizzle */
560
572
memset(&drizzle->options, 0, sizeof(drizzle->options));
561
573
drizzle->free_me=0;
562
drizzle_close(drizzle);
574
drizzleclient_close(drizzle);
563
575
*drizzle=tmp_drizzle;
564
net_clear(&drizzle->net, 1);
576
drizzleclient_net_clear(&drizzle->net, 1);
565
577
drizzle->affected_rows= ~(uint64_t) 0;
570
582
Shut down connection
571
583
**************************************************************************/
573
void drizzle_disconnect(DRIZZLE *drizzle)
585
void drizzleclient_disconnect(DRIZZLE *drizzle)
575
587
int save_errno= errno;
576
588
if (drizzle->net.vio != 0)
578
vio_delete(drizzle->net.vio);
590
drizzleclient_vio_delete(drizzle->net.vio);
579
591
drizzle->net.vio= 0; /* Marker */
581
net_end(&drizzle->net);
582
free_old_query(drizzle);
593
drizzleclient_net_end(&drizzle->net);
594
drizzleclient_free_old_query(drizzle);
583
595
errno= save_errno;
589
601
If handle is alloced by DRIZZLE connect free it.
590
602
*************************************************************************/
592
void drizzle_close_free_options(DRIZZLE *drizzle)
604
void drizzleclient_close_free_options(DRIZZLE *drizzle)
594
606
if (drizzle->options.user != NULL)
595
607
free(drizzle->options.user);
632
void drizzle_close(DRIZZLE *drizzle)
644
void drizzleclient_close(DRIZZLE *drizzle)
634
646
if (drizzle) /* Some simple safety */
636
648
/* If connection is still up, send a QUIT message */
637
649
if (drizzle->net.vio != 0)
639
free_old_query(drizzle);
651
drizzleclient_free_old_query(drizzle);
640
652
drizzle->status=DRIZZLE_STATUS_READY; /* Force command */
641
653
drizzle->reconnect=0;
642
654
simple_command(drizzle,COM_QUIT,(unsigned char*) 0,0,1);
643
drizzle_disconnect(drizzle); /* Sets drizzle->net.vio= 0 */
655
drizzleclient_disconnect(drizzle); /* Sets drizzle->net.vio= 0 */
645
drizzle_close_free_options(drizzle);
646
drizzle_close_free(drizzle);
657
drizzleclient_close_free_options(drizzle);
658
drizzleclient_close_free(drizzle);
647
659
if (drizzle->free_me)
648
660
free((unsigned char*) drizzle);
654
bool cli_read_query_result(DRIZZLE *drizzle)
666
bool drizzleclient_cli_read_query_result(DRIZZLE *drizzle)
656
668
unsigned char *pos;
657
669
uint32_t field_count;
658
670
DRIZZLE_DATA *fields;
661
if ((length = cli_safe_read(drizzle)) == packet_error)
673
if ((length = drizzleclient_cli_safe_read(drizzle)) == packet_error)
663
free_old_query(drizzle); /* Free old result */
675
drizzleclient_free_old_query(drizzle); /* Free old result */
665
677
pos=(unsigned char*) drizzle->net.read_pos;
666
if ((field_count= net_field_length(&pos)) == 0)
678
if ((field_count= drizzleclient_net_field_length(&pos)) == 0)
668
drizzle->affected_rows= net_field_length_ll(&pos);
669
drizzle->insert_id= net_field_length_ll(&pos);
680
drizzle->affected_rows= drizzleclient_drizzleclient_net_field_length_ll(&pos);
681
drizzle->insert_id= drizzleclient_drizzleclient_net_field_length_ll(&pos);
671
683
drizzle->server_status= uint2korr(pos); pos+=2;
672
684
drizzle->warning_count= uint2korr(pos); pos+=2;
674
if (pos < drizzle->net.read_pos+length && net_field_length(&pos))
686
if (pos < drizzle->net.read_pos+length && drizzleclient_net_field_length(&pos))
675
687
drizzle->info=(char*) pos;
678
690
if (field_count == NULL_LENGTH) /* LOAD DATA LOCAL INFILE */
682
if (!(drizzle->options.client_flag & CLIENT_LOCAL_FILES))
684
drizzle_set_error(drizzle, CR_MALFORMED_PACKET, sqlstate_get_unknown());
688
error= handle_local_infile(drizzle,(char*) pos);
689
if ((length= cli_safe_read(drizzle)) == packet_error || error)
691
goto get_info; /* Get info packet */
692
drizzleclient_set_error(drizzle, CR_MALFORMED_PACKET, drizzleclient_sqlstate_get_unknown());
693
696
if (!(drizzle->server_status & SERVER_STATUS_AUTOCOMMIT))
694
697
drizzle->server_status|= SERVER_STATUS_IN_TRANS;
696
if (!(fields=cli_read_rows(drizzle,(DRIZZLE_FIELD*)0, 7)))
699
if (!(fields=drizzleclient_cli_read_rows(drizzle,(DRIZZLE_FIELD*)0, 7)))
698
if (!(drizzle->fields= unpack_fields(fields, (uint32_t) field_count, 0)))
701
if (!(drizzle->fields= drizzleclient_unpack_fields(fields, (uint32_t) field_count, 0)))
700
703
drizzle->status= DRIZZLE_STATUS_GET_RESULT;
701
704
drizzle->field_count= (uint32_t) field_count;
707
710
Send the query and return so we can do something else.
708
Needs to be followed by drizzle_read_query_result() when we want to
711
Needs to be followed by drizzleclient_read_query_result() when we want to
709
712
finish processing it.
713
drizzle_send_query(DRIZZLE *drizzle, const char* query, uint32_t length)
716
drizzleclient_send_query(DRIZZLE *drizzle, const char* query, uint32_t length)
715
718
return(simple_command(drizzle, COM_QUERY, (unsigned char*) query, length, 1));
720
drizzle_real_query(DRIZZLE *drizzle, const char *query, uint32_t length)
723
drizzleclient_real_query(DRIZZLE *drizzle, const char *query, uint32_t length)
722
if (drizzle_send_query(drizzle,query,length))
725
if (drizzleclient_send_query(drizzle,query,length))
724
727
return((int) (*drizzle->methods->read_query_result)(drizzle));
728
731
/**************************************************************************
729
732
Alloc result struct for buffered results. All rows are read to buffer.
730
drizzle_data_seek may be used.
733
drizzleclient_data_seek may be used.
731
734
**************************************************************************/
733
DRIZZLE_RES * drizzle_store_result(DRIZZLE *drizzle)
736
DRIZZLE_RES * drizzleclient_store_result(DRIZZLE *drizzle)
735
738
DRIZZLE_RES *result;
739
742
if (drizzle->status != DRIZZLE_STATUS_GET_RESULT)
741
drizzle_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, sqlstate_get_unknown());
744
drizzleclient_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, drizzleclient_sqlstate_get_unknown());
744
747
drizzle->status=DRIZZLE_STATUS_READY; /* server is ready */
746
749
sizeof(uint32_t) *
747
750
drizzle->field_count))))
749
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
752
drizzleclient_set_error(drizzle, CR_OUT_OF_MEMORY, drizzleclient_sqlstate_get_unknown());
752
755
memset(result, 0,(sizeof(DRIZZLE_RES)+ sizeof(uint32_t) *
775
778
/**************************************************************************
776
779
Alloc struct for use with unbuffered reads. Data is fetched by domand
777
when calling to drizzle_fetch_row.
780
when calling to drizzleclient_fetch_row.
778
781
DRIZZLE_DATA_seek is a noop.
780
783
No other queries may be specified with the same DRIZZLE handle.
791
794
if (drizzle->status != DRIZZLE_STATUS_GET_RESULT)
793
drizzle_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, sqlstate_get_unknown());
796
drizzleclient_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, drizzleclient_sqlstate_get_unknown());
796
799
if (!(result=(DRIZZLE_RES*) malloc(sizeof(*result)+
827
830
@parma sqlstate SQL standard sqlstate
830
void drizzle_set_error(DRIZZLE *drizzle, int errcode, const char *sqlstate)
833
void drizzleclient_set_error(DRIZZLE *drizzle, int errcode, const char *sqlstate)
833
836
assert(drizzle != 0);
851
unsigned int drizzle_errno(const DRIZZLE *drizzle)
854
unsigned int drizzleclient_errno(const DRIZZLE *drizzle)
853
856
return drizzle ? drizzle->net.last_errno : drizzle_server_last_errno;
857
const char * drizzle_error(const DRIZZLE *drizzle)
860
const char * drizzleclient_error(const DRIZZLE *drizzle)
859
862
return drizzle ? _(drizzle->net.last_error) : _(drizzle_server_last_error);
865
868
@param drizzle connection handle
866
869
@param errcode CR_* errcode, for client errors
867
@param sqlstate SQL standard sql state, sqlstate_get_unknown() for the
870
@param sqlstate SQL standard sql state, drizzleclient_sqlstate_get_unknown() for the
868
871
majority of client errors.
869
872
@param format error message template, in sprintf format
870
873
@param ... variable number of arguments
873
void drizzle_set_extended_error(DRIZZLE *drizzle, int errcode,
876
void drizzleclient_set_extended_error(DRIZZLE *drizzle, int errcode,
874
877
const char *sqlstate,
875
878
const char *format, ...)
895
898
Flush result set sent from server
898
void cli_flush_use_result(DRIZZLE *drizzle)
901
void drizzleclient_cli_flush_use_result(DRIZZLE *drizzle)
900
903
/* Clear the current execution status */
903
906
uint32_t pkt_len;
904
if ((pkt_len=cli_safe_read(drizzle)) == packet_error)
907
if ((pkt_len=drizzleclient_cli_safe_read(drizzle)) == packet_error)
906
909
if (pkt_len <= 8 && drizzle->net.read_pos[0] == DRIZZLE_PROTOCOL_NO_MORE_DATA)
918
921
/**************************************************************************
919
922
Get column lengths of the current row
920
If one uses drizzle_use_result, res->lengths contains the length information,
923
If one uses drizzleclient_use_result, res->lengths contains the length information,
921
924
else the lengths are calculated from the offset between pointers.
922
925
**************************************************************************/
924
void cli_fetch_lengths(uint32_t *to, DRIZZLE_ROW column, uint32_t field_count)
927
void drizzleclient_cli_fetch_lengths(uint32_t *to, DRIZZLE_ROW column, uint32_t field_count)
926
929
uint32_t *prev_length;