~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to libdrizzle/libdrizzle.c

  • Committer: Monty Taylor
  • Date: 2008-09-14 00:14:42 UTC
  • mto: This revision was merged to the branch mainline in revision 387.
  • Revision ID: monty@inaugust.com-20080914001442-09k3yuht4gopk0t6
Reworked drizzle_escape_string.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
19
19
 
20
20
#include <drizzled/global.h>
21
 
#include <mysys/my_sys.h>
22
21
#include "drizzle.h"
23
22
#include "errmsg.h"
24
23
#include <sys/stat.h>
53
52
#include "client_settings.h"
54
53
#include <drizzled/version.h>
55
54
 
 
55
/* Borrowed from libicu header */
 
56
 
 
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)\
 
64
                ) \
 
65
            ) \
 
66
        ) \
 
67
    )
 
68
 
 
69
 
56
70
#undef net_buffer_length
57
71
#undef max_allowed_packet
58
72
 
78
92
  return &drizzle_internal_parameters;
79
93
}
80
94
 
81
 
bool drizzle_thread_init()
82
 
{
83
 
  return my_thread_init();
84
 
}
85
 
 
86
 
void drizzle_thread_end()
87
 
{
88
 
  my_thread_end();
89
 
}
90
 
 
91
 
 
92
95
/*
93
96
  Expand wildcard to a sql string
94
97
*/
538
541
  return drizzle->charset->csname;
539
542
}
540
543
 
541
 
void drizzle_get_character_set_info(const DRIZZLE *drizzle, MY_CHARSET_INFO *csinfo)
542
 
{
543
 
  csinfo->number   = drizzle->charset->number;
544
 
  csinfo->state    = drizzle->charset->state;
545
 
  csinfo->csname   = drizzle->charset->csname;
546
 
  csinfo->name     = drizzle->charset->name;
547
 
  csinfo->comment  = drizzle->charset->comment;
548
 
  csinfo->mbminlen = drizzle->charset->mbminlen;
549
 
  csinfo->mbmaxlen = drizzle->charset->mbmaxlen;
550
 
 
551
 
  if (drizzle->options.charset_dir)
552
 
    csinfo->dir = drizzle->options.charset_dir;
553
 
  else
554
 
    csinfo->dir = charsets_dir;
555
 
}
556
 
 
557
 
uint drizzle_thread_safe(void)
558
 
{
559
 
  return 1;
560
 
}
561
 
 
562
 
 
563
 
bool drizzle_embedded(void)
564
 
{
565
 
  return false;
566
 
}
567
 
 
568
544
/****************************************************************************
569
545
  Some support functions
570
546
****************************************************************************/
596
572
  Each character needs two bytes, and you need room for the terminating
597
573
  null byte. When drizzle_hex_string() returns, the contents of "to" will
598
574
  be a null-terminated string. The return value is the length of the
599
 
  encoded string, not including the terminating null character.
600
 
 
601
 
  The return value does not contain any leading 0x or a leading X' and
 
575
  encoded string, not including the terminating null character.  The return value does not contain any leading 0x or a leading X' and
602
576
  trailing '. The caller must supply whichever of those is desired.
603
577
*/
604
578
 
626
600
uint32_t
627
601
drizzle_escape_string(char *to,const char *from, uint32_t length)
628
602
{
629
 
  return escape_string_for_drizzle(default_charset_info, to, 0, from, length);
 
603
  const char *to_start= to;
 
604
  const char *end, *to_end=to_start + 2*length;
 
605
  bool overflow= false;
 
606
  for (end= from + length; from < end; from++)
 
607
  {
 
608
    uint32_t tmp_length;
 
609
    char escape= 0;
 
610
    if (!U8_IS_SINGLE(*from))
 
611
    {
 
612
      tmp_length= U8_LENGTH(*from);
 
613
      if (to + tmp_length > to_end)
 
614
      {
 
615
        overflow= true;
 
616
        break;
 
617
      }
 
618
      while (tmp_length--)
 
619
        *to++= *from++;
 
620
      from--;
 
621
      continue;
 
622
    }
 
623
    switch (*from) {
 
624
    case 0:                             /* Must be escaped for 'mysql' */
 
625
      escape= '0';
 
626
      break;
 
627
    case '\n':                          /* Must be escaped for logs */
 
628
      escape= 'n';
 
629
      break;
 
630
    case '\r':
 
631
      escape= 'r';
 
632
      break;
 
633
    case '\\':
 
634
      escape= '\\';
 
635
      break;
 
636
    case '\'':
 
637
      escape= '\'';
 
638
      break;
 
639
    case '"':                           /* Better safe than sorry */
 
640
      escape= '"';
 
641
      break;
 
642
    case '\032':                        /* This gives problems on Win32 */
 
643
      escape= 'Z';
 
644
      break;
 
645
    }
 
646
    if (escape)
 
647
    {
 
648
      if (to + 2 > to_end)
 
649
      {
 
650
        overflow= true;
 
651
        break;
 
652
      }
 
653
      *to++= '\\';
 
654
      *to++= escape;
 
655
    }
 
656
    else
 
657
    {
 
658
      if (to + 1 > to_end)
 
659
      {
 
660
        overflow= true;
 
661
        break;
 
662
      }
 
663
      *to++= *from;
 
664
    }
 
665
  }
 
666
  *to= 0;
 
667
  return overflow ? (size_t) -1 : (size_t) (to - to_start);
630
668
}
631
669
 
632
 
uint32_t
633
 
drizzle_real_escape_string(DRIZZLE *drizzle, char *to,const char *from,
634
 
       uint32_t length)
635
 
{
636
 
  if (drizzle->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES)
637
 
    return escape_quotes_for_drizzle(drizzle->charset, to, 0, from, length);
638
 
  return escape_string_for_drizzle(drizzle->charset, to, 0, from, length);
639
 
}
640
670
 
641
671
void
642
672
myodbc_remove_escape(const DRIZZLE *drizzle, char *name)