On 5/23/06 2:36 AM, [EMAIL PROTECTED] wrote:
> this is pretty generic 3nf 'crap' tables -- stuff like
>
> table filetype: id | name
> table accounttype: id | name
>
> about 10 tables, ~200 id:name pairigs total. bs stuff. using straight
> sql in the framework i built though, i learned pre-caching that stuff
> saved a visible bit on postgres queries and almost no performance hit in
> perl. so i do that.
You could do that with Rose::DB::Cached. In fact, that's exactly what it's
for: caching "read-only" data. Example:
# Set up your ::Cached base class for all cached objects
package My::DB::Object::Cached;
use base 'Rose::DB::Object::Cached';
...
sub init_db { ... }
# Make a cached class for the filetype table
package My::FileType;
use base 'My::DB::Object::Cached';
...
# Make a manager class for My::FileType
package My::FileType::Manager;
use base 'Rose::DB::Object::Manager';
...
# On server start-up, cached all file types
my $fts = My::FileType::Manager->get_filetypes();
foreach my $ft (@$fts) { $ft->remember } # Cache them all
>From that point on, finding the name of a filetype id can be done like this:
# Does not hit the db at all
$name = My::FileType->new(id => 123)->load->name;
Of course, you can wrap that in a function to make it look nicer.
> am i correct in assuming that the only way to accomplish what I want to do
> ( add some new arbitrary fields to a result returned by a load; or
> get_magagerclass() ) is to clone the existing fieldnames into a new ,
> normal hash?
Just add methods to the row class itself. For example, if you have a
My::Doc class that fronts the "documents" table which has a filetype_id
column, and you want all the My::Doc objects to have a "filetype_name"
method, do this:
package My::Doc;
use base 'My::DB::Object';
...
use My::FileType;
sub filetype_name
{
my($self) = shift;
# Will not hit the db if all the My::FileType objects were
# cached on server start-up.
return My::FileType->new(id => $self->filetype_id)->load->name;
}
Then as you fetch each My::Doc object from a Manager method, you can just
call:
$doc->filetype_name
to get the file type as a name, and it won't hit the db at all.
-John
-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Rose-db-object mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object