18
18
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
20
20
#include <drizzled/global.h>
21
#include "libdrizzle.h"
21
#include <mysys/my_sys.h>
23
#include <mysys/mysys_err.h>
22
25
#include "errmsg.h"
26
#include <vio/violite.h>
23
27
#include <sys/stat.h>
24
28
#include <signal.h>
52
57
#include "client_settings.h"
53
58
#include <drizzled/version.h>
55
/* Borrowed from libicu header */
57
#define U8_IS_SINGLE(c) (((c)&0x80)==0)
58
#define U8_LENGTH(c) \
59
((uint32_t)(c)<=0x7f ? 1 : \
60
((uint32_t)(c)<=0x7ff ? 2 : \
61
((uint32_t)(c)<=0xd7ff ? 3 : \
62
((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
63
((uint32_t)(c)<=0xffff ? 3 : 4)\
70
60
#undef net_buffer_length
71
61
#undef max_allowed_packet
154
155
char buff[USERNAME_LENGTH+SCRAMBLED_PASSWORD_CHAR_LENGTH+NAME_LEN+2];
158
const CHARSET_INFO *saved_cs= drizzle->charset;
160
/* Get the connection-default character set. */
162
if (drizzle_init_character_set(drizzle))
164
drizzle->charset= saved_cs;
158
168
/* Use an empty string instead of NULL. */
179
189
end= strncpy(end, db ? db : "", NAME_LEN) + NAME_LEN + 1;
181
191
/* Add character set number. */
182
193
if (drizzle->server_capabilities & CLIENT_SECURE_CONNECTION)
184
int2store(end, (ushort) 45); // utf8mb4 number from mystrings/ctype-utf8.c
195
int2store(end, (ushort) drizzle->charset->number);
307
322
drizzle->field_count= (uint) query->rows;
308
return unpack_fields(query, drizzle->field_count, 1);
323
return unpack_fields(query,&drizzle->field_alloc, drizzle->field_count, 1);
338
353
memset(result, 0, sizeof(DRIZZLE_RES));
340
355
result->methods= drizzle->methods;
356
result->field_alloc=drizzle->field_alloc;
341
357
drizzle->fields=0;
342
358
result->field_count = drizzle->field_count;
343
359
result->fields= fields;
361
377
field_count=(uint) net_field_length(&pos);
362
378
if (!(fields = (*drizzle->methods->read_rows)(drizzle,(DRIZZLE_FIELD*) 0, 7)))
364
if (!(drizzle->fields=unpack_fields(fields, field_count, 0)))
380
if (!(drizzle->fields=unpack_fields(fields,&drizzle->field_alloc,field_count,0)))
366
382
drizzle->status=DRIZZLE_STATUS_GET_RESULT;
367
383
drizzle->field_count=field_count;
521
537
return drizzle->thread_id;
540
const char * drizzle_character_set_name(const DRIZZLE *drizzle)
542
return drizzle->charset->csname;
545
void drizzle_get_character_set_info(const DRIZZLE *drizzle, MY_CHARSET_INFO *csinfo)
547
csinfo->number = drizzle->charset->number;
548
csinfo->state = drizzle->charset->state;
549
csinfo->csname = drizzle->charset->csname;
550
csinfo->name = drizzle->charset->name;
551
csinfo->comment = drizzle->charset->comment;
552
csinfo->mbminlen = drizzle->charset->mbminlen;
553
csinfo->mbmaxlen = drizzle->charset->mbmaxlen;
555
if (drizzle->options.charset_dir)
556
csinfo->dir = drizzle->options.charset_dir;
558
csinfo->dir = charsets_dir;
561
uint drizzle_thread_safe(void)
567
bool drizzle_embedded(void)
569
#ifdef EMBEDDED_LIBRARY
524
576
/****************************************************************************
525
577
Some support functions
526
578
****************************************************************************/
552
604
Each character needs two bytes, and you need room for the terminating
553
605
null byte. When drizzle_hex_string() returns, the contents of "to" will
554
606
be a null-terminated string. The return value is the length of the
555
encoded string, not including the terminating null character. The return value does not contain any leading 0x or a leading X' and
607
encoded string, not including the terminating null character.
609
The return value does not contain any leading 0x or a leading X' and
556
610
trailing '. The caller must supply whichever of those is desired.
581
635
drizzle_escape_string(char *to,const char *from, uint32_t length)
583
const char *to_start= to;
584
const char *end, *to_end=to_start + 2*length;
585
bool overflow= false;
586
for (end= from + length; from < end; from++)
637
return escape_string_for_drizzle(default_charset_info, to, 0, from, length);
641
drizzle_real_escape_string(DRIZZLE *drizzle, char *to,const char *from,
644
if (drizzle->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
645
return escape_quotes_for_drizzle(drizzle->charset, to, 0, from, length);
646
return escape_string_for_drizzle(drizzle->charset, to, 0, from, length);
650
myodbc_remove_escape(const DRIZZLE *drizzle, char *name)
654
bool use_mb_flag= use_mb(drizzle->charset);
657
for (end=name; *end ; end++) ;
660
for (to=name ; *name ; name++)
590
if (!U8_IS_SINGLE(*from))
664
if (use_mb_flag && (l = my_ismbchar( drizzle->charset, name , end ) ) )
592
tmp_length= U8_LENGTH(*from);
593
if (to + tmp_length > to_end)
604
case 0: /* Must be escaped for 'mysql' */
607
case '\n': /* Must be escaped for logs */
619
case '"': /* Better safe than sorry */
622
case '\032': /* This gives problems on Win32 */
672
if (*name == '\\' && name[1])
647
return overflow ? (size_t) -1 : (size_t) (to - to_start);
650
679
int cli_unbuffered_fetch(DRIZZLE *drizzle, char **row)