ארכיון יומי: 17 מאי, 2010

טיפ לעצמי: Jruby + Firebird Events

עוד טיפ עצמי בסדרה ל JRuby, הפעם איך לתרגם את הקוד הבא בג'אווה לקוד רובי 🙂 כמו שאפשר לראות, זה דורש פחות שורות קוד לאותו הדבר בדיוק.

קוד הרובי:

#!/usr/bin/env jruby
require 'rubygems'
require 'java'
require 'date'

class Test
  def initialize
    @event_manager = org.firebirdsql.event.FBEventManager.new(Java::org.firebirdsql.gds.impl.GDSType.getType('PURE_JAVA'))
    @event_manager.setDatabase('/tmp/jtest.fdb')
    @event_manager.setUser('sysdba')
    @event_manager.setPassword('masterkey')
  end

  def run
    @event_manager.connect
    @event_manager.addEventListener('new_user', self)
    while (true)
      sleep(1)
    end
  end

  def eventOccurred(event)
    puts "[#{DateTime.now.to_s}] #{event.getEventName()}"
  end
end

test = Test.new
test.run

חשוב להבהיר כי למרות ש eventOccurred אינו חוקי כל כך ברובי, אבל הוא מאשר את זה בכל זאת, רק ה IDE שאני משתמש בו לא מאושר מזה כל כך 🙂

טיפ לעצמי: שימוש בjruby ו jdbc לעבודה עם firebird ו dbi

אני ממשיך בניסויים שלי עם jruby וכמובן FirebirdSQL. הרבה אנשים לא מבינים למה, אז התשובה היא פשוטה: אני מחפש כלים פשוטים, אמינים שעושים לי חיים קלים לתחזוקה ועבודה. השימוש ב JRuby הוא כאמור בגלל התמיכה שלו ב thread, אבל אם כבר משתמשים ב JVM, אז בואו נשתמש בזה איפה שאפשר להנות ממנו בכל מקום, ולכן השימוש שלי עם Firebird הוא באמצעות JDBC. בחרתי דווקא ב DBI ולא ב ActiveRecord בגלל שהתמיכה של ActiveRecord ב JDBC ממש לא עובדת לי כמו שצריך (ניסיתי עם עוד כמה מסדי נתונים), ואחרי יותר מידי שעות של מאבקים שבהם אפילו הצלחתי להרוס לגמרי את PosgreSQL (המסד נתונים הנוסף שניסיתי) בצורה שגם הסרה מלאהו התקנה מחודשת לא מתקנת, נשברתי ואני חוזר לעבוד עם DBI ו JDBC. כאן לקח לי מאוד מהר לגרום לדברים לעבוד כמו שצריך (פחות מ10 דקות במקום 8 שעות של אתמול והיום מאבק עם ActiveRecord).

הקוד לעבודה כאן מאוד קל ופשוט (אותו מסד נתונים כמו אתמול, רק היום אני משתמש כבר ב alias):

#!/usr/bin/env jruby

require 'rubygems'
require 'java'
require 'dbi'

dbh = DBI.connect('DBI:Jdbc:firebirdsql:localhost:jtest',
'sysdba', 'masterkey', 'driver' => 'org.firebirdsql.jdbc.FBDriver')

begin
  puts dbh.select_one "SELECT name FROM users"
ensure
  dbh.disconnect if (not dbh.nil? && dbh.connected?)
end

וכאמור זה עובד כבר מפעם הראשונה שניסיתי.