79
80
#define SOCKET_ERROR -1
82
#include <drizzled/version.h>
83
#include <libdrizzle/sql_common.h>
84
#include <libdrizzle/gettext.h>
85
#include "local_infile.h"
94
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
95
struct passwd *getpwuid(uid_t);
82
#define CONNECT_TIMEOUT 0
84
#include "client_settings.h"
85
#include <sql_common.h>
88
char *mysql_unix_port= 0;
89
const char *unknown_sqlstate= "HY000";
90
const char *not_error_sqlstate= "00000";
91
const char *cant_connect_sqlstate= "08001";
93
static void mysql_close_free_options(MYSQL *mysql);
94
static void mysql_close_free(MYSQL *mysql);
96
static int wait_for_data(my_socket fd, uint timeout);
98
CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
100
/* Server error code and message */
101
unsigned int mysql_server_last_errno;
102
char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
104
/****************************************************************************
105
A modified version of connect(). my_connect() allows you to specify
106
a timeout value, in seconds, that we should wait until we
107
derermine we can't connect to a particular host. If timeout is 0,
108
my_connect() will behave exactly like connect().
110
Base version coded by Steve Bernacki, Jr. <steve@navinet.net>
111
*****************************************************************************/
113
int my_connect(my_socket fd, const struct sockaddr *name, uint namelen,
116
int flags, res, s_err;
119
If they passed us a timeout of zero, we should behave
120
exactly like the normal connect() call does.
124
return connect(fd, (struct sockaddr*) name, namelen);
126
flags = fcntl(fd, F_GETFL, 0); /* Set socket to not block */
128
fcntl(fd, F_SETFL, flags | O_NONBLOCK); /* and save the flags.. */
131
res= connect(fd, (struct sockaddr*) name, namelen);
132
s_err= errno; /* Save the error... */
133
fcntl(fd, F_SETFL, flags);
134
if ((res != 0) && (s_err != EINPROGRESS))
136
errno= s_err; /* Restore it */
139
if (res == 0) /* Connected quickly! */
141
return wait_for_data(fd, timeout);
146
Wait up to timeout seconds for a connection to be established.
148
We prefer to do this with poll() as there is no limitations with this.
149
If not, we will use select()
152
static int wait_for_data(my_socket fd, uint timeout)
159
ufds.events= POLLIN | POLLPRI;
160
if (!(res= poll(&ufds, 1, (int) timeout*1000)))
165
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
169
SOCKOPT_OPTLEN_TYPE s_err_size = sizeof(uint);
172
time_t start_time, now_time;
175
if (fd >= FD_SETSIZE) /* Check if wrong error */
176
return 0; /* Can't use timeout */
179
Our connection is "in progress." We can use the select() call to wait
180
up to a specified period of time for the connection to suceed.
181
If select() returns 0 (after waiting howevermany seconds), our socket
182
never became writable (host is probably unreachable.) Otherwise, if
183
select() returns 1, then one of two conditions exist:
185
1. An error occured. We use getsockopt() to check for this.
186
2. The connection was set up sucessfully: getsockopt() will
187
return 0 as an error.
189
Thanks goes to Andrew Gierth <andrew@erlenstar.demon.co.uk>
190
who posted this method of timing out a connect() in
191
comp.unix.programmer on August 15th, 1997.
197
select could be interrupted by a signal, and if it is,
198
the timeout should be adjusted and the select restarted
199
to work around OSes that don't restart select and
200
implementations of select that don't adjust tv upon
201
failure to reflect the time remaining
203
start_time= my_time(0);
206
tv.tv_sec = (long) timeout;
209
if ((res = select(fd+1, NULL, (int*) &sfds, NULL, &tv)) > 0)
212
if ((res = select(fd+1, NULL, &sfds, NULL, &tv)) > 0)
215
if (res == 0) /* timeout */
217
now_time= my_time(0);
218
timeout-= (uint) (now_time - start_time);
219
if (errno != EINTR || (int) timeout <= 0)
224
select() returned something more interesting than zero, let's
225
see if we have any errors. If the next two statements pass,
226
we've got an open socket!
230
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*) &s_err, &s_err_size) != 0)
234
{ /* getsockopt could succeed */
236
return(-1); /* but return an error... */
239
#endif /* HAVE_POLL */
243
Set the internal error message to mysql handler
245
@param mysql connection handle (client side)
246
@param errcode CR_ error code, passed to ER macro to get
248
@parma sqlstate SQL standard sqlstate
251
void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
259
net->last_errno= errcode;
260
strmov(net->last_error, ER(errcode));
261
strmov(net->sqlstate, sqlstate);
265
mysql_server_last_errno= errcode;
266
strmov(mysql_server_last_error, ER(errcode));
272
Clear possible error state of struct NET
274
@param net clear the state of the argument
277
void net_clear_error(NET *net)
280
net->last_error[0]= '\0';
281
strmov(net->sqlstate, not_error_sqlstate);
285
Set an error message on the client.
287
@param mysql connection handle
288
@param errcode CR_* errcode, for client errors
289
@param sqlstate SQL standard sql state, unknown_sqlstate for the
290
majority of client errors.
291
@param format error message template, in sprintf format
292
@param ... variable number of arguments
295
static void set_mysql_extended_error(MYSQL *mysql, int errcode,
296
const char *sqlstate,
297
const char *format, ...)
304
net->last_errno= errcode;
305
va_start(args, format);
306
vsnprintf(net->last_error, sizeof(net->last_error)-1,
309
strmov(net->sqlstate, sqlstate);
101
314
/*****************************************************************************
102
315
Read a packet from server. Give error message if socket was down
103
316
or packet is an error message
104
317
*****************************************************************************/
106
uint32_t cli_safe_read(DRIZZLE *drizzle)
319
uint32_t cli_safe_read(MYSQL *mysql)
108
NET *net= &drizzle->net;
321
NET *net= &mysql->net;
323
init_sigpipe_variables
325
/* Don't give sigpipe errors if the client doesn't want them */
111
327
if (net->vio != 0)
112
328
len=my_net_read(net);
329
reset_sigpipe(mysql);
114
331
if (len == packet_error || len == 0)
116
#ifdef DRIZZLE_SERVER
117
334
if (net->vio && vio_was_interrupted(net->vio))
118
335
return (packet_error);
119
#endif /*DRIZZLE_SERVER*/
120
drizzle_disconnect(drizzle);
121
drizzle_set_error(drizzle, net->last_errno == CR_NET_PACKET_TOO_LARGE ?
122
CR_NET_PACKET_TOO_LARGE : CR_SERVER_LOST,
123
sqlstate_get_unknown());
336
#endif /*MYSQL_SERVER*/
338
set_mysql_error(mysql, net->last_errno == ER_NET_PACKET_TOO_LARGE ?
339
CR_NET_PACKET_TOO_LARGE: CR_SERVER_LOST, unknown_sqlstate);
124
340
return (packet_error);
126
342
if (net->read_pos[0] == 255)
160
376
a multi-statement or a stored procedure, so it should be
161
377
safe to unconditionally turn off the flag here.
163
drizzle->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
379
mysql->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
165
381
return(packet_error);
386
void free_rows(MYSQL_DATA *cur)
390
free_root(&cur->alloc,MYF(0));
391
my_free((uchar*) cur,MYF(0));
171
cli_advanced_command(DRIZZLE *drizzle, enum enum_server_command command,
172
const unsigned char *header, uint32_t header_length,
173
const unsigned char *arg, uint32_t arg_length, bool skip_check)
396
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
397
const unsigned char *header, uint32_t header_length,
398
const unsigned char *arg, uint32_t arg_length, bool skip_check)
175
NET *net= &drizzle->net;
177
bool stmt_skip= false;
179
if (drizzle->net.vio == 0)
180
{ /* Do reconnect if possible */
181
if (drizzle_reconnect(drizzle) || stmt_skip)
400
NET *net= &mysql->net;
402
init_sigpipe_variables
403
my_bool stmt_skip= false;
405
/* Don't give sigpipe errors if the client doesn't want them */
408
if (mysql->net.vio == 0)
409
{ /* Do reconnect if possible */
410
if (mysql_reconnect(mysql) || stmt_skip)
184
if (drizzle->status != DRIZZLE_STATUS_READY ||
185
drizzle->server_status & SERVER_MORE_RESULTS_EXISTS)
413
if (mysql->status != MYSQL_STATUS_READY ||
414
mysql->server_status & SERVER_MORE_RESULTS_EXISTS)
187
drizzle_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC,
188
sqlstate_get_unknown());
416
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
192
420
net_clear_error(net);
194
drizzle->affected_rows= ~(uint64_t) 0;
422
mysql->affected_rows= ~(uint64_t) 0;
196
424
We don't want to clear the protocol buffer on COM_QUIT, because if
197
425
the previous command was a shutdown command, we may have the
198
426
response for the COM_QUIT already in the communication buffer
200
net_clear(&drizzle->net, (command != COM_QUIT));
428
net_clear(&mysql->net, (command != COM_QUIT));
202
if (net_write_command(net,(unsigned char) command, header, header_length,
430
if (net_write_command(net,(uchar) command, header, header_length,
205
if (net->last_errno == CR_NET_PACKET_TOO_LARGE)
433
if (net->last_errno == ER_NET_PACKET_TOO_LARGE)
207
drizzle_set_error(drizzle, CR_NET_PACKET_TOO_LARGE, sqlstate_get_unknown());
435
set_mysql_error(mysql, CR_NET_PACKET_TOO_LARGE, unknown_sqlstate);
210
drizzle_disconnect(drizzle);
211
if (drizzle_reconnect(drizzle) || stmt_skip)
439
if (mysql_reconnect(mysql) || stmt_skip)
213
if (net_write_command(net,(unsigned char) command, header, header_length,
441
if (net_write_command(net,(uchar) command, header, header_length,
216
drizzle_set_error(drizzle, CR_SERVER_GONE_ERROR, sqlstate_get_unknown());
444
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
222
result= ((drizzle->packet_length=cli_safe_read(drizzle)) == packet_error ?
450
result= ((mysql->packet_length=cli_safe_read(mysql)) == packet_error ?
453
reset_sigpipe(mysql);
228
void free_old_query(DRIZZLE *drizzle)
232
/* TODO - we need to de-alloc field storage */
233
free(drizzle->fields->catalog);
234
free(drizzle->fields->db);
235
free(drizzle->fields->table);
236
free(drizzle->fields->org_table);
237
free(drizzle->fields->name);
238
free(drizzle->fields->org_name);
239
free(drizzle->fields->def);
240
free(drizzle->fields);
243
/* init_alloc_root(&drizzle->field_alloc,8192,0); */ /* Assume rowlength < 8192 */
245
drizzle->field_count= 0; /* For API */
246
drizzle->warning_count= 0;
256
drizzle_free_result(DRIZZLE_RES *result)
457
void free_old_query(MYSQL *mysql)
460
free_root(&mysql->field_alloc,MYF(0));
461
init_alloc_root(&mysql->field_alloc,8192,0); /* Assume rowlength < 8192 */
463
mysql->field_count= 0; /* For API */
464
mysql->warning_count= 0;
470
Flush result set sent from server
473
static void cli_flush_use_result(MYSQL *mysql)
475
/* Clear the current execution status */
479
if ((pkt_len=cli_safe_read(mysql)) == packet_error)
481
if (pkt_len <= 8 && mysql->net.read_pos[0] == 254)
483
if (protocol_41(mysql))
485
char *pos= (char*) mysql->net.read_pos + 1;
486
mysql->warning_count=uint2korr(pos); pos+=2;
487
mysql->server_status=uint2korr(pos); pos+=2;
489
break; /* End of data */
496
/**************************************************************************
498
**************************************************************************/
500
void end_server(MYSQL *mysql)
502
int save_errno= errno;
503
if (mysql->net.vio != 0)
505
init_sigpipe_variables
507
vio_delete(mysql->net.vio);
508
reset_sigpipe(mysql);
509
mysql->net.vio= 0; /* Marker */
511
net_end(&mysql->net);
512
free_old_query(mysql);
519
mysql_free_result(MYSQL_RES *result)
260
DRIZZLE *drizzle= result->handle;
523
MYSQL *mysql= result->handle;
263
if (drizzle->unbuffered_fetch_owner == &result->unbuffered_fetch_cancelled)
264
drizzle->unbuffered_fetch_owner= 0;
265
if (drizzle->status == DRIZZLE_STATUS_USE_RESULT)
526
if (mysql->unbuffered_fetch_owner == &result->unbuffered_fetch_cancelled)
527
mysql->unbuffered_fetch_owner= 0;
528
if (mysql->status == MYSQL_STATUS_USE_RESULT)
267
(*drizzle->methods->flush_use_result)(drizzle);
268
drizzle->status=DRIZZLE_STATUS_READY;
269
if (drizzle->unbuffered_fetch_owner)
270
*drizzle->unbuffered_fetch_owner= true;
530
(*mysql->methods->flush_use_result)(mysql);
531
mysql->status=MYSQL_STATUS_READY;
532
if (mysql->unbuffered_fetch_owner)
533
*mysql->unbuffered_fetch_owner= true;
273
536
free_rows(result->data);
274
/* TODO: free result->fields */
538
free_root(&result->field_alloc,MYF(0));
276
free((unsigned char*) result->row);
277
free((unsigned char*) result);
540
my_free((uchar*) result->row,MYF(0));
541
my_free((uchar*) result,MYF(0));
546
/****************************************************************************
547
Get options from my.cnf
548
****************************************************************************/
550
static const char *default_options[]=
552
"port","socket","compress","password","pipe", "timeout", "user",
553
"init-command", "host", "database", "return-found-rows",
554
"ssl-key" ,"ssl-cert" ,"ssl-ca" ,"ssl-capath",
555
"character-sets-dir", "default-character-set", "interactive-timeout",
556
"connect-timeout", "local-infile", "disable-local-infile",
557
"ssl-cipher", "max-allowed-packet", "protocol", "shared-memory-base-name",
558
"multi-results", "multi-statements", "multi-queries", "secure-auth",
559
"report-data-truncation",
563
static TYPELIB option_types={array_elements(default_options)-1,
564
"options",default_options, NULL};
566
const char *sql_protocol_names_lib[] =
567
{ "TCP", "SOCKET", "PIPE", "MEMORY", NullS };
568
TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"",
569
sql_protocol_names_lib, NULL};
571
static int add_init_command(struct st_mysql_options *options, const char *cmd)
575
if (!options->init_commands)
577
options->init_commands= (DYNAMIC_ARRAY*)my_malloc(sizeof(DYNAMIC_ARRAY),
579
init_dynamic_array(options->init_commands,sizeof(char*),0,5 CALLER_INFO);
582
if (!(tmp= my_strdup(cmd,MYF(MY_WME))) ||
583
insert_dynamic(options->init_commands, (uchar*)&tmp))
585
my_free(tmp, MYF(MY_ALLOW_ZERO_PTR));
592
void mysql_read_default_options(struct st_mysql_options *options,
593
const char *filename,const char *group)
596
char *argv_buff[1],**argv;
597
const char *groups[3];
599
argc=1; argv=argv_buff; argv_buff[0]= (char*) "client";
600
groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0;
602
load_defaults(filename, groups, &argc, &argv);
603
if (argc != 1) /* If some default option */
608
if (option[0][0] == '-' && option[0][1] == '-')
610
char *end=strcend(*option,'=');
615
*end=0; /* Remove '=' */
617
/* Change all '_' in variable name to '-' */
618
for (end= *option ; *(end= strcend(end,'_')) ; )
620
switch (find_type(*option+2,&option_types,2)) {
623
options->port=atoi(opt_arg);
628
my_free(options->unix_socket,MYF(MY_ALLOW_ZERO_PTR));
629
options->unix_socket=my_strdup(opt_arg,MYF(MY_WME));
632
case 3: /* compress */
634
options->client_flag|= CLIENT_COMPRESS;
636
case 4: /* password */
639
my_free(options->password,MYF(MY_ALLOW_ZERO_PTR));
640
options->password=my_strdup(opt_arg,MYF(MY_WME));
644
options->protocol = MYSQL_PROTOCOL_PIPE;
645
case 20: /* connect_timeout */
646
case 6: /* timeout */
648
options->connect_timeout=atoi(opt_arg);
653
my_free(options->user,MYF(MY_ALLOW_ZERO_PTR));
654
options->user=my_strdup(opt_arg,MYF(MY_WME));
657
case 8: /* init-command */
658
add_init_command(options,opt_arg);
663
my_free(options->host,MYF(MY_ALLOW_ZERO_PTR));
664
options->host=my_strdup(opt_arg,MYF(MY_WME));
667
case 10: /* database */
670
my_free(options->db,MYF(MY_ALLOW_ZERO_PTR));
671
options->db=my_strdup(opt_arg,MYF(MY_WME));
674
case 12: /* return-found-rows */
675
options->client_flag|=CLIENT_FOUND_ROWS;
677
case 13: /* Ignore SSL options */
683
case 17: /* charset-lib */
684
my_free(options->charset_dir,MYF(MY_ALLOW_ZERO_PTR));
685
options->charset_dir = my_strdup(opt_arg, MYF(MY_WME));
688
my_free(options->charset_name,MYF(MY_ALLOW_ZERO_PTR));
689
options->charset_name = my_strdup(opt_arg, MYF(MY_WME));
691
case 19: /* Interactive-timeout */
692
options->client_flag|= CLIENT_INTERACTIVE;
695
if (!opt_arg || atoi(opt_arg) != 0)
696
options->client_flag|= CLIENT_LOCAL_FILES;
698
options->client_flag&= ~CLIENT_LOCAL_FILES;
701
options->client_flag&= ~CLIENT_LOCAL_FILES;
703
case 24: /* max-allowed-packet */
705
options->max_allowed_packet= atoi(opt_arg);
707
case 25: /* protocol */
708
if ((options->protocol= find_type(opt_arg,
709
&sql_protocol_typelib,0)) <= 0)
711
fprintf(stderr, "Unknown option to protocol: %s\n", opt_arg);
715
case 26: /* shared_memory_base_name */
717
if (options->shared_memory_base_name != def_shared_memory_base_name)
718
my_free(options->shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
719
options->shared_memory_base_name=my_strdup(opt_arg,MYF(MY_WME));
722
case 27: /* multi-results */
723
options->client_flag|= CLIENT_MULTI_RESULTS;
725
case 28: /* multi-statements */
726
case 29: /* multi-queries */
727
options->client_flag|= CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS;
729
case 30: /* secure-auth */
730
options->secure_auth= true;
732
case 31: /* report-data-truncation */
733
options->report_data_truncation= opt_arg ? test(atoi(opt_arg)) : 1;
746
/**************************************************************************
747
Get column lengths of the current row
748
If one uses mysql_use_result, res->lengths contains the length information,
749
else the lengths are calculated from the offset between pointers.
750
**************************************************************************/
752
static void cli_fetch_lengths(uint32_t *to, MYSQL_ROW column, uint32_t field_count)
754
uint32_t *prev_length;
758
prev_length=0; /* Keep gcc happy */
759
for (end=column + field_count + 1 ; column != end ; column++, to++)
766
if (start) /* Found end of prev string */
767
*prev_length= (ulong) (*column-start-1);
773
/***************************************************************************
774
Change field rows to field structs
775
***************************************************************************/
778
unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
779
my_bool default_value, uint server_capabilities)
782
MYSQL_FIELD *field,*result;
783
uint32_t lengths[9]; /* Max of fields */
785
field= result= (MYSQL_FIELD*) alloc_root(alloc,
786
(uint) sizeof(*field)*fields);
789
free_rows(data); /* Free old data */
792
bzero((char*) field, (uint) sizeof(MYSQL_FIELD)*fields);
793
if (server_capabilities & CLIENT_PROTOCOL_41)
795
/* server is 4.1, and returns the new field result format */
796
for (row=data->data; row ; row = row->next,field++)
799
/* fields count may be wrong */
800
assert((uint) (field - result) < fields);
801
cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7);
802
field->catalog= strmake_root(alloc,(char*) row->data[0], lengths[0]);
803
field->db= strmake_root(alloc,(char*) row->data[1], lengths[1]);
804
field->table= strmake_root(alloc,(char*) row->data[2], lengths[2]);
805
field->org_table= strmake_root(alloc,(char*) row->data[3], lengths[3]);
806
field->name= strmake_root(alloc,(char*) row->data[4], lengths[4]);
807
field->org_name= strmake_root(alloc,(char*) row->data[5], lengths[5]);
809
field->catalog_length= lengths[0];
810
field->db_length= lengths[1];
811
field->table_length= lengths[2];
812
field->org_table_length= lengths[3];
813
field->name_length= lengths[4];
814
field->org_name_length= lengths[5];
816
/* Unpack fixed length parts */
817
pos= (uchar*) row->data[6];
818
field->charsetnr= uint2korr(pos);
819
field->length= (uint) uint4korr(pos+2);
820
field->type= (enum enum_field_types) pos[6];
821
field->flags= uint2korr(pos+7);
822
field->decimals= (uint) pos[9];
824
if (INTERNAL_NUM_FIELD(field))
825
field->flags|= NUM_FLAG;
826
if (default_value && row->data[7])
828
field->def=strmake_root(alloc,(char*) row->data[7], lengths[7]);
829
field->def_length= lengths[7];
833
field->max_length= 0;
836
#ifndef DELETE_SUPPORT_OF_4_0_PROTOCOL
839
/* old protocol, for backward compatibility */
840
for (row=data->data; row ; row = row->next,field++)
842
cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
843
field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
844
field->name= strdup_root(alloc,(char*) row->data[1]);
845
field->length= (uint) uint3korr(row->data[2]);
846
field->type= (enum enum_field_types) (uchar) row->data[3][0];
848
field->catalog=(char*) "";
849
field->db= (char*) "";
850
field->catalog_length= 0;
852
field->org_table_length= field->table_length= lengths[0];
853
field->name_length= lengths[1];
855
if (server_capabilities & CLIENT_LONG_FLAG)
857
field->flags= uint2korr(row->data[4]);
858
field->decimals=(uint) (uchar) row->data[4][2];
862
field->flags= (uint) (uchar) row->data[4][0];
863
field->decimals=(uint) (uchar) row->data[4][1];
865
if (INTERNAL_NUM_FIELD(field))
866
field->flags|= NUM_FLAG;
867
if (default_value && row->data[5])
869
field->def=strdup_root(alloc,(char*) row->data[5]);
870
field->def_length= lengths[5];
874
field->max_length= 0;
877
#endif /* DELETE_SUPPORT_OF_4_0_PROTOCOL */
878
free_rows(data); /* Free old data */
284
882
/* Read all rows (fields or data) from server */
286
DRIZZLE_DATA *cli_read_rows(DRIZZLE *drizzle, DRIZZLE_FIELD *DRIZZLE_FIELDs, uint32_t fields)
884
MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
293
DRIZZLE_DATA *result;
294
DRIZZLE_ROWS **prev_ptr,*cur;
295
NET *net = &drizzle->net;
893
MYSQL_ROWS **prev_ptr,*cur;
894
NET *net = &mysql->net;
297
if ((pkt_len= cli_safe_read(drizzle)) == packet_error)
896
if ((pkt_len= cli_safe_read(mysql)) == packet_error)
299
if (!(result=(DRIZZLE_DATA*) malloc(sizeof(DRIZZLE_DATA))))
898
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
899
MYF(MY_WME | MY_ZEROFILL))))
301
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY,
302
sqlstate_get_unknown());
901
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
305
memset(result, 0, sizeof(DRIZZLE_DATA));
904
init_alloc_root(&result->alloc,8192,0); /* Assume rowlength < 8192 */
905
result->alloc.min_malloc=sizeof(MYSQL_ROWS);
306
906
prev_ptr= &result->data;
308
908
result->fields=fields;
311
The last EOF packet is either a 254 (0xFE) character followed by 1-7 status bytes.
911
The last EOF packet is either a single 254 character or (in MySQL 4.1)
912
254 followed by 1-7 status bytes.
313
914
This doesn't conflict with normal usage of 254 which stands for a
314
915
string where the length of the string is 8 bytes. (see net_field_length())
317
while (*(cp=net->read_pos) != DRIZZLE_PROTOCOL_NO_MORE_DATA || pkt_len >= 8)
918
while (*(cp=net->read_pos) != 254 || pkt_len >= 8)
320
if (!(cur= (DRIZZLE_ROWS*) malloc(sizeof(DRIZZLE_ROWS))) ||
321
!(cur->data= ((DRIZZLE_ROW) malloc((fields+1)*sizeof(char *)+pkt_len))))
921
if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc,
922
sizeof(MYSQL_ROWS))) ||
923
!(cur->data= ((MYSQL_ROW)
924
alloc_root(&result->alloc,
925
(fields+1)*sizeof(char *)+pkt_len))))
323
927
free_rows(result);
324
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
928
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
422
*prev_pos=0; /* Terminate prev field */
1023
*prev_pos=0; /* Terminate prev field */
425
row[field]=(char*) prev_pos+1; /* End of last field */
426
*prev_pos=0; /* Terminate last field */
1026
row[field]=(char*) prev_pos+1; /* End of last field */
1027
*prev_pos=0; /* Terminate last field */
1032
/****************************************************************************
1033
Init MySQL structure or allocate one
1034
****************************************************************************/
1037
mysql_init(MYSQL *mysql)
1039
if (mysql_server_init(0, NULL, NULL))
1043
if (!(mysql=(MYSQL*) my_malloc(sizeof(*mysql),MYF(MY_WME | MY_ZEROFILL))))
1045
set_mysql_error(NULL, CR_OUT_OF_MEMORY, unknown_sqlstate);
1051
bzero((char*) (mysql), sizeof(*(mysql)));
1052
mysql->options.connect_timeout= CONNECT_TIMEOUT;
1053
mysql->charset=default_client_charset_info;
1054
strmov(mysql->net.sqlstate, not_error_sqlstate);
1057
Only enable LOAD DATA INFILE by default if configured with
1058
--enable-local-infile
1061
#if defined(ENABLED_LOCAL_INFILE) && !defined(MYSQL_SERVER)
1062
mysql->options.client_flag|= CLIENT_LOCAL_FILES;
1066
mysql->options.shared_memory_base_name= (char*) def_shared_memory_base_name;
1069
mysql->options.methods_to_use= MYSQL_OPT_GUESS_CONNECTION;
1070
mysql->options.report_data_truncation= true; /* default */
1073
By default we don't reconnect because it could silently corrupt data (after
1074
reconnection you potentially lose table locks, user variables, session
1075
variables (transactions but they are specifically dealt with in
1077
This is a change: < 5.0.3 mysql->reconnect was set to 1 by default.
1078
How this change impacts existing apps:
1079
- existing apps which relyed on the default will see a behaviour change;
1080
they will have to set reconnect=1 after mysql_real_connect().
1081
- existing apps which explicitely asked for reconnection (the only way they
1082
could do it was by setting mysql.reconnect to 1 after mysql_real_connect())
1083
will not see a behaviour change.
1084
- existing apps which explicitely asked for no reconnection
1085
(mysql.reconnect=0) will not see a behaviour change.
1087
mysql->reconnect= 0;
1094
Fill in SSL part of MYSQL structure and set 'use_ssl' flag.
1095
NB! Errors are not reported until you do mysql_real_connect.
1098
#define strdup_if_not_null(A) (A) == 0 ? 0 : my_strdup((A),MYF(MY_WME))
1101
Note that the mysql argument must be initialized with mysql_init()
1102
before calling mysql_real_connect !
1105
static bool cli_read_query_result(MYSQL *mysql);
1106
static MYSQL_RES *cli_use_result(MYSQL *mysql);
1108
static MYSQL_METHODS client_methods=
1110
cli_read_query_result, /* read_query_result */
1111
cli_advanced_command, /* advanced_command */
1112
cli_read_rows, /* read_rows */
1113
cli_use_result, /* use_result */
1114
cli_fetch_lengths, /* fetch_lengths */
1115
cli_flush_use_result, /* flush_use_result */
1116
#ifndef MYSQL_SERVER
1117
cli_list_fields, /* list_fields */
1118
cli_unbuffered_fetch, /* unbuffered_fetch */
1119
cli_read_statistics, /* read_statistics */
1120
cli_read_query_result, /* next_result */
1121
cli_read_change_user_result, /* read_change_user_result */
1128
int mysql_init_character_set(MYSQL *mysql)
1130
const char *default_collation_name;
1132
/* Set character set */
1133
if (!mysql->options.charset_name)
1135
default_collation_name= MYSQL_DEFAULT_COLLATION_NAME;
1136
if (!(mysql->options.charset_name=
1137
my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
1141
default_collation_name= NULL;
1144
const char *save= charsets_dir;
1145
if (mysql->options.charset_dir)
1146
charsets_dir=mysql->options.charset_dir;
1147
mysql->charset=get_charset_by_csname(mysql->options.charset_name,
1148
MY_CS_PRIMARY, MYF(MY_WME));
1149
if (mysql->charset && default_collation_name)
1151
CHARSET_INFO *collation;
1153
get_charset_by_name(default_collation_name, MYF(MY_WME))))
1155
if (!my_charset_same(mysql->charset, collation))
1157
my_printf_error(ER_UNKNOWN_ERROR,
1158
"COLLATION %s is not valid for CHARACTER SET %s",
1160
default_collation_name, mysql->options.charset_name);
1161
mysql->charset= NULL;
1165
mysql->charset= collation;
1169
mysql->charset= NULL;
1174
if (!mysql->charset)
1176
if (mysql->options.charset_dir)
1177
set_mysql_extended_error(mysql, CR_CANT_READ_CHARSET, unknown_sqlstate,
1178
ER(CR_CANT_READ_CHARSET),
1179
mysql->options.charset_name,
1180
mysql->options.charset_dir);
1183
char cs_dir_name[FN_REFLEN];
1184
get_charsets_dir(cs_dir_name);
1185
set_mysql_extended_error(mysql, CR_CANT_READ_CHARSET, unknown_sqlstate,
1186
ER(CR_CANT_READ_CHARSET),
1187
mysql->options.charset_name,
1198
CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
1199
const char *passwd, const char *db,
1200
uint32_t port, const char *unix_socket, uint32_t client_flag)
1202
char buff[NAME_LEN+USERNAME_LENGTH+100];
1203
char *end,*host_info=NULL;
1204
uint32_t pkt_length;
1205
NET *net= &mysql->net;
1206
struct sockaddr_un UNIXaddr;
1207
init_sigpipe_variables
1209
/* Don't give sigpipe errors if the client doesn't want them */
1211
mysql->methods= &client_methods;
1212
net->vio = 0; /* If something goes wrong */
1213
mysql->client_flag=0; /* For handshake */
1215
/* use default options */
1216
if (mysql->options.my_cnf_file || mysql->options.my_cnf_group)
1218
mysql_read_default_options(&mysql->options,
1219
(mysql->options.my_cnf_file ?
1220
mysql->options.my_cnf_file : "my"),
1221
mysql->options.my_cnf_group);
1222
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
1223
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
1224
mysql->options.my_cnf_file=mysql->options.my_cnf_group=0;
1227
/* Some empty-string-tests are done because of ODBC */
1228
if (!host || !host[0])
1229
host=mysql->options.host;
1230
if (!user || !user[0])
1232
user=mysql->options.user;
1238
passwd=mysql->options.password;
1243
db=mysql->options.db;
1245
port=mysql->options.port;
1247
unix_socket=mysql->options.unix_socket;
1249
mysql->server_status=SERVER_STATUS_AUTOCOMMIT;
1252
Part 0: Grab a socket and connect it to the server
1254
#if defined(HAVE_SMEM)
1255
if ((!mysql->options.protocol ||
1256
mysql->options.protocol == MYSQL_PROTOCOL_MEMORY) &&
1257
(!host || !strcmp(host,LOCAL_HOST)))
1259
if ((create_shared_memory(mysql,net, mysql->options.connect_timeout)) ==
1260
INVALID_HANDLE_VALUE)
1262
if (mysql->options.protocol == MYSQL_PROTOCOL_MEMORY)
1266
Try also with PIPE or TCP/IP. Clear the error from
1267
create_shared_memory().
1270
net_clear_error(net);
1274
mysql->options.protocol=MYSQL_PROTOCOL_MEMORY;
1276
host=mysql->options.shared_memory_base_name;
1277
snprintf(host_info=buff, sizeof(buff)-1,
1278
ER(CR_SHARED_MEMORY_CONNECTION), host);
1281
#endif /* HAVE_SMEM */
1283
(!mysql->options.protocol ||
1284
mysql->options.protocol == MYSQL_PROTOCOL_SOCKET) &&
1285
(unix_socket || mysql_unix_port) &&
1286
(!host || !strcmp(host,LOCAL_HOST)))
1288
my_socket sock= socket(AF_UNIX, SOCK_STREAM, 0);
1289
if (sock == SOCKET_ERROR)
1291
set_mysql_extended_error(mysql, CR_SOCKET_CREATE_ERROR,
1293
ER(CR_SOCKET_CREATE_ERROR),
1298
net->vio= vio_new(sock, VIO_TYPE_SOCKET,
1299
VIO_LOCALHOST | VIO_BUFFERED_READ);
1302
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
1309
unix_socket= mysql_unix_port;
1310
host_info= (char*) ER(CR_LOCALHOST_CONNECTION);
1312
bzero((char*) &UNIXaddr, sizeof(UNIXaddr));
1313
UNIXaddr.sun_family= AF_UNIX;
1314
strmake(UNIXaddr.sun_path, unix_socket, sizeof(UNIXaddr.sun_path)-1);
1316
if (my_connect(sock, (struct sockaddr *) &UNIXaddr, sizeof(UNIXaddr),
1317
mysql->options.connect_timeout))
1319
set_mysql_extended_error(mysql, CR_CONNECTION_ERROR,
1321
ER(CR_CONNECTION_ERROR),
1322
unix_socket, socket_errno);
1323
vio_delete(net->vio);
1327
mysql->options.protocol=MYSQL_PROTOCOL_SOCKET;
1330
(!mysql->options.protocol ||
1331
mysql->options.protocol == MYSQL_PROTOCOL_TCP))
1333
struct addrinfo *res_lst, hints, *t_res;
1335
char port_buf[NI_MAXSERV];
1337
unix_socket=0; /* This is not used */
1345
snprintf(host_info=buff, sizeof(buff)-1, ER(CR_TCP_CONNECTION), host);
1347
memset(&hints, 0, sizeof(hints));
1348
hints.ai_socktype= SOCK_STREAM;
1349
hints.ai_protocol= IPPROTO_TCP;
1350
hints.ai_family= AF_UNSPEC;
1352
snprintf(port_buf, NI_MAXSERV, "%d", port);
1353
gai_errno= getaddrinfo(host, port_buf, &hints, &res_lst);
1357
set_mysql_extended_error(mysql, CR_UNKNOWN_HOST, unknown_sqlstate,
1358
ER(CR_UNKNOWN_HOST), host, errno);
1363
/* We only look at the first item (something to think about changing in the future) */
1366
my_socket sock= socket(t_res->ai_family, t_res->ai_socktype,
1367
t_res->ai_protocol);
1368
if (sock == SOCKET_ERROR)
1370
set_mysql_extended_error(mysql, CR_IPSOCK_ERROR, unknown_sqlstate,
1371
ER(CR_IPSOCK_ERROR), socket_errno);
1372
freeaddrinfo(res_lst);
1376
net->vio= vio_new(sock, VIO_TYPE_TCPIP, VIO_BUFFERED_READ);
1379
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
1381
freeaddrinfo(res_lst);
1385
if (my_connect(sock, t_res->ai_addr, t_res->ai_addrlen,
1386
mysql->options.connect_timeout))
1388
set_mysql_extended_error(mysql, CR_CONN_HOST_ERROR, unknown_sqlstate,
1389
ER(CR_CONN_HOST_ERROR), host, socket_errno);
1390
vio_delete(net->vio);
1392
freeaddrinfo(res_lst);
1397
freeaddrinfo(res_lst);
1402
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
1406
if (my_net_init(net, net->vio))
1408
vio_delete(net->vio);
1410
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
1413
vio_keepalive(net->vio,true);
1415
/* If user set read_timeout, let it override the default */
1416
if (mysql->options.read_timeout)
1417
my_net_set_read_timeout(net, mysql->options.read_timeout);
1419
/* If user set write_timeout, let it override the default */
1420
if (mysql->options.write_timeout)
1421
my_net_set_write_timeout(net, mysql->options.write_timeout);
1423
if (mysql->options.max_allowed_packet)
1424
net->max_packet_size= mysql->options.max_allowed_packet;
1426
/* Get version info */
1427
mysql->protocol_version= PROTOCOL_VERSION; /* Assume this */
1428
if (mysql->options.connect_timeout &&
1429
vio_poll_read(net->vio, mysql->options.connect_timeout))
1431
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
1432
ER(CR_SERVER_LOST_EXTENDED),
1433
"waiting for initial communication packet",
1439
Part 1: Connection established, read and parse first packet
1442
if ((pkt_length=cli_safe_read(mysql)) == packet_error)
1444
if (mysql->net.last_errno == CR_SERVER_LOST)
1445
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
1446
ER(CR_SERVER_LOST_EXTENDED),
1447
"reading initial communication packet",
1451
/* Check if version of protocol matches current one */
1453
mysql->protocol_version= net->read_pos[0];
1454
if (mysql->protocol_version != PROTOCOL_VERSION)
1456
set_mysql_extended_error(mysql, CR_VERSION_ERROR, unknown_sqlstate,
1457
ER(CR_VERSION_ERROR), mysql->protocol_version,
1461
end=strend((char*) net->read_pos+1);
1462
mysql->thread_id=uint4korr(end+1);
1465
Scramble is split into two parts because old clients does not understand
1466
long scrambles; here goes the first part.
1468
strmake(mysql->scramble, end, SCRAMBLE_LENGTH_323);
1469
end+= SCRAMBLE_LENGTH_323+1;
1471
if (pkt_length >= (uint) (end+1 - (char*) net->read_pos))
1472
mysql->server_capabilities=uint2korr(end);
1473
if (pkt_length >= (uint) (end+18 - (char*) net->read_pos))
1475
/* New protocol with 16 bytes to describe server characteristics */
1476
mysql->server_language=end[2];
1477
mysql->server_status=uint2korr(end+3);
1480
if (pkt_length >= (uint) (end + SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323 + 1 -
1481
(char *) net->read_pos))
1482
strmake(mysql->scramble+SCRAMBLE_LENGTH_323, end,
1483
SCRAMBLE_LENGTH-SCRAMBLE_LENGTH_323);
1485
mysql->server_capabilities&= ~CLIENT_SECURE_CONNECTION;
1487
if (mysql->options.secure_auth && passwd[0] &&
1488
!(mysql->server_capabilities & CLIENT_SECURE_CONNECTION))
1490
set_mysql_error(mysql, CR_SECURE_AUTH, unknown_sqlstate);
1494
if (mysql_init_character_set(mysql))
1497
/* Save connection information */
1498
if (!my_multi_malloc(MYF(0),
1499
&mysql->host_info, (uint) strlen(host_info)+1,
1500
&mysql->host, (uint) strlen(host)+1,
1501
&mysql->unix_socket,unix_socket ?
1502
(uint) strlen(unix_socket)+1 : (uint) 1,
1503
&mysql->server_version,
1504
(uint) (end - (char*) net->read_pos),
1506
!(mysql->user=my_strdup(user,MYF(0))) ||
1507
!(mysql->passwd=my_strdup(passwd,MYF(0))))
1509
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
1512
strmov(mysql->host_info,host_info);
1513
strmov(mysql->host,host);
1515
strmov(mysql->unix_socket,unix_socket);
1517
mysql->unix_socket=0;
1518
strmov(mysql->server_version,(char*) net->read_pos+1);
1522
Part 2: format and send client info to the server for access check
1525
client_flag|=mysql->options.client_flag;
1526
client_flag|=CLIENT_CAPABILITIES;
1527
if (client_flag & CLIENT_MULTI_STATEMENTS)
1528
client_flag|= CLIENT_MULTI_RESULTS;
1531
client_flag|=CLIENT_CONNECT_WITH_DB;
1533
/* Remove options that server doesn't support */
1534
client_flag= ((client_flag &
1535
~(CLIENT_COMPRESS | CLIENT_SSL | CLIENT_PROTOCOL_41)) |
1536
(client_flag & mysql->server_capabilities));
1537
client_flag&= ~CLIENT_COMPRESS;
1539
if (client_flag & CLIENT_PROTOCOL_41)
1541
/* 4.1 server and 4.1 client has a 32 byte option flag */
1542
int4store(buff,client_flag);
1543
int4store(buff+4, net->max_packet_size);
1544
buff[8]= (char) mysql->charset->number;
1545
bzero(buff+9, 32-9);
1550
int2store(buff,client_flag);
1551
int3store(buff+2,net->max_packet_size);
1554
mysql->client_flag=client_flag;
1556
/* This needs to be changed as it's not useful with big packets */
1557
if (user && user[0])
1558
strmake(end,user,USERNAME_LENGTH); /* Max user name */
1560
read_user_name((char*) end);
1562
/* We have to handle different version of handshake here */
1563
#ifdef _CUSTOMCONFIG_
1564
#include "_cust_libmysql.h"
1566
end= strend(end) + 1;
1570
*end++= SCRAMBLE_LENGTH;
1571
scramble(end, mysql->scramble, passwd);
1572
end+= SCRAMBLE_LENGTH;
1576
*end++= '\0'; /* empty password */
1578
/* Add database if needed */
1579
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
1581
end= strmake(end, db, NAME_LEN) + 1;
1582
mysql->db= my_strdup(db,MYF(MY_WME));
1585
/* Write authentication package */
1586
if (my_net_write(net, (uchar*) buff, (size_t) (end-buff)) || net_flush(net))
1588
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
1589
ER(CR_SERVER_LOST_EXTENDED),
1590
"sending authentication information",
1596
Part 3: Authorization data's been sent. Now server can reply with
1597
OK-packet, or re-request scrambled password.
1600
if ((pkt_length=cli_safe_read(mysql)) == packet_error)
1602
if (mysql->net.last_errno == CR_SERVER_LOST)
1603
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
1604
ER(CR_SERVER_LOST_EXTENDED),
1605
"reading authorization packet",
1610
if (client_flag & CLIENT_COMPRESS) /* We will use compression */
1614
if (db && mysql_select_db(mysql, db))
1616
if (mysql->net.last_errno == CR_SERVER_LOST)
1617
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
1618
ER(CR_SERVER_LOST_EXTENDED),
1619
"Setting intital database",
1624
if (mysql->options.init_commands)
1626
DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
1627
char **ptr= (char**)init_commands->buffer;
1628
char **end_command= ptr + init_commands->elements;
1630
my_bool reconnect=mysql->reconnect;
1633
for (; ptr < end_command; ptr++)
1636
if (mysql_real_query(mysql,*ptr, (ulong) strlen(*ptr)))
1640
if (!(res= cli_use_result(mysql)))
1642
mysql_free_result(res);
1645
mysql->reconnect=reconnect;
1648
reset_sigpipe(mysql);
1652
reset_sigpipe(mysql);
1654
/* Free alloced memory */
1656
mysql_close_free(mysql);
1657
if (!(((ulong) client_flag) & CLIENT_REMEMBER_OPTIONS))
1658
mysql_close_free_options(mysql);
1664
my_bool mysql_reconnect(MYSQL *mysql)
1669
if (!mysql->reconnect ||
1670
(mysql->server_status & SERVER_STATUS_IN_TRANS) || !mysql->host_info)
1672
/* Allow reconnect next time */
1673
mysql->server_status&= ~SERVER_STATUS_IN_TRANS;
1674
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
1677
mysql_init(&tmp_mysql);
1678
tmp_mysql.options= mysql->options;
1679
tmp_mysql.options.my_cnf_file= tmp_mysql.options.my_cnf_group= 0;
1681
if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,
1682
mysql->db, mysql->port, mysql->unix_socket,
1683
mysql->client_flag | CLIENT_REMEMBER_OPTIONS))
1685
mysql->net.last_errno= tmp_mysql.net.last_errno;
1686
strmov(mysql->net.last_error, tmp_mysql.net.last_error);
1687
strmov(mysql->net.sqlstate, tmp_mysql.net.sqlstate);
1690
if (mysql_set_character_set(&tmp_mysql, mysql->charset->csname))
1692
bzero((char*) &tmp_mysql.options,sizeof(tmp_mysql.options));
1693
mysql_close(&tmp_mysql);
1694
mysql->net.last_errno= tmp_mysql.net.last_errno;
1695
strmov(mysql->net.last_error, tmp_mysql.net.last_error);
1696
strmov(mysql->net.sqlstate, tmp_mysql.net.sqlstate);
1700
tmp_mysql.reconnect= 1;
1701
tmp_mysql.free_me= mysql->free_me;
1703
/* Don't free options as these are now used in tmp_mysql */
1704
bzero((char*) &mysql->options,sizeof(mysql->options));
1708
net_clear(&mysql->net, 1);
1709
mysql->affected_rows= ~(uint64_t) 0;
1714
/**************************************************************************
1715
Set current database
1716
**************************************************************************/
1719
mysql_select_db(MYSQL *mysql, const char *db)
1723
if ((error=simple_command(mysql,COM_INIT_DB, (const uchar*) db,
1724
(ulong) strlen(db),0)))
1726
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
1727
mysql->db=my_strdup(db,MYF(MY_WME));
1732
/*************************************************************************
1733
Send a QUIT to the server and close the connection
1734
If handle is alloced by mysql connect free it.
1735
*************************************************************************/
1737
static void mysql_close_free_options(MYSQL *mysql)
1739
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
1740
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
1741
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
1742
my_free(mysql->options.unix_socket,MYF(MY_ALLOW_ZERO_PTR));
1743
my_free(mysql->options.db,MYF(MY_ALLOW_ZERO_PTR));
1744
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
1745
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
1746
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
1747
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
1748
my_free(mysql->options.client_ip,MYF(MY_ALLOW_ZERO_PTR));
1749
if (mysql->options.init_commands)
1751
DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
1752
char **ptr= (char**)init_commands->buffer;
1753
char **end= ptr + init_commands->elements;
1754
for (; ptr<end; ptr++)
1755
my_free(*ptr,MYF(MY_WME));
1756
delete_dynamic(init_commands);
1757
my_free((char*)init_commands,MYF(MY_WME));
1760
if (mysql->options.shared_memory_base_name != def_shared_memory_base_name)
1761
my_free(mysql->options.shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
1762
#endif /* HAVE_SMEM */
1763
bzero((char*) &mysql->options,sizeof(mysql->options));
1768
static void mysql_close_free(MYSQL *mysql)
1770
my_free((uchar*) mysql->host_info,MYF(MY_ALLOW_ZERO_PTR));
1771
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
1772
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
1773
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
1774
my_free(mysql->info_buffer,MYF(MY_ALLOW_ZERO_PTR));
1775
mysql->info_buffer= 0;
1777
/* Clear pointers for better safety */
1778
mysql->host_info= mysql->user= mysql->passwd= mysql->db= 0;
1782
void STDCALL mysql_close(MYSQL *mysql)
1784
if (mysql) /* Some simple safety */
1786
/* If connection is still up, send a QUIT message */
1787
if (mysql->net.vio != 0)
1789
free_old_query(mysql);
1790
mysql->status=MYSQL_STATUS_READY; /* Force command */
1792
simple_command(mysql,COM_QUIT,(uchar*) 0,0,1);
1793
end_server(mysql); /* Sets mysql->net.vio= 0 */
1795
mysql_close_free_options(mysql);
1796
mysql_close_free(mysql);
1798
my_free((uchar*) mysql,MYF(0));
1804
static bool cli_read_query_result(MYSQL *mysql)
1811
if ((length = cli_safe_read(mysql)) == packet_error)
1813
free_old_query(mysql); /* Free old result */
1814
#ifdef MYSQL_CLIENT /* Avoid warn of unused labels*/
1817
pos=(uchar*) mysql->net.read_pos;
1818
if ((field_count= net_field_length(&pos)) == 0)
1820
mysql->affected_rows= net_field_length_ll(&pos);
1821
mysql->insert_id= net_field_length_ll(&pos);
1822
if (protocol_41(mysql))
1824
mysql->server_status=uint2korr(pos); pos+=2;
1825
mysql->warning_count=uint2korr(pos); pos+=2;
1827
else if (mysql->server_capabilities & CLIENT_TRANSACTIONS)
1829
/* MySQL 4.0 protocol */
1830
mysql->server_status=uint2korr(pos); pos+=2;
1831
mysql->warning_count= 0;
1833
if (pos < mysql->net.read_pos+length && net_field_length(&pos))
1834
mysql->info=(char*) pos;
1838
if (field_count == NULL_LENGTH) /* LOAD DATA LOCAL INFILE */
1842
if (!(mysql->options.client_flag & CLIENT_LOCAL_FILES))
1844
set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate);
1848
error= handle_local_infile(mysql,(char*) pos);
1849
if ((length= cli_safe_read(mysql)) == packet_error || error)
1851
goto get_info; /* Get info packet */
1854
if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT))
1855
mysql->server_status|= SERVER_STATUS_IN_TRANS;
1857
if (!(fields=cli_read_rows(mysql,(MYSQL_FIELD*)0, protocol_41(mysql) ? 7:5)))
1859
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,
1860
(uint) field_count,0,
1861
mysql->server_capabilities)))
1863
mysql->status= MYSQL_STATUS_GET_RESULT;
1864
mysql->field_count= (uint) field_count;
1870
Send the query and return so we can do something else.
1871
Needs to be followed by mysql_read_query_result() when we want to
1872
finish processing it.
1876
mysql_send_query(MYSQL* mysql, const char* query, uint32_t length)
1878
return(simple_command(mysql, COM_QUERY, (uchar*) query, length, 1));
1883
mysql_real_query(MYSQL *mysql, const char *query, uint32_t length)
1885
if (mysql_send_query(mysql,query,length))
1887
return((int) (*mysql->methods->read_query_result)(mysql));
1891
/**************************************************************************
1892
Alloc result struct for buffered results. All rows are read to buffer.
1893
mysql_data_seek may be used.
1894
**************************************************************************/
1896
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql)
1902
if (mysql->status != MYSQL_STATUS_GET_RESULT)
1904
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
1907
mysql->status=MYSQL_STATUS_READY; /* server is ready */
1908
if (!(result=(MYSQL_RES*) my_malloc((uint) (sizeof(MYSQL_RES)+
1910
mysql->field_count),
1911
MYF(MY_WME | MY_ZEROFILL))))
1913
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
1916
result->methods= mysql->methods;
1917
result->eof= 1; /* Marker for buffered */
1918
result->lengths= (uint32_t*) (result+1);
1920
(*mysql->methods->read_rows)(mysql,mysql->fields,mysql->field_count)))
1922
my_free((uchar*) result,MYF(0));
1925
mysql->affected_rows= result->row_count= result->data->rows;
1926
result->data_cursor= result->data->data;
1927
result->fields= mysql->fields;
1928
result->field_alloc= mysql->field_alloc;
1929
result->field_count= mysql->field_count;
1930
/* The rest of result members is bzeroed in malloc */
1931
mysql->fields=0; /* fields is now in result */
1932
clear_alloc_root(&mysql->field_alloc);
1933
/* just in case this was mistakenly called after mysql_stmt_execute() */
1934
mysql->unbuffered_fetch_owner= 0;
1935
return(result); /* Data fetched */
1939
/**************************************************************************
1940
Alloc struct for use with unbuffered reads. Data is fetched by domand
1941
when calling to mysql_fetch_row.
1942
mysql_data_seek is a noop.
1944
No other queries may be specified with the same MYSQL handle.
1945
There shouldn't be much processing per row because mysql server shouldn't
1946
have to wait for the client (and will not wait more than 30 sec/packet).
1947
**************************************************************************/
1949
static MYSQL_RES * cli_use_result(MYSQL *mysql)
1955
if (mysql->status != MYSQL_STATUS_GET_RESULT)
1957
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
1960
if (!(result=(MYSQL_RES*) my_malloc(sizeof(*result)+
1961
sizeof(ulong)*mysql->field_count,
1962
MYF(MY_WME | MY_ZEROFILL))))
1964
result->lengths=(uint32_t*) (result+1);
1965
result->methods= mysql->methods;
1966
if (!(result->row=(MYSQL_ROW)
1967
my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
1968
{ /* Ptrs: to one row */
1969
my_free((uchar*) result,MYF(0));
1972
result->fields= mysql->fields;
1973
result->field_alloc= mysql->field_alloc;
1974
result->field_count= mysql->field_count;
1975
result->current_field=0;
1976
result->handle= mysql;
1977
result->current_row= 0;
1978
mysql->fields=0; /* fields is now in result */
1979
clear_alloc_root(&mysql->field_alloc);
1980
mysql->status=MYSQL_STATUS_USE_RESULT;
1981
mysql->unbuffered_fetch_owner= &result->unbuffered_fetch_cancelled;
1982
return(result); /* Data is read to be fetched */