Shiro Kawai
shiro****@lava*****
2006年 6月 13日 (火) 08:38:26 JST
ああわかった。しばらく、なぜこうなるのか悩んでしまいました。 requireに渡るのがモジュールのフルパス名で、モジュール内で provideされるパス名と違うために、dbi-make-driverする度に mysql.scmが再ロードされてしまっていたのですね。 わざわざlibrary-foldを使った理由を思い出せないんですが、 何か将来の機能追加を頭に置いていたのかもしれません。 でも現状でmodule-name->pathを使うのと差は無いので、 module-name->pathを使うようにします。 --shiro From: Tatsuya BIZENN <bizen****@arthu*****> Subject: [Gauche-devel-jp] dbi-make-driver Date: Tue, 13 Jun 2006 07:56:23 +0900 > 備前です。 > > DBIのドキュメントの<dbi-driver>のサブクラスを実装 > しなければならないという説明の一部として > > Usually this class produces a singleton instance, > and is only used to dispatch dbi-make-connection > method below. > > と書かれています。で、それもそうだということで、 > <mysql-driver> を次のようにしてみました。 > > (define-class <mysql-driver> > (<dbi-driver> <singleton-mixin>) > ()) > > が、dbi-make-driver は毎回違うオブジェクトを返し、 > シングルトンインスタンスにならないようです。 > > gosh> (use dbi) > #<undef> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x60e050> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x6c8c40> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x56d410> > gosh> > > そこで、次のようなパッチをdbi.scm に当ててみたところ、 > 今度はシングルトンになりました。 > > Index: lib/dbi.scm > =================================================================== > RCS file: /cvsroot/gauche/Gauche/lib/dbi.scm,v > retrieving revision 1.32 > diff -u -r1.32 dbi.scm > --- lib/dbi.scm 9 Mar 2006 21:53:06 -0000 1.32 > +++ lib/dbi.scm 12 Jun 2006 22:51:12 -0000 > @@ -218,22 +218,14 @@ > ;; Loads a concrete driver module, and returns an instance of > ;; the driver. > (define (dbi-make-driver driver-name) > - (or (and-let* ((module&path (library-fold > - (string->symbol #`"dbd.,driver-name") > - (lambda (m p s) (cons m p)) #f)) > - (module (car module&path)) > - (path (cdr module&path)) > - (class-name (string->symbol #`"<,|driver-name|- > driver>")) > - > - (driver-class > - (begin (eval `(require ,(path-sans-extension path)) > - (current-module)) > - (global-variable-ref module class-name #f))) > - ) > - (make driver-class :driver-name driver-name)) > - (errorf <dbi-nonexistent-driver-error> > - :driver-name driver-name > - "couldn't load driver dbd.~a" driver-name))) > + (guard (e (else (errorf <dbi-nonexistent-driver-error> > + :driver-name driver-name > + "couldn't load driver dbd.~a" driver-name))) > + (let* ((module (string->symbol #`"dbd.,driver-name")) > + (path (module-name->path module)) > + (class-name (string->symbol #`"<,|driver-name|-driver>"))) > + (eval `(require ,path) (current-module)) > + (eval `(with-module ,module (make ,class-name :driver- > name ,driver-name)) (current-module))))) > ;; Default prepared-SQL handler > ;; dbi-prepare-sql returns a procedure, which generates a complete sql > > 実行結果 > gosh> (use dbi) > #<undef> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x689630> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x689630> > gosh> (dbi-make-driver "mysql") > #<<mysql-driver> 0x689630> > gosh> > > 何かわたしが勘違いしている可能性もありますが、こちらの方が > いいんじゃないかと思うので、一応提案させていただきます。 > > -- > 備前 達矢 > > > _______________________________________________ > Gauche-devel-jp mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp >