00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #define _GNU_SOURCE
00029 #include <glib.h>
00030 #include <string.h>
00031
00032 #include "escape.h"
00033
00034
00035
00036 struct _escape {
00037
00038 gchar * escape;
00039 gsize esc_buflen;
00040 };
00041
00042
00043
00044
00045
00046
00047 const gchar *
00048 sqlEscapeString (sqlEscape *b, const gchar *str)
00049 {
00050 const gchar *p, *src_head;
00051 gchar *dst_tail;
00052 size_t len, slen;
00053
00054 if (!b || !str) return NULL;
00055
00056
00057 if (b->escape == str)
00058 return str;
00059
00060
00061 len = strlen (str);
00062 slen = strcspn (str, "\\\'");
00063 if (len == slen) return str;
00064
00065
00066 p = str + slen + 1;
00067 while (*p)
00068 {
00069 len ++;
00070 p += 1 + strcspn (p, "\\\'");
00071 }
00072
00073
00074 if (len >= b->esc_buflen)
00075 {
00076 b->escape = g_realloc(b->escape, len+100);
00077 b->esc_buflen = len+100;
00078 }
00079
00080
00081 src_head = (char *) str;
00082 dst_tail = b->escape;
00083 p = src_head + strcspn (src_head, "\\\'");
00084 while (*p)
00085 {
00086 size_t cp_len = p - src_head;
00087
00088 strncpy (dst_tail, src_head, cp_len);
00089 dst_tail += cp_len;
00090 *dst_tail = '\\';
00091 dst_tail ++;
00092 *dst_tail = *p;
00093 dst_tail ++;
00094
00095 src_head = p+1;
00096 p = src_head + strcspn (src_head, "\\\'");
00097 }
00098 if (p != src_head)
00099 {
00100 size_t cp_len = p - src_head;
00101
00102 strncpy (dst_tail, src_head, cp_len);
00103 dst_tail += cp_len;
00104 }
00105 *dst_tail = 0;
00106
00107 return b->escape;
00108 }
00109
00110
00111
00112 #define INITIAL_BUFSZ 2000
00113
00114 sqlEscape *
00115 sqlEscape_new (void)
00116 {
00117 sqlEscape *b = g_new (sqlEscape, 1);
00118
00119 b->escape = g_malloc (INITIAL_BUFSZ);
00120 b->esc_buflen = INITIAL_BUFSZ;
00121 return (b);
00122 }
00123
00124
00125
00126 void
00127 sqlEscape_destroy (sqlEscape *b)
00128 {
00129 if (!b) return;
00130 g_free (b->escape); b->escape = NULL;
00131 g_free (b);
00132 }
00133
00134