〜Gauche on Railsへの道〜 2. ActiveRecord 風のものを作る。その4 〜

find(id) メソッドのデバック

やっと、Gauche on Railsのデバックが出来ました ^^)

原因は、クラス変数に相当するスロット(インスタンス変数)も、make (new) しないと作成されない事でした。
Java等と違い、クラス変数相当の :allocation :each-subclass、:allocation :class も基本的にはインスタンス変数なので、スロットを make するまでは作られません。

ということで、ActiveRecord 風のものが動くようになりました。

(define-method find ((klass <active-record-meta>)(id <integer>))
  (let* ((query (dbi-prepare (db-conn klass)
			     #`"select * from ,(table-name klass) where id = ?"))
	 (row (first-row (dbi-execute query id))))
    (set-ar-columns! (make klass) row)))

(define-method db-conn ((klass <active-record-meta>))
  (ar-slot-ref klass 'db-conn))

(define-method table-name  ((klass <active-record-meta>))
  (ar-slot-ref klass 'table-name))

(define-method ar-slot-ref ((klass <active-record-meta>)(name <symbol>))
  (if (class-slot-bound? klass 'initialized)
      (class-slot-ref klass name)
      (slot-ref (make klass) name)))

(define-method first-row ((self <collection>))
  (find (lambda(n) #t) self))

(define (set-ar-columns! ar row)
  (for-each (lambda(v n t)
	      (if v
		  (set! (ref ar (string->symbol n)) 
			(db-result->scheme-object v t))))
	    row
	    (ref ar 'column-names)
	    (ref ar 'column-types))
  ar)