ในที่สุด ก็รอไม่ไหว หันไปหาทางเลือกอื่น
นั่นคือ ช่องทาง ODBC
solution ก็คือ
- unixODBC
อันนี้ไม่มีอะไรพิเศษ ติดตั้งได้จากพวก Package Manager ของ Distro ได้เลย
ประเด็นถัดมา ก็คือการสร้าง datasource
ถ้าสร้างด้วยมือ ดูจะโหดร้ายไปหน่อย
ingres ก็เลยเตรียม utility ที่ชื่อiiodbcadmn
- Ruby ODBC
ตัวนี้มีปัญหานิดหน่อย
ตรงวิธีที่เขาเขียน
เนื่องจากเขาเขียนโดยอิง mysql เป็นหลัก
พอมาใช้กับ database ตัวอื่น ก็อาจจะเป็นปัญหาบ้าง
ในกรณีของ ingres ถ้าลอง build แล้ว run testcase ดูจะพบ error นี้[pphetra@fedora ruby-odbc-0.9991]$ ruby test.rb sso
connect.............ok
create_table........ok
insert.............../test/20insert.rb:6:in `call': 37000 (2913)
[unixODBC][Ingres][Ingres ODBC Driver][Ingres]line 1, You cannot assign
a value of type 'varchar' to a column of type 'integer'.
Explicitly convert the value to the required type. (ODBC::Error)
from ./test/20insert.rb:6
from test.rb:20
from test.rb:16
ถ้าเข้าไปดูใน testcase จะเห็น code ที่มีปัญหา หน้าตาเป็นแบบนี้$p = $c.proc("insert into test (id, str) values (?, ?)") {}
$p.call(3, 'FOO')
ประเด็นที่เป็นปัญหา ก็คือวิธีที่ใช้ในการ binding parameter เข้ากับ statement
หลังจากไล่ source code ของ ruby-odbc ซักพัก ผมก็เจอจุด quickfix
ก็เลยแก้ง่ายๆลงไป@@ -6265,6 +6266,7 @@
if (coldef == 0) {
switch (ctype) {
case SQL_C_LONG:
+ stype = SQL_NUMERIC;
coldef = 10;
break;
case SQL_C_DOUBLE: - Ruby DBI
ตัวนี้ไม่มีอะไรพิเศษ
ผมเลือกลงแต่ dbd ที่ต่อเข้า ODBC อย่างเดียว
ขั้นตอนถัดไป ระหว่างรอให้มี ODBC Adapter(สำหรับ rails) ดีๆออกมา
ก็จะทดลองเขียน rails adapter ที่ต่อเข้ากับ ruby dbi ไปพลางๆก่อน
(ใช้ตัวอย่างจาก sqlserver adapter ที่มี mode ที่ใช้ odbc ด้วย)