[Dancer-users] Dancer::Session::SQLite

David Precious davidp at preshweb.co.uk
Tue Aug 24 19:31:30 CEST 2010

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....');

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.


Dave P

David Precious <davidp at 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)

More information about the Dancer-users mailing list