Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re: Database Search Approaches

by Ven'Tatsu (Deacon)
on Aug 23, 2005 at 21:17 UTC ( #486020=note: print w/replies, xml ) Need Help??

in reply to Database Search Approaches

I would set up a factory method in Searchable that is configured external to your program. Since you are already dealing with a database that is ideal. Set up a table with 2 columns (or more if you have a reason to) one the primary key lists the table names you want to have searchable, the second holds the name of the module to handle that table. Then the factory function would be something like this:
#called as Searchable->getTableHandler($table); sub getTableHandler { my $class = shift; my $table = shift; #get $handlerClass from db eval "use $handlerClass;"; #deal with errors return $handlerClass->new($table); }
The advantages of this is that you don't have to alter the main script any time you want to add a table, and there is only one place new tables and modules need to be added. Down sides are that it uses string eval to pull in the module at run time, that can cause delays as the compiler fires up again, and it risks that if someone gets some malicious code into your configuration you could have a serious problem.

Replies are listed 'Best First'.
Re^2: Database Search Approaches
by Tanktalus (Canon) on Aug 23, 2005 at 23:42 UTC

    I'm not sure why everyone keeps using string eval to load modules. Heck, even UNIVERSAL::require does it, which confounds the heck out of me.

    sub my_require { my $class = shift; (my $pm = $class) =~ s(::)(/); $pm .= '.pm'; require $pm; # optional: # $class->import(); }
    Then it's as simple as eval { my_require($handlerClass); }. Eliminating all the delays and risks of string eval. Of course, if someone can put a new module in your @INC and update your table, that someone could be malicious, but I don't think there's much that you can do about that.

Re^2: Database Search Approaches
by saberworks (Curate) on Aug 23, 2005 at 21:20 UTC
    In this case I could just query the filesystem directly for a list of Searchable/*.pm modules.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://486020]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (4)
As of 2022-08-08 09:25 GMT
Find Nodes?
    Voting Booth?

    No recent polls found