Newbie questions about Pliant

Newbie questions about Pliant

Understanding the Database type

The Database type and the load method do not seem very
straightforward.
Message posted by maybe Gord Eagle on 2002/10/30 04:45:01
I'm trying to use the Database type in an application that must deal
with multiple (arbitrary number of) databases in the same process.
The current examples of using the database always put it
in a `gvar'.  I tried changing this to just a `var', or 
even a field inside another type, but I just got compile
errors.

I can't pass a Database to a function, either.

What do I need to do to make Databases more dynamic and less
anchored to a single gvar?
Message posted by maybe Hubert Tonneau on 2002/10/30 08:59:55
Why do you want to have many databases ?
Can you elaborate on the application you plan: I can hardly imagine an
application where many many databases are needed.
Message posted by maybe Gord Eagle on 2002/10/30 15:55:15
I'll have to think about that more.
Message posted by maybe Gord Eagle on 2002/10/30 16:12:28
Okay, I think I understand my problem better.

I have a module "/pledge/db.pli", which defines PledgeDatabase, and
other functions that are shortcuts to database fields or operations.

What I want is for the user of "/pledge/db.pli" to specify which
database to operate on (such as "file:/var/pliant/pledge-2001.pdb"
or "file:/var/pliant/pledge-2002.pdb").  I also need multiple
databases (probably not very many, but definitely more than one) at
a time in the same process (the web server).

I thought of doing this with a Pledge object that has "field Database:PledgeDatabase db"
within it.  Then, the user could create one of these objects, load
the file they like into the db field, and pass this object to the methods in
"/pledge/db.pli".

This failed with compile errors, presumably because the Database:PledgeDatabase
field is not a gvar.

I have a vague understanding of why this is not possible, but I would
really like to make it work somehow.  My current workaround is to
use a "gvar PledgeDatabase db", and have all the helper functions
ignore the Pledge object I pass, and just use the db directly.  Yuck.
Message posted by maybe Hubert Tonneau on 2002/10/30 19:06:12
What is the advantage of having several database files ?

Assuming that the type defining your database is 'PledgeDatabase',
then you can have something like:

type PledgeDatabases
  field Set:PledgeDatabase db

(gvar Database:PledgeDatabases pledge_databases) load "file:/var/pliant/pledge.pdb" mount "/pledge/db"

so you end with a set of databases, all stored in a single file.

Anyway, if you really need each database to be stored in a different file, it
is still possible to use the Pliant database engine 'split_field' mechanism,
but it's not recommended unless your overall database is very large.

Message posted by maybe Gord Eagle on 2002/11/01 02:51:10
Why does

type Transfer
  field Str from
  field Str to
type PledgeDatabase
  field Set:Transfer xfer
gvar Database:PledgeDatabase db
db load "file:/var/fig/pledge.pdb"
db:data
gvar (Pointer Database:PledgeDatabase) db2 :> db
db2:data

give a compile error on the db2:data line?
Message posted by maybe Hubert Tonneau on 2002/11/01 10:21:09
Just change:
  gvar (Pointer Database:PledgeDatabase) db2 :> db
with
  gvar (Link Database:PledgeDatabase) db2 :> db

A database is a true Pliant object, and it uses generic methods, you need a
link to access it.
Message posted by maybe Gord Eagle on 2002/11/11 00:41:07
Thank you, that was exactly the problem.  I also learned that
`oarg_rw' was necessary instead of just `arg_rw' when passing a
database to a function (as you said, a matter of generic functions).