# mySqlLib.pm
sub connectDb {
eval "use DBI 1.19;";
# exit to error eval
die [email protected] if [email protected];
# database-driver
my %DB = ( driver => 'mysql',
# database-host
host => 'localhost',
# database
name => 'asterisk',
# database-user
user => 'asterisk',
# database-user-passwort
passwort => '',
);
# stelle Verbindung zur Datenbank her und gebe Datenbank-handle nach $DBH zurück
my $DBH = DBI->connect("DBI:$DB{driver}:$DB{name}:$DB{host}", $DB{user}, $DB{passwort});
# Datenbank-Handle an Aufrufende zurückgeben
return $DBH;
}
# <--------------------- sub connectDb
# sub lesen aus Datenbank (mit dieser sub ist auch
# das schreiben in eine datenbank möglich)
#
# SYNTAX:
# my %request = readDb("[SQL-SYNTAX]");
sub readDb {
# SQL-SYNTAX holen
my $SYNTAX = shift;
# Datenbank connect
my $DBH = connectDb();
# Datenbank auslesen, Daten in %DB_REQ zurückgeben
my %DB_REQ=&readDbMore($DBH,$SYNTAX);
# Datenbank disconnect
disconnectDb($DBH);
# %DB_REQ an Aufrufende zurückgeben
return %DB_REQ;
} # <--------------------- sub readDb
# sub schreiben in Datenbank
#
# SYNTAX:
# doDb("[SQL-SYNTAX]");
sub doDb {
# SQL-SYNTAX holen
my $SYNTAX = shift;
# Datenbank connect
my $DBH = connectDb();
# SQL-Anfrage ausführen
$DBH->do($SYNTAX);
# Datenbank disconnect
disconnectDb($DBH);
# true zurückgeben (ist nur der Form
# halber oder wenn Abfragen, ob IO enthalen)
return 1;
} # <--------------------- sub doDb
# sub lesen aus Datenbank (mit dieser sub ist auch
# das schreiben in eine datenbank möglich)
# Diese Sub ist anzuwenden, wenn man mehrere Anfragen
# an eine Datenbank hat und nicht jedesmahl neu connecten will (Zeit)
#
# SYNTAX:
# my %request = readDbMore($Datenbank-Handle,"[SQL-SYNTAX]");
sub readDbMore {
# Datenbank-Handle holen
my $DBH = shift;
# SQL-SYNTAX holen
my $SYNTAX = shift;
# globale Variablen deklarieren (sind nur in der Sub gültig)
my (@COLUMNS,$TABLE);
# SYNTAX parsen, um zu prüfen, ob eine select-Anweisung. Wenn ja, dann ...
if ($SYNTAX=~/^select (.*) from ([\S]*)( .*)?/i) {
# Feldnamen und Tabellennamen holen ...
my $COLUMNS=$1; $TABLE=$2;
# wenn Feldnamen explizit angegeben, dann ...
unless ($COLUMNS=~/\*/) {
# Feldnamen ...
$COLUMNS=~s/[ \`\"\']//g;
# holen und in ARRAY @COLUMNS zurückgeben
@COLUMNS=split(/,/,$COLUMNS);
# wenn Feldnamen nicht explizit angegeben, als alle Felder
# (SQL-SYNTAX: select * from ....), dann ...
} else {
# die Feldnamen aus der Tabelle selbst abfragen
# (hier SQL-SYNTAX vorbereiten)
my $STH = $DBH->prepare("show columns from $TABLE");
# hier Anfrage an die Datenbank senden
$STH->execute();
# Rückgabewerte der Datenbank in @FIELDS zurückgeben
while (my @FIELDS = $STH->fetchrow_array()) {
# Feldnamen in @COLUMNS speichern
push @COLUMNS ,$FIELDS[0];
}
# Datenbankabfrage beenden
$STH->finish();
}
}
# eigendliche Datenbankanfrage vorbereiten (nur wenn $SYNTAX angegeben)
my $STH = $DBH->prepare($SYNTAX) if $SYNTAX;
# Hash für Rückgabewert an Aufrufende deklarieren
my %DB_REQ;
# hier Anfrage an die Datenbank senden
$STH->execute();
# internen Zähler für Zeilen mit 0 deklarieren
my $II=0;
# Rückgabe der Datenbank zeielenweise durchgehen
while (my @FIELDS = $STH->fetchrow_array()) {
# dabei die Anzahl der Feldnamen berücksichtigen
# (dient zur Aufbereitung des Rückgabewertes für Aufrufende)
for (my $I=0;$I<=$#FIELDS ;$I++) {
# einzelne Felder in 2 Dimensionen
# (1. Rückgabezeile/Datenbankzeile, 2. Feldname)
# im Hash %DB_REQ speichern
$DB_REQ{$II}{$COLUMNS[$I]}=$FIELDS[$I];
}
# Zähler für Zeilen ikrementieren
$II++;
}
# Datenbankabfrage beenden
$STH->finish();
# Mehrdimensionalen Hash an Aufrufende zurückgeben
return %DB_REQ;
} # <--------------------- sub readDbMore
# sub connect Database
sub disconnectDb {
# Datenbank-Handle holen
my $DBH=shift;
# Datenbank disconnect
$DBH->disconnect();
} # <--------------------- sub disconnectDb
# true für require
1;
# ----------------------------------------------------------------------------------------------------