37
45
#ifdef HAVE_SYS_SELECT_H
38
46
#include <sys/select.h>
48
#endif /* !defined(MSDOS) && !defined(__WIN__) */
42
50
#include <sys/poll.h>
44
52
#ifdef HAVE_SYS_UN_H
45
53
#include <sys/un.h>
55
#include <my_pthread.h> /* because of signal() */
47
56
#ifndef INADDR_NONE
48
#define INADDR_NONE -1
57
#define INADDR_NONE -1
54
60
#include <sql_common.h>
55
#include <drizzled/version.h>
57
/* Borrowed from libicu header */
59
#define U8_IS_SINGLE(c) (((c)&0x80)==0)
60
#define U8_LENGTH(c) \
61
((uint32_t)(c)<=0x7f ? 1 : \
62
((uint32_t)(c)<=0x7ff ? 2 : \
63
((uint32_t)(c)<=0xd7ff ? 3 : \
64
((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
65
((uint32_t)(c)<=0xffff ? 3 : 4)\
61
#include "client_settings.h"
72
63
#undef net_buffer_length
73
64
#undef max_allowed_packet
75
uint32_t net_buffer_length= 8192;
76
uint32_t max_allowed_packet= 1024L*1024L*1024L;
78
unsigned int drizzle_port=0;
66
ulong net_buffer_length=8192;
67
ulong max_allowed_packet= 1024L*1024L*1024L;
70
#ifdef EMBEDDED_LIBRARY
72
my_bool net_flush(NET *net);
75
#if defined(MSDOS) || defined(__WIN__)
76
/* socket_errno is defined in my_global.h for all platforms */
83
static DRIZZLE_PARAMETERS drizzle_internal_parameters=
80
#define SOCKET_ERROR -1
84
If allowed through some configuration, then this needs to
87
#define MAX_LONG_DATA_LENGTH 8192
88
#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG)
90
static void append_wild(char *to,char *end,const char *wild);
91
sig_handler my_pipe_sig_handler(int sig);
93
static my_bool mysql_client_init= 0;
94
static my_bool org_my_init_done= 0;
98
Initialize the MySQL client library
104
Should be called before doing any other calls to the MySQL
105
client library to initialize thread specific variables etc.
106
It's called by mysql_init() to ensure that things will work for
107
old not threaded applications that doesn't call mysql_server_init()
112
1 could not initialize environment (out of memory or thread keys)
115
int STDCALL mysql_server_init(int argc __attribute__((unused)),
116
char **argv __attribute__((unused)),
117
char **groups __attribute__((unused)))
120
if (!mysql_client_init)
123
org_my_init_done=my_init_done;
124
if (my_init()) /* Will init threads */
129
mysql_port = MYSQL_PORT;
132
struct servent *serv_ptr;
136
if builder specifically requested a default port, use that
137
(even if it coincides with our factory default).
138
only if they didn't do we check /etc/services (and, failing
139
on that, fall back to the factory default of 3306).
140
either default can be overridden by the environment variable
141
MYSQL_TCP_PORT, which in turn can be overridden with command
145
#if MYSQL_PORT_DEFAULT == 0
146
if ((serv_ptr = getservbyname("mysql", "tcp")))
147
mysql_port = (uint) ntohs((ushort) serv_ptr->s_port);
149
if ((env = getenv("MYSQL_TCP_PORT")))
150
mysql_port =(uint) atoi(env);
154
if (!mysql_unix_port)
157
mysql_unix_port = (char*) MYSQL_UNIX_ADDR;
158
if ((env = getenv("MYSQL_UNIX_PORT")))
159
mysql_unix_port = env;
163
(void) signal(SIGPIPE, SIG_IGN);
167
result= (int)my_thread_init(); /* Init if new thread */
173
Free all memory and resources used by the client library
176
When calling this there should not be any other threads using
179
To make things simpler when used with windows dll's (which calls this
180
function automaticly), it's safe to call this function multiple times.
184
void STDCALL mysql_server_end()
186
if (!mysql_client_init)
189
finish_client_errs();
192
/* If library called my_init(), free memory allocated by it */
193
if (!org_my_init_done)
195
my_end(MY_DONT_FREE_DBUG);
196
/* Remove TRACING, if enabled by mysql_debug() */
205
mysql_client_init= org_my_init_done= 0;
206
#ifdef EMBEDDED_SERVER
209
fclose(stderror_file);
215
static MYSQL_PARAMETERS mysql_internal_parameters=
84
216
{&max_allowed_packet, &net_buffer_length, 0};
86
const DRIZZLE_PARAMETERS * drizzle_get_parameters(void)
88
return &drizzle_internal_parameters;
91
unsigned int drizzle_get_default_port(void)
96
void drizzle_set_default_port(unsigned int port)
218
MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void)
220
return &mysql_internal_parameters;
223
my_bool STDCALL mysql_thread_init()
225
return my_thread_init();
228
void STDCALL mysql_thread_end()
102
235
Expand wildcard to a sql string
106
239
append_wild(char *to, char *end, const char *wild)
108
end-=5; /* Some extra */
241
end-=5; /* Some extra */
109
242
if (wild && wild[0])
111
to= strcpy(to," like '");
112
to+= 7; /* strlen(" like '"); */
244
to=strmov(to," like '");
114
245
while (*wild && to < end)
116
247
if (*wild == '\\' || *wild == '\'')
120
if (*wild) /* Too small buffer */
121
*to++='%'; /* Nicer this way */
251
if (*wild) /* Too small buffer */
252
*to++='%'; /* Nicer this way */
259
/**************************************************************************
260
Init debugging if MYSQL_DEBUG environment variable is found
261
**************************************************************************/
264
mysql_debug(const char *debug __attribute__((unused)))
272
else if ((env = getenv("MYSQL_DEBUG")))
275
#if !defined(_WINVER) && !defined(WINVER)
276
puts("\n-------------------------------------------------------");
277
puts("MYSQL_DEBUG found. libmysql started with the following:");
279
puts("-------------------------------------------------------\n");
283
buff[sizeof(buff)-1]= 0;
284
strxnmov(buff,sizeof(buff)-1,"libmysql: ", env, NullS);
285
MessageBox((HWND) 0,"Debugging variable MYSQL_DEBUG used",buff,MB_OK);
293
/**************************************************************************
294
Ignore SIGPIPE handler
296
**************************************************************************/
299
my_pipe_sig_handler(int sig __attribute__((unused)))
301
DBUG_PRINT("info",("Hit by signal %d",sig));
302
#ifdef DONT_REMEMBER_SIGNAL
303
(void) signal(SIGPIPE, my_pipe_sig_handler);
308
/**************************************************************************
309
Connect to sql server
310
If host == 0 then use localhost
311
**************************************************************************/
313
#ifdef USE_OLD_FUNCTIONS
315
mysql_connect(MYSQL *mysql,const char *host,
316
const char *user, const char *passwd)
319
mysql=mysql_init(mysql); /* Make it thread safe */
321
DBUG_ENTER("mysql_connect");
322
if (!(res=mysql_real_connect(mysql,host,user,passwd,NullS,0,NullS,0)))
325
my_free((uchar*) mysql,MYF(0));
127
334
/**************************************************************************
128
335
Change user and database
129
336
**************************************************************************/
131
int cli_read_change_user_result(DRIZZLE *drizzle)
338
int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
340
NET *net= &mysql->net;
135
pkt_length= cli_safe_read(drizzle);
343
pkt_length= cli_safe_read(mysql);
137
345
if (pkt_length == packet_error)
348
if (pkt_length == 1 && net->read_pos[0] == 254 &&
349
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
352
By sending this very specific reply server asks us to send scrambled
353
password in old format. The reply contains scramble_323.
355
scramble_323(buff, mysql->scramble, passwd);
356
if (my_net_write(net, (uchar*) buff, SCRAMBLE_LENGTH_323 + 1) ||
359
set_mysql_error(mysql, CR_SERVER_LOST, unknown_sqlstate);
362
/* Read what server thinks about out new auth message report */
363
if (cli_safe_read(mysql) == packet_error)
143
bool drizzle_change_user(DRIZZLE *drizzle, const char *user,
144
const char *passwd, const char *db)
369
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
370
const char *passwd, const char *db)
146
372
char buff[USERNAME_LENGTH+SCRAMBLED_PASSWORD_CHAR_LENGTH+NAME_LEN+2];
375
CHARSET_INFO *saved_cs= mysql->charset;
377
DBUG_ENTER("mysql_change_user");
379
/* Get the connection-default character set. */
381
if (mysql_init_character_set(mysql))
383
mysql->charset= saved_cs;
150
387
/* Use an empty string instead of NULL. */
157
394
/* Store user into the buffer */
158
end= strncpy(end, user, USERNAME_LENGTH) + USERNAME_LENGTH + 1;
395
end= strmake(end, user, USERNAME_LENGTH) + 1;
160
397
/* write scrambled password according to server capabilities */
400
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
164
402
*end++= SCRAMBLE_LENGTH;
403
scramble(end, mysql->scramble, passwd);
165
404
end+= SCRAMBLE_LENGTH;
408
scramble_323(end, mysql->scramble, passwd);
409
end+= SCRAMBLE_LENGTH_323 + 1;
169
413
*end++= '\0'; /* empty password */
170
414
/* Add database if needed */
171
end= strncpy(end, db ? db : "", NAME_LEN) + NAME_LEN + 1;
415
end= strmake(end, db ? db : "", NAME_LEN) + 1;
173
417
/* Add character set number. */
174
if (drizzle->server_capabilities & CLIENT_SECURE_CONNECTION)
419
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
176
int2store(end, (uint16_t) 45); // utf8mb4 number from mystrings/ctype-utf8.c
421
int2store(end, (ushort) mysql->charset->number);
180
425
/* Write authentication package */
181
(void)simple_command(drizzle,COM_CHANGE_USER, (unsigned char*) buff, (uint32_t) (end-buff), 1);
426
simple_command(mysql,COM_CHANGE_USER, (uchar*) buff, (ulong) (end-buff), 1);
183
rc= (*drizzle->methods->read_change_user_result)(drizzle);
428
rc= (*mysql->methods->read_change_user_result)(mysql, buff, passwd);
187
432
/* Free old connect information */
191
free(drizzle->passwd);
433
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
434
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
435
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
195
437
/* alloc new connect information */
196
drizzle->user= strdup(user);
197
drizzle->passwd= strdup(passwd);
198
drizzle->db= db ? strdup(db) : 0;
438
mysql->user= my_strdup(user,MYF(MY_WME));
439
mysql->passwd=my_strdup(passwd,MYF(MY_WME));
440
mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
444
mysql->charset= saved_cs;
204
450
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
206
452
char* getlogin(void);
455
void read_user_name(char *name)
457
DBUG_ENTER("read_user_name");
459
(void) strmov(name,"root"); /* allow use of surun */
465
if ((str=getlogin()) == NULL)
467
if ((skr=getpwuid(geteuid())) != NULL)
469
else if (!(str=getenv("USER")) && !(str=getenv("LOGNAME")) &&
470
!(str=getenv("LOGIN")))
473
(void) strmake(name,str,USERNAME_LENGTH);
475
(void) cuserid(name);
477
strmov(name,"UNKNOWN_USER");
483
my_bool handle_local_infile(MYSQL *mysql, const char *net_filename)
486
uint packet_length=MY_ALIGN(mysql->net.max_packet-16,IO_SIZE);
487
NET *net= &mysql->net;
489
void *li_ptr; /* pass state to local_infile functions */
490
char *buf; /* buffer to be filled by local_infile_read */
491
struct st_mysql_options *options= &mysql->options;
492
DBUG_ENTER("handle_local_infile");
494
/* check that we've got valid callback functions */
495
if (!(options->local_infile_init &&
496
options->local_infile_read &&
497
options->local_infile_end &&
498
options->local_infile_error))
500
/* if any of the functions is invalid, set the default */
501
mysql_set_local_infile_default(mysql);
504
/* copy filename into local memory and allocate read buffer */
505
if (!(buf=my_malloc(packet_length, MYF(0))))
507
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
511
/* initialize local infile (open file, usually) */
512
if ((*options->local_infile_init)(&li_ptr, net_filename,
513
options->local_infile_userdata))
515
VOID(my_net_write(net,(const uchar*) "",0)); /* Server needs one packet */
517
strmov(net->sqlstate, unknown_sqlstate);
519
(*options->local_infile_error)(li_ptr,
521
sizeof(net->last_error)-1);
525
/* read blocks of data from local infile callback */
527
(*options->local_infile_read)(li_ptr, buf,
530
if (my_net_write(net, (uchar*) buf, readcount))
533
("Lost connection to MySQL server during LOAD DATA of local file"));
534
set_mysql_error(mysql, CR_SERVER_LOST, unknown_sqlstate);
539
/* Send empty packet to mark end of file */
540
if (my_net_write(net, (const uchar*) "", 0) || net_flush(net))
542
set_mysql_error(mysql, CR_SERVER_LOST, unknown_sqlstate);
549
(*options->local_infile_error)(li_ptr,
551
sizeof(net->last_error)-1);
558
/* free up memory allocated with _init, usually */
559
(*options->local_infile_end)(li_ptr);
560
my_free(buf, MYF(0));
565
/****************************************************************************
566
Default handlers for LOAD LOCAL INFILE
567
****************************************************************************/
569
typedef struct st_default_local_infile
573
const char *filename;
574
char error_msg[LOCAL_INFILE_ERROR_LEN];
575
} default_local_infile_data;
579
Open file for LOAD LOCAL INFILE
582
default_local_infile_init()
583
ptr Store pointer to internal data here
584
filename File name to open. This may be in unix format !
588
Even if this function returns an error, the load data interface
589
guarantees that default_local_infile_end() is called.
596
static int default_local_infile_init(void **ptr, const char *filename,
597
void *userdata __attribute__ ((unused)))
599
default_local_infile_data *data;
600
char tmp_name[FN_REFLEN];
602
if (!(*ptr= data= ((default_local_infile_data *)
603
my_malloc(sizeof(default_local_infile_data), MYF(0)))))
604
return 1; /* out of memory */
606
data->error_msg[0]= 0;
608
data->filename= filename;
610
fn_format(tmp_name, filename, "", "", MY_UNPACK_FILENAME);
611
if ((data->fd = my_open(tmp_name, O_RDONLY, MYF(0))) < 0)
613
data->error_num= my_errno;
614
my_snprintf(data->error_msg, sizeof(data->error_msg)-1,
615
EE(EE_FILENOTFOUND), tmp_name, data->error_num);
623
Read data for LOAD LOCAL INFILE
626
default_local_infile_read()
627
ptr Points to handle allocated by _init
629
buf_len Ammount of data to read
632
> 0 number of bytes read
637
static int default_local_infile_read(void *ptr, char *buf, uint buf_len)
640
default_local_infile_data*data = (default_local_infile_data *) ptr;
642
if ((count= (int) my_read(data->fd, (uchar *) buf, buf_len, MYF(0))) < 0)
644
data->error_num= EE_READ; /* the errmsg for not entire file read */
645
my_snprintf(data->error_msg, sizeof(data->error_msg)-1,
647
data->filename, my_errno);
654
Read data for LOAD LOCAL INFILE
657
default_local_infile_end()
658
ptr Points to handle allocated by _init
659
May be NULL if _init failed!
664
static void default_local_infile_end(void *ptr)
666
default_local_infile_data *data= (default_local_infile_data *) ptr;
667
if (data) /* If not error on open */
670
my_close(data->fd, MYF(MY_WME));
671
my_free(ptr, MYF(MY_WME));
677
Return error from LOAD LOCAL INFILE
680
default_local_infile_end()
681
ptr Points to handle allocated by _init
682
May be NULL if _init failed!
683
error_msg Store error text here
684
error_msg_len Max lenght of error_msg
691
default_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
693
default_local_infile_data *data = (default_local_infile_data *) ptr;
694
if (data) /* If not error on open */
696
strmake(error_msg, data->error_msg, error_msg_len);
697
return data->error_num;
699
/* This can only happen if we got error on malloc of handle */
700
strmov(error_msg, ER(CR_OUT_OF_MEMORY));
701
return CR_OUT_OF_MEMORY;
706
mysql_set_local_infile_handler(MYSQL *mysql,
707
int (*local_infile_init)(void **, const char *,
709
int (*local_infile_read)(void *, char *, uint),
710
void (*local_infile_end)(void *),
711
int (*local_infile_error)(void *, char *, uint),
714
mysql->options.local_infile_init= local_infile_init;
715
mysql->options.local_infile_read= local_infile_read;
716
mysql->options.local_infile_end= local_infile_end;
717
mysql->options.local_infile_error= local_infile_error;
718
mysql->options.local_infile_userdata = userdata;
722
void mysql_set_local_infile_default(MYSQL *mysql)
724
mysql->options.local_infile_init= default_local_infile_init;
725
mysql->options.local_infile_read= default_local_infile_read;
726
mysql->options.local_infile_end= default_local_infile_end;
727
mysql->options.local_infile_error= default_local_infile_error;
209
731
/**************************************************************************
210
732
Do a query. If query returned rows, free old rows.
211
Read data by drizzle_store_result or by repeat call of drizzle_fetch_row
733
Read data by mysql_store_result or by repeat call of mysql_fetch_row
212
734
**************************************************************************/
215
drizzle_query(DRIZZLE *drizzle, const char *query)
737
mysql_query(MYSQL *mysql, const char *query)
217
return drizzle_real_query(drizzle,query, (uint32_t) strlen(query));
739
return mysql_real_query(mysql,query, (uint) strlen(query));
249
772
/*************************************************************************
250
put the row or field cursor one a position one got from DRIZZLE_ROW_tell()
251
This doesn't restore any data. The next drizzle_fetch_row or
252
drizzle_fetch_field will return the next row or field after the last used
773
put the row or field cursor one a position one got from mysql_row_tell()
774
This doesn't restore any data. The next mysql_fetch_row or
775
mysql_fetch_field will return the next row or field after the last used
253
776
*************************************************************************/
256
drizzle_row_seek(DRIZZLE_RES *result, DRIZZLE_ROW_OFFSET row)
778
MYSQL_ROW_OFFSET STDCALL
779
mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET row)
258
DRIZZLE_ROW_OFFSET return_value=result->data_cursor;
781
MYSQL_ROW_OFFSET return_value=result->data_cursor;
259
782
result->current_row= 0;
260
783
result->data_cursor= row;
261
784
return return_value;
266
drizzle_field_seek(DRIZZLE_RES *result, DRIZZLE_FIELD_OFFSET field_offset)
788
MYSQL_FIELD_OFFSET STDCALL
789
mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET field_offset)
268
DRIZZLE_FIELD_OFFSET return_value=result->current_field;
791
MYSQL_FIELD_OFFSET return_value=result->current_field;
269
792
result->current_field=field_offset;
270
793
return return_value;
274
797
/*****************************************************************************
799
*****************************************************************************/
802
mysql_list_dbs(MYSQL *mysql, const char *wild)
805
DBUG_ENTER("mysql_list_dbs");
807
append_wild(strmov(buff,"show databases"),buff+sizeof(buff),wild);
808
if (mysql_query(mysql,buff))
810
DBUG_RETURN (mysql_store_result(mysql));
814
/*****************************************************************************
275
815
List all tables in a database
276
816
If wild is given then only the tables matching wild is returned
277
817
*****************************************************************************/
280
drizzle_list_tables(DRIZZLE *drizzle, const char *wild)
820
mysql_list_tables(MYSQL *mysql, const char *wild)
283
char *ptr= strcpy(buff, "show tables");
284
ptr+= 11; /* strlen("show tables"); */
823
DBUG_ENTER("mysql_list_tables");
286
append_wild(ptr,buff+sizeof(buff),wild);
287
if (drizzle_query(drizzle,buff))
289
return (drizzle_store_result(drizzle));
825
append_wild(strmov(buff,"show tables"),buff+sizeof(buff),wild);
826
if (mysql_query(mysql,buff))
828
DBUG_RETURN (mysql_store_result(mysql));
293
DRIZZLE_FIELD *cli_list_fields(DRIZZLE *drizzle)
832
MYSQL_FIELD *cli_list_fields(MYSQL *mysql)
296
if (!(query= cli_read_rows(drizzle,(DRIZZLE_FIELD*) 0, 8)))
835
if (!(query= cli_read_rows(mysql,(MYSQL_FIELD*) 0,
836
protocol_41(mysql) ? 8 : 6)))
299
drizzle->field_count= (uint32_t) query->rows;
300
return unpack_fields(query, drizzle->field_count, 1);
839
mysql->field_count= (uint) query->rows;
840
return unpack_fields(query,&mysql->field_alloc,
841
mysql->field_count, 1, mysql->server_capabilities);
308
849
show fields in 'table' like "wild"
309
850
**************************************************************************/
312
drizzle_list_fields(DRIZZLE *drizzle, const char *table, const char *wild)
853
mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
315
DRIZZLE_FIELD *fields;
316
char buff[257], *end;
318
end= strncpy(buff, table, 128) + 128;
319
end= strncpy(end+1, wild ? wild : "", 128) + 128;
321
free_old_query(drizzle);
322
if (simple_command(drizzle, COM_FIELD_LIST, (unsigned char*) buff,
323
(uint32_t) (end-buff), 1) ||
324
!(fields= (*drizzle->methods->list_fields)(drizzle)))
327
if (!(result = (DRIZZLE_RES *) malloc(sizeof(DRIZZLE_RES))))
330
memset(result, 0, sizeof(DRIZZLE_RES));
332
result->methods= drizzle->methods;
334
result->field_count = drizzle->field_count;
858
DBUG_ENTER("mysql_list_fields");
859
DBUG_PRINT("enter",("table: '%s' wild: '%s'",table,wild ? wild : ""));
861
end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128);
862
free_old_query(mysql);
863
if (simple_command(mysql, COM_FIELD_LIST, (uchar*) buff,
864
(ulong) (end-buff), 1) ||
865
!(fields= (*mysql->methods->list_fields)(mysql)))
868
if (!(result = (MYSQL_RES *) my_malloc(sizeof(MYSQL_RES),
869
MYF(MY_WME | MY_ZEROFILL))))
872
result->methods= mysql->methods;
873
result->field_alloc=mysql->field_alloc;
875
result->field_count = mysql->field_count;
335
876
result->fields= fields;
340
881
/* List all running processes (threads) in server */
343
drizzle_list_processes(DRIZZLE *drizzle)
345
DRIZZLE_DATA *fields;
346
uint32_t field_count;
349
if (simple_command(drizzle,COM_PROCESS_INFO,0,0,0))
351
free_old_query(drizzle);
352
pos=(unsigned char*) drizzle->net.read_pos;
353
field_count=(uint32_t) net_field_length(&pos);
354
if (!(fields = (*drizzle->methods->read_rows)(drizzle,(DRIZZLE_FIELD*) 0, 7)))
356
if (!(drizzle->fields=unpack_fields(fields, field_count, 0)))
358
drizzle->status=DRIZZLE_STATUS_GET_RESULT;
359
drizzle->field_count=field_count;
360
return(drizzle_store_result(drizzle));
365
drizzle_shutdown(DRIZZLE *drizzle)
367
return(simple_command(drizzle, COM_SHUTDOWN, 0, 0, 0));
372
drizzle_refresh(DRIZZLE *drizzle, uint32_t options)
374
unsigned char bits[1];
375
bits[0]= (unsigned char) options;
376
return(simple_command(drizzle, COM_REFRESH, bits, 1, 0));
381
drizzle_kill(DRIZZLE *drizzle, uint32_t pid)
383
unsigned char buff[4];
884
mysql_list_processes(MYSQL *mysql)
889
DBUG_ENTER("mysql_list_processes");
891
if (simple_command(mysql,COM_PROCESS_INFO,0,0,0))
893
free_old_query(mysql);
894
pos=(uchar*) mysql->net.read_pos;
895
field_count=(uint) net_field_length(&pos);
896
if (!(fields = (*mysql->methods->read_rows)(mysql,(MYSQL_FIELD*) 0,
897
protocol_41(mysql) ? 7 : 5)))
899
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0,
900
mysql->server_capabilities)))
902
mysql->status=MYSQL_STATUS_GET_RESULT;
903
mysql->field_count=field_count;
904
DBUG_RETURN(mysql_store_result(mysql));
908
#ifdef USE_OLD_FUNCTIONS
910
mysql_create_db(MYSQL *mysql, const char *db)
912
DBUG_ENTER("mysql_createdb");
913
DBUG_PRINT("enter",("db: %s",db));
914
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (ulong) strlen(db),0));
919
mysql_drop_db(MYSQL *mysql, const char *db)
921
DBUG_ENTER("mysql_drop_db");
922
DBUG_PRINT("enter",("db: %s",db));
923
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(ulong) strlen(db),0));
929
mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)
932
DBUG_ENTER("mysql_shutdown");
933
level[0]= (uchar) shutdown_level;
934
DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN, level, 1, 0));
939
mysql_refresh(MYSQL *mysql,uint options)
942
DBUG_ENTER("mysql_refresh");
943
bits[0]= (uchar) options;
944
DBUG_RETURN(simple_command(mysql, COM_REFRESH, bits, 1, 0));
949
mysql_kill(MYSQL *mysql,ulong pid)
952
DBUG_ENTER("mysql_kill");
384
953
int4store(buff,pid);
385
return(simple_command(drizzle,COM_PROCESS_KILL,buff,sizeof(buff),0));
390
drizzle_set_server_option(DRIZZLE *drizzle, enum enum_drizzle_set_option option)
392
unsigned char buff[2];
393
int2store(buff, (uint32_t) option);
394
return(simple_command(drizzle, COM_SET_OPTION, buff, sizeof(buff), 0));
398
const char *cli_read_statistics(DRIZZLE *drizzle)
400
drizzle->net.read_pos[drizzle->packet_length]=0; /* End of stat string */
401
if (!drizzle->net.read_pos[0])
954
DBUG_RETURN(simple_command(mysql,COM_PROCESS_KILL,buff,sizeof(buff),0));
959
mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
962
DBUG_ENTER("mysql_set_server_option");
963
int2store(buff, (uint) option);
964
DBUG_RETURN(simple_command(mysql, COM_SET_OPTION, buff, sizeof(buff), 0));
969
mysql_dump_debug_info(MYSQL *mysql)
971
DBUG_ENTER("mysql_dump_debug_info");
972
DBUG_RETURN(simple_command(mysql,COM_DEBUG,0,0,0));
976
const char *cli_read_statistics(MYSQL *mysql)
978
mysql->net.read_pos[mysql->packet_length]=0; /* End of stat string */
979
if (!mysql->net.read_pos[0])
403
drizzle_set_error(drizzle, CR_WRONG_HOST_INFO, sqlstate_get_unknown());
404
return drizzle->net.last_error;
981
set_mysql_error(mysql, CR_WRONG_HOST_INFO, unknown_sqlstate);
982
return mysql->net.last_error;
406
return (char*) drizzle->net.read_pos;
411
drizzle_ping(DRIZZLE *drizzle)
984
return (char*) mysql->net.read_pos;
989
mysql_stat(MYSQL *mysql)
991
DBUG_ENTER("mysql_stat");
992
if (simple_command(mysql,COM_STATISTICS,0,0,0))
993
DBUG_RETURN(mysql->net.last_error);
994
DBUG_RETURN((*mysql->methods->read_statistics)(mysql));
999
mysql_ping(MYSQL *mysql)
414
res= simple_command(drizzle,COM_PING,0,0,0);
415
if (res == CR_SERVER_LOST && drizzle->reconnect)
416
res= simple_command(drizzle,COM_PING,0,0,0);
422
drizzle_get_server_info(const DRIZZLE *drizzle)
424
return((char*) drizzle->server_version);
429
drizzle_get_host_info(const DRIZZLE *drizzle)
431
return(drizzle->host_info);
436
drizzle_get_proto_info(const DRIZZLE *drizzle)
438
return (drizzle->protocol_version);
442
drizzle_get_client_info(void)
444
return (char*) DRIZZLE_SERVER_VERSION;
447
uint32_t drizzle_get_client_version(void)
449
return DRIZZLE_VERSION_ID;
452
bool drizzle_eof(const DRIZZLE_RES *res)
1002
DBUG_ENTER("mysql_ping");
1003
res= simple_command(mysql,COM_PING,0,0,0);
1004
if (res == CR_SERVER_LOST && mysql->reconnect)
1005
res= simple_command(mysql,COM_PING,0,0,0);
1010
const char * STDCALL
1011
mysql_get_server_info(MYSQL *mysql)
1013
return((char*) mysql->server_version);
1017
const char * STDCALL
1018
mysql_get_host_info(MYSQL *mysql)
1020
return(mysql->host_info);
1025
mysql_get_proto_info(MYSQL *mysql)
1027
return (mysql->protocol_version);
1030
const char * STDCALL
1031
mysql_get_client_info(void)
1033
return (char*) MYSQL_SERVER_VERSION;
1036
ulong STDCALL mysql_get_client_version(void)
1038
return MYSQL_VERSION_ID;
1041
my_bool STDCALL mysql_eof(MYSQL_RES *res)
454
1043
return res->eof;
457
const DRIZZLE_FIELD * drizzle_fetch_field_direct(const DRIZZLE_RES *res, unsigned int fieldnr)
1046
MYSQL_FIELD * STDCALL mysql_fetch_field_direct(MYSQL_RES *res,uint fieldnr)
459
1048
return &(res)->fields[fieldnr];
462
const DRIZZLE_FIELD * drizzle_fetch_fields(const DRIZZLE_RES *res)
1051
MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res)
1053
return (res)->fields;
467
DRIZZLE_ROW_OFFSET drizzle_row_tell(const DRIZZLE_RES *res)
1056
MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res)
469
1058
return res->data_cursor;
472
DRIZZLE_FIELD_OFFSET drizzle_field_tell(const DRIZZLE_RES *res)
474
return res->current_field;
479
unsigned int drizzle_field_count(const DRIZZLE *drizzle)
481
return drizzle->field_count;
484
uint64_t drizzle_affected_rows(const DRIZZLE *drizzle)
486
return drizzle->affected_rows;
489
uint64_t drizzle_insert_id(const DRIZZLE *drizzle)
491
return drizzle->insert_id;
494
const char * drizzle_sqlstate(const DRIZZLE *drizzle)
496
return drizzle ? drizzle->net.sqlstate : sqlstate_get_cant_connect();
499
uint32_t drizzle_warning_count(const DRIZZLE *drizzle)
501
return drizzle->warning_count;
504
const char * drizzle_info(const DRIZZLE *drizzle)
506
return drizzle->info;
509
uint32_t drizzle_thread_id(const DRIZZLE *drizzle)
511
return drizzle->thread_id;
1061
MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res)
1063
return (res)->current_field;
1068
unsigned int STDCALL mysql_field_count(MYSQL *mysql)
1070
return mysql->field_count;
1073
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql)
1075
return mysql->affected_rows;
1078
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
1080
return mysql->insert_id;
1083
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
1085
return mysql ? mysql->net.sqlstate : cant_connect_sqlstate;
1088
uint STDCALL mysql_warning_count(MYSQL *mysql)
1090
return mysql->warning_count;
1093
const char *STDCALL mysql_info(MYSQL *mysql)
1098
ulong STDCALL mysql_thread_id(MYSQL *mysql)
1100
return (mysql)->thread_id;
1103
const char * STDCALL mysql_character_set_name(MYSQL *mysql)
1105
return mysql->charset->csname;
1108
void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *csinfo)
1110
csinfo->number = mysql->charset->number;
1111
csinfo->state = mysql->charset->state;
1112
csinfo->csname = mysql->charset->csname;
1113
csinfo->name = mysql->charset->name;
1114
csinfo->comment = mysql->charset->comment;
1115
csinfo->mbminlen = mysql->charset->mbminlen;
1116
csinfo->mbmaxlen = mysql->charset->mbmaxlen;
1118
if (mysql->options.charset_dir)
1119
csinfo->dir = mysql->options.charset_dir;
1121
csinfo->dir = charsets_dir;
1124
uint STDCALL mysql_thread_safe(void)
1130
my_bool STDCALL mysql_embedded(void)
1132
#ifdef EMBEDDED_LIBRARY
514
1139
/****************************************************************************
568
1194
Returns the length of the to string
572
drizzle_escape_string(char *to,const char *from, uint32_t length)
574
const char *to_start= to;
575
const char *end, *to_end=to_start + 2*length;
576
bool overflow= false;
577
for (end= from + length; from < end; from++)
1198
mysql_escape_string(char *to,const char *from,ulong length)
1200
return escape_string_for_mysql(default_charset_info, to, 0, from, length);
1204
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
1207
if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
1208
return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
1209
return escape_string_for_mysql(mysql->charset, to, 0, from, length);
1213
myodbc_remove_escape(MYSQL *mysql,char *name)
1217
my_bool use_mb_flag=use_mb(mysql->charset);
1220
for (end=name; *end ; end++) ;
1223
for (to=name ; *name ; name++)
581
if (!U8_IS_SINGLE(*from))
1227
if (use_mb_flag && (l = my_ismbchar( mysql->charset, name , end ) ) )
583
tmp_length= U8_LENGTH(*from);
584
if (to + tmp_length > to_end)
595
case 0: /* Must be escaped for 'mysql' */
598
case '\n': /* Must be escaped for logs */
610
case '"': /* Better safe than sorry */
613
case '\032': /* This gives problems on Win32 */
1235
if (*name == '\\' && name[1])
638
return overflow ? (size_t) -1 : (size_t) (to - to_start);
641
int cli_unbuffered_fetch(DRIZZLE *drizzle, char **row)
1242
int cli_unbuffered_fetch(MYSQL *mysql, char **row)
643
if (packet_error == cli_safe_read(drizzle))
1244
if (packet_error == cli_safe_read(mysql))
646
*row= ((drizzle->net.read_pos[0] == DRIZZLE_PROTOCOL_NO_MORE_DATA) ? NULL :
647
(char*) (drizzle->net.read_pos+1));
1247
*row= ((mysql->net.read_pos[0] == 254) ? NULL :
1248
(char*) (mysql->net.read_pos+1));