On Tuesday 24 August 2010 16:52:10 P Kishor wrote:
1. Getting db settings. Initially, I thought I could use Dancer::Plugin::Database, so the same method could be used in the main Dancer application as well as in my session plugin. However, I have the following problems with D::P::Database -- (1) it doesn't really work in D::Session::SQLite. I get the error that database method is not declared (or something like that);
With current Dancer versions, keywords defined by a plugin are exported only to the Dancer app which loaded the plugin, not to other plugins (or other scripts loaded by the app). This is an annoying bug, and one which I hope to fix soon, if it hasn't been sorted already (I've been on holiday for two weeks, so don't yet know what's changed while I was away).
and (2) it changes the regular, more familiar DBI methods. In fact, I am not even sure how I would do more DBI-ish things with it, such as transactions, etc. So, this is a different issue, but for now, I am tabling Dancer::Plugin::Database.
Actually, it doesn't change anything about DBI other than taking away the work of connecting to the database. Calling the database() keyword simply returns a connected, ready to use DBI connection handle. It may have been freshly connected, or it may be re-using the existing connection, but either way, you'll get a DBI connection handle to use as normal, so you might write something like: my $sth = database()->prepare('select * from table....'); $sth->execute(); .... This is all documented in the documentation for D::P::Database. I'm considering adding a few utility methods to D::P::Database to simplify some operations, but it will never prevent you from doing things in the usual DBI way, other than the initial connection to the database, which is what the plugin is designed to simplify.
2. This is more of a show-stopper. I am getting a lock on my database everytime a new session is inserted.
That's to be expected with SQLite; the entire database is contained in a single file, which is locked when you connect to it.
So, I am trying to figure out where to disconnect the db manually, but I don't really understand the sequence of actions that Dancer::Session takes. I have the following methods in my module [...]
In order to avoid it being locked, you'd probably need to disconnect in flush() after storing the session data, and probably in retrieve() right after fetching the session data too. This could result in many repeated connection & disconnections, but may be the only way to reliably use SQLite without incurring locking problems. Cheers Dave P -- David Precious <davidp@preshweb.co.uk> http://blog.preshweb.co.uk/ www.preshweb.co.uk/twitter www.preshweb.co.uk/linkedin www.preshweb.co.uk/facebook www.preshweb.co.uk/identica www.lyricsbadger.co.uk "Programming is like sex. One mistake and you have to support it for the rest of your life". (Michael Sinz)