The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

#  EvilBoss-api - API for creating FTN-tools
#
#  EBDatabase.pm - work with databases (PostgreSQL/MySQL/mSQL)
#
#  Copyright (c) 2004-2005 Alex Soukhotine, 2:5030/1157
#	
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  $Id$

package EvilBoss::Database;

require Exporter;
require DBI;
use Fcntl qw(:flock);
require EBConfig;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

$VERSION = 1.01;

@ISA=qw(Exporter);
#@EXPORT = qw(&f1 &f3 &name);
%EXPORT_TAGS=();

#@EXPORT_OK = qw(&name);

my $tmpfile		= ''; 
my $SQLConnectStr	= '';
my $dbh			= undef;
my $sth			= undef;
my $state		= 0;

sub new
{
 my $classname = shift;
 my $self = {};
 bless($self,$classname);
 my $cfg=$_[0];
 $tmpfile=$cfg->{TempDir}."/EBmSQL.tmp";
 $SQLConnectStr="DBI:".$cfg->{DBType}.":";
 
 if ($cfg->{DBType} eq "mSQL")
 {
  $SQLConnectStr .= $cfg->{DBName};
  $cfg->{DBUser} = undef;
  $cfg->{DBPass} = undef;
  if (open(TMP,">$tmpfile"))
  {
   print "Locking temporary file...\n\n";
   flock(TMP,LOCK_EX);
  } 
 }
 elsif ($cfg->{DBType} eq "mysql")
 {
  $SQLConnectStr .= $cfg->{DBName}.":".$cfg->{DBHost}.":".$cfg->{DBPort};
 }
 elsif ($cfg->{DBType} eq "Pg")
 {
  $SQLConnectStr .= "dbname=".$cfg->{DBName}.";host=".$cfg->{DBHost}.";port=".$cfg->{DBPort};
 } 
 
 $dbh = DBI->connect($SQLConnectStr,$cfg->{DBUser},$cfg->{DBPass},{ PrintError => 0, RaiseError => 0 }); 
 
 $state=1 if ($dbh);
 
 return $self;
}

sub DESTROY
{
 my $self = shift;
 if ($state)
 {
  $dbh->disconnect;
  $state=0;
 } 
}

sub state
{
 my $self = shift;
 return 1 if ($state);
 return 0;
}

sub dbh
{
 return $dbh;
}

sub quick_fetchrow
{
 my $self = shift;
 my $sth,$tmp;
 if ($dbh)
 {
  $sth=$dbh->prepare($_[0]);
  $sth->execute;
  $tmp=$sth->fetchrow;
  $sth->finish;
 } 
 return $tmp;
}


sub query
{
 my $self = shift;
 $sth=$dbh->prepare($_[0]);
 $sth->execute;
}

sub end_query
{
 my $self=shift;
 $sth->finish;
 $sth=undef;
}

sub fetchrow
{
 my $self = shift;
 my $tmp;
 if ($dbh && $sth)
 {
  $tmp=$sth->fetchrow;
 } 
 return $tmp;
}

sub fetchrow_array
{
 my $self = shift;
 my @tmp;
 if ($dbh && $sth)
 {
  @tmp=$sth->fetchrow_array;
 } 
 return @tmp;
}

sub fetchrow_hashref
{
 my $self = shift;
 my %tmp;
 if ($dbh && $sth)
 {
  %tmp=$sth->fetchrow_hashref;
 }
 return %tmp;
}
	

sub quick_fetchrow_array
{
 my $self = shift;
 my $sth,@tmp;
 if ($dbh)
 { 
  $sth=$dbh->prepare($_[0]);
  $sth->execute;
  @tmp=$sth->fetchrow_array;
  $sth->finish;
 } 
 return @tmp;
}

sub quick_fetchrow_hashref
{
 my $self = shift;
 my $sth,%tmp;
 if ($dbh)
 {
  $sth=$dbh->prepare($_[0]);
  $sth->execute;
  %tmp=$sth->fetchrow_hashref;
  $sth->finish;
 }
 return %tmp;
}
	      

1;