1
/* Copyright (C) 2000-2004 DRIZZLE AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation.
7
There are special exceptions to the terms and conditions of the GPL as it
8
is applied to this software. View the full text of the exception in file
9
EXCEPTIONS-CLIENT in the directory of this software distribution.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
20
#include <drizzled/global.h>
21
#include <mysys/my_sys.h>
21
#include "libdrizzle_priv.h"
23
#include "libdrizzle.h"
24
24
#include "errmsg.h"
25
#include <vio/violite.h>
26
27
#include <sys/stat.h>
27
28
#include <signal.h>
61
63
uint32_t net_buffer_length= 8192;
62
64
uint32_t max_allowed_packet= 1024L*1024L*1024L;
66
unsigned int drizzle_port=0;
65
#define SOCKET_ERROR -1
68
If allowed through some configuration, then this needs to
71
#define MAX_LONG_DATA_LENGTH 8192
72
#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG)
75
71
static DRIZZLE_PARAMETERS drizzle_internal_parameters=
80
76
return &drizzle_internal_parameters;
83
bool drizzle_thread_init()
85
return my_thread_init();
88
void drizzle_thread_end()
79
unsigned int drizzle_get_default_port(void)
84
void drizzle_set_default_port(unsigned int port)
95
90
Expand wildcard to a sql string
120
115
/**************************************************************************
121
Ignore SIGPIPE handler
123
**************************************************************************/
126
my_pipe_sig_handler(int sig __attribute__((unused)))
128
#ifdef DONT_REMEMBER_SIGNAL
129
(void) signal(SIGPIPE, my_pipe_sig_handler);
134
/**************************************************************************
135
116
Change user and database
136
117
**************************************************************************/
153
134
char buff[USERNAME_LENGTH+SCRAMBLED_PASSWORD_CHAR_LENGTH+NAME_LEN+2];
156
const CHARSET_INFO *saved_cs= drizzle->charset;
158
/* Get the connection-default character set. */
160
if (drizzle_init_character_set(drizzle))
162
drizzle->charset= saved_cs;
166
138
/* Use an empty string instead of NULL. */
187
159
end= strncpy(end, db ? db : "", NAME_LEN) + NAME_LEN + 1;
189
161
/* Add character set number. */
191
162
if (drizzle->server_capabilities & CLIENT_SECURE_CONNECTION)
193
int2store(end, (ushort) drizzle->charset->number);
164
int2store(end, (uint16_t) 45); // utf8mb4 number from mystrings/ctype-utf8.c
197
168
/* Write authentication package */
198
(void)simple_command(drizzle,COM_CHANGE_USER, (uchar*) buff, (uint32_t) (end-buff), 1);
169
(void)simple_command(drizzle,COM_CHANGE_USER, (unsigned char*) buff, (uint32_t) (end-buff), 1);
200
171
rc= (*drizzle->methods->read_change_user_result)(drizzle);
236
203
drizzle_query(DRIZZLE *drizzle, const char *query)
238
return drizzle_real_query(drizzle,query, (uint) strlen(query));
205
return drizzle_real_query(drizzle,query, (uint32_t) strlen(query));
317
284
if (!(query= cli_read_rows(drizzle,(DRIZZLE_FIELD*) 0, 8)))
320
drizzle->field_count= (uint) query->rows;
321
return unpack_fields(query,&drizzle->field_alloc, drizzle->field_count, 1);
287
drizzle->field_count= (uint32_t) query->rows;
288
return unpack_fields(query, drizzle->field_count, 1);
340
307
end= strncpy(end+1, wild ? wild : "", 128) + 128;
342
309
free_old_query(drizzle);
343
if (simple_command(drizzle, COM_FIELD_LIST, (uchar*) buff,
310
if (simple_command(drizzle, COM_FIELD_LIST, (unsigned char*) buff,
344
311
(uint32_t) (end-buff), 1) ||
345
312
!(fields= (*drizzle->methods->list_fields)(drizzle)))
351
318
memset(result, 0, sizeof(DRIZZLE_RES));
353
320
result->methods= drizzle->methods;
354
result->field_alloc=drizzle->field_alloc;
355
321
drizzle->fields=0;
356
322
result->field_count = drizzle->field_count;
357
323
result->fields= fields;
365
331
drizzle_list_processes(DRIZZLE *drizzle)
367
333
DRIZZLE_DATA *fields;
334
uint32_t field_count;
371
337
if (simple_command(drizzle,COM_PROCESS_INFO,0,0,0))
373
339
free_old_query(drizzle);
374
pos=(uchar*) drizzle->net.read_pos;
375
field_count=(uint) net_field_length(&pos);
340
pos=(unsigned char*) drizzle->net.read_pos;
341
field_count=(uint32_t) net_field_length(&pos);
376
342
if (!(fields = (*drizzle->methods->read_rows)(drizzle,(DRIZZLE_FIELD*) 0, 7)))
378
if (!(drizzle->fields=unpack_fields(fields,&drizzle->field_alloc,field_count,0)))
344
if (!(drizzle->fields=unpack_fields(fields, field_count, 0)))
380
346
drizzle->status=DRIZZLE_STATUS_GET_RESULT;
381
347
drizzle->field_count=field_count;
387
drizzle_shutdown(DRIZZLE *drizzle, enum drizzle_enum_shutdown_level shutdown_level)
353
drizzle_shutdown(DRIZZLE *drizzle)
390
level[0]= (uchar) shutdown_level;
391
return(simple_command(drizzle, COM_SHUTDOWN, level, 1, 0));
355
return(simple_command(drizzle, COM_SHUTDOWN, 0, 0, 0));
396
drizzle_refresh(DRIZZLE *drizzle,uint options)
360
drizzle_refresh(DRIZZLE *drizzle, uint32_t options)
399
bits[0]= (uchar) options;
362
unsigned char bits[1];
363
bits[0]= (unsigned char) options;
400
364
return(simple_command(drizzle, COM_REFRESH, bits, 1, 0));
414
378
drizzle_set_server_option(DRIZZLE *drizzle, enum enum_drizzle_set_option option)
417
int2store(buff, (uint) option);
380
unsigned char buff[2];
381
int2store(buff, (uint32_t) option);
418
382
return(simple_command(drizzle, COM_SET_OPTION, buff, sizeof(buff), 0));
424
388
drizzle->net.read_pos[drizzle->packet_length]=0; /* End of stat string */
425
389
if (!drizzle->net.read_pos[0])
427
set_drizzle_error(drizzle, CR_WRONG_HOST_INFO, unknown_sqlstate);
391
drizzle_set_error(drizzle, CR_WRONG_HOST_INFO, sqlstate_get_unknown());
428
392
return drizzle->net.last_error;
430
394
return (char*) drizzle->net.read_pos;
535
499
return drizzle->thread_id;
538
const char * drizzle_character_set_name(const DRIZZLE *drizzle)
540
return drizzle->charset->csname;
543
void drizzle_get_character_set_info(const DRIZZLE *drizzle, MY_CHARSET_INFO *csinfo)
545
csinfo->number = drizzle->charset->number;
546
csinfo->state = drizzle->charset->state;
547
csinfo->csname = drizzle->charset->csname;
548
csinfo->name = drizzle->charset->name;
549
csinfo->comment = drizzle->charset->comment;
550
csinfo->mbminlen = drizzle->charset->mbminlen;
551
csinfo->mbmaxlen = drizzle->charset->mbmaxlen;
553
if (drizzle->options.charset_dir)
554
csinfo->dir = drizzle->options.charset_dir;
556
csinfo->dir = charsets_dir;
559
uint drizzle_thread_safe(void)
565
bool drizzle_embedded(void)
567
#ifdef EMBEDDED_LIBRARY
574
502
/****************************************************************************
575
503
Some support functions
576
504
****************************************************************************/
582
510
void my_net_local_init(NET *net)
584
net->max_packet= (uint) net_buffer_length;
512
net->max_packet= (uint32_t) net_buffer_length;
585
513
my_net_set_read_timeout(net, CLIENT_NET_READ_TIMEOUT);
586
514
my_net_set_write_timeout(net, CLIENT_NET_WRITE_TIMEOUT);
587
515
net->retry_count= 1;
588
net->max_packet_size= max(net_buffer_length, max_allowed_packet);
592
This function is used to create HEX string that you
593
can use in a SQL statement in of the either ways:
594
INSERT INTO blob_column VALUES (0xAABBCC); (any DRIZZLE version)
595
INSERT INTO blob_column VALUES (X'AABBCC');
597
The string in "from" is encoded to a HEX string.
598
The result is placed in "to" and a terminating null byte is appended.
600
The string pointed to by "from" must be "length" bytes long.
601
You must allocate the "to" buffer to be at least length*2+1 bytes long.
602
Each character needs two bytes, and you need room for the terminating
603
null byte. When drizzle_hex_string() returns, the contents of "to" will
604
be a null-terminated string. The return value is the length of the
605
encoded string, not including the terminating null character.
607
The return value does not contain any leading 0x or a leading X' and
608
trailing '. The caller must supply whichever of those is desired.
612
drizzle_hex_string(char *to, const char *from, uint32_t length)
617
for (end= from + length; from < end; from++)
619
*to++= _dig_vec_upper[((unsigned char) *from) >> 4];
620
*to++= _dig_vec_upper[((unsigned char) *from) & 0x0F];
623
return (uint32_t) (to-to0);
516
net->max_packet_size= (net_buffer_length > max_allowed_packet) ?
517
net_buffer_length : max_allowed_packet;
633
527
drizzle_escape_string(char *to,const char *from, uint32_t length)
635
return escape_string_for_drizzle(default_charset_info, to, 0, from, length);
639
drizzle_real_escape_string(DRIZZLE *drizzle, char *to,const char *from,
642
if (drizzle->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
643
return escape_quotes_for_drizzle(drizzle->charset, to, 0, from, length);
644
return escape_string_for_drizzle(drizzle->charset, to, 0, from, length);
648
myodbc_remove_escape(const DRIZZLE *drizzle, char *name)
652
bool use_mb_flag= use_mb(drizzle->charset);
655
for (end=name; *end ; end++) ;
658
for (to=name ; *name ; name++)
529
const char *to_start= to;
530
const char *end, *to_end=to_start + 2*length;
531
bool overflow= false;
532
for (end= from + length; from < end; from++)
662
if (use_mb_flag && (l = my_ismbchar( drizzle->charset, name , end ) ) )
536
if (!U8_IS_SINGLE(*from))
538
tmp_length= U8_LENGTH(*(uint32_t*)from);
539
if (to + tmp_length > to_end)
670
if (*name == '\\' && name[1])
550
case 0: /* Must be escaped for 'mysql' */
553
case '\n': /* Must be escaped for logs */
565
case '"': /* Better safe than sorry */
568
case '\032': /* This gives problems on Win32 */
593
return overflow ? (size_t) -1 : (size_t) (to - to_start);
677
596
int cli_unbuffered_fetch(DRIZZLE *drizzle, char **row)
742
661
if (drizzle->status != DRIZZLE_STATUS_READY)
744
set_drizzle_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
663
drizzle_set_error(drizzle, CR_COMMANDS_OUT_OF_SYNC, sqlstate_get_unknown());