72
87
#ifdef HAVE_SYS_SELECT_H
73
88
#include <sys/select.h>
90
#endif /*!defined(MSDOS) && !defined(__WIN__) */
95
#if defined(MSDOS) || defined(__WIN__)
79
99
#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);
103
#define CONNECT_TIMEOUT 20
105
#define CONNECT_TIMEOUT 0
108
#include "client_settings.h"
109
#include <sql_common.h>
112
char *mysql_unix_port= 0;
113
const char *unknown_sqlstate= "HY000";
114
const char *not_error_sqlstate= "00000";
115
const char *cant_connect_sqlstate= "08001";
117
char *shared_memory_base_name= 0;
118
const char *def_shared_memory_base_name= default_shared_memory_base_name;
121
static void mysql_close_free_options(MYSQL *mysql);
122
static void mysql_close_free(MYSQL *mysql);
124
#if !(defined(__WIN__) || defined(__NETWARE__))
125
static int wait_for_data(my_socket fd, uint timeout);
128
CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
130
/* Server error code and message */
131
unsigned int mysql_server_last_errno;
132
char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
134
/****************************************************************************
135
A modified version of connect(). my_connect() allows you to specify
136
a timeout value, in seconds, that we should wait until we
137
derermine we can't connect to a particular host. If timeout is 0,
138
my_connect() will behave exactly like connect().
140
Base version coded by Steve Bernacki, Jr. <steve@navinet.net>
141
*****************************************************************************/
143
int my_connect(my_socket fd, const struct sockaddr *name, uint namelen,
146
#if defined(__WIN__) || defined(__NETWARE__)
147
return connect(fd, (struct sockaddr*) name, namelen);
149
int flags, res, s_err;
152
If they passed us a timeout of zero, we should behave
153
exactly like the normal connect() call does.
157
return connect(fd, (struct sockaddr*) name, namelen);
159
flags = fcntl(fd, F_GETFL, 0); /* Set socket to not block */
161
fcntl(fd, F_SETFL, flags | O_NONBLOCK); /* and save the flags.. */
164
res= connect(fd, (struct sockaddr*) name, namelen);
165
s_err= errno; /* Save the error... */
166
fcntl(fd, F_SETFL, flags);
167
if ((res != 0) && (s_err != EINPROGRESS))
169
errno= s_err; /* Restore it */
172
if (res == 0) /* Connected quickly! */
174
return wait_for_data(fd, timeout);
180
Wait up to timeout seconds for a connection to be established.
182
We prefer to do this with poll() as there is no limitations with this.
183
If not, we will use select()
186
#if !(defined(__WIN__) || defined(__NETWARE__))
188
static int wait_for_data(my_socket fd, uint timeout)
195
ufds.events= POLLIN | POLLPRI;
196
if (!(res= poll(&ufds, 1, (int) timeout*1000)))
201
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
205
SOCKOPT_OPTLEN_TYPE s_err_size = sizeof(uint);
208
time_t start_time, now_time;
211
if (fd >= FD_SETSIZE) /* Check if wrong error */
212
return 0; /* Can't use timeout */
215
Our connection is "in progress." We can use the select() call to wait
216
up to a specified period of time for the connection to suceed.
217
If select() returns 0 (after waiting howevermany seconds), our socket
218
never became writable (host is probably unreachable.) Otherwise, if
219
select() returns 1, then one of two conditions exist:
221
1. An error occured. We use getsockopt() to check for this.
222
2. The connection was set up sucessfully: getsockopt() will
223
return 0 as an error.
225
Thanks goes to Andrew Gierth <andrew@erlenstar.demon.co.uk>
226
who posted this method of timing out a connect() in
227
comp.unix.programmer on August 15th, 1997.
233
select could be interrupted by a signal, and if it is,
234
the timeout should be adjusted and the select restarted
235
to work around OSes that don't restart select and
236
implementations of select that don't adjust tv upon
237
failure to reflect the time remaining
239
start_time= my_time(0);
242
tv.tv_sec = (long) timeout;
245
if ((res = select(fd+1, NULL, (int*) &sfds, NULL, &tv)) > 0)
248
if ((res = select(fd+1, NULL, &sfds, NULL, &tv)) > 0)
251
if (res == 0) /* timeout */
253
now_time= my_time(0);
254
timeout-= (uint) (now_time - start_time);
255
if (errno != EINTR || (int) timeout <= 0)
260
select() returned something more interesting than zero, let's
261
see if we have any errors. If the next two statements pass,
262
we've got an open socket!
266
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (char*) &s_err, &s_err_size) != 0)
270
{ /* getsockopt could succeed */
272
return(-1); /* but return an error... */
275
#endif /* HAVE_POLL */
277
#endif /* defined(__WIN__) || defined(__NETWARE__) */
280
Set the internal error message to mysql handler
282
@param mysql connection handle (client side)
283
@param errcode CR_ error code, passed to ER macro to get
285
@parma sqlstate SQL standard sqlstate
288
void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
291
DBUG_ENTER("set_mysql_error");
292
DBUG_PRINT("enter", ("error :%d '%s'", errcode, ER(errcode)));
293
DBUG_ASSERT(mysql != 0);
298
net->last_errno= errcode;
299
strmov(net->last_error, ER(errcode));
300
strmov(net->sqlstate, sqlstate);
304
mysql_server_last_errno= errcode;
305
strmov(mysql_server_last_error, ER(errcode));
311
Clear possible error state of struct NET
313
@param net clear the state of the argument
316
void net_clear_error(NET *net)
319
net->last_error[0]= '\0';
320
strmov(net->sqlstate, not_error_sqlstate);
324
Set an error message on the client.
326
@param mysql connection handle
327
@param errcode CR_* errcode, for client errors
328
@param sqlstate SQL standard sql state, unknown_sqlstate for the
329
majority of client errors.
330
@param format error message template, in sprintf format
331
@param ... variable number of arguments
334
static void set_mysql_extended_error(MYSQL *mysql, int errcode,
335
const char *sqlstate,
336
const char *format, ...)
340
DBUG_ENTER("set_mysql_extended_error");
341
DBUG_PRINT("enter", ("error :%d '%s'", errcode, format));
342
DBUG_ASSERT(mysql != 0);
345
net->last_errno= errcode;
346
va_start(args, format);
347
my_vsnprintf(net->last_error, sizeof(net->last_error)-1,
350
strmov(net->sqlstate, sqlstate);
358
Create a named pipe connection
363
HANDLE create_named_pipe(MYSQL *mysql, uint connect_timeout, char **arg_host,
364
char **arg_unix_socket)
366
HANDLE hPipe=INVALID_HANDLE_VALUE;
367
char pipe_name[1024];
370
my_bool testing_named_pipes=0;
371
char *host= *arg_host, *unix_socket= *arg_unix_socket;
373
if ( ! unix_socket || (unix_socket)[0] == 0x00)
374
unix_socket = mysql_unix_port;
375
if (!host || !strcmp(host,LOCAL_HOST))
376
host=LOCAL_HOST_NAMEDPIPE;
379
pipe_name[sizeof(pipe_name)-1]= 0; /* Safety if too long string */
380
strxnmov(pipe_name, sizeof(pipe_name)-1, "\\\\", host, "\\pipe\\",
382
DBUG_PRINT("info",("Server name: '%s'. Named Pipe: %s", host, unix_socket));
384
for (i=0 ; i < 100 ; i++) /* Don't retry forever */
386
if ((hPipe = CreateFile(pipe_name,
387
GENERIC_READ | GENERIC_WRITE,
392
NULL )) != INVALID_HANDLE_VALUE)
394
if (GetLastError() != ERROR_PIPE_BUSY)
396
set_mysql_extended_error(mysql, CR_NAMEDPIPEOPEN_ERROR,
397
unknown_sqlstate, ER(CR_NAMEDPIPEOPEN_ERROR),
398
host, unix_socket, (ulong) GetLastError());
399
return INVALID_HANDLE_VALUE;
401
/* wait for for an other instance */
402
if (! WaitNamedPipe(pipe_name, connect_timeout*1000) )
404
set_mysql_extended_error(mysql, CR_NAMEDPIPEWAIT_ERROR, unknown_sqlstate,
405
ER(CR_NAMEDPIPEWAIT_ERROR),
406
host, unix_socket, (ulong) GetLastError());
407
return INVALID_HANDLE_VALUE;
410
if (hPipe == INVALID_HANDLE_VALUE)
412
set_mysql_extended_error(mysql, CR_NAMEDPIPEOPEN_ERROR, unknown_sqlstate,
413
ER(CR_NAMEDPIPEOPEN_ERROR), host, unix_socket,
414
(ulong) GetLastError());
415
return INVALID_HANDLE_VALUE;
417
dwMode = PIPE_READMODE_BYTE | PIPE_WAIT;
418
if ( !SetNamedPipeHandleState(hPipe, &dwMode, NULL, NULL) )
420
CloseHandle( hPipe );
421
set_mysql_extended_error(mysql, CR_NAMEDPIPESETSTATE_ERROR,
422
unknown_sqlstate, ER(CR_NAMEDPIPESETSTATE_ERROR),
423
host, unix_socket, (ulong) GetLastError());
424
return INVALID_HANDLE_VALUE;
426
*arg_host=host ; *arg_unix_socket=unix_socket; /* connect arg */
433
Create new shared memory connection, return handler of connection
436
create_shared_memory()
437
mysql Pointer of mysql structure
438
net Pointer of net structure
439
connect_timeout Timeout of connection
443
HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
445
ulong smem_buffer_length = shared_memory_buffer_length + 4;
447
event_connect_request is event object for start connection actions
448
event_connect_answer is event object for confirm, that server put data
449
handle_connect_file_map is file-mapping object, use for create shared
451
handle_connect_map is pointer on shared memory
452
handle_map is pointer on shared memory for client
456
event_client_read are events for transfer data between server and client
457
handle_file_map is file-mapping object, use for create shared memory
459
HANDLE event_connect_request = NULL;
460
HANDLE event_connect_answer = NULL;
461
HANDLE handle_connect_file_map = NULL;
462
char *handle_connect_map = NULL;
464
char *handle_map = NULL;
465
HANDLE event_server_wrote = NULL;
466
HANDLE event_server_read = NULL;
467
HANDLE event_client_wrote = NULL;
468
HANDLE event_client_read = NULL;
469
HANDLE event_conn_closed = NULL;
470
HANDLE handle_file_map = NULL;
471
ulong connect_number;
472
char connect_number_char[22], *p;
475
DWORD error_allow = 0;
476
DWORD error_code = 0;
477
DWORD event_access_rights= SYNCHRONIZE | EVENT_MODIFY_STATE;
478
char *shared_memory_base_name = mysql->options.shared_memory_base_name;
481
get enough space base-name + '_' + longest suffix we might ever send
483
if (!(tmp= (char *)my_malloc(strlen(shared_memory_base_name) + 32L, MYF(MY_FAE))))
487
The name of event and file-mapping events create agree next rule:
488
shared_memory_base_name+unique_part
490
shared_memory_base_name is unique value for each server
491
unique_part is uniquel value for each object (events and file-mapping)
493
suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", NullS);
494
strmov(suffix_pos, "CONNECT_REQUEST");
495
if (!(event_connect_request= OpenEvent(event_access_rights, FALSE, tmp)))
497
error_allow = CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR;
500
strmov(suffix_pos, "CONNECT_ANSWER");
501
if (!(event_connect_answer= OpenEvent(event_access_rights,FALSE,tmp)))
503
error_allow = CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR;
506
strmov(suffix_pos, "CONNECT_DATA");
507
if (!(handle_connect_file_map= OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)))
509
error_allow = CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR;
512
if (!(handle_connect_map= MapViewOfFile(handle_connect_file_map,
513
FILE_MAP_WRITE,0,0,sizeof(DWORD))))
515
error_allow = CR_SHARED_MEMORY_CONNECT_MAP_ERROR;
519
/* Send to server request of connection */
520
if (!SetEvent(event_connect_request))
522
error_allow = CR_SHARED_MEMORY_CONNECT_SET_ERROR;
526
/* Wait of answer from server */
527
if (WaitForSingleObject(event_connect_answer,connect_timeout*1000) !=
530
error_allow = CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR;
534
/* Get number of connection */
535
connect_number = uint4korr(handle_connect_map);/*WAX2*/
536
p= int10_to_str(connect_number, connect_number_char, 10);
539
The name of event and file-mapping events create agree next rule:
540
shared_memory_base_name+unique_part+number_of_connection
543
shared_memory_base_name is uniquel value for each server
544
unique_part is uniquel value for each object (events and file-mapping)
545
number_of_connection is number of connection between server and client
547
suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", connect_number_char,
549
strmov(suffix_pos, "DATA");
550
if ((handle_file_map = OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)) == NULL)
552
error_allow = CR_SHARED_MEMORY_FILE_MAP_ERROR;
555
if ((handle_map = MapViewOfFile(handle_file_map,FILE_MAP_WRITE,0,0,
556
smem_buffer_length)) == NULL)
558
error_allow = CR_SHARED_MEMORY_MAP_ERROR;
562
strmov(suffix_pos, "SERVER_WROTE");
563
if ((event_server_wrote = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
565
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
569
strmov(suffix_pos, "SERVER_READ");
570
if ((event_server_read = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
572
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
576
strmov(suffix_pos, "CLIENT_WROTE");
577
if ((event_client_wrote = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
579
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
583
strmov(suffix_pos, "CLIENT_READ");
584
if ((event_client_read = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
586
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
590
strmov(suffix_pos, "CONNECTION_CLOSED");
591
if ((event_conn_closed = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
593
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
597
Set event that server should send data
599
SetEvent(event_server_read);
602
if (error_allow == 0)
604
net->vio= vio_new_win32shared_memory(net,handle_file_map,handle_map,
606
event_server_read,event_client_wrote,
607
event_client_read,event_conn_closed);
611
error_code = GetLastError();
612
if (event_server_read)
613
CloseHandle(event_server_read);
614
if (event_server_wrote)
615
CloseHandle(event_server_wrote);
616
if (event_client_read)
617
CloseHandle(event_client_read);
618
if (event_client_wrote)
619
CloseHandle(event_client_wrote);
620
if (event_conn_closed)
621
CloseHandle(event_conn_closed);
623
UnmapViewOfFile(handle_map);
625
CloseHandle(handle_file_map);
629
my_free(tmp, MYF(0));
631
error_code = GetLastError();
632
if (event_connect_request)
633
CloseHandle(event_connect_request);
634
if (event_connect_answer)
635
CloseHandle(event_connect_answer);
636
if (handle_connect_map)
637
UnmapViewOfFile(handle_connect_map);
638
if (handle_connect_file_map)
639
CloseHandle(handle_connect_file_map);
642
if (error_allow == CR_SHARED_MEMORY_EVENT_ERROR)
643
set_mysql_extended_error(mysql, error_allow, unknown_sqlstate,
644
ER(error_allow), suffix_pos, error_code);
646
set_mysql_extended_error(mysql, error_allow, unknown_sqlstate,
647
ER(error_allow), error_code);
648
return(INVALID_HANDLE_VALUE);
101
654
/*****************************************************************************
102
655
Read a packet from server. Give error message if socket was down
103
656
or packet is an error message
104
657
*****************************************************************************/
106
uint32_t cli_safe_read(DRIZZLE *drizzle)
660
cli_safe_read(MYSQL *mysql)
108
NET *net= &drizzle->net;
662
NET *net= &mysql->net;
664
init_sigpipe_variables
666
/* Don't give sigpipe errors if the client doesn't want them */
111
668
if (net->vio != 0)
112
669
len=my_net_read(net);
670
reset_sigpipe(mysql);
114
672
if (len == packet_error || len == 0)
116
#ifdef DRIZZLE_SERVER
674
DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %lu",
675
vio_description(net->vio),len));
117
677
if (net->vio && vio_was_interrupted(net->vio))
118
678
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());
679
#endif /*MYSQL_SERVER*/
681
set_mysql_error(mysql, net->last_errno == ER_NET_PACKET_TOO_LARGE ?
682
CR_NET_PACKET_TOO_LARGE: CR_SERVER_LOST, unknown_sqlstate);
124
683
return (packet_error);
126
685
if (net->read_pos[0] == 255)
160
719
a multi-statement or a stored procedure, so it should be
161
720
safe to unconditionally turn off the flag here.
163
drizzle->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
722
mysql->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
724
DBUG_PRINT("error",("Got error: %d/%s (%s)",
165
728
return(packet_error);
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)
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)
184
if (drizzle->status != DRIZZLE_STATUS_READY ||
185
drizzle->server_status & SERVER_MORE_RESULTS_EXISTS)
187
drizzle_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC,
188
sqlstate_get_unknown());
733
void free_rows(MYSQL_DATA *cur)
737
free_root(&cur->alloc,MYF(0));
738
my_free((uchar*) cur,MYF(0));
743
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
744
const uchar *header, ulong header_length,
745
const uchar *arg, ulong arg_length, my_bool skip_check,
748
NET *net= &mysql->net;
750
init_sigpipe_variables
751
my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE;
752
DBUG_ENTER("cli_advanced_command");
754
/* Don't give sigpipe errors if the client doesn't want them */
757
if (mysql->net.vio == 0)
758
{ /* Do reconnect if possible */
759
if (mysql_reconnect(mysql) || stmt_skip)
762
if (mysql->status != MYSQL_STATUS_READY ||
763
mysql->server_status & SERVER_MORE_RESULTS_EXISTS)
765
DBUG_PRINT("error",("state: %d", mysql->status));
766
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
192
770
net_clear_error(net);
194
drizzle->affected_rows= ~(uint64_t) 0;
772
mysql->affected_rows= ~(my_ulonglong) 0;
196
774
We don't want to clear the protocol buffer on COM_QUIT, because if
197
775
the previous command was a shutdown command, we may have the
198
776
response for the COM_QUIT already in the communication buffer
200
net_clear(&drizzle->net, (command != COM_QUIT));
778
net_clear(&mysql->net, (command != COM_QUIT));
202
if (net_write_command(net,(unsigned char) command, header, header_length,
780
if (net_write_command(net,(uchar) command, header, header_length,
205
if (net->last_errno == CR_NET_PACKET_TOO_LARGE)
783
DBUG_PRINT("error",("Can't send command to server. Error: %d",
785
if (net->last_errno == ER_NET_PACKET_TOO_LARGE)
207
drizzle_set_error(drizzle, CR_NET_PACKET_TOO_LARGE, sqlstate_get_unknown());
787
set_mysql_error(mysql, CR_NET_PACKET_TOO_LARGE, unknown_sqlstate);
210
drizzle_disconnect(drizzle);
211
if (drizzle_reconnect(drizzle) || stmt_skip)
791
if (mysql_reconnect(mysql) || stmt_skip)
213
if (net_write_command(net,(unsigned char) command, header, header_length,
793
if (net_write_command(net,(uchar) command, header, header_length,
216
drizzle_set_error(drizzle, CR_SERVER_GONE_ERROR, sqlstate_get_unknown());
796
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
222
result= ((drizzle->packet_length=cli_safe_read(drizzle)) == packet_error ?
802
result= ((mysql->packet_length=cli_safe_read(mysql)) == packet_error ?
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)
805
reset_sigpipe(mysql);
806
DBUG_PRINT("exit",("result: %d", result));
810
void free_old_query(MYSQL *mysql)
812
DBUG_ENTER("free_old_query");
814
free_root(&mysql->field_alloc,MYF(0));
815
init_alloc_root(&mysql->field_alloc,8192,0); /* Assume rowlength < 8192 */
817
mysql->field_count= 0; /* For API */
818
mysql->warning_count= 0;
824
Flush result set sent from server
827
static void cli_flush_use_result(MYSQL *mysql)
829
/* Clear the current execution status */
830
DBUG_ENTER("cli_flush_use_result");
831
DBUG_PRINT("warning",("Not all packets read, clearing them"));
835
if ((pkt_len=cli_safe_read(mysql)) == packet_error)
837
if (pkt_len <= 8 && mysql->net.read_pos[0] == 254)
839
if (protocol_41(mysql))
841
char *pos= (char*) mysql->net.read_pos + 1;
842
mysql->warning_count=uint2korr(pos); pos+=2;
843
mysql->server_status=uint2korr(pos); pos+=2;
845
break; /* End of data */
853
static my_bool is_NT(void)
855
char *os=getenv("OS");
856
return (os && !strcmp(os, "Windows_NT")) ? 1 : 0;
863
Check server side variable 'license'.
865
If the variable does not exist or does not contain 'Commercial',
866
we're talking to non-commercial server from commercial client.
869
@retval !0 network error or the server is not commercial.
870
Error code is saved in mysql->net.last_errno.
873
static int check_license(MYSQL *mysql)
877
NET *net= &mysql->net;
878
static const char query[]= "SELECT @@license";
879
static const char required_license[]= STRINGIFY_ARG(LICENSE);
881
if (mysql_real_query(mysql, query, sizeof(query)-1))
883
if (net->last_errno == ER_UNKNOWN_SYSTEM_VARIABLE)
885
set_mysql_extended_error(mysql, CR_WRONG_LICENSE, unknown_sqlstate,
886
ER(CR_WRONG_LICENSE), required_license);
890
if (!(res= mysql_use_result(mysql)))
892
row= mysql_fetch_row(res);
894
If no rows in result set, or column value is NULL (none of these
895
two is ever true for server variables now), or column value
896
mismatch, set wrong license error.
898
if (!net->last_errno &&
900
strncmp(row[0], required_license, sizeof(required_license))))
902
set_mysql_extended_error(mysql, CR_WRONG_LICENSE, unknown_sqlstate,
903
ER(CR_WRONG_LICENSE), required_license);
905
mysql_free_result(res);
906
return net->last_errno;
908
#endif /* CHECK_LICENSE */
911
/**************************************************************************
913
**************************************************************************/
915
void end_server(MYSQL *mysql)
917
int save_errno= errno;
918
DBUG_ENTER("end_server");
919
if (mysql->net.vio != 0)
921
init_sigpipe_variables
922
DBUG_PRINT("info",("Net: %s", vio_description(mysql->net.vio)));
924
vio_delete(mysql->net.vio);
925
reset_sigpipe(mysql);
926
mysql->net.vio= 0; /* Marker */
928
net_end(&mysql->net);
929
free_old_query(mysql);
936
mysql_free_result(MYSQL_RES *result)
938
DBUG_ENTER("mysql_free_result");
939
DBUG_PRINT("enter",("mysql_res: 0x%lx", (long) result));
260
DRIZZLE *drizzle= result->handle;
942
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)
945
if (mysql->unbuffered_fetch_owner == &result->unbuffered_fetch_cancelled)
946
mysql->unbuffered_fetch_owner= 0;
947
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;
949
(*mysql->methods->flush_use_result)(mysql);
950
mysql->status=MYSQL_STATUS_READY;
951
if (mysql->unbuffered_fetch_owner)
952
*mysql->unbuffered_fetch_owner= TRUE;
273
955
free_rows(result->data);
274
/* TODO: free result->fields */
957
free_root(&result->field_alloc,MYF(0));
276
free((unsigned char*) result->row);
277
free((unsigned char*) result);
959
my_free((uchar*) result->row,MYF(0));
960
my_free((uchar*) result,MYF(0));
965
/****************************************************************************
966
Get options from my.cnf
967
****************************************************************************/
969
static const char *default_options[]=
971
"port","socket","compress","password","pipe", "timeout", "user",
972
"init-command", "host", "database", "debug", "return-found-rows",
973
"ssl-key" ,"ssl-cert" ,"ssl-ca" ,"ssl-capath",
974
"character-sets-dir", "default-character-set", "interactive-timeout",
975
"connect-timeout", "local-infile", "disable-local-infile",
976
"ssl-cipher", "max-allowed-packet", "protocol", "shared-memory-base-name",
977
"multi-results", "multi-statements", "multi-queries", "secure-auth",
978
"report-data-truncation",
982
static TYPELIB option_types={array_elements(default_options)-1,
983
"options",default_options, NULL};
985
const char *sql_protocol_names_lib[] =
986
{ "TCP", "SOCKET", "PIPE", "MEMORY", NullS };
987
TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"",
988
sql_protocol_names_lib, NULL};
990
static int add_init_command(struct st_mysql_options *options, const char *cmd)
994
if (!options->init_commands)
996
options->init_commands= (DYNAMIC_ARRAY*)my_malloc(sizeof(DYNAMIC_ARRAY),
998
init_dynamic_array(options->init_commands,sizeof(char*),0,5 CALLER_INFO);
1001
if (!(tmp= my_strdup(cmd,MYF(MY_WME))) ||
1002
insert_dynamic(options->init_commands, (uchar*)&tmp))
1004
my_free(tmp, MYF(MY_ALLOW_ZERO_PTR));
1011
void mysql_read_default_options(struct st_mysql_options *options,
1012
const char *filename,const char *group)
1015
char *argv_buff[1],**argv;
1016
const char *groups[3];
1017
DBUG_ENTER("mysql_read_default_options");
1018
DBUG_PRINT("enter",("file: %s group: %s",filename,group ? group :"NULL"));
1020
argc=1; argv=argv_buff; argv_buff[0]= (char*) "client";
1021
groups[0]= (char*) "client"; groups[1]= (char*) group; groups[2]=0;
1023
load_defaults(filename, groups, &argc, &argv);
1024
if (argc != 1) /* If some default option */
1029
/* DBUG_PRINT("info",("option: %s",option[0])); */
1030
if (option[0][0] == '-' && option[0][1] == '-')
1032
char *end=strcend(*option,'=');
1037
*end=0; /* Remove '=' */
1039
/* Change all '_' in variable name to '-' */
1040
for (end= *option ; *(end= strcend(end,'_')) ; )
1042
switch (find_type(*option+2,&option_types,2)) {
1045
options->port=atoi(opt_arg);
1047
case 2: /* socket */
1050
my_free(options->unix_socket,MYF(MY_ALLOW_ZERO_PTR));
1051
options->unix_socket=my_strdup(opt_arg,MYF(MY_WME));
1054
case 3: /* compress */
1055
options->compress=1;
1056
options->client_flag|= CLIENT_COMPRESS;
1058
case 4: /* password */
1061
my_free(options->password,MYF(MY_ALLOW_ZERO_PTR));
1062
options->password=my_strdup(opt_arg,MYF(MY_WME));
1066
options->protocol = MYSQL_PROTOCOL_PIPE;
1067
case 20: /* connect_timeout */
1068
case 6: /* timeout */
1070
options->connect_timeout=atoi(opt_arg);
1075
my_free(options->user,MYF(MY_ALLOW_ZERO_PTR));
1076
options->user=my_strdup(opt_arg,MYF(MY_WME));
1079
case 8: /* init-command */
1080
add_init_command(options,opt_arg);
1085
my_free(options->host,MYF(MY_ALLOW_ZERO_PTR));
1086
options->host=my_strdup(opt_arg,MYF(MY_WME));
1089
case 10: /* database */
1092
my_free(options->db,MYF(MY_ALLOW_ZERO_PTR));
1093
options->db=my_strdup(opt_arg,MYF(MY_WME));
1096
case 11: /* debug */
1098
mysql_debug(opt_arg ? opt_arg : "d:t:o,/tmp/client.trace");
1101
case 12: /* return-found-rows */
1102
options->client_flag|=CLIENT_FOUND_ROWS;
1104
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
1105
case 13: /* ssl_key */
1106
my_free(options->ssl_key, MYF(MY_ALLOW_ZERO_PTR));
1107
options->ssl_key = my_strdup(opt_arg, MYF(MY_WME));
1109
case 14: /* ssl_cert */
1110
my_free(options->ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
1111
options->ssl_cert = my_strdup(opt_arg, MYF(MY_WME));
1113
case 15: /* ssl_ca */
1114
my_free(options->ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
1115
options->ssl_ca = my_strdup(opt_arg, MYF(MY_WME));
1117
case 16: /* ssl_capath */
1118
my_free(options->ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
1119
options->ssl_capath = my_strdup(opt_arg, MYF(MY_WME));
1121
case 23: /* ssl_cipher */
1122
my_free(options->ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
1123
options->ssl_cipher= my_strdup(opt_arg, MYF(MY_WME));
1126
case 13: /* Ignore SSL options */
1132
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
1133
case 17: /* charset-lib */
1134
my_free(options->charset_dir,MYF(MY_ALLOW_ZERO_PTR));
1135
options->charset_dir = my_strdup(opt_arg, MYF(MY_WME));
1138
my_free(options->charset_name,MYF(MY_ALLOW_ZERO_PTR));
1139
options->charset_name = my_strdup(opt_arg, MYF(MY_WME));
1141
case 19: /* Interactive-timeout */
1142
options->client_flag|= CLIENT_INTERACTIVE;
1145
if (!opt_arg || atoi(opt_arg) != 0)
1146
options->client_flag|= CLIENT_LOCAL_FILES;
1148
options->client_flag&= ~CLIENT_LOCAL_FILES;
1151
options->client_flag&= ~CLIENT_LOCAL_FILES;
1153
case 24: /* max-allowed-packet */
1155
options->max_allowed_packet= atoi(opt_arg);
1157
case 25: /* protocol */
1158
if ((options->protocol= find_type(opt_arg,
1159
&sql_protocol_typelib,0)) <= 0)
1161
fprintf(stderr, "Unknown option to protocol: %s\n", opt_arg);
1165
case 26: /* shared_memory_base_name */
1167
if (options->shared_memory_base_name != def_shared_memory_base_name)
1168
my_free(options->shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
1169
options->shared_memory_base_name=my_strdup(opt_arg,MYF(MY_WME));
1172
case 27: /* multi-results */
1173
options->client_flag|= CLIENT_MULTI_RESULTS;
1175
case 28: /* multi-statements */
1176
case 29: /* multi-queries */
1177
options->client_flag|= CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS;
1179
case 30: /* secure-auth */
1180
options->secure_auth= TRUE;
1182
case 31: /* report-data-truncation */
1183
options->report_data_truncation= opt_arg ? test(atoi(opt_arg)) : 1;
1186
DBUG_PRINT("warning",("unknown option: %s",option[0]));
1191
free_defaults(argv);
1196
/**************************************************************************
1197
Get column lengths of the current row
1198
If one uses mysql_use_result, res->lengths contains the length information,
1199
else the lengths are calculated from the offset between pointers.
1200
**************************************************************************/
1202
static void cli_fetch_lengths(ulong *to, MYSQL_ROW column,
1203
unsigned int field_count)
1209
prev_length=0; /* Keep gcc happy */
1210
for (end=column + field_count + 1 ; column != end ; column++, to++)
1217
if (start) /* Found end of prev string */
1218
*prev_length= (ulong) (*column-start-1);
1224
/***************************************************************************
1225
Change field rows to field structs
1226
***************************************************************************/
1229
unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
1230
my_bool default_value, uint server_capabilities)
1233
MYSQL_FIELD *field,*result;
1234
ulong lengths[9]; /* Max of fields */
1235
DBUG_ENTER("unpack_fields");
1237
field= result= (MYSQL_FIELD*) alloc_root(alloc,
1238
(uint) sizeof(*field)*fields);
1241
free_rows(data); /* Free old data */
1244
bzero((char*) field, (uint) sizeof(MYSQL_FIELD)*fields);
1245
if (server_capabilities & CLIENT_PROTOCOL_41)
1247
/* server is 4.1, and returns the new field result format */
1248
for (row=data->data; row ; row = row->next,field++)
1251
/* fields count may be wrong */
1252
DBUG_ASSERT((uint) (field - result) < fields);
1253
cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7);
1254
field->catalog= strmake_root(alloc,(char*) row->data[0], lengths[0]);
1255
field->db= strmake_root(alloc,(char*) row->data[1], lengths[1]);
1256
field->table= strmake_root(alloc,(char*) row->data[2], lengths[2]);
1257
field->org_table= strmake_root(alloc,(char*) row->data[3], lengths[3]);
1258
field->name= strmake_root(alloc,(char*) row->data[4], lengths[4]);
1259
field->org_name= strmake_root(alloc,(char*) row->data[5], lengths[5]);
1261
field->catalog_length= lengths[0];
1262
field->db_length= lengths[1];
1263
field->table_length= lengths[2];
1264
field->org_table_length= lengths[3];
1265
field->name_length= lengths[4];
1266
field->org_name_length= lengths[5];
1268
/* Unpack fixed length parts */
1269
pos= (uchar*) row->data[6];
1270
field->charsetnr= uint2korr(pos);
1271
field->length= (uint) uint4korr(pos+2);
1272
field->type= (enum enum_field_types) pos[6];
1273
field->flags= uint2korr(pos+7);
1274
field->decimals= (uint) pos[9];
1276
if (INTERNAL_NUM_FIELD(field))
1277
field->flags|= NUM_FLAG;
1278
if (default_value && row->data[7])
1280
field->def=strmake_root(alloc,(char*) row->data[7], lengths[7]);
1281
field->def_length= lengths[7];
1285
field->max_length= 0;
1288
#ifndef DELETE_SUPPORT_OF_4_0_PROTOCOL
1291
/* old protocol, for backward compatibility */
1292
for (row=data->data; row ; row = row->next,field++)
1294
cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
1295
field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
1296
field->name= strdup_root(alloc,(char*) row->data[1]);
1297
field->length= (uint) uint3korr(row->data[2]);
1298
field->type= (enum enum_field_types) (uchar) row->data[3][0];
1300
field->catalog=(char*) "";
1301
field->db= (char*) "";
1302
field->catalog_length= 0;
1303
field->db_length= 0;
1304
field->org_table_length= field->table_length= lengths[0];
1305
field->name_length= lengths[1];
1307
if (server_capabilities & CLIENT_LONG_FLAG)
1309
field->flags= uint2korr(row->data[4]);
1310
field->decimals=(uint) (uchar) row->data[4][2];
1314
field->flags= (uint) (uchar) row->data[4][0];
1315
field->decimals=(uint) (uchar) row->data[4][1];
1317
if (INTERNAL_NUM_FIELD(field))
1318
field->flags|= NUM_FLAG;
1319
if (default_value && row->data[5])
1321
field->def=strdup_root(alloc,(char*) row->data[5]);
1322
field->def_length= lengths[5];
1326
field->max_length= 0;
1329
#endif /* DELETE_SUPPORT_OF_4_0_PROTOCOL */
1330
free_rows(data); /* Free old data */
1331
DBUG_RETURN(result);
284
1334
/* Read all rows (fields or data) from server */
286
DRIZZLE_DATA *cli_read_rows(DRIZZLE *drizzle, DRIZZLE_FIELD *DRIZZLE_FIELDs, uint32_t fields)
1336
MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
1337
unsigned int fields)
293
DRIZZLE_DATA *result;
294
DRIZZLE_ROWS **prev_ptr,*cur;
295
NET *net = &drizzle->net;
1345
MYSQL_ROWS **prev_ptr,*cur;
1346
NET *net = &mysql->net;
1347
DBUG_ENTER("cli_read_rows");
297
if ((pkt_len= cli_safe_read(drizzle)) == packet_error)
299
if (!(result=(DRIZZLE_DATA*) malloc(sizeof(DRIZZLE_DATA))))
1349
if ((pkt_len= cli_safe_read(mysql)) == packet_error)
1351
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
1352
MYF(MY_WME | MY_ZEROFILL))))
301
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY,
302
sqlstate_get_unknown());
1354
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
305
memset(result, 0, sizeof(DRIZZLE_DATA));
1357
init_alloc_root(&result->alloc,8192,0); /* Assume rowlength < 8192 */
1358
result->alloc.min_malloc=sizeof(MYSQL_ROWS);
306
1359
prev_ptr= &result->data;
308
1361
result->fields=fields;
311
The last EOF packet is either a 254 (0xFE) character followed by 1-7 status bytes.
1364
The last EOF packet is either a single 254 character or (in MySQL 4.1)
1365
254 followed by 1-7 status bytes.
313
1367
This doesn't conflict with normal usage of 254 which stands for a
314
1368
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)
1371
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))))
1374
if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc,
1375
sizeof(MYSQL_ROWS))) ||
1376
!(cur->data= ((MYSQL_ROW)
1377
alloc_root(&result->alloc,
1378
(fields+1)*sizeof(char *)+pkt_len))))
323
1380
free_rows(result);
324
drizzle_set_error(drizzle, CR_OUT_OF_MEMORY, sqlstate_get_unknown());
1381
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
328
1385
prev_ptr= &cur->next;
422
*prev_pos=0; /* Terminate prev field */
1479
*prev_pos=0; /* Terminate prev field */
425
row[field]=(char*) prev_pos+1; /* End of last field */
426
*prev_pos=0; /* Terminate last field */
1482
row[field]=(char*) prev_pos+1; /* End of last field */
1483
*prev_pos=0; /* Terminate last field */
1488
/****************************************************************************
1489
Init MySQL structure or allocate one
1490
****************************************************************************/
1493
mysql_init(MYSQL *mysql)
1495
if (mysql_server_init(0, NULL, NULL))
1499
if (!(mysql=(MYSQL*) my_malloc(sizeof(*mysql),MYF(MY_WME | MY_ZEROFILL))))
1501
set_mysql_error(NULL, CR_OUT_OF_MEMORY, unknown_sqlstate);
1507
bzero((char*) (mysql), sizeof(*(mysql)));
1508
mysql->options.connect_timeout= CONNECT_TIMEOUT;
1509
mysql->charset=default_client_charset_info;
1510
strmov(mysql->net.sqlstate, not_error_sqlstate);
1513
Only enable LOAD DATA INFILE by default if configured with
1514
--enable-local-infile
1517
#if defined(ENABLED_LOCAL_INFILE) && !defined(MYSQL_SERVER)
1518
mysql->options.client_flag|= CLIENT_LOCAL_FILES;
1522
mysql->options.shared_memory_base_name= (char*) def_shared_memory_base_name;
1525
mysql->options.methods_to_use= MYSQL_OPT_GUESS_CONNECTION;
1526
mysql->options.report_data_truncation= TRUE; /* default */
1529
By default we don't reconnect because it could silently corrupt data (after
1530
reconnection you potentially lose table locks, user variables, session
1531
variables (transactions but they are specifically dealt with in
1533
This is a change: < 5.0.3 mysql->reconnect was set to 1 by default.
1534
How this change impacts existing apps:
1535
- existing apps which relyed on the default will see a behaviour change;
1536
they will have to set reconnect=1 after mysql_real_connect().
1537
- existing apps which explicitely asked for reconnection (the only way they
1538
could do it was by setting mysql.reconnect to 1 after mysql_real_connect())
1539
will not see a behaviour change.
1540
- existing apps which explicitely asked for no reconnection
1541
(mysql.reconnect=0) will not see a behaviour change.
1543
mysql->reconnect= 0;
1550
Fill in SSL part of MYSQL structure and set 'use_ssl' flag.
1551
NB! Errors are not reported until you do mysql_real_connect.
1554
#define strdup_if_not_null(A) (A) == 0 ? 0 : my_strdup((A),MYF(MY_WME))
1557
mysql_ssl_set(MYSQL *mysql __attribute__((unused)) ,
1558
const char *key __attribute__((unused)),
1559
const char *cert __attribute__((unused)),
1560
const char *ca __attribute__((unused)),
1561
const char *capath __attribute__((unused)),
1562
const char *cipher __attribute__((unused)))
1564
DBUG_ENTER("mysql_ssl_set");
1565
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
1566
mysql->options.ssl_key= strdup_if_not_null(key);
1567
mysql->options.ssl_cert= strdup_if_not_null(cert);
1568
mysql->options.ssl_ca= strdup_if_not_null(ca);
1569
mysql->options.ssl_capath= strdup_if_not_null(capath);
1570
mysql->options.ssl_cipher= strdup_if_not_null(cipher);
1571
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
1577
Free strings in the SSL structure and clear 'use_ssl' flag.
1578
NB! Errors are not reported until you do mysql_real_connect.
1581
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
1584
mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
1586
struct st_VioSSLFd *ssl_fd= (struct st_VioSSLFd*) mysql->connector_fd;
1587
DBUG_ENTER("mysql_ssl_free");
1589
my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR));
1590
my_free(mysql->options.ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
1591
my_free(mysql->options.ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
1592
my_free(mysql->options.ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
1593
my_free(mysql->options.ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
1595
SSL_CTX_free(ssl_fd->ssl_context);
1596
my_free(mysql->connector_fd,MYF(MY_ALLOW_ZERO_PTR));
1597
mysql->options.ssl_key = 0;
1598
mysql->options.ssl_cert = 0;
1599
mysql->options.ssl_ca = 0;
1600
mysql->options.ssl_capath = 0;
1601
mysql->options.ssl_cipher= 0;
1602
mysql->options.use_ssl = FALSE;
1603
mysql->connector_fd = 0;
1607
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
1610
Return the SSL cipher (if any) used for current
1611
connection to the server.
1614
mysql_get_ssl_cipher()
1615
mysql pointer to the mysql connection
1619
const char * STDCALL
1620
mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused)))
1622
DBUG_ENTER("mysql_get_ssl_cipher");
1623
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
1624
if (mysql->net.vio && mysql->net.vio->ssl_arg)
1625
DBUG_RETURN(SSL_get_cipher_name((SSL*)mysql->net.vio->ssl_arg));
1626
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
1632
Check the server's (subject) Common Name against the
1633
hostname we connected to
1636
ssl_verify_server_cert()
1637
vio pointer to a SSL connected vio
1638
server_hostname name of the server that we connected to
1642
1 Failed to validate server
1646
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
1648
static int ssl_verify_server_cert(Vio *vio, const char* server_hostname)
1654
DBUG_ENTER("ssl_verify_server_cert");
1655
DBUG_PRINT("enter", ("server_hostname: %s", server_hostname));
1657
if (!(ssl= (SSL*)vio->ssl_arg))
1659
DBUG_PRINT("error", ("No SSL pointer found"));
1663
if (!server_hostname)
1665
DBUG_PRINT("error", ("No server hostname supplied"));
1669
if (!(server_cert= SSL_get_peer_certificate(ssl)))
1671
DBUG_PRINT("error", ("Could not get server certificate"));
1676
We already know that the certificate exchanged was valid; the SSL library
1677
handled that. Now we need to verify that the contents of the certificate
1681
X509_NAME_oneline(X509_get_subject_name(server_cert), buf, sizeof(buf));
1682
X509_free (server_cert);
1684
DBUG_PRINT("info", ("hostname in cert: %s", buf));
1685
cp1= strstr(buf, "/CN=");
1688
cp1+= 4; /* Skip the "/CN=" that we found */
1689
/* Search for next / which might be the delimiter for email */
1690
cp2= strchr(cp1, '/');
1693
DBUG_PRINT("info", ("Server hostname in cert: %s", cp1));
1694
if (!strcmp(cp1, server_hostname))
1700
DBUG_PRINT("error", ("SSL certificate validation failure"));
1704
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
1708
Note that the mysql argument must be initialized with mysql_init()
1709
before calling mysql_real_connect !
1712
static my_bool cli_read_query_result(MYSQL *mysql);
1713
static MYSQL_RES *cli_use_result(MYSQL *mysql);
1715
static MYSQL_METHODS client_methods=
1717
cli_read_query_result, /* read_query_result */
1718
cli_advanced_command, /* advanced_command */
1719
cli_read_rows, /* read_rows */
1720
cli_use_result, /* use_result */
1721
cli_fetch_lengths, /* fetch_lengths */
1722
cli_flush_use_result /* flush_use_result */
1723
#ifndef MYSQL_SERVER
1724
,cli_list_fields, /* list_fields */
1725
cli_read_prepare_result, /* read_prepare_result */
1726
cli_stmt_execute, /* stmt_execute */
1727
cli_read_binary_rows, /* read_binary_rows */
1728
cli_unbuffered_fetch, /* unbuffered_fetch */
1729
NULL, /* free_embedded_thd */
1730
cli_read_statistics, /* read_statistics */
1731
cli_read_query_result, /* next_result */
1732
cli_read_change_user_result, /* read_change_user_result */
1733
cli_read_binary_rows /* read_rows_from_cursor */
1738
int mysql_init_character_set(MYSQL *mysql)
1740
const char *default_collation_name;
1742
/* Set character set */
1743
if (!mysql->options.charset_name)
1745
default_collation_name= MYSQL_DEFAULT_COLLATION_NAME;
1746
if (!(mysql->options.charset_name=
1747
my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
1751
default_collation_name= NULL;
1754
const char *save= charsets_dir;
1755
if (mysql->options.charset_dir)
1756
charsets_dir=mysql->options.charset_dir;
1757
mysql->charset=get_charset_by_csname(mysql->options.charset_name,
1758
MY_CS_PRIMARY, MYF(MY_WME));
1759
if (mysql->charset && default_collation_name)
1761
CHARSET_INFO *collation;
1763
get_charset_by_name(default_collation_name, MYF(MY_WME))))
1765
if (!my_charset_same(mysql->charset, collation))
1767
my_printf_error(ER_UNKNOWN_ERROR,
1768
"COLLATION %s is not valid for CHARACTER SET %s",
1770
default_collation_name, mysql->options.charset_name);
1771
mysql->charset= NULL;
1775
mysql->charset= collation;
1779
mysql->charset= NULL;
1784
if (!mysql->charset)
1786
if (mysql->options.charset_dir)
1787
set_mysql_extended_error(mysql, CR_CANT_READ_CHARSET, unknown_sqlstate,
1788
ER(CR_CANT_READ_CHARSET),
1789
mysql->options.charset_name,
1790
mysql->options.charset_dir);
1793
char cs_dir_name[FN_REFLEN];
1794
get_charsets_dir(cs_dir_name);
1795
set_mysql_extended_error(mysql, CR_CANT_READ_CHARSET, unknown_sqlstate,
1796
ER(CR_CANT_READ_CHARSET),
1797
mysql->options.charset_name,
1808
CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
1809
const char *passwd, const char *db,
1810
uint port, const char *unix_socket,ulong client_flag)
1812
char buff[NAME_LEN+USERNAME_LENGTH+100];
1813
char *end,*host_info;
1815
NET *net= &mysql->net;
1817
thr_alarm_t alarmed;
1821
HANDLE hPipe=INVALID_HANDLE_VALUE;
1823
#ifdef HAVE_SYS_UN_H
1824
struct sockaddr_un UNIXaddr;
1826
init_sigpipe_variables
1827
DBUG_ENTER("mysql_real_connect");
1829
DBUG_PRINT("enter",("host: %s db: %s user: %s",
1830
host ? host : "(Null)",
1832
user ? user : "(Null)"));
1834
/* Don't give sigpipe errors if the client doesn't want them */
1836
mysql->methods= &client_methods;
1837
net->vio = 0; /* If something goes wrong */
1838
mysql->client_flag=0; /* For handshake */
1840
/* use default options */
1841
if (mysql->options.my_cnf_file || mysql->options.my_cnf_group)
1843
mysql_read_default_options(&mysql->options,
1844
(mysql->options.my_cnf_file ?
1845
mysql->options.my_cnf_file : "my"),
1846
mysql->options.my_cnf_group);
1847
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
1848
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
1849
mysql->options.my_cnf_file=mysql->options.my_cnf_group=0;
1852
/* Some empty-string-tests are done because of ODBC */
1853
if (!host || !host[0])
1854
host=mysql->options.host;
1855
if (!user || !user[0])
1857
user=mysql->options.user;
1863
passwd=mysql->options.password;
1864
#if !defined(DONT_USE_MYSQL_PWD) && !defined(MYSQL_SERVER)
1866
passwd=getenv("MYSQL_PWD"); /* get it from environment */
1872
db=mysql->options.db;
1874
port=mysql->options.port;
1876
unix_socket=mysql->options.unix_socket;
1878
mysql->server_status=SERVER_STATUS_AUTOCOMMIT;
1881
Part 0: Grab a socket and connect it to the server
1883
#if defined(HAVE_SMEM)
1884
if ((!mysql->options.protocol ||
1885
mysql->options.protocol == MYSQL_PROTOCOL_MEMORY) &&
1886
(!host || !strcmp(host,LOCAL_HOST)))
1888
if ((create_shared_memory(mysql,net, mysql->options.connect_timeout)) ==
1889
INVALID_HANDLE_VALUE)
1892
("host: '%s' socket: '%s' shared memory: %s have_tcpip: %d",
1893
host ? host : "<null>",
1894
unix_socket ? unix_socket : "<null>",
1895
(int) mysql->options.shared_memory_base_name,
1897
if (mysql->options.protocol == MYSQL_PROTOCOL_MEMORY)
1901
Try also with PIPE or TCP/IP. Clear the error from
1902
create_shared_memory().
1905
net_clear_error(net);
1909
mysql->options.protocol=MYSQL_PROTOCOL_MEMORY;
1911
host=mysql->options.shared_memory_base_name;
1912
my_snprintf(host_info=buff, sizeof(buff)-1,
1913
ER(CR_SHARED_MEMORY_CONNECTION), host);
1916
#endif /* HAVE_SMEM */
1917
#if defined(HAVE_SYS_UN_H)
1919
(!mysql->options.protocol ||
1920
mysql->options.protocol == MYSQL_PROTOCOL_SOCKET) &&
1921
(unix_socket || mysql_unix_port) &&
1922
(!host || !strcmp(host,LOCAL_HOST)))
1924
my_socket sock= socket(AF_UNIX, SOCK_STREAM, 0);
1925
if (sock == SOCKET_ERROR)
1927
set_mysql_extended_error(mysql, CR_SOCKET_CREATE_ERROR,
1929
ER(CR_SOCKET_CREATE_ERROR),
1934
net->vio= vio_new(sock, VIO_TYPE_SOCKET,
1935
VIO_LOCALHOST | VIO_BUFFERED_READ);
1938
DBUG_PRINT("error",("Unknow protocol %d ", mysql->options.protocol));
1939
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
1946
unix_socket= mysql_unix_port;
1947
host_info= (char*) ER(CR_LOCALHOST_CONNECTION);
1948
DBUG_PRINT("info", ("Using UNIX sock '%s'", unix_socket));
1950
bzero((char*) &UNIXaddr, sizeof(UNIXaddr));
1951
UNIXaddr.sun_family= AF_UNIX;
1952
strmake(UNIXaddr.sun_path, unix_socket, sizeof(UNIXaddr.sun_path)-1);
1954
if (my_connect(sock, (struct sockaddr *) &UNIXaddr, sizeof(UNIXaddr),
1955
mysql->options.connect_timeout))
1957
DBUG_PRINT("error",("Got error %d on connect to local server",
1959
set_mysql_extended_error(mysql, CR_CONNECTION_ERROR,
1961
ER(CR_CONNECTION_ERROR),
1962
unix_socket, socket_errno);
1963
vio_delete(net->vio);
1967
mysql->options.protocol=MYSQL_PROTOCOL_SOCKET;
1969
#elif defined(__WIN__)
1971
(mysql->options.protocol == MYSQL_PROTOCOL_PIPE ||
1972
(host && !strcmp(host,LOCAL_HOST_NAMEDPIPE)) ||
1973
(! have_tcpip && (unix_socket || !host && is_NT()))))
1975
if ((hPipe= create_named_pipe(mysql, mysql->options.connect_timeout,
1976
(char**) &host, (char**) &unix_socket)) ==
1977
INVALID_HANDLE_VALUE)
1980
("host: '%s' socket: '%s' have_tcpip: %d",
1981
host ? host : "<null>",
1982
unix_socket ? unix_socket : "<null>",
1984
if (mysql->options.protocol == MYSQL_PROTOCOL_PIPE ||
1985
(host && !strcmp(host,LOCAL_HOST_NAMEDPIPE)) ||
1986
(unix_socket && !strcmp(unix_socket,MYSQL_NAMEDPIPE)))
1988
/* Try also with TCP/IP */
1992
net->vio=vio_new_win32pipe(hPipe);
1993
my_snprintf(host_info=buff, sizeof(buff)-1,
1994
ER(CR_NAMEDPIPE_CONNECTION), unix_socket);
1999
(!mysql->options.protocol ||
2000
mysql->options.protocol == MYSQL_PROTOCOL_TCP))
2002
struct addrinfo *res_lst, hints, *t_res;
2004
char port_buf[NI_MAXSERV];
2006
unix_socket=0; /* This is not used */
2014
my_snprintf(host_info=buff, sizeof(buff)-1, ER(CR_TCP_CONNECTION), host);
2015
DBUG_PRINT("info",("Server name: '%s'. TCP sock: %d", host, port));
2017
thr_alarm_init(&alarmed);
2018
thr_alarm(&alarmed, mysql->options.connect_timeout, &alarm_buff);
2021
DBUG_PRINT("info",("IP '%s'", "client"));
2024
thr_end_alarm(&alarmed);
2027
memset(&hints, 0, sizeof(hints));
2028
hints.ai_socktype= SOCK_STREAM;
2029
hints.ai_protocol= IPPROTO_TCP;
2030
hints.ai_family= AF_UNSPEC;
2032
DBUG_PRINT("info",("IPV6 getaddrinfo %s", host));
2033
my_snprintf(port_buf, NI_MAXSERV, "%d", port);
2034
gai_errno= getaddrinfo(host, port_buf, &hints, &res_lst);
2039
For DBUG we are keeping the right message but for client we default to
2040
historical error message.
2042
DBUG_PRINT("info",("IPV6 getaddrinfo error %d", gai_errno));
2043
set_mysql_extended_error(mysql, CR_UNKNOWN_HOST, unknown_sqlstate,
2044
ER(CR_UNKNOWN_HOST), host, errno);
2049
/* We only look at the first item (something to think about changing in the future) */
2052
my_socket sock= socket(t_res->ai_family, t_res->ai_socktype,
2053
t_res->ai_protocol);
2054
if (sock == SOCKET_ERROR)
2056
set_mysql_extended_error(mysql, CR_IPSOCK_ERROR, unknown_sqlstate,
2057
ER(CR_IPSOCK_ERROR), socket_errno);
2058
freeaddrinfo(res_lst);
2062
net->vio= vio_new(sock, VIO_TYPE_TCPIP, VIO_BUFFERED_READ);
2065
DBUG_PRINT("error",("Unknow protocol %d ", mysql->options.protocol));
2066
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
2068
freeaddrinfo(res_lst);
2072
if (my_connect(sock, t_res->ai_addr, t_res->ai_addrlen,
2073
mysql->options.connect_timeout))
2075
DBUG_PRINT("error",("Got error %d on connect to '%s'",socket_errno,
2077
set_mysql_extended_error(mysql, CR_CONN_HOST_ERROR, unknown_sqlstate,
2078
ER(CR_CONN_HOST_ERROR), host, socket_errno);
2079
vio_delete(net->vio);
2081
freeaddrinfo(res_lst);
2086
freeaddrinfo(res_lst);
2091
DBUG_PRINT("error",("Unknow protocol %d ",mysql->options.protocol));
2092
set_mysql_error(mysql, CR_CONN_UNKNOW_PROTOCOL, unknown_sqlstate);
2096
if (my_net_init(net, net->vio))
2098
vio_delete(net->vio);
2100
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
2103
vio_keepalive(net->vio,TRUE);
2105
/* If user set read_timeout, let it override the default */
2106
if (mysql->options.read_timeout)
2107
my_net_set_read_timeout(net, mysql->options.read_timeout);
2109
/* If user set write_timeout, let it override the default */
2110
if (mysql->options.write_timeout)
2111
my_net_set_write_timeout(net, mysql->options.write_timeout);
2113
if (mysql->options.max_allowed_packet)
2114
net->max_packet_size= mysql->options.max_allowed_packet;
2116
/* Get version info */
2117
mysql->protocol_version= PROTOCOL_VERSION; /* Assume this */
2118
if (mysql->options.connect_timeout &&
2119
vio_poll_read(net->vio, mysql->options.connect_timeout))
2121
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2122
ER(CR_SERVER_LOST_EXTENDED),
2123
"waiting for initial communication packet",
2129
Part 1: Connection established, read and parse first packet
2132
if ((pkt_length=cli_safe_read(mysql)) == packet_error)
2134
if (mysql->net.last_errno == CR_SERVER_LOST)
2135
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2136
ER(CR_SERVER_LOST_EXTENDED),
2137
"reading initial communication packet",
2141
/* Check if version of protocol matches current one */
2143
mysql->protocol_version= net->read_pos[0];
2144
DBUG_DUMP("packet",(uchar*) net->read_pos,10);
2145
DBUG_PRINT("info",("mysql protocol version %d, server=%d",
2146
PROTOCOL_VERSION, mysql->protocol_version));
2147
if (mysql->protocol_version != PROTOCOL_VERSION)
2149
set_mysql_extended_error(mysql, CR_VERSION_ERROR, unknown_sqlstate,
2150
ER(CR_VERSION_ERROR), mysql->protocol_version,
2154
end=strend((char*) net->read_pos+1);
2155
mysql->thread_id=uint4korr(end+1);
2158
Scramble is split into two parts because old clients does not understand
2159
long scrambles; here goes the first part.
2161
strmake(mysql->scramble, end, SCRAMBLE_LENGTH_323);
2162
end+= SCRAMBLE_LENGTH_323+1;
2164
if (pkt_length >= (uint) (end+1 - (char*) net->read_pos))
2165
mysql->server_capabilities=uint2korr(end);
2166
if (pkt_length >= (uint) (end+18 - (char*) net->read_pos))
2168
/* New protocol with 16 bytes to describe server characteristics */
2169
mysql->server_language=end[2];
2170
mysql->server_status=uint2korr(end+3);
2173
if (pkt_length >= (uint) (end + SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323 + 1 -
2174
(char *) net->read_pos))
2175
strmake(mysql->scramble+SCRAMBLE_LENGTH_323, end,
2176
SCRAMBLE_LENGTH-SCRAMBLE_LENGTH_323);
2178
mysql->server_capabilities&= ~CLIENT_SECURE_CONNECTION;
2180
if (mysql->options.secure_auth && passwd[0] &&
2181
!(mysql->server_capabilities & CLIENT_SECURE_CONNECTION))
2183
set_mysql_error(mysql, CR_SECURE_AUTH, unknown_sqlstate);
2187
if (mysql_init_character_set(mysql))
2190
/* Save connection information */
2191
if (!my_multi_malloc(MYF(0),
2192
&mysql->host_info, (uint) strlen(host_info)+1,
2193
&mysql->host, (uint) strlen(host)+1,
2194
&mysql->unix_socket,unix_socket ?
2195
(uint) strlen(unix_socket)+1 : (uint) 1,
2196
&mysql->server_version,
2197
(uint) (end - (char*) net->read_pos),
2199
!(mysql->user=my_strdup(user,MYF(0))) ||
2200
!(mysql->passwd=my_strdup(passwd,MYF(0))))
2202
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
2205
strmov(mysql->host_info,host_info);
2206
strmov(mysql->host,host);
2208
strmov(mysql->unix_socket,unix_socket);
2210
mysql->unix_socket=0;
2211
strmov(mysql->server_version,(char*) net->read_pos+1);
2215
Part 2: format and send client info to the server for access check
2218
client_flag|=mysql->options.client_flag;
2219
client_flag|=CLIENT_CAPABILITIES;
2220
if (client_flag & CLIENT_MULTI_STATEMENTS)
2221
client_flag|= CLIENT_MULTI_RESULTS;
2223
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
2224
if (mysql->options.ssl_key || mysql->options.ssl_cert ||
2225
mysql->options.ssl_ca || mysql->options.ssl_capath ||
2226
mysql->options.ssl_cipher)
2227
mysql->options.use_ssl= 1;
2228
if (mysql->options.use_ssl)
2229
client_flag|=CLIENT_SSL;
2230
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY*/
2232
client_flag|=CLIENT_CONNECT_WITH_DB;
2234
/* Remove options that server doesn't support */
2235
client_flag= ((client_flag &
2236
~(CLIENT_COMPRESS | CLIENT_SSL | CLIENT_PROTOCOL_41)) |
2237
(client_flag & mysql->server_capabilities));
2238
client_flag&= ~CLIENT_COMPRESS;
2240
if (client_flag & CLIENT_PROTOCOL_41)
2242
/* 4.1 server and 4.1 client has a 32 byte option flag */
2243
int4store(buff,client_flag);
2244
int4store(buff+4, net->max_packet_size);
2245
buff[8]= (char) mysql->charset->number;
2246
bzero(buff+9, 32-9);
2251
int2store(buff,client_flag);
2252
int3store(buff+2,net->max_packet_size);
2255
mysql->client_flag=client_flag;
2257
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
2258
if (client_flag & CLIENT_SSL)
2260
/* Do the SSL layering. */
2261
struct st_mysql_options *options= &mysql->options;
2262
struct st_VioSSLFd *ssl_fd;
2265
Send client_flag, max_packet_size - unencrypted otherwise
2266
the server does not know we want to do SSL
2268
if (my_net_write(net, (uchar*) buff, (uint) (end-buff)) || net_flush(net))
2270
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2271
ER(CR_SERVER_LOST_EXTENDED),
2272
"sending connection information to server",
2277
/* Create the VioSSLConnectorFd - init SSL and load certs */
2278
if (!(ssl_fd= new_VioSSLConnectorFd(options->ssl_key,
2281
options->ssl_capath,
2282
options->ssl_cipher)))
2284
set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate);
2287
mysql->connector_fd= (void*)ssl_fd;
2289
/* Connect to the server */
2290
DBUG_PRINT("info", ("IO layer change in progress..."));
2291
if (sslconnect(ssl_fd, mysql->net.vio,
2292
(long) (mysql->options.connect_timeout)))
2294
set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate);
2297
DBUG_PRINT("info", ("IO layer change done!"));
2299
/* Verify server cert */
2300
if ((client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) &&
2301
ssl_verify_server_cert(mysql->net.vio, mysql->host))
2303
set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate);
2308
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
2310
DBUG_PRINT("info",("Server version = '%s' capabilites: %lu status: %u client_flag: %lu",
2311
mysql->server_version,mysql->server_capabilities,
2312
mysql->server_status, client_flag));
2313
/* This needs to be changed as it's not useful with big packets */
2314
if (user && user[0])
2315
strmake(end,user,USERNAME_LENGTH); /* Max user name */
2317
read_user_name((char*) end);
2319
/* We have to handle different version of handshake here */
2320
#ifdef _CUSTOMCONFIG_
2321
#include "_cust_libmysql.h"
2323
DBUG_PRINT("info",("user: %s",end));
2324
end= strend(end) + 1;
2327
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
2329
*end++= SCRAMBLE_LENGTH;
2330
scramble(end, mysql->scramble, passwd);
2331
end+= SCRAMBLE_LENGTH;
2335
scramble_323(end, mysql->scramble, passwd);
2336
end+= SCRAMBLE_LENGTH_323 + 1;
2340
*end++= '\0'; /* empty password */
2342
/* Add database if needed */
2343
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
2345
end= strmake(end, db, NAME_LEN) + 1;
2346
mysql->db= my_strdup(db,MYF(MY_WME));
2349
/* Write authentication package */
2350
if (my_net_write(net, (uchar*) buff, (size_t) (end-buff)) || net_flush(net))
2352
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2353
ER(CR_SERVER_LOST_EXTENDED),
2354
"sending authentication information",
2360
Part 3: Authorization data's been sent. Now server can reply with
2361
OK-packet, or re-request scrambled password.
2364
if ((pkt_length=cli_safe_read(mysql)) == packet_error)
2366
if (mysql->net.last_errno == CR_SERVER_LOST)
2367
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2368
ER(CR_SERVER_LOST_EXTENDED),
2369
"reading authorization packet",
2374
if (pkt_length == 1 && net->read_pos[0] == 254 &&
2375
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
2378
By sending this very specific reply server asks us to send scrambled
2379
password in old format.
2381
scramble_323(buff, mysql->scramble, passwd);
2382
if (my_net_write(net, (uchar*) buff, SCRAMBLE_LENGTH_323 + 1) ||
2385
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2386
ER(CR_SERVER_LOST_EXTENDED),
2387
"sending password information",
2391
/* Read what server thinks about out new auth message report */
2392
if (cli_safe_read(mysql) == packet_error)
2394
if (mysql->net.last_errno == CR_SERVER_LOST)
2395
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2396
ER(CR_SERVER_LOST_EXTENDED),
2397
"reading final connect information",
2403
if (client_flag & CLIENT_COMPRESS) /* We will use compression */
2406
#ifdef CHECK_LICENSE
2407
if (check_license(mysql))
2411
if (db && mysql_select_db(mysql, db))
2413
if (mysql->net.last_errno == CR_SERVER_LOST)
2414
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
2415
ER(CR_SERVER_LOST_EXTENDED),
2416
"Setting intital database",
2421
if (mysql->options.init_commands)
2423
DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
2424
char **ptr= (char**)init_commands->buffer;
2425
char **end_command= ptr + init_commands->elements;
2427
my_bool reconnect=mysql->reconnect;
2430
for (; ptr < end_command; ptr++)
2433
if (mysql_real_query(mysql,*ptr, (ulong) strlen(*ptr)))
2437
if (!(res= cli_use_result(mysql)))
2439
mysql_free_result(res);
2442
mysql->reconnect=reconnect;
2445
DBUG_PRINT("exit", ("Mysql handler: 0x%lx", (long) mysql));
2446
reset_sigpipe(mysql);
2450
reset_sigpipe(mysql);
2451
DBUG_PRINT("error",("message: %u/%s (%s)",
2456
/* Free alloced memory */
2458
mysql_close_free(mysql);
2459
if (!(((ulong) client_flag) & CLIENT_REMEMBER_OPTIONS))
2460
mysql_close_free_options(mysql);
2466
my_bool mysql_reconnect(MYSQL *mysql)
2469
DBUG_ENTER("mysql_reconnect");
2471
DBUG_PRINT("enter", ("mysql->reconnect: %d", mysql->reconnect));
2473
if (!mysql->reconnect ||
2474
(mysql->server_status & SERVER_STATUS_IN_TRANS) || !mysql->host_info)
2476
/* Allow reconnect next time */
2477
mysql->server_status&= ~SERVER_STATUS_IN_TRANS;
2478
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
2481
mysql_init(&tmp_mysql);
2482
tmp_mysql.options= mysql->options;
2483
tmp_mysql.options.my_cnf_file= tmp_mysql.options.my_cnf_group= 0;
2485
if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,
2486
mysql->db, mysql->port, mysql->unix_socket,
2487
mysql->client_flag | CLIENT_REMEMBER_OPTIONS))
2489
mysql->net.last_errno= tmp_mysql.net.last_errno;
2490
strmov(mysql->net.last_error, tmp_mysql.net.last_error);
2491
strmov(mysql->net.sqlstate, tmp_mysql.net.sqlstate);
2494
if (mysql_set_character_set(&tmp_mysql, mysql->charset->csname))
2496
DBUG_PRINT("error", ("mysql_set_character_set() failed"));
2497
bzero((char*) &tmp_mysql.options,sizeof(tmp_mysql.options));
2498
mysql_close(&tmp_mysql);
2499
mysql->net.last_errno= tmp_mysql.net.last_errno;
2500
strmov(mysql->net.last_error, tmp_mysql.net.last_error);
2501
strmov(mysql->net.sqlstate, tmp_mysql.net.sqlstate);
2505
DBUG_PRINT("info", ("reconnect succeded"));
2506
tmp_mysql.reconnect= 1;
2507
tmp_mysql.free_me= mysql->free_me;
2510
For each stmt in mysql->stmts, move it to tmp_mysql if it is
2511
in state MYSQL_STMT_INIT_DONE, otherwise close it.
2514
LIST *element= mysql->stmts;
2515
for (; element; element= element->next)
2517
MYSQL_STMT *stmt= (MYSQL_STMT *) element->data;
2518
if (stmt->state != MYSQL_STMT_INIT_DONE)
2521
stmt->last_errno= CR_SERVER_LOST;
2522
strmov(stmt->last_error, ER(CR_SERVER_LOST));
2523
strmov(stmt->sqlstate, unknown_sqlstate);
2527
tmp_mysql.stmts= list_add(tmp_mysql.stmts, &stmt->list);
2529
/* No need to call list_delete for statement here */
2534
/* Don't free options as these are now used in tmp_mysql */
2535
bzero((char*) &mysql->options,sizeof(mysql->options));
2539
net_clear(&mysql->net, 1);
2540
mysql->affected_rows= ~(my_ulonglong) 0;
2545
/**************************************************************************
2546
Set current database
2547
**************************************************************************/
2550
mysql_select_db(MYSQL *mysql, const char *db)
2553
DBUG_ENTER("mysql_select_db");
2554
DBUG_PRINT("enter",("db: '%s'",db));
2556
if ((error=simple_command(mysql,COM_INIT_DB, (const uchar*) db,
2557
(ulong) strlen(db),0)))
2559
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
2560
mysql->db=my_strdup(db,MYF(MY_WME));
2565
/*************************************************************************
2566
Send a QUIT to the server and close the connection
2567
If handle is alloced by mysql connect free it.
2568
*************************************************************************/
2570
static void mysql_close_free_options(MYSQL *mysql)
2572
DBUG_ENTER("mysql_close_free_options");
2574
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
2575
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
2576
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
2577
my_free(mysql->options.unix_socket,MYF(MY_ALLOW_ZERO_PTR));
2578
my_free(mysql->options.db,MYF(MY_ALLOW_ZERO_PTR));
2579
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
2580
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
2581
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
2582
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
2583
my_free(mysql->options.client_ip,MYF(MY_ALLOW_ZERO_PTR));
2584
if (mysql->options.init_commands)
2586
DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
2587
char **ptr= (char**)init_commands->buffer;
2588
char **end= ptr + init_commands->elements;
2589
for (; ptr<end; ptr++)
2590
my_free(*ptr,MYF(MY_WME));
2591
delete_dynamic(init_commands);
2592
my_free((char*)init_commands,MYF(MY_WME));
2594
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
2595
mysql_ssl_free(mysql);
2596
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
2598
if (mysql->options.shared_memory_base_name != def_shared_memory_base_name)
2599
my_free(mysql->options.shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
2600
#endif /* HAVE_SMEM */
2601
bzero((char*) &mysql->options,sizeof(mysql->options));
2606
static void mysql_close_free(MYSQL *mysql)
2608
my_free((uchar*) mysql->host_info,MYF(MY_ALLOW_ZERO_PTR));
2609
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
2610
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
2611
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
2612
#if defined(EMBEDDED_LIBRARY) || MYSQL_VERSION_ID >= 50100
2613
my_free(mysql->info_buffer,MYF(MY_ALLOW_ZERO_PTR));
2614
mysql->info_buffer= 0;
2616
/* Clear pointers for better safety */
2617
mysql->host_info= mysql->user= mysql->passwd= mysql->db= 0;
2622
Clear connection pointer of every statement: this is necessary
2623
to give error on attempt to use a prepared statement of closed
2627
mysql_detach_stmt_list()
2628
stmt_list pointer to mysql->stmts
2629
func_name name of calling function
2632
There is similar code in mysql_reconnect(), so changes here
2633
should also be reflected there.
2636
void mysql_detach_stmt_list(LIST **stmt_list __attribute__((unused)),
2637
const char *func_name __attribute__((unused)))
2640
/* Reset connection handle in all prepared statements. */
2641
LIST *element= *stmt_list;
2642
char buff[MYSQL_ERRMSG_SIZE];
2643
DBUG_ENTER("mysql_detach_stmt_list");
2645
my_snprintf(buff, sizeof(buff)-1, ER(CR_STMT_CLOSED), func_name);
2646
for (; element; element= element->next)
2648
MYSQL_STMT *stmt= (MYSQL_STMT *) element->data;
2649
set_stmt_error(stmt, CR_STMT_CLOSED, unknown_sqlstate, buff);
2651
/* No need to call list_delete for statement here */
2655
#endif /* MYSQL_CLIENT */
2659
void STDCALL mysql_close(MYSQL *mysql)
2661
DBUG_ENTER("mysql_close");
2662
if (mysql) /* Some simple safety */
2664
/* If connection is still up, send a QUIT message */
2665
if (mysql->net.vio != 0)
2667
free_old_query(mysql);
2668
mysql->status=MYSQL_STATUS_READY; /* Force command */
2670
simple_command(mysql,COM_QUIT,(uchar*) 0,0,1);
2671
end_server(mysql); /* Sets mysql->net.vio= 0 */
2673
mysql_close_free_options(mysql);
2674
mysql_close_free(mysql);
2675
mysql_detach_stmt_list(&mysql->stmts, "mysql_close");
2676
#ifndef MYSQL_SERVER
2678
(*mysql->methods->free_embedded_thd)(mysql);
2681
my_free((uchar*) mysql,MYF(0));
2687
static my_bool cli_read_query_result(MYSQL *mysql)
2693
DBUG_ENTER("cli_read_query_result");
2695
if ((length = cli_safe_read(mysql)) == packet_error)
2697
free_old_query(mysql); /* Free old result */
2698
#ifdef MYSQL_CLIENT /* Avoid warn of unused labels*/
2701
pos=(uchar*) mysql->net.read_pos;
2702
if ((field_count= net_field_length(&pos)) == 0)
2704
mysql->affected_rows= net_field_length_ll(&pos);
2705
mysql->insert_id= net_field_length_ll(&pos);
2706
DBUG_PRINT("info",("affected_rows: %lu insert_id: %lu",
2707
(ulong) mysql->affected_rows,
2708
(ulong) mysql->insert_id));
2709
if (protocol_41(mysql))
2711
mysql->server_status=uint2korr(pos); pos+=2;
2712
mysql->warning_count=uint2korr(pos); pos+=2;
2714
else if (mysql->server_capabilities & CLIENT_TRANSACTIONS)
2716
/* MySQL 4.0 protocol */
2717
mysql->server_status=uint2korr(pos); pos+=2;
2718
mysql->warning_count= 0;
2720
DBUG_PRINT("info",("status: %u warning_count: %u",
2721
mysql->server_status, mysql->warning_count));
2722
if (pos < mysql->net.read_pos+length && net_field_length(&pos))
2723
mysql->info=(char*) pos;
2727
if (field_count == NULL_LENGTH) /* LOAD DATA LOCAL INFILE */
2731
if (!(mysql->options.client_flag & CLIENT_LOCAL_FILES))
2733
set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate);
2737
error= handle_local_infile(mysql,(char*) pos);
2738
if ((length= cli_safe_read(mysql)) == packet_error || error)
2740
goto get_info; /* Get info packet */
2743
if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT))
2744
mysql->server_status|= SERVER_STATUS_IN_TRANS;
2746
if (!(fields=cli_read_rows(mysql,(MYSQL_FIELD*)0, protocol_41(mysql) ? 7:5)))
2748
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,
2749
(uint) field_count,0,
2750
mysql->server_capabilities)))
2752
mysql->status= MYSQL_STATUS_GET_RESULT;
2753
mysql->field_count= (uint) field_count;
2754
DBUG_PRINT("exit",("ok"));
2760
Send the query and return so we can do something else.
2761
Needs to be followed by mysql_read_query_result() when we want to
2762
finish processing it.
2766
mysql_send_query(MYSQL* mysql, const char* query, ulong length)
2768
DBUG_ENTER("mysql_send_query");
2769
DBUG_RETURN(simple_command(mysql, COM_QUERY, (uchar*) query, length, 1));
2774
mysql_real_query(MYSQL *mysql, const char *query, ulong length)
2776
DBUG_ENTER("mysql_real_query");
2777
DBUG_PRINT("enter",("handle: 0x%lx", (long) mysql));
2778
DBUG_PRINT("query",("Query = '%-.4096s'",query));
2780
if (mysql_send_query(mysql,query,length))
2782
DBUG_RETURN((int) (*mysql->methods->read_query_result)(mysql));
2786
/**************************************************************************
2787
Alloc result struct for buffered results. All rows are read to buffer.
2788
mysql_data_seek may be used.
2789
**************************************************************************/
2791
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql)
2794
DBUG_ENTER("mysql_store_result");
2798
if (mysql->status != MYSQL_STATUS_GET_RESULT)
2800
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
2803
mysql->status=MYSQL_STATUS_READY; /* server is ready */
2804
if (!(result=(MYSQL_RES*) my_malloc((uint) (sizeof(MYSQL_RES)+
2806
mysql->field_count),
2807
MYF(MY_WME | MY_ZEROFILL))))
2809
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
2812
result->methods= mysql->methods;
2813
result->eof=1; /* Marker for buffered */
2814
result->lengths=(ulong*) (result+1);
2816
(*mysql->methods->read_rows)(mysql,mysql->fields,mysql->field_count)))
2818
my_free((uchar*) result,MYF(0));
2821
mysql->affected_rows= result->row_count= result->data->rows;
2822
result->data_cursor= result->data->data;
2823
result->fields= mysql->fields;
2824
result->field_alloc= mysql->field_alloc;
2825
result->field_count= mysql->field_count;
2826
/* The rest of result members is bzeroed in malloc */
2827
mysql->fields=0; /* fields is now in result */
2828
clear_alloc_root(&mysql->field_alloc);
2829
/* just in case this was mistakenly called after mysql_stmt_execute() */
2830
mysql->unbuffered_fetch_owner= 0;
2831
DBUG_RETURN(result); /* Data fetched */
2835
/**************************************************************************
2836
Alloc struct for use with unbuffered reads. Data is fetched by domand
2837
when calling to mysql_fetch_row.
2838
mysql_data_seek is a noop.
2840
No other queries may be specified with the same MYSQL handle.
2841
There shouldn't be much processing per row because mysql server shouldn't
2842
have to wait for the client (and will not wait more than 30 sec/packet).
2843
**************************************************************************/
2845
static MYSQL_RES * cli_use_result(MYSQL *mysql)
2848
DBUG_ENTER("cli_use_result");
2852
if (mysql->status != MYSQL_STATUS_GET_RESULT)
2854
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
2857
if (!(result=(MYSQL_RES*) my_malloc(sizeof(*result)+
2858
sizeof(ulong)*mysql->field_count,
2859
MYF(MY_WME | MY_ZEROFILL))))
2861
result->lengths=(ulong*) (result+1);
2862
result->methods= mysql->methods;
2863
if (!(result->row=(MYSQL_ROW)
2864
my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
2865
{ /* Ptrs: to one row */
2866
my_free((uchar*) result,MYF(0));
2869
result->fields= mysql->fields;
2870
result->field_alloc= mysql->field_alloc;
2871
result->field_count= mysql->field_count;
2872
result->current_field=0;
2873
result->handle= mysql;
2874
result->current_row= 0;
2875
mysql->fields=0; /* fields is now in result */
2876
clear_alloc_root(&mysql->field_alloc);
2877
mysql->status=MYSQL_STATUS_USE_RESULT;
2878
mysql->unbuffered_fetch_owner= &result->unbuffered_fetch_cancelled;
2879
DBUG_RETURN(result); /* Data is read to be fetched */
432
2884
Return next row of the query results
433
2885
**************************************************************************/
436
drizzle_fetch_row(DRIZZLE_RES *res)
2888
mysql_fetch_row(MYSQL_RES *res)
2890
DBUG_ENTER("mysql_fetch_row");
439
{ /* Unbufferred fetch */
2892
{ /* Unbufferred fetch */
442
DRIZZLE *drizzle= res->handle;
443
if (drizzle->status != DRIZZLE_STATUS_USE_RESULT)
445
drizzle_set_error(drizzle,
446
res->unbuffered_fetch_cancelled ?
447
CR_FETCH_CANCELED : CR_COMMANDS_OUT_OF_SYNC,
448
sqlstate_get_unknown());
450
else if (!(read_one_row(drizzle, res->field_count, res->row, res->lengths)))
453
return(res->current_row=res->row);
2895
MYSQL *mysql= res->handle;
2896
if (mysql->status != MYSQL_STATUS_USE_RESULT)
2898
set_mysql_error(mysql,
2899
res->unbuffered_fetch_cancelled ?
2900
CR_FETCH_CANCELED : CR_COMMANDS_OUT_OF_SYNC,
2903
else if (!(read_one_row(mysql, res->field_count, res->row, res->lengths)))
2906
DBUG_RETURN(res->current_row=res->row);
2908
DBUG_PRINT("info",("end of data"));
456
drizzle->status=DRIZZLE_STATUS_READY;
2910
mysql->status=MYSQL_STATUS_READY;
458
2912
Reset only if owner points to us: there is a chance that somebody
459
started new query after drizzle_stmt_close():
2913
started new query after mysql_stmt_close():
461
if (drizzle->unbuffered_fetch_owner == &res->unbuffered_fetch_cancelled)
462
drizzle->unbuffered_fetch_owner= 0;
463
/* Don't clear handle in drizzle_free_result */
2915
if (mysql->unbuffered_fetch_owner == &res->unbuffered_fetch_cancelled)
2916
mysql->unbuffered_fetch_owner= 0;
2917
/* Don't clear handle in mysql_free_result */
466
return((DRIZZLE_ROW) NULL);
2920
DBUG_RETURN((MYSQL_ROW) NULL);
470
2924
if (!res->data_cursor)
472
return(res->current_row=(DRIZZLE_ROW) NULL);
2926
DBUG_PRINT("info",("end of data"));
2927
DBUG_RETURN(res->current_row=(MYSQL_ROW) NULL);
474
2929
tmp = res->data_cursor->data;
475
2930
res->data_cursor = res->data_cursor->next;
476
return(res->current_row=tmp);
2931
DBUG_RETURN(res->current_row=tmp);
481
2936
/**************************************************************************
482
2937
Get column lengths of the current row
483
If one uses drizzle_use_result, res->lengths contains the length information,
2938
If one uses mysql_use_result, res->lengths contains the length information,
484
2939
else the lengths are calculated from the offset between pointers.
485
2940
**************************************************************************/
488
drizzle_fetch_lengths(DRIZZLE_RES *res)
2943
mysql_fetch_lengths(MYSQL_RES *res)
492
2947
if (!(column=res->current_row))
493
return 0; /* Something is wrong */
2948
return 0; /* Something is wrong */
495
2950
(*res->methods->fetch_lengths)(res->lengths, column, res->field_count);
496
2951
return res->lengths;
501
drizzle_options(DRIZZLE *drizzle,enum drizzle_option option, const void *arg)
2956
mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg)
2958
DBUG_ENTER("mysql_option");
2959
DBUG_PRINT("enter",("option: %d",(int) option));
503
2960
switch (option) {
504
case DRIZZLE_OPT_CONNECT_TIMEOUT:
505
drizzle->options.connect_timeout= *(uint32_t*) arg;
507
case DRIZZLE_OPT_READ_TIMEOUT:
508
drizzle->options.read_timeout= *(uint32_t*) arg;
510
case DRIZZLE_OPT_WRITE_TIMEOUT:
511
drizzle->options.write_timeout= *(uint32_t*) arg;
513
case DRIZZLE_OPT_COMPRESS:
514
drizzle->options.compress= 1; /* Remember for connect */
515
drizzle->options.client_flag|= CLIENT_COMPRESS;
517
case DRIZZLE_OPT_LOCAL_INFILE: /* Allow LOAD DATA LOCAL ?*/
518
if (!arg || (*(uint32_t*) arg) ? 1 : 0)
519
drizzle->options.client_flag|= CLIENT_LOCAL_FILES;
521
drizzle->options.client_flag&= ~CLIENT_LOCAL_FILES;
523
case DRIZZLE_READ_DEFAULT_FILE:
524
if (drizzle->options.my_cnf_file != NULL)
525
free(drizzle->options.my_cnf_file);
526
drizzle->options.my_cnf_file=strdup(arg);
528
case DRIZZLE_READ_DEFAULT_GROUP:
529
if (drizzle->options.my_cnf_group != NULL)
530
free(drizzle->options.my_cnf_group);
531
drizzle->options.my_cnf_group=strdup(arg);
533
case DRIZZLE_OPT_PROTOCOL:
535
case DRIZZLE_OPT_USE_REMOTE_CONNECTION:
536
case DRIZZLE_OPT_GUESS_CONNECTION:
537
drizzle->options.methods_to_use= option;
539
case DRIZZLE_SET_CLIENT_IP:
540
drizzle->options.client_ip= strdup(arg);
542
case DRIZZLE_SECURE_AUTH:
543
drizzle->options.secure_auth= *(const bool *) arg;
545
case DRIZZLE_REPORT_DATA_TRUNCATION:
546
drizzle->options.report_data_truncation= (*(const bool *) arg) ? 1 : 0;
548
case DRIZZLE_OPT_RECONNECT:
549
drizzle->reconnect= *(const bool *) arg;
551
case DRIZZLE_OPT_SSL_VERIFY_SERVER_CERT:
552
if (*(const bool*) arg)
553
drizzle->options.client_flag|= CLIENT_SSL_VERIFY_SERVER_CERT;
555
drizzle->options.client_flag&= ~CLIENT_SSL_VERIFY_SERVER_CERT;
2961
case MYSQL_OPT_CONNECT_TIMEOUT:
2962
mysql->options.connect_timeout= *(uint*) arg;
2964
case MYSQL_OPT_READ_TIMEOUT:
2965
mysql->options.read_timeout= *(uint*) arg;
2967
case MYSQL_OPT_WRITE_TIMEOUT:
2968
mysql->options.write_timeout= *(uint*) arg;
2970
case MYSQL_OPT_COMPRESS:
2971
mysql->options.compress= 1; /* Remember for connect */
2972
mysql->options.client_flag|= CLIENT_COMPRESS;
2974
case MYSQL_OPT_NAMED_PIPE: /* This option is depricated */
2975
mysql->options.protocol=MYSQL_PROTOCOL_PIPE; /* Force named pipe */
2977
case MYSQL_OPT_LOCAL_INFILE: /* Allow LOAD DATA LOCAL ?*/
2978
if (!arg || test(*(uint*) arg))
2979
mysql->options.client_flag|= CLIENT_LOCAL_FILES;
2981
mysql->options.client_flag&= ~CLIENT_LOCAL_FILES;
2983
case MYSQL_INIT_COMMAND:
2984
add_init_command(&mysql->options,arg);
2986
case MYSQL_READ_DEFAULT_FILE:
2987
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
2988
mysql->options.my_cnf_file=my_strdup(arg,MYF(MY_WME));
2990
case MYSQL_READ_DEFAULT_GROUP:
2991
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
2992
mysql->options.my_cnf_group=my_strdup(arg,MYF(MY_WME));
2994
case MYSQL_SET_CHARSET_DIR:
2995
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
2996
mysql->options.charset_dir=my_strdup(arg,MYF(MY_WME));
2998
case MYSQL_SET_CHARSET_NAME:
2999
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
3000
mysql->options.charset_name=my_strdup(arg,MYF(MY_WME));
3002
case MYSQL_OPT_PROTOCOL:
3003
mysql->options.protocol= *(uint*) arg;
3005
case MYSQL_SHARED_MEMORY_BASE_NAME:
3007
if (mysql->options.shared_memory_base_name != def_shared_memory_base_name)
3008
my_free(mysql->options.shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
3009
mysql->options.shared_memory_base_name=my_strdup(arg,MYF(MY_WME));
3012
case MYSQL_OPT_USE_REMOTE_CONNECTION:
3013
case MYSQL_OPT_USE_EMBEDDED_CONNECTION:
3014
case MYSQL_OPT_GUESS_CONNECTION:
3015
mysql->options.methods_to_use= option;
3017
case MYSQL_SET_CLIENT_IP:
3018
mysql->options.client_ip= my_strdup(arg, MYF(MY_WME));
3020
case MYSQL_SECURE_AUTH:
3021
mysql->options.secure_auth= *(my_bool *) arg;
3023
case MYSQL_REPORT_DATA_TRUNCATION:
3024
mysql->options.report_data_truncation= test(*(my_bool *) arg);
3026
case MYSQL_OPT_RECONNECT:
3027
mysql->reconnect= *(my_bool *) arg;
3029
case MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
3030
if (*(my_bool*) arg)
3031
mysql->options.client_flag|= CLIENT_SSL_VERIFY_SERVER_CERT;
3033
mysql->options.client_flag&= ~CLIENT_SSL_VERIFY_SERVER_CERT;
564
3042
/****************************************************************************
565
Functions to get information from the DRIZZLE structure
3043
Functions to get information from the MySQL structure
566
3044
These are functions to make shared libraries more usable.
567
3045
****************************************************************************/
570
uint64_t drizzle_num_rows(const DRIZZLE_RES *res)
3048
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res)
572
3050
return res->row_count;
575
unsigned int drizzle_num_fields(const DRIZZLE_RES *res)
3053
unsigned int STDCALL mysql_num_fields(MYSQL_RES *res)
577
3055
return res->field_count;
3058
uint STDCALL mysql_errno(MYSQL *mysql)
3060
return mysql ? mysql->net.last_errno : mysql_server_last_errno;
3064
const char * STDCALL mysql_error(MYSQL *mysql)
3066
return mysql ? mysql->net.last_error : mysql_server_last_error;
582
3071
Get version number for server in a form easy to test on
585
drizzle_get_server_version()
3074
mysql_get_server_version()
589
3078
4.1.0-alfa -> 40100
592
3081
We will ensure that a newer server always has a bigger number.