Friday, August 18, 2006

Ruby กับ Ingres

หลังจอเฝ้ารอว่าจะมีใครเขียน adapter ให้ ruby สามารถคุยกับ ingres ได้
ในที่สุด ก็รอไม่ไหว หันไปหาทางเลือกอื่น
นั่นคือ ช่องทาง 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 ด้วย)

Related link from Roti

No comments: