Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: [Caml-list] ANNOUNCE: Wiki software written in OCaml
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Richard Jones <rich@a...>
Subject: Re: [Caml-list] ANNOUNCE: Wiki software written in OCaml
On Fri, Jul 30, 2004 at 02:03:20PM +0200, Sven Luther wrote:
> Mmm, i adapted it to ocaml 3.08, and added the missing ocamldbi
> build-dependency, since it failed somehow because of a double -I in the
> Makefile.
> 
> Now, it fails with :
> 
> ocamlc -linkall -custom -g -w s -I /usr/lib/ocaml/3.08/pcre -I
> /usr/lib/ocaml/3.08/dbi -I /usr/include/apache-1.3 -I
> /usr/lib/ocaml/3.08/postgres postgres.cma dynlink.cma str.cma pcre.cma
> unix.cma dbi.cma mod_caml_c.o mod_caml.cmo apache_c.o wrappers.o apache.cmo
> mod_caml_config.cmo cgi_escape.cmo template.cmo cgi.cmo -o mod_caml.so \
>   -cclib "-fPIC -shared -L/usr/lib/ocaml/3.08/postgres -lpostgres -lpq
>   -lcamlrun -ltermcap -lunix -lstr "
>   Error while linking /usr/lib/ocaml/3.08/dbi/dbi.cma(Dbi_mysql):
>   Reference to undefined global `Mysql'
>   make[1]: *** [mod_caml.so] Erreur 2

Yes, this is interesting ...

It's because Dbi is built (by John) with MySQL support.  Thus
/usr/lib/ocaml/*/dbi/dbi.cma contains a module (Dbi_mysql) which
depends on (the OCaml module) Mysql.

John's libdbi-ocaml package suggests libmysql-ocaml-dev, but doesn't
require it.  This works fine provided you're just linking a standalone
program against the Dbi library, because unless the standalone program
deliberately links against Dbi_mysql, nothing will attempt to load the
missing Mysql module.

So far, so good.  Now here's the problem: ocamldbi contains a
mechanism to build handles of any type (Dbi.Factory.connect "postgres"
"store") for example, which is implemented using a complex
registration mechanism.  mod_caml requires this, because it provides a
way to pool database handles between requests.

Dbi.Factory loads any available module, depending on how it was
compiled.  Thus when you link mod_caml, and if ocamldbi was compiled
to depend on Mysql, then mod_caml depends on Mysql too!

So the upshot is that libmysql-ocaml-dev is a real dependency, not
just a 'Suggest:'ion.

-----

I'm not really sure how to solve properly this at the moment.

This was all written before I really understood functors.  I suspect
that a functorized approach would be much better, because it is highly
unlikely that you really want a pool of database handles pointing to
different _types_ of database (ie. a mixture of PostgreSQL and MySQL
handles).  (If you did want this, just use two pools, and manage it
yourself).

Suggestions welcome ...

Rich.

-- 
Richard Jones. http://www.annexia.org/ http://www.j-london.com/
Merjis Ltd. http://www.merjis.com/ - improving website return on investment
C2LIB is a library of basic Perl/STL-like types for C. Vectors, hashes,
trees, string funcs, pool allocator: http://www.annexia.org/freeware/c2lib/

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners