# PATCH for MySQL/Ruby

**URL:** <https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751>\
**Category:** Development\
**Created:** [June 18, 2008, 8:16am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751 "2008-06-18T08:16:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 18, 2008, 8:16am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751/1 "2008-06-18T08:16:37Z")

</div>

e$B$J$+$@$G$9!#e(B

MySQL/Ruby 2.8pre2e$B$r$_$F$_$?$N$G$9$,!"$d$dLdBj$,$"$k$h$&$G$9!#e(B

= e$BJL%G%#%l%/%H%j$G%3%s%Q%$%k$G$-$J$$!#e(B  
\*.ce$B$r\<+F0$GC5$9$N$O%=!\<%9%G%#%l%/%H%j$G$9!#$3$N\>l9g$O%=!\<%9A4e(B  
e$BBN$r%3%T!\<$7$J$/$H$b!"%X%C%@$KJ,$1$k$@$1$G=\<J,$@$H;W$$$^$9!#e(B

- RUBYY\_VERSION\_CODEe$B$r$\_$F$$$ke(B  
rb\_str\_set\_len()e$B$r;H$&$N$Oe(BRSTRING\_LEN()e$B$,$J$$$H$-$G$$$$$H;W$$e(B  
e$B$^$9!#e(B

# Index: mysql-ruby-2.7.5/extconf.rb

— mysql-ruby-2.7.5/extconf.rb~ 2006-10-29 23:59:44.000000000 +0900  
+++ mysql-ruby-2.7.5/extconf.rb 2008-06-16 12:18:51.000000000 +0900  
@@ -61,11 +61,7 @@  
error\_syms.uniq!

-newf = File::open(‘mysql.c’, ‘w’)  
-IO::foreach(‘mysql.c.in’) do |l|

- newf.puts l
- if l =~ //\* Mysql::Error constant \*// then
- error\_syms.each do |s|
- 

```
 newf.puts " rb_define_const(eMysql, \"#{s}\", INT2NUM(#{s}));"

```

- end  
+File::open(‘error\_const.h’, ‘w’) do |f|

- error\_syms.each do |s|
- f.puts " rb\_define\_mysql\_const(#{s});"  
end  
end  
Index: mysql-ruby-2.7.5/mysql.c  
===================================================================  
— mysql-ruby-2.7.5/mysql.c.in~ 2008-03-08 01:30:47.000000000 +0900  
+++ mysql-ruby-2.7.5/mysql.c 2008-06-16 12:20:36.000000000 +0900  
@@ -4,5 +4,4 @@

#include “ruby.h”  
-#include “version.h”  
#ifdef HAVE\_MYSQL\_H  
#include \<mysql.h\>  
@@ -19,4 +18,12 @@  
#define GC\_STORE\_RESULT\_LIMIT 20

+#ifndef RSTRING\_PTR  
+#define RSTRING\_PTR(str) RSTRING(str)-\>ptr  
+#endif  
+#ifndef RSTRING\_LEN  
+#define RSTRING\_LEN(str) RSTRING(str)-\>len  
+#define rb\_str\_set\_len(str, length) (RSTRING\_LEN(str) = (length))  
+#endif  
+  
#ifndef Qtrue /\* ruby 1.2.x ? \*/  
#define Qtrue TRUE  
@@ -278,6 +285,6 @@  
VALUE ret;  
Check\_Type(str, T\_STRING);

- ret = rb\_str\_new(0, (RSTRING(str)-\>len)\*2+1);
- RSTRING(ret)-\>len = mysql\_escape\_string(RSTRING(ret)-\>ptr,  
RSTRING(str)-\>ptr, RSTRING(str)-\>len);

- ret = rb\_str\_new(0, (RSTRING\_LEN(str))\*2+1);
- rb\_str\_set\_len(ret, mysql\_escape\_string(RSTRING\_PTR(ret),  
RSTRING\_PTR(str), RSTRING\_LEN(str)));  
return ret;  
}  
@@ -412,6 +419,6 @@  
VALUE ret;  
Check\_Type(str, T\_STRING);

- ret = rb\_str\_new(0, (RSTRING(str)-\>len)\*2+1);
- RSTRING(ret)-\>len = mysql\_real\_escape\_string(m, RSTRING(ret)-\>ptr,  
RSTRING(str)-\>ptr, RSTRING(str)-\>len);

- ret = rb\_str\_new(0, (RSTRING\_LEN(str))\*2+1);
- rb\_str\_set\_len(ret, mysql\_real\_escape\_string(m, RSTRING\_PTR(ret),  
RSTRING\_PTR(str), RSTRING\_LEN(str)));  
return ret;  
}  
@@ -723,5 +730,5 @@  
mysql\_raise(m);  
#endif

- if (mysql\_real\_query(m, RSTRING(sql)-\>ptr, RSTRING(sql)-\>len) != 0)

- if (mysql\_real\_query(m, RSTRING\_PTR(sql), RSTRING\_LEN(sql)) != 0)  
mysql\_raise(m);  
do {  
@@ -743,5 +750,5 @@  
return obj;  
}

- if (mysql\_real\_query(m, RSTRING(sql)-\>ptr, RSTRING(sql)-\>len) != 0)

- if (mysql\_real\_query(m, RSTRING\_PTR(sql), RSTRING\_LEN(sql)) != 0)  
mysql\_raise(m);  
if (GetMysqlStruct(obj)-\>query\_with\_result == Qfalse)  
@@ -895,9 +902,5 @@  
{  
if (TYPE(flag) != T\_TRUE && TYPE(flag) != T\_FALSE)  
-#if RUBY\_VERSION\_CODE \< 160

- TypeError(“invalid type, required true or false.”);  
-#else  
rb\_raise(rb\_eTypeError, “invalid type, required true or  
false.”);  
-#endif  
GetMysqlStruct(obj)-\>query\_with\_result = flag;  
return flag;  
@@ -973,9 +976,5 @@  
n = NUM2INT(nr);  
if (n \>= max)  
-#if RUBY\_VERSION\_CODE \< 160
- 

```
   Raise(eMysql, "%d: out of range (max: %d)", n, max-1);

```

-#else  
rb\_raise(eMysql, “%d: out of range (max: %d)”, n, max-1);  
-#endif  
#if MYSQL\_VERSION\_ID \>= 32226  
return make\_field\_obj(mysql\_fetch\_field\_direct(res, n));  
@@ -1046,6 +1045,6 @@  
else {  
col = rb\_tainted\_str\_new(fields[i].table,  
strlen(fields[i].table)+strlen(fields[i].name)+1);

- 

```
 RSTRING(col)->ptr[strlen(fields[i].table)] = '.';

```

- 

```
 strcpy(RSTRING(col)->ptr+strlen(fields[i].table)+1, 

```

fields[i].name);

- 

```
 RSTRING_PTR(col)[strlen(fields[i].table)] = '.';

```

- 

```
 strcpy(RSTRING_PTR(col)+strlen(fields[i].table)+1, 

```

fields[i].name);  
}  
rb\_hash\_aset(hash, col, row[i]? rb\_tainted\_str\_new(row[i],  
lengths[i]): Qnil);  
@@ -1171,6 +1170,6 @@  
{  
VALUE n = rb\_iv\_get(obj, “name”);

- VALUE s = rb\_str\_new(0, RSTRING(n)-\>len + 16);
- sprintf(RSTRING(s)-\>ptr, “#Mysql::Field:%s”, RSTRING(n)-\>ptr);

- VALUE s = rb\_str\_new(0, RSTRING\_LEN(n) + 16);
- sprintf(RSTRING\_PTR(s), “#Mysql::Field:%s”, RSTRING\_PTR(n));  
return s;  
}  
@@ -1297,5 +1296,5 @@  
s-\>result.bind[i].buffer\_type = MYSQL\_TYPE\_DATETIME;  
else

- 

```
 rb_raise(rb_eTypeError, "unrecognized class: %s", 

```

RSTRING(rb\_inspect(argv[i]))-\>ptr);

- 

```
 rb_raise(rb_eTypeError, "unrecognized class: %s", 

```

RSTRING\_PTR(rb\_inspect(argv[i])));  
if (mysql\_stmt\_bind\_result(s-\>stmt, s-\>result.bind))  
mysql\_stmt\_raise(s-\>stmt);  
@@ -1620,5 +1619,5 @@  
check\_stmt\_closed(obj);  
Check\_Type(query, T\_STRING);

- if (mysql\_stmt\_prepare(s-\>stmt, RSTRING(query)-\>ptr,  
RSTRING(query)-\>len))

- if (mysql\_stmt\_prepare(s-\>stmt, RSTRING\_PTR(query),  
RSTRING\_LEN(query)))  
mysql\_stmt\_raise(s-\>stmt);

@@ -1717,5 +1716,5 @@  
mysql\_stmt\_raise(s-\>stmt);  
}

- if (mysql\_stmt\_send\_long\_data(s-\>stmt, c, RSTRING(data)-\>ptr,  
RSTRING(data)-\>len))

- if (mysql\_stmt\_send\_long\_data(s-\>stmt, c, RSTRING\_PTR(data),  
RSTRING\_LEN(data)))  
mysql\_stmt\_raise(s-\>stmt);  
return obj;  
@@ -2233,3 +2232,5 @@

-newf = File::open(‘mysql.c’, ‘w’)  
-IO::foreach(‘mysql.c.in’) do |l|

- newf.puts l.gsub(/%RUBY\_VERSION%/, RUBY\_VERSION.gsub(/\D/, ‘’))
- if l =~ //\* Mysql::Error constant \*// then
- error\_syms.each do |s|
- 

```
 newf.puts " rb_define_const(eMysql, \"#{s}\", INT2NUM(#{s}));"

```

- end  
+File::open(‘error\_const.h’, ‘w’) do |f|

- error\_syms.each do |s|
- f.puts " rb\_define\_mysql\_const(#{s});"  
end  
end  
Index: mysql-ruby-2.8pre2/mysql.c  
===================================================================  
— mysql-ruby-2.8pre2/mysql.c.in 2008-03-08 01:16:28.000000000 +0900  
+++ mysql-ruby-2.8pre2/mysql.c 2008-06-16 12:15:14.000000000 +0900  
@@ -4,5 +4,4 @@

#include “ruby.h”  
-#define RUBY\_VERSION\_CODE %RUBY\_VERSION%  
#ifdef HAVE\_MYSQL\_H  
#include \<mysql.h\>  
@@ -19,4 +18,12 @@  
#define GC\_STORE\_RESULT\_LIMIT 20

+#ifndef RSTRING\_PTR  
+#define RSTRING\_PTR(str) RSTRING(str)-\>ptr  
+#endif  
+#ifndef RSTRING\_LEN  
+#define RSTRING\_LEN(str) RSTRING(str)-\>len  
+#define rb\_str\_set\_len(str, length) (RSTRING\_LEN(str) = (length))  
+#endif  
+  
#ifndef Qtrue /\* ruby 1.2.x ? \*/  
#define Qtrue TRUE  
@@ -283,9 +290,5 @@  
ret = rb\_str\_new(0, (RSTRING\_LEN(str))\*2+1);  
len = mysql\_escape\_string(RSTRING\_PTR(ret), RSTRING\_PTR(str),  
RSTRING\_LEN(str));  
-#if RUBY\_VERSION\_CODE \< 190

- RSTRING(ret)-\>len = len;  
-#else  
rb\_str\_set\_len(ret, len);  
-#endif  
return ret;  
}  
@@ -423,9 +426,5 @@  
ret = rb\_str\_new(0, (RSTRING\_LEN(str))\*2+1);  
len = mysql\_real\_escape\_string(m, RSTRING\_PTR(ret),  
RSTRING\_PTR(str), RSTRING\_LEN(str));  
-#if RUBY\_VERSION\_CODE \< 190
- RSTRING(ret)-\>len = len;  
-#else  
rb\_str\_set\_len(ret, len);  
-#endif  
return ret;  
}  
@@ -905,9 +904,5 @@  
{  
if (TYPE(flag) != T\_TRUE && TYPE(flag) != T\_FALSE)  
-#if RUBY\_VERSION\_CODE \< 160
- TypeError(“invalid type, required true or false.”);  
-#else  
rb\_raise(rb\_eTypeError, “invalid type, required true or  
false.”);  
-#endif  
GetMysqlStruct(obj)-\>query\_with\_result = flag;  
return flag;  
@@ -983,9 +978,5 @@  
n = NUM2INT(nr);  
if (n \>= max)  
-#if RUBY\_VERSION\_CODE \< 160
- 

```
   Raise(eMysql, "%d: out of range (max: %d)", n, max-1);

```

-#else  
rb\_raise(eMysql, “%d: out of range (max: %d)”, n, max-1);  
-#endif  
#if MYSQL\_VERSION\_ID \>= 32226  
return make\_field\_obj(mysql\_fetch\_field\_direct(res, n));  
@@ -2264,3 +2255,5 @@

```
 /* Mysql::Error constant */

```

+#define rb\_define\_mysql\_const(s) rb\_define\_const(eMysql, #s,  
INT2NUM(s))  
+#include “error\_const.h”  
}

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 20, 2008, 7:06am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751/2 "2008-06-20T07:06:18Z")

</div>

e$B$H$\_$?!w$D$/$Pe(B e$B$G$9!#e(B

On Wed, 18 Jun 2008 15:15:01 +0900  
Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> RUBY\_VERSION\_CODE \< 160 e$B$N$H$-$Ke(BTypeError()e$B$de(BRaise()e$B$r;H$C$F$$e(B  
> e$B$^$9$,!"$3$N4X?t$Oe(B1.3e$B$G$O$9$G$KGQ;_$5$l$F$$$^$9!#$J$N$G!"e(B1.4e$B$Ge(B  
> e$B$OF0$+$J$$$O$:$G$9!#$^$?!“B\>$N$H$3$m$G$OL5\>r7o$Ge(Brb\_raisee$B$r;H$Ce(B  
> e$B$F$$$k$N$G!“e(B1.2e$B0JA0$G$b%@%a$J$O$:$G$9!#$D$^$j!”$b$&e(B1.4e$B0JA0$G$Oe(B  
> e$B;H$o$l$F$$$J$$!”$H$_$J$7$F$b$$$$$N$G$O!#e(B

e$B0JA0$N%P!\<%8%g%s$Ne(B Ruby  
e$B$GF0$/$+$I$&$+$OA4A33NG’$7$F$J$+$C$?$N$G$9$,!“e(B  
e$B$”$($F0U?^E\*$KF0$+$J$/$9$k$h$&$JJQ99$O$7$J$/$F$b$$$$$+$J$!!De(B  
e$B$/$i$$$N46e(B  
e$B$8$G$=$N$^$^$K$7$F$^$7$?!#e(B

e$B$I$&$;F0:n$7$F$J$$$N$J$i!"e(BMySQL/Ruby 2.8 e$B$K$D$$$F$O!“e(B1.8.x  
e$B0J\>e$G$7$+F0e(B  
e$B$+$J$$$H$$$&A0Ds$K$7$F!”%=!\<%9$r@0M}$7$F$b$$$$$G$9$M!#e(B

e$B%Q%C%A$NCf$G!"e(BRSTRING(str)-\>ptr, RSTRING(str)-\>len e$B$re(B  
RSTRING\_PTR(str), RSTRING\_LEN(str) e$B$KJQ$($F$$$k$N$O!"e(BRuby 1.9  
e$B$@$H%^%:e(B  
e$B$$$C$F$3$H$G$9$+$M!#$J$s$+%^%:$=$&$G$9$M!D!#e(B

e$B$[$$3$N$^$^%Q%C%A$r\<h$j9~$^$;$F$$$?$@$/$H;W$$$^$9!#$"$j$,$H$&$4$6$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 20, 2008, 7:39am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751/3 "2008-06-20T07:39:08Z")

</div>

e$B$H$\_$?$G$9!#e(B

On Fri, 20 Jun 2008 14:04:26 +0900  
e$B$H$\_$?$^$5$R$me(B [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> e$B%Q%C%A$NCf$G!"e(BRSTRING(str)-\>ptr, RSTRING(str)-\>len e$B$re(B  
> RSTRING\_PTR(str), RSTRING\_LEN(str) e$B$KJQ$($F$$$k$N$O!"e(BRuby 1.9 e$B$@$H%^%:e(B  
> e$B$$$C$F$3$H$G$9$+$M!#$J$s$+%^%:$=$&$G$9$M!D!#e(B

e$B$“$l!)e(B MySQL/Ruby 2.8 e$B$G$O!”$A$c$s$He(B RSTRING\_PTR,  
RSTRING\_LEN e$B$K$J$C$F$^$9$M!D!#e(B  
[ruby-dev:35152] e$B$N%Q%C%A$Oe(B MySQL/Ruby 2.7.5  
e$B$KBP$9$k$b$N$\_$?$$$G$9!#e(B

e$B$^$“!”$=$l$O$=$l$H$7$F!"\<h$j9~$a$k$H$3$m$O\<h$j9~$\_$?$$$H;W$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 20, 2008, 8:22am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751/4 "2008-06-20T08:22:36Z")

</div>

e$B$J$+$@$G$9!#e(B

At Fri, 20 Jun 2008 14:36:52 +0900,  
e$B$H$\_$?$^$5$R$me(B wrote in [ruby-dev:35186]:

> e$B$"$l!)e(B MySQL/Ruby 2.8 e$B$G$O!"$A$c$s$He(B RSTRING\_PTR, RSTRING\_LEN e$B$K$J$C$F$^$9$M!D!#e(B  
> [ruby-dev:35152] e$B$N%Q%C%A$Oe(B MySQL/Ruby 2.7.5 e$B$KBP$9$k$b$N$\_$?$$$G$9!#e(B

2.8e$B$N$D$b$j$G$7$?$,!“e(B2.7.5e$B$N$b0l=o$KAw$C$F$7$^$$$^$7$?!#e(B2.8e$BMQ$Ne(B  
e$B%Q%C%A$Oe(B2.7.5e$BMQ$N%Q%C%A$N8e$K$”$j$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [June 20, 2008, 8:46am UTC](https://www.ruby-forum.com/t/patch-for-mysql-ruby/140751/5 "2008-06-20T08:46:50Z")

</div>

e$B$H$\_$?$G$9!#e(B

On Fri, 20 Jun 2008 15:19:53 +0900  
Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 2.8e$B$N$D$b$j$G$7$?$,!“e(B2.7.5e$B$N$b0l=o$KAw$C$F$7$^$$$^$7$?!#e(B2.8e$BMQ$Ne(B  
> e$B%Q%C%A$Oe(B2.7.5e$BMQ$N%Q%C%A$N8e$K$”$j$^$9!#e(B

e$B$“!”$"$j$^$7$?!#$9$$$^$;$s!#e(B

e$B%Q%C%A$=$N$^$^$@$He(B rb\_str\_set\_len() e$B$,$J$$4X78$G!"e(B1.8.6  
e$B$GF0$+$J$+$C$?e(B  
e$B$N$G!"D4@0$7$F\<h$j9~$\_$^$7$?!#e(B
