File: real_escape.dpatch

package info (click to toggle)
mysql-ocaml 1.0.4-2%2Betch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 728 kB
  • ctags: 717
  • sloc: sh: 2,278; ml: 599; ansic: 531; makefile: 74; perl: 41
file content (116 lines) | stat: -rw-r--r-- 4,215 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#! /bin/sh /usr/share/dpatch/dpatch-run
## real_escape.dpatch by Mehdi Dogguy <mehdi@debian.org>
##
## DP: Add a binding for mysql_real_escape_string.

@DPATCH@
diff -urNad mysql-ocaml~/mysql.ml mysql-ocaml/mysql.ml
--- mysql-ocaml~/mysql.ml	2009-10-01 22:56:38.000000000 +0200
+++ mysql-ocaml/mysql.ml	2009-10-07 23:59:24.000000000 +0200
@@ -333,6 +333,7 @@
 external real_status     : dbd -> int                         = "db_status"
 external errmsg     : dbd -> string option                  = "db_errmsg"
 external escape     : string -> string                      = "db_escape"
+external real_escape: dbd -> string -> string               = "db_real_escape"
 external fetch      : result -> string option array option  = "db_fetch" 
 external to_row     : result -> int64 -> unit                 = "db_to_row"
 external size       : result -> int64                         = "db_size"
@@ -516,7 +517,9 @@
    the corresponding type *)
   
 let ml2str str  = "'" ^ escape str ^ "'"
+let ml2rstr conn str = "'" ^ real_escape conn str ^ "'"
 let ml2blob     = ml2str
+let ml2rblob    = ml2rstr
 let ml2int x    = string_of_int x
 let ml2decimal x    = x
 let ml322int x  = Int32.to_string x
@@ -524,12 +527,15 @@
 let mlnative2int x = Nativeint.to_string x
 let ml2float x  = string_of_float x
 let ml2enum x   = escape x
-let ml2set x    = let rec loop arg = match arg with
-                    | []        -> ""
-                    | [x]       -> escape x
-                    | x::y::ys  -> escape x ^ "," ^ loop (y::ys)
-                  in
-                    loop x  
+let ml2renum x  = real_escape x
+let ml2set_filter f x =
+  let rec loop f = function
+  | []        -> ""
+  | [x]       -> f x
+  | x::y::ys  -> f x ^ "," ^ loop f (y::ys)
+  in loop f x
+let ml2set x       = ml2set_filter escape x
+let ml2rset conn x = ml2set_filter (real_escape conn) x
 
 let ml2datetimel ~year ~month ~day ~hour ~min ~sec =
     Printf.sprintf "'%04d-%02d-%02d %02d:%02d:%02d'"
diff -urNad mysql-ocaml~/mysql.mli mysql-ocaml/mysql.mli
--- mysql-ocaml~/mysql.mli	2009-10-01 22:56:38.000000000 +0200
+++ mysql-ocaml/mysql.mli	2009-10-07 23:59:24.000000000 +0200
@@ -230,6 +230,7 @@
 (** [escape str] returns the same string as [str] in MySQL syntax with
   special characters quoted to not confuse the MySQL parser *)
 val escape : string -> string 
+val real_escape : dbd -> string -> string
 
 (** [xxx2ml str] decodes a MySQL value of type xxx into a corresponding
   OCaml value *)
@@ -277,14 +278,18 @@
 (** [ml2xxx v] encodes [v] into MySQL syntax. *)
 
 val ml2str          : string -> string
+val ml2rstr         : dbd -> string -> string
 val ml2blob         : string -> string
+val ml2rblob        : dbd -> string -> string
 val ml2int          : int -> string
 val ml2decimal      : string -> string
 val ml322int        : int32 -> string
 val ml642int        : int64 -> string
 val ml2float        : float -> string
 val ml2enum         : string -> string
+val ml2renum        : dbd -> string -> string
 val ml2set          : string list -> string
+val ml2rset         : dbd -> string list -> string
 val ml2datetime     : int * int * int * int * int * int -> string
 val ml2datetimel    : year:int -> month:int -> day:int -> hour:int -> min:int -> sec:int -> string
 val ml2date         : int * int * int -> string
diff -urNad mysql-ocaml~/mysql_stubs.c mysql-ocaml/mysql_stubs.c
--- mysql-ocaml~/mysql_stubs.c	2009-10-01 22:56:38.000000000 +0200
+++ mysql-ocaml/mysql_stubs.c	2009-10-07 23:59:24.000000000 +0200
@@ -472,6 +472,33 @@
   CAMLreturn(res);
 }
 
+EXTERNAL value
+db_real_escape(value dbd, value str)
+{
+  CAMLparam2(dbd, str);
+  char *s;
+  char *buf;
+  int len, esclen;
+  MYSQL *mysql;
+  CAMLlocal1(res);
+
+  check_dbd(dbd, "escape");
+  mysql = DBDmysql(dbd);
+
+  s = String_val(str);
+  len = string_length(str);
+  buf = (char*) stat_alloc(2*len+1);
+  caml_enter_blocking_section();
+  esclen = mysql_real_escape_string(mysql,buf,s,len);
+  caml_leave_blocking_section();
+
+  res = alloc_string(esclen);
+  memcpy(String_val(res), buf, esclen);
+  stat_free(buf);
+
+  CAMLreturn(res);
+}
+
 /*
  * db_size -- returns the size of the current result (number of rows).
  */