The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

LEOCHARRE::Database - common database methods for oo

SYNOPSIS

Mymod.pm:

   package Mymod;
   use base 'LEOCHARRE::Database';

   1;

script.pl:

   use Mymod;

   my $m = new Mymod({ 
      DBHOST => 'localhost' , 
      DBUSER => 'username',
      DBPASSWORD => 'passwerd',
      DBNAME => 'superdb',
   });

   $m->dbh;

   my $a = $m->dbh_sth('select * from avocado where provider = ?');
   $a->execute(3);

   $m->dbh_sth('INSERT INTO fruit (name,provider) values(?,?)')->execute('grape','joe'); # gets prepared and cached
   
   $m->dbh_sth('INSERT INTO fruit (name,provider) values(?,?)')->execute('orange','joe'); # uses the previous cached prepared handle

DESCRIPTION

This is meant to be used as base by another oo module.

This can be passed an open database handle via DBH or it will attempt to open a new connection. By default it attempts to open a mysql connection. It can also open a sqlite connection.

Basically, if you provide the argument DBABSPATH, will attempt to open a mysql connection instead.

PLEASE NOTE autocommit is off. DESTROY calls commit and finishes and closes handles.

These and any other modules under my name as namespace base (LEOCHARRE) are parts of code that I use for doing repetitive tasks. They are not bringing anything really new to the table, and I wouldn't assume that 'my way' is the way to attack these problems by any stretch of the imagination. This is why I place them under my namespace, as a gesture of deference.

To open a mysql connection

   new ({ 
      DBHOST => $host,
      DBNAME => $dbname,
      DBUSER => $dbuser,
      DBPASSWORD => $pw,
   });

To open a sqlite connection

   new ({ 
      DBABSPATH => '/home/myself/great.db',
   });

To use existing connection

   new ({ 
      DBH => $dbh,
   });

METHODS

These are meant to be inherited by your module with

   use base 'LEOCHARRE::Database';

dbh()

returns database handle

dbh_selectcol()

argument is statement will select and return array ref

   my $users = $self->dbh_selectcol("SELECT user FROM users WHERE type = 'm'");

Now users has ['joe','rita','carl']

This is useful sometimes.

dbh_do()

argis hash ref with mysql and sqlite keys

will select one or the other with dbh_is_mysql etc

   $self->dbh_do({
      sqlite => 'CREATE TABLE bla( name varchar(25) )',
      mysql  => 'CREATE TABLE bla( name varchar(25) )',  
   });

dbh_count()

argument is statement returns count number you MUST have a COUNT(*) in the select statement

   my $matches = $self->dbh_count('select count(*) from files');

dbh_sth()

argument is a statment, returns handle it will cache in the object, subsequent calls are not re-prepared

   my $delete = $self->dbh_sth('DELETE FROM files WHERE id = ?');
   $delete->execute(4);
   
   # or..
   for (@ids){
      $self->dbh_sth('DELETE FROM files WHERE id = ?')->execute($_);
   } 

If the prepare fails, confess is called.

dbh_is_mysql()

returns boolean

dbh_is_sqlite()

returns boolean

dbh_driver()

returns name of DBI Driver, sqlite, mysql, etc. Currently mysql is used, sqlite is used for testing. For testing the package, you don't need to have mysqld running.

dbh_table_exists()

argument is table name, returns boolean

dbh_table_dump()

argument is table name returns string of dump of table suitable for print to STDERR

dbh_droptable()

arg is table name, drops the table. returns boolean will drop IF EXISTS

dbh_lid()

arg is table name, returns last insert id. returns undef if not there

dbh_close_active_handles()

closes ChildHandles that are active, finishes and undefines them. returns true + number of active handles were finished and undefined here

DESTROY()

If the database handle was created in this object and not passed via constructor, then we close all handles, commit, and disconnect.

finishes active database handles etc, makes a commit to the database. Note, this method is called automatically.

CAVEATS

IMPORTANT NOTE AUTOCOMMIT

Autocommit is set to 0 by default. That means you should commit after indexing_lock(), indexing_lock_release(), delete_record()

DESTROY will finish and commit if there are open handles created by the object

DEBUG

To turn on debug,

   $LEOCHARRE::Database::DEBUG = 1;

SEE ALSO

LEOCHARRE::CLI LEOCHARRE::Dev DBI

AUTHOR

Leo Charre leocharre at cpan dot org http://leocharre.com

COPYRIGHT

Copyright (c) 2008 Leo Charre. All rights reserved.

LICENSE

This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself, i.e., under the terms of the "Artistic License" or the "GNU General Public License".

DISCLAIMER

This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the "GNU General Public License" for more details.