87
76
#define MAX_LONG_DATA_LENGTH 8192
88
77
#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG)
91
static DRIZZLE_PARAMETERS drizzle_internal_parameters=
79
static void append_wild(char *to,char *end,const char *wild);
81
static my_bool mysql_client_init= 0;
82
static my_bool org_my_init_done= 0;
86
Initialize the MySQL client library
92
Should be called before doing any other calls to the MySQL
93
client library to initialize thread specific variables etc.
94
It's called by mysql_init() to ensure that things will work for
95
old not threaded applications that doesn't call mysql_server_init()
100
1 could not initialize environment (out of memory or thread keys)
103
int STDCALL mysql_server_init(int argc __attribute__((unused)),
104
char **argv __attribute__((unused)),
105
char **groups __attribute__((unused)))
108
if (!mysql_client_init)
111
org_my_init_done=my_init_done;
112
if (my_init()) /* Will init threads */
117
mysql_port = MYSQL_PORT;
119
struct servent *serv_ptr;
123
if builder specifically requested a default port, use that
124
(even if it coincides with our factory default).
125
only if they didn't do we check /etc/services (and, failing
126
on that, fall back to the factory default of 3306).
127
either default can be overridden by the environment variable
128
MYSQL_TCP_PORT, which in turn can be overridden with command
132
#if MYSQL_PORT_DEFAULT == 0
133
if ((serv_ptr = getservbyname("mysql", "tcp")))
134
mysql_port = (uint) ntohs((ushort) serv_ptr->s_port);
136
if ((env = getenv("MYSQL_TCP_PORT")))
137
mysql_port =(uint) atoi(env);
140
if (!mysql_unix_port)
143
mysql_unix_port = (char*) MYSQL_UNIX_ADDR;
144
if ((env = getenv("MYSQL_UNIX_PORT")))
145
mysql_unix_port = env;
149
(void) signal(SIGPIPE, SIG_IGN);
153
result= (int)my_thread_init(); /* Init if new thread */
159
Free all memory and resources used by the client library
162
When calling this there should not be any other threads using
165
To make things simpler when used with windows dll's (which calls this
166
function automaticly), it's safe to call this function multiple times.
170
void STDCALL mysql_server_end()
172
if (!mysql_client_init)
175
finish_client_errs();
178
/* If library called my_init(), free memory allocated by it */
179
if (!org_my_init_done)
181
my_end(MY_DONT_FREE_DBUG);
182
/* Remove TRACING, if enabled by mysql_debug() */
191
mysql_client_init= org_my_init_done= 0;
192
#ifdef EMBEDDED_SERVER
195
fclose(stderror_file);
201
static MYSQL_PARAMETERS mysql_internal_parameters=
92
202
{&max_allowed_packet, &net_buffer_length, 0};
94
const DRIZZLE_PARAMETERS * drizzle_get_parameters(void)
96
return &drizzle_internal_parameters;
99
unsigned int drizzle_get_default_port(void)
104
void drizzle_set_default_port(unsigned int port)
204
MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void)
206
return &mysql_internal_parameters;
209
my_bool STDCALL mysql_thread_init()
211
return my_thread_init();
214
void STDCALL mysql_thread_end()
110
221
Expand wildcard to a sql string
114
225
append_wild(char *to, char *end, const char *wild)
116
end-=5; /* Some extra */
227
end-=5; /* Some extra */
117
228
if (wild && wild[0])
119
to= strcpy(to," like '");
120
to+= 7; /* strlen(" like '"); */
230
to=strmov(to," like '");
122
231
while (*wild && to < end)
124
233
if (*wild == '\\' || *wild == '\'')
128
if (*wild) /* Too small buffer */
129
*to++='%'; /* Nicer this way */
237
if (*wild) /* Too small buffer */
238
*to++='%'; /* Nicer this way */
245
/**************************************************************************
246
Init debugging if MYSQL_DEBUG environment variable is found
247
**************************************************************************/
250
mysql_debug(const char *debug __attribute__((unused)))
258
else if ((env = getenv("MYSQL_DEBUG")))
261
#if !defined(_WINVER) && !defined(WINVER)
262
puts("\n-------------------------------------------------------");
263
puts("MYSQL_DEBUG found. libmysql started with the following:");
265
puts("-------------------------------------------------------\n");
269
buff[sizeof(buff)-1]= 0;
270
strxnmov(buff,sizeof(buff)-1,"libmysql: ", env, NullS);
271
MessageBox((HWND) 0,"Debugging variable MYSQL_DEBUG used",buff,MB_OK);
279
/**************************************************************************
280
Ignore SIGPIPE handler
282
**************************************************************************/
285
my_pipe_sig_handler(int sig __attribute__((unused)))
287
DBUG_PRINT("info",("Hit by signal %d",sig));
288
#ifdef DONT_REMEMBER_SIGNAL
289
(void) signal(SIGPIPE, my_pipe_sig_handler);
294
/**************************************************************************
295
Connect to sql server
296
If host == 0 then use localhost
297
**************************************************************************/
299
#ifdef USE_OLD_FUNCTIONS
301
mysql_connect(MYSQL *mysql,const char *host,
302
const char *user, const char *passwd)
305
mysql=mysql_init(mysql); /* Make it thread safe */
307
DBUG_ENTER("mysql_connect");
308
if (!(res=mysql_real_connect(mysql,host,user,passwd,NullS,0,NullS,0)))
311
my_free((uchar*) mysql,MYF(0));
135
320
/**************************************************************************
136
321
Change user and database
137
322
**************************************************************************/
139
int cli_read_change_user_result(DRIZZLE *drizzle)
324
int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
143
pkt_length= cli_safe_read(drizzle);
328
pkt_length= cli_safe_read(mysql);
145
330
if (pkt_length == packet_error)
165
361
/* Store user into the buffer */
166
end= strncpy(end, user, USERNAME_LENGTH) + USERNAME_LENGTH + 1;
362
end= strmake(end, user, USERNAME_LENGTH) + 1;
168
364
/* write scrambled password according to server capabilities */
172
368
*end++= SCRAMBLE_LENGTH;
369
scramble(end, mysql->scramble, passwd);
173
370
end+= SCRAMBLE_LENGTH;
177
374
*end++= '\0'; /* empty password */
178
375
/* Add database if needed */
179
end= strncpy(end, db ? db : "", NAME_LEN) + NAME_LEN + 1;
376
end= strmake(end, db ? db : "", NAME_LEN) + 1;
181
378
/* Add character set number. */
182
if (drizzle->server_capabilities & CLIENT_SECURE_CONNECTION)
380
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
184
int2store(end, (uint16_t) 45); // utf8mb4 number from mystrings/ctype-utf8.c
382
int2store(end, (ushort) mysql->charset->number);
188
386
/* Write authentication package */
189
(void)simple_command(drizzle,COM_CHANGE_USER, (unsigned char*) buff, (uint32_t) (end-buff), 1);
387
(void)simple_command(mysql,COM_CHANGE_USER, (uchar*) buff, (ulong) (end-buff), 1);
191
rc= (*drizzle->methods->read_change_user_result)(drizzle);
389
rc= (*mysql->methods->read_change_user_result)(mysql, buff, passwd);
195
393
/* Free old connect information */
199
free(drizzle->passwd);
394
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
395
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
396
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
203
398
/* alloc new connect information */
204
drizzle->user= strdup(user);
205
drizzle->passwd= strdup(passwd);
206
drizzle->db= db ? strdup(db) : 0;
399
mysql->user= my_strdup(user,MYF(MY_WME));
400
mysql->passwd=my_strdup(passwd,MYF(MY_WME));
401
mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
405
mysql->charset= saved_cs;
212
411
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
214
413
char* getlogin(void);
416
void read_user_name(char *name)
418
DBUG_ENTER("read_user_name");
420
(void) strmov(name,"root"); /* allow use of surun */
426
if ((str=getlogin()) == NULL)
428
if ((skr=getpwuid(geteuid())) != NULL)
430
else if (!(str=getenv("USER")) && !(str=getenv("LOGNAME")) &&
431
!(str=getenv("LOGIN")))
434
(void) strmake(name,str,USERNAME_LENGTH);
436
(void) cuserid(name);
438
strmov(name,"UNKNOWN_USER");
444
my_bool handle_local_infile(MYSQL *mysql, const char *net_filename)
447
uint packet_length=MY_ALIGN(mysql->net.max_packet-16,IO_SIZE);
448
NET *net= &mysql->net;
450
void *li_ptr; /* pass state to local_infile functions */
451
char *buf; /* buffer to be filled by local_infile_read */
452
struct st_mysql_options *options= &mysql->options;
453
DBUG_ENTER("handle_local_infile");
455
/* check that we've got valid callback functions */
456
if (!(options->local_infile_init &&
457
options->local_infile_read &&
458
options->local_infile_end &&
459
options->local_infile_error))
461
/* if any of the functions is invalid, set the default */
462
mysql_set_local_infile_default(mysql);
465
/* copy filename into local memory and allocate read buffer */
466
if (!(buf=my_malloc(packet_length, MYF(0))))
468
set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
472
/* initialize local infile (open file, usually) */
473
if ((*options->local_infile_init)(&li_ptr, net_filename,
474
options->local_infile_userdata))
476
VOID(my_net_write(net,(const uchar*) "",0)); /* Server needs one packet */
478
strmov(net->sqlstate, unknown_sqlstate);
480
(*options->local_infile_error)(li_ptr,
482
sizeof(net->last_error)-1);
486
/* read blocks of data from local infile callback */
488
(*options->local_infile_read)(li_ptr, buf,
491
if (my_net_write(net, (uchar*) buf, readcount))
494
("Lost connection to MySQL server during LOAD DATA of local file"));
495
set_mysql_error(mysql, CR_SERVER_LOST, unknown_sqlstate);
500
/* Send empty packet to mark end of file */
501
if (my_net_write(net, (const uchar*) "", 0) || net_flush(net))
503
set_mysql_error(mysql, CR_SERVER_LOST, unknown_sqlstate);
510
(*options->local_infile_error)(li_ptr,
512
sizeof(net->last_error)-1);
519
/* free up memory allocated with _init, usually */
520
(*options->local_infile_end)(li_ptr);
521
my_free(buf, MYF(0));
526
/****************************************************************************
527
Default handlers for LOAD LOCAL INFILE
528
****************************************************************************/
530
typedef struct st_default_local_infile
534
const char *filename;
535
char error_msg[LOCAL_INFILE_ERROR_LEN];
536
} default_local_infile_data;
540
Open file for LOAD LOCAL INFILE
543
default_local_infile_init()
544
ptr Store pointer to internal data here
545
filename File name to open. This may be in unix format !
549
Even if this function returns an error, the load data interface
550
guarantees that default_local_infile_end() is called.
557
static int default_local_infile_init(void **ptr, const char *filename,
558
void *userdata __attribute__ ((unused)))
560
default_local_infile_data *data;
561
char tmp_name[FN_REFLEN];
563
if (!(*ptr= data= ((default_local_infile_data *)
564
my_malloc(sizeof(default_local_infile_data), MYF(0)))))
565
return 1; /* out of memory */
567
data->error_msg[0]= 0;
569
data->filename= filename;
571
fn_format(tmp_name, filename, "", "", MY_UNPACK_FILENAME);
572
if ((data->fd = my_open(tmp_name, O_RDONLY, MYF(0))) < 0)
574
data->error_num= my_errno;
575
snprintf(data->error_msg, sizeof(data->error_msg)-1,
576
EE(EE_FILENOTFOUND), tmp_name, data->error_num);
584
Read data for LOAD LOCAL INFILE
587
default_local_infile_read()
588
ptr Points to handle allocated by _init
590
buf_len Ammount of data to read
593
> 0 number of bytes read
598
static int default_local_infile_read(void *ptr, char *buf, uint buf_len)
601
default_local_infile_data*data = (default_local_infile_data *) ptr;
603
if ((count= (int) my_read(data->fd, (uchar *) buf, buf_len, MYF(0))) < 0)
605
data->error_num= EE_READ; /* the errmsg for not entire file read */
606
snprintf(data->error_msg, sizeof(data->error_msg)-1,
608
data->filename, my_errno);
615
Read data for LOAD LOCAL INFILE
618
default_local_infile_end()
619
ptr Points to handle allocated by _init
620
May be NULL if _init failed!
625
static void default_local_infile_end(void *ptr)
627
default_local_infile_data *data= (default_local_infile_data *) ptr;
628
if (data) /* If not error on open */
631
my_close(data->fd, MYF(MY_WME));
632
my_free(ptr, MYF(MY_WME));
638
Return error from LOAD LOCAL INFILE
641
default_local_infile_end()
642
ptr Points to handle allocated by _init
643
May be NULL if _init failed!
644
error_msg Store error text here
645
error_msg_len Max lenght of error_msg
652
default_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
654
default_local_infile_data *data = (default_local_infile_data *) ptr;
655
if (data) /* If not error on open */
657
strmake(error_msg, data->error_msg, error_msg_len);
658
return data->error_num;
660
/* This can only happen if we got error on malloc of handle */
661
strmov(error_msg, ER(CR_OUT_OF_MEMORY));
662
return CR_OUT_OF_MEMORY;
667
mysql_set_local_infile_handler(MYSQL *mysql,
668
int (*local_infile_init)(void **, const char *,
670
int (*local_infile_read)(void *, char *, uint),
671
void (*local_infile_end)(void *),
672
int (*local_infile_error)(void *, char *, uint),
675
mysql->options.local_infile_init= local_infile_init;
676
mysql->options.local_infile_read= local_infile_read;
677
mysql->options.local_infile_end= local_infile_end;
678
mysql->options.local_infile_error= local_infile_error;
679
mysql->options.local_infile_userdata = userdata;
683
void mysql_set_local_infile_default(MYSQL *mysql)
685
mysql->options.local_infile_init= default_local_infile_init;
686
mysql->options.local_infile_read= default_local_infile_read;
687
mysql->options.local_infile_end= default_local_infile_end;
688
mysql->options.local_infile_error= default_local_infile_error;
217
692
/**************************************************************************
218
693
Do a query. If query returned rows, free old rows.
219
Read data by drizzle_store_result or by repeat call of drizzle_fetch_row
694
Read data by mysql_store_result or by repeat call of mysql_fetch_row
220
695
**************************************************************************/
223
drizzle_query(DRIZZLE *drizzle, const char *query)
698
mysql_query(MYSQL *mysql, const char *query)
225
return drizzle_real_query(drizzle,query, (uint32_t) strlen(query));
700
return mysql_real_query(mysql,query, (uint) strlen(query));
257
733
/*************************************************************************
258
put the row or field cursor one a position one got from DRIZZLE_ROW_tell()
259
This doesn't restore any data. The next drizzle_fetch_row or
260
drizzle_fetch_field will return the next row or field after the last used
734
put the row or field cursor one a position one got from mysql_row_tell()
735
This doesn't restore any data. The next mysql_fetch_row or
736
mysql_fetch_field will return the next row or field after the last used
261
737
*************************************************************************/
264
drizzle_row_seek(DRIZZLE_RES *result, DRIZZLE_ROW_OFFSET row)
739
MYSQL_ROW_OFFSET STDCALL
740
mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET row)
266
DRIZZLE_ROW_OFFSET return_value=result->data_cursor;
742
MYSQL_ROW_OFFSET return_value=result->data_cursor;
267
743
result->current_row= 0;
268
744
result->data_cursor= row;
269
745
return return_value;
274
drizzle_field_seek(DRIZZLE_RES *result, DRIZZLE_FIELD_OFFSET field_offset)
749
MYSQL_FIELD_OFFSET STDCALL
750
mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET field_offset)
276
DRIZZLE_FIELD_OFFSET return_value=result->current_field;
752
MYSQL_FIELD_OFFSET return_value=result->current_field;
277
753
result->current_field=field_offset;
278
754
return return_value;
282
758
/*****************************************************************************
760
*****************************************************************************/
763
mysql_list_dbs(MYSQL *mysql, const char *wild)
766
DBUG_ENTER("mysql_list_dbs");
768
append_wild(strmov(buff,"show databases"),buff+sizeof(buff),wild);
769
if (mysql_query(mysql,buff))
771
DBUG_RETURN (mysql_store_result(mysql));
775
/*****************************************************************************
283
776
List all tables in a database
284
777
If wild is given then only the tables matching wild is returned
285
778
*****************************************************************************/
288
drizzle_list_tables(DRIZZLE *drizzle, const char *wild)
781
mysql_list_tables(MYSQL *mysql, const char *wild)
291
char *ptr= strcpy(buff, "show tables");
292
ptr+= 11; /* strlen("show tables"); */
784
DBUG_ENTER("mysql_list_tables");
294
append_wild(ptr,buff+sizeof(buff),wild);
295
if (drizzle_query(drizzle,buff))
297
return (drizzle_store_result(drizzle));
786
append_wild(strmov(buff,"show tables"),buff+sizeof(buff),wild);
787
if (mysql_query(mysql,buff))
789
DBUG_RETURN (mysql_store_result(mysql));
301
DRIZZLE_FIELD *cli_list_fields(DRIZZLE *drizzle)
793
MYSQL_FIELD *cli_list_fields(MYSQL *mysql)
304
if (!(query= cli_read_rows(drizzle,(DRIZZLE_FIELD*) 0, 8)))
796
if (!(query= cli_read_rows(mysql,(MYSQL_FIELD*) 0,
797
protocol_41(mysql) ? 8 : 6)))
307
drizzle->field_count= (uint32_t) query->rows;
308
return unpack_fields(query, drizzle->field_count, 1);
800
mysql->field_count= (uint) query->rows;
801
return unpack_fields(query,&mysql->field_alloc,
802
mysql->field_count, 1, mysql->server_capabilities);
316
810
show fields in 'table' like "wild"
317
811
**************************************************************************/
320
drizzle_list_fields(DRIZZLE *drizzle, const char *table, const char *wild)
814
mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
323
DRIZZLE_FIELD *fields;
324
char buff[257], *end;
326
end= strncpy(buff, table, 128) + 128;
327
end= strncpy(end+1, wild ? wild : "", 128) + 128;
329
free_old_query(drizzle);
330
if (simple_command(drizzle, COM_FIELD_LIST, (unsigned char*) buff,
331
(uint32_t) (end-buff), 1) ||
332
!(fields= (*drizzle->methods->list_fields)(drizzle)))
335
if (!(result = (DRIZZLE_RES *) malloc(sizeof(DRIZZLE_RES))))
338
memset(result, 0, sizeof(DRIZZLE_RES));
340
result->methods= drizzle->methods;
342
result->field_count = drizzle->field_count;
819
DBUG_ENTER("mysql_list_fields");
820
DBUG_PRINT("enter",("table: '%s' wild: '%s'",table,wild ? wild : ""));
822
end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128);
823
free_old_query(mysql);
824
if (simple_command(mysql, COM_FIELD_LIST, (uchar*) buff,
825
(ulong) (end-buff), 1) ||
826
!(fields= (*mysql->methods->list_fields)(mysql)))
829
if (!(result = (MYSQL_RES *) my_malloc(sizeof(MYSQL_RES),
830
MYF(MY_WME | MY_ZEROFILL))))
833
result->methods= mysql->methods;
834
result->field_alloc=mysql->field_alloc;
836
result->field_count = mysql->field_count;
343
837
result->fields= fields;
348
842
/* List all running processes (threads) in server */
351
drizzle_list_processes(DRIZZLE *drizzle)
353
DRIZZLE_DATA *fields;
354
uint32_t field_count;
357
if (simple_command(drizzle,COM_PROCESS_INFO,0,0,0))
359
free_old_query(drizzle);
360
pos=(unsigned char*) drizzle->net.read_pos;
361
field_count=(uint32_t) net_field_length(&pos);
362
if (!(fields = (*drizzle->methods->read_rows)(drizzle,(DRIZZLE_FIELD*) 0, 7)))
364
if (!(drizzle->fields=unpack_fields(fields, field_count, 0)))
366
drizzle->status=DRIZZLE_STATUS_GET_RESULT;
367
drizzle->field_count=field_count;
368
return(drizzle_store_result(drizzle));
373
drizzle_shutdown(DRIZZLE *drizzle)
375
return(simple_command(drizzle, COM_SHUTDOWN, 0, 0, 0));
380
drizzle_refresh(DRIZZLE *drizzle, uint32_t options)
382
unsigned char bits[1];
383
bits[0]= (unsigned char) options;
384
return(simple_command(drizzle, COM_REFRESH, bits, 1, 0));
389
drizzle_kill(DRIZZLE *drizzle, uint32_t pid)
391
unsigned char buff[4];
845
mysql_list_processes(MYSQL *mysql)
850
DBUG_ENTER("mysql_list_processes");
852
if (simple_command(mysql,COM_PROCESS_INFO,0,0,0))
854
free_old_query(mysql);
855
pos=(uchar*) mysql->net.read_pos;
856
field_count=(uint) net_field_length(&pos);
857
if (!(fields = (*mysql->methods->read_rows)(mysql,(MYSQL_FIELD*) 0,
858
protocol_41(mysql) ? 7 : 5)))
860
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0,
861
mysql->server_capabilities)))
863
mysql->status=MYSQL_STATUS_GET_RESULT;
864
mysql->field_count=field_count;
865
DBUG_RETURN(mysql_store_result(mysql));
869
#ifdef USE_OLD_FUNCTIONS
871
mysql_create_db(MYSQL *mysql, const char *db)
873
DBUG_ENTER("mysql_createdb");
874
DBUG_PRINT("enter",("db: %s",db));
875
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (ulong) strlen(db),0));
880
mysql_drop_db(MYSQL *mysql, const char *db)
882
DBUG_ENTER("mysql_drop_db");
883
DBUG_PRINT("enter",("db: %s",db));
884
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(ulong) strlen(db),0));
890
mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)
893
DBUG_ENTER("mysql_shutdown");
894
level[0]= (uchar) shutdown_level;
895
DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN, level, 1, 0));
900
mysql_refresh(MYSQL *mysql,uint options)
903
DBUG_ENTER("mysql_refresh");
904
bits[0]= (uchar) options;
905
DBUG_RETURN(simple_command(mysql, COM_REFRESH, bits, 1, 0));
910
mysql_kill(MYSQL *mysql, uint32_t pid)
913
DBUG_ENTER("mysql_kill");
392
914
int4store(buff,pid);
393
return(simple_command(drizzle,COM_PROCESS_KILL,buff,sizeof(buff),0));
398
drizzle_set_server_option(DRIZZLE *drizzle, enum enum_drizzle_set_option option)
400
unsigned char buff[2];
401
int2store(buff, (uint32_t) option);
402
return(simple_command(drizzle, COM_SET_OPTION, buff, sizeof(buff), 0));
406
const char *cli_read_statistics(DRIZZLE *drizzle)
408
drizzle->net.read_pos[drizzle->packet_length]=0; /* End of stat string */
409
if (!drizzle->net.read_pos[0])
915
DBUG_RETURN(simple_command(mysql,COM_PROCESS_KILL,buff,sizeof(buff),0));
920
mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
923
DBUG_ENTER("mysql_set_server_option");
924
int2store(buff, (uint) option);
925
DBUG_RETURN(simple_command(mysql, COM_SET_OPTION, buff, sizeof(buff), 0));
930
mysql_dump_debug_info(MYSQL *mysql)
932
DBUG_ENTER("mysql_dump_debug_info");
933
DBUG_RETURN(simple_command(mysql,COM_DEBUG,0,0,0));
937
const char *cli_read_statistics(MYSQL *mysql)
939
mysql->net.read_pos[mysql->packet_length]=0; /* End of stat string */
940
if (!mysql->net.read_pos[0])
411
drizzle_set_error(drizzle, CR_WRONG_HOST_INFO, sqlstate_get_unknown());
412
return drizzle->net.last_error;
942
set_mysql_error(mysql, CR_WRONG_HOST_INFO, unknown_sqlstate);
943
return mysql->net.last_error;
414
return (char*) drizzle->net.read_pos;
419
drizzle_ping(DRIZZLE *drizzle)
945
return (char*) mysql->net.read_pos;
950
mysql_stat(MYSQL *mysql)
952
DBUG_ENTER("mysql_stat");
953
if (simple_command(mysql,COM_STATISTICS,0,0,0))
954
DBUG_RETURN(mysql->net.last_error);
955
DBUG_RETURN((*mysql->methods->read_statistics)(mysql));
960
mysql_ping(MYSQL *mysql)
422
res= simple_command(drizzle,COM_PING,0,0,0);
423
if (res == CR_SERVER_LOST && drizzle->reconnect)
424
res= simple_command(drizzle,COM_PING,0,0,0);
430
drizzle_get_server_info(const DRIZZLE *drizzle)
432
return((char*) drizzle->server_version);
437
drizzle_get_host_info(const DRIZZLE *drizzle)
439
return(drizzle->host_info);
444
drizzle_get_proto_info(const DRIZZLE *drizzle)
446
return (drizzle->protocol_version);
450
drizzle_get_client_info(void)
452
return (char*) DRIZZLE_SERVER_VERSION;
455
uint32_t drizzle_get_client_version(void)
457
return DRIZZLE_VERSION_ID;
460
bool drizzle_eof(const DRIZZLE_RES *res)
963
DBUG_ENTER("mysql_ping");
964
res= simple_command(mysql,COM_PING,0,0,0);
965
if (res == CR_SERVER_LOST && mysql->reconnect)
966
res= simple_command(mysql,COM_PING,0,0,0);
972
mysql_get_server_info(MYSQL *mysql)
974
return((char*) mysql->server_version);
979
mysql_get_host_info(MYSQL *mysql)
981
return(mysql->host_info);
986
mysql_get_proto_info(MYSQL *mysql)
988
return (mysql->protocol_version);
992
mysql_get_client_info(void)
994
return (char*) MYSQL_SERVER_VERSION;
997
uint32_t STDCALL mysql_get_client_version(void)
999
return MYSQL_VERSION_ID;
1002
my_bool STDCALL mysql_eof(MYSQL_RES *res)
462
1004
return res->eof;
465
const DRIZZLE_FIELD * drizzle_fetch_field_direct(const DRIZZLE_RES *res, unsigned int fieldnr)
1007
MYSQL_FIELD * STDCALL mysql_fetch_field_direct(MYSQL_RES *res,uint fieldnr)
467
1009
return &(res)->fields[fieldnr];
470
const DRIZZLE_FIELD * drizzle_fetch_fields(const DRIZZLE_RES *res)
1012
MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res)
1014
return (res)->fields;
475
DRIZZLE_ROW_OFFSET drizzle_row_tell(const DRIZZLE_RES *res)
1017
MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res)
477
1019
return res->data_cursor;
480
DRIZZLE_FIELD_OFFSET drizzle_field_tell(const DRIZZLE_RES *res)
482
return res->current_field;
487
unsigned int drizzle_field_count(const DRIZZLE *drizzle)
489
return drizzle->field_count;
492
uint64_t drizzle_affected_rows(const DRIZZLE *drizzle)
494
return drizzle->affected_rows;
497
uint64_t drizzle_insert_id(const DRIZZLE *drizzle)
499
return drizzle->insert_id;
502
const char * drizzle_sqlstate(const DRIZZLE *drizzle)
504
return drizzle ? drizzle->net.sqlstate : sqlstate_get_cant_connect();
507
uint32_t drizzle_warning_count(const DRIZZLE *drizzle)
509
return drizzle->warning_count;
512
const char * drizzle_info(const DRIZZLE *drizzle)
514
return drizzle->info;
517
uint32_t drizzle_thread_id(const DRIZZLE *drizzle)
519
return drizzle->thread_id;
1022
MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res)
1024
return (res)->current_field;
1029
unsigned int STDCALL mysql_field_count(MYSQL *mysql)
1031
return mysql->field_count;
1034
uint64_t STDCALL mysql_affected_rows(MYSQL *mysql)
1036
return mysql->affected_rows;
1039
uint64_t STDCALL mysql_insert_id(MYSQL *mysql)
1041
return mysql->insert_id;
1044
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
1046
return mysql ? mysql->net.sqlstate : cant_connect_sqlstate;
1049
uint32_t STDCALL mysql_warning_count(MYSQL *mysql)
1051
return mysql->warning_count;
1054
const char *STDCALL mysql_info(MYSQL *mysql)
1059
uint32_t STDCALL mysql_thread_id(MYSQL *mysql)
1061
return (mysql)->thread_id;
1064
const char * STDCALL mysql_character_set_name(MYSQL *mysql)
1066
return mysql->charset->csname;
1069
void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *csinfo)
1071
csinfo->number = mysql->charset->number;
1072
csinfo->state = mysql->charset->state;
1073
csinfo->csname = mysql->charset->csname;
1074
csinfo->name = mysql->charset->name;
1075
csinfo->comment = mysql->charset->comment;
1076
csinfo->mbminlen = mysql->charset->mbminlen;
1077
csinfo->mbmaxlen = mysql->charset->mbmaxlen;
1079
if (mysql->options.charset_dir)
1080
csinfo->dir = mysql->options.charset_dir;
1082
csinfo->dir = charsets_dir;
1085
uint STDCALL mysql_thread_safe(void)
1091
my_bool STDCALL mysql_embedded(void)
1093
#ifdef EMBEDDED_LIBRARY
522
1100
/****************************************************************************
576
1155
Returns the length of the to string
580
drizzle_escape_string(char *to,const char *from, uint32_t length)
582
const char *to_start= to;
583
const char *end, *to_end=to_start + 2*length;
584
bool overflow= false;
585
for (end= from + length; from < end; from++)
1159
mysql_escape_string(char *to,const char *from, uint32_t length)
1161
return escape_string_for_mysql(default_charset_info, to, 0, from, length);
1165
mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
1168
if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
1169
return escape_quotes_for_mysql(mysql->charset, to, 0, from, length);
1170
return escape_string_for_mysql(mysql->charset, to, 0, from, length);
1174
myodbc_remove_escape(MYSQL *mysql,char *name)
1178
my_bool use_mb_flag=use_mb(mysql->charset);
1181
for (end=name; *end ; end++) ;
1184
for (to=name ; *name ; name++)
589
if (!U8_IS_SINGLE(*from))
1188
if (use_mb_flag && (l = my_ismbchar( mysql->charset, name , end ) ) )
591
tmp_length= U8_LENGTH(*from);
592
if (to + tmp_length > to_end)
603
case 0: /* Must be escaped for 'mysql' */
606
case '\n': /* Must be escaped for logs */
618
case '"': /* Better safe than sorry */
621
case '\032': /* This gives problems on Win32 */
1196
if (*name == '\\' && name[1])
646
return overflow ? (size_t) -1 : (size_t) (to - to_start);
649
int cli_unbuffered_fetch(DRIZZLE *drizzle, char **row)
1203
int cli_unbuffered_fetch(MYSQL *mysql, char **row)
651
if (packet_error == cli_safe_read(drizzle))
1205
if (packet_error == cli_safe_read(mysql))
654
*row= ((drizzle->net.read_pos[0] == DRIZZLE_PROTOCOL_NO_MORE_DATA) ? NULL :
655
(char*) (drizzle->net.read_pos+1));
1208
*row= ((mysql->net.read_pos[0] == 254) ? NULL :
1209
(char*) (mysql->net.read_pos+1));