2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-13 15:19:52 +00:00

configdb - lots of code cleanup

- removed no longer needed coding
- added complete list of forward declarations
- melted search and list into one function


git-svn-id: https://svn.fhem.de/fhem/trunk@5845 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
betateilchen 2014-05-13 14:18:01 +00:00
parent cc0c3c5b7b
commit 324a1df4ef
2 changed files with 90 additions and 155 deletions

View File

@ -206,24 +206,6 @@ sub CommandConfigdb($$) {
$ret = _cfgDB_Fileexport $filename;
}
# when ('fileimport') {
# return "\n Syntax: configdb fileimport <pathToFile>" if @a != 2;
# my $filename;
# if($param1 =~ m,^[./],) {
# $filename = $param1;
# } else {
# $filename = $attr{global}{modpath};
# $filename .= "/$param1";
# }
# if ( -r $filename ) {
# $ret = _cfgDB_Fileimport $filename;
# } elsif ( -e $filename) {
# $ret = "\n Read error on file $filename";
# } else {
# $ret = "\n File $filename not found.";
# }
# }
when ('fileimport') {
return "\n Syntax: configdb fileimport <pathToFile>" if @a != 2;
my $filename;
@ -286,7 +268,7 @@ sub CommandConfigdb($$) {
$param1 = $param1 ? $param1 : '%';
$param2 = $param2 ? $param2 : 0;
Log3('configdb', 4, "configdb: list requested for device: $param1 in version $param2.");
$ret = _cfgDB_List($param1,$param2);
$ret = _cfgDB_Search($param1,$param2,1);
}
when ('migrate') {

View File

@ -75,39 +75,62 @@
#
# 2014-05-11 - removed binfileimport
# changed store all files as binary
# added _cfgDB_move to move all files from text
# added _cfgDB_Move to move all files from text
# to binary filesave on first load of configDB
#
# 2014-05-12 - added sorted write & read for config data
#
##############################################################################
#
use DBI;
#use Data::Dumper; # for debugging only
##################################################
# Forward declarations for functions in fhem.pl
#
sub AnalyzeCommandChain($$;$);
sub AttrVal($$$);
sub Debug($);
sub Log3($$$);
sub GlobalAttr($$$$);
##################################################
# Forward declarations inside this library
#
sub cfgDB_AttrRead($);
sub cfgDB_Init();
sub cfgDB_FileRead($);
sub cfgDB_FileUpdate($);
sub cfgDB_Fileversion($$);
sub cfgDB_FileWrite($@);
sub cfgDB_FW_fileList(@$);
sub cfgDB_Read99();
sub cfgDB_ReadAll($);
sub cfgDB_SaveCfg();
sub cfgDB_SaveState();
sub cfgDB_svnId();
sub _cfgDB_Connect;
sub _cfgDB_binFileimport($$;$);
sub _cfgDB_Connect();
sub _cfgDB_Diff($$);
sub __cfgDB_Diff($$$);
sub _cfgDB_InsertLine($$$$);
sub _cfgDB_Execute($@);
sub _cfgDB_Filedelete($);
sub _cfgDB_Fileexport($);
sub _cfgDB_Filelist(;$);
sub _cfgDB_Info();
sub _cfgDB_Migrate();
sub _cfgDB_Move();
sub _cfgDB_ReadCfg(@);
sub _cfgDB_ReadState(@);
sub _cfgDB_Rotate($);
sub _cfgDB_Uuid;
sub _cfgDB_Info;
sub _cfgDB_Filelist(;$);
sub _cfgDB_Recover($);
sub _cfgDB_Reorg(;$$);
sub _cfgDB_move();
sub _cfgDB_Rotate($);
sub _cfgDB_Search($$;$);
sub _cfgDB_Uuid();
# deprecated!
sub _cfgDB_Readfile($);
sub _cfgDB_Updatefile($);
sub _cfgDB_Writefile($$);
##################################################
# Read configuration file for DB connection
@ -146,7 +169,7 @@ if($cfgDB_dbconn =~ m/pg:/i) {
#
# initialize database, create tables if necessary
sub cfgDB_Init {
sub cfgDB_Init() {
##################################################
# Create non-existing database tables
# Create default config entries if necessary
@ -207,13 +230,13 @@ if($cfgDB_dbconn =~ m/pg:/i) {
$fhem_dbh->disconnect();
# move all files from text filesave to binary if not already done
_cfgDB_move if($needmove);
_cfgDB_Move if($needmove);
return;
}
# read attributes
sub cfgDB_AttrRead($) {
sub cfgDB_AttrRead($) {
my ($readSpec) = @_;
my ($row, $sql, @line, @rets);
my $fhem_dbh = _cfgDB_Connect;
@ -234,10 +257,8 @@ if($cfgDB_dbconn =~ m/pg:/i) {
return @rets;
}
# functions for filehandling to be called
# from fhem.pl and other fhem modules
sub cfgDB_FileRead($) {
# generic file functions called from fhem.pl
sub cfgDB_FileRead($) {
my ($filename) = @_;
my ($err, @ret, $counter);
my $fhem_dbh = _cfgDB_Connect;
@ -256,9 +277,9 @@ if($cfgDB_dbconn =~ m/pg:/i) {
}
return ($err, @ret);
}
sub cfgDB_FileWrite($@) {
sub cfgDB_FileWrite($@) {
my ($filename,@content) = @_;
chomp(@content) if($filename =~ m/.gplot$/);
my $fhem_dbh = _cfgDB_Connect;
$fhem_dbh->do("delete from fhembinfilesave where filename = '$filename'");
my $sth = $fhem_dbh->prepare('INSERT INTO fhembinfilesave values (?, ?)');
@ -268,8 +289,7 @@ if($cfgDB_dbconn =~ m/pg:/i) {
$fhem_dbh->disconnect();
return;
}
sub cfgDB_FileUpdate($) {
sub cfgDB_FileUpdate($) {
my ($filename) = @_;
my $fhem_dbh = _cfgDB_Connect;
my $id = $fhem_dbh->selectrow_array("SELECT filename from fhembinfilesave where filename = '$filename'");
@ -282,10 +302,8 @@ if($cfgDB_dbconn =~ m/pg:/i) {
return "";
}
# read and execute all commands from
# fhemconfig and fhemstate
sub cfgDB_ReadAll($){
# read and execute fhemconfig and fhemstate
sub cfgDB_ReadAll($) {
my ($cl) = @_;
my $ret;
# add Config Rows to commandfile
@ -298,10 +316,8 @@ if($cfgDB_dbconn =~ m/pg:/i) {
return undef;
}
# rotate all older versions to versionnumber+1
# save running configuration to version 0
sub cfgDB_SaveCfg {
sub cfgDB_SaveCfg() {
my (%devByNr, @rowList);
map { $devByNr{$defs{$_}{NR}} = $_ } keys %defs;
@ -363,13 +379,14 @@ if($cfgDB_dbconn =~ m/pg:/i) {
}
$fhem_dbh->commit();
$fhem_dbh->disconnect();
my $maxVersions = AttrVal('configdb','maxversions',0);
my $maxVersions = $attr{configdb}{maxversions};
$maxVersions = ($maxVersions) ? $maxVersions : 0;
_cfgDB_Reorg($maxVersions,1) if($maxVersions);
return 'configDB saved.';
}
# save statefile
sub cfgDB_SaveState {
sub cfgDB_SaveState() {
my ($out,$val,$r,$rd,$t,@rowList);
$t = localtime;
@ -423,12 +440,12 @@ if($cfgDB_dbconn =~ m/pg:/i) {
}
# return SVN Id, called by fhem's CommandVersion
sub cfgDB_svnId {
sub cfgDB_svnId() {
return "# ".'$Id$'
}
# return filelist depending on directory and regexp
sub cfgDB_FW_fileList(@$) {
sub cfgDB_FW_fileList(@$) {
my ($dir,$re,@ret) = @_;
my @files = split(/\n/, _cfgDB_Filelist('notitle'));
foreach my $f (@files) {
@ -441,7 +458,7 @@ if($cfgDB_dbconn =~ m/pg:/i) {
}
# read filelist containing 99_ files in database
sub cfgDB_Read99() {
sub cfgDB_Read99() {
my $ret;
my $fhem_dbh = _cfgDB_Connect;
my $sth = $fhem_dbh->prepare( "SELECT filename FROM fhembinfilesave WHERE filename like '%/99_%.pm' group by filename" );
@ -457,7 +474,7 @@ if($cfgDB_dbconn =~ m/pg:/i) {
}
# return SVN Id from file stored in database
sub cfgDB_Fileversion($$) {
sub cfgDB_Fileversion($$) {
my ($file,$ret) = @_;
my ($err,@in) = cfgDB_FileRead($file);
foreach(@in){ $ret = $_ if($_ =~ m/# \$Id:/); }
@ -470,7 +487,7 @@ if($cfgDB_dbconn =~ m/pg:/i) {
#
# connect do database
sub _cfgDB_Connect {
sub _cfgDB_Connect() {
my $fhem_dbh = DBI->connect(
"dbi:$cfgDB_dbconn",
$cfgDB_dbuser,
@ -550,7 +567,7 @@ sub _cfgDB_Rotate($) {
}
# return a UUID based on DB-model
sub _cfgDB_Uuid{
sub _cfgDB_Uuid() {
my $fhem_dbh = _cfgDB_Connect;
my $uuid;
$uuid = $fhem_dbh->selectrow_array('select lower(hex(randomblob(16)))') if($cfgDB_dbtype eq 'SQLITE');
@ -565,8 +582,8 @@ sub _cfgDB_Uuid{
# not called from fhem.pl directly
#
# migrate existing fhem config into database
sub _cfgDB_Migrate {
# migrate existing fhem config into database
sub _cfgDB_Migrate() {
my $ret;
$ret = "Starting migration...\n";
Log3('configDB',4,'Starting migration.');
@ -586,8 +603,8 @@ sub _cfgDB_Migrate {
}
# show database statistics
sub _cfgDB_Info {
# show database statistics
sub _cfgDB_Info() {
my ($l, @r, @row_ary, $f);
for my $i (1..65){ $l .= '-';}
# $l .= "\n";
@ -655,7 +672,7 @@ sub _cfgDB_Info {
return join("\n", @r);
}
# recover former config from database archive
# recover former config from database archive
sub _cfgDB_Recover($) {
my ($version) = @_;
my ($cmd, $count, $ret);
@ -698,7 +715,7 @@ sub _cfgDB_Recover($) {
return $ret;
}
# delete old configurations
# delete old configurations
sub _cfgDB_Reorg(;$$) {
my ($lastversion,$quiet) = @_;
$lastversion = ($lastversion > 0) ? $lastversion : 3;
@ -712,41 +729,21 @@ sub _cfgDB_Reorg(;$$) {
return " Result after database reorg:\n"._cfgDB_Info;
}
# list device(s) from given version
sub _cfgDB_List(;$$) {
my ($search,$searchversion) = @_;
$search = $search ? $search : "%";
$searchversion = $searchversion ? $searchversion : 0;
my $fhem_dbh = _cfgDB_Connect;
my ($sql, $sth, @line, $row, @result, $ret);
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
"WHERE v.version = '$searchversion' AND command not like '#create%' AND device like '$search%' ORDER BY lower(device),command DESC";
$sth = $fhem_dbh->prepare( $sql);
$sth->execute();
push @result, "search result for device: $search in version: $searchversion";
push @result, "--------------------------------------------------------------------------------";
while (@line = $sth->fetchrow_array()) {
$row = "$line[0] $line[1] $line[2] $line[3]";
push @result, "$row";
}
$fhem_dbh->disconnect();
$ret = join("\n", @result);
return $ret;
}
sub _cfgDB_Search($;$) {
my ($search,$searchversion) = @_;
# search for device or fulltext in db
sub _cfgDB_Search($$;$) {
my ($search,$searchversion,$dsearch) = @_;
return 'Syntax error.' if(!(defined($search)));
$searchversion = $searchversion ? $searchversion : 0;
my $fhem_dbh = _cfgDB_Connect;
my ($sql, $sth, @line, $row, @result, $ret);
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ".
"WHERE v.version = '$searchversion' AND command not like '#create%' ".
"AND (device like '$search%' OR P1 like '$search%' OR P2 like '$search%') ".
"ORDER BY lower(device),command DESC";
my ($sql, $sth, @line, $row, @result, $ret, $text);
$sql = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ";
$sql .= "WHERE v.version = '$searchversion' AND command not like '#create%' ";
$sql .= "AND device like '$search%' " if($dsearch);
$sql .= "AND (device like '$search%' OR P1 like '$search%' OR P2 like '$search%') " if(!$dsearch);
$sql .= "ORDER BY lower(device),command DESC";
$sth = $fhem_dbh->prepare( $sql);
$sth->execute();
push @result, "search result for: $search in version: $searchversion";
$text = " device" if($dsearch);
push @result, "search result for$text: $search in version: $searchversion";
push @result, "--------------------------------------------------------------------------------";
while (@line = $sth->fetchrow_array()) {
$row = "$line[0] $line[1] $line[2] $line[3]";
@ -757,7 +754,7 @@ sub _cfgDB_Search($;$) {
return $ret;
}
# called from cfgDB_Diff
# called from cfgDB_Diff
sub __cfgDB_Diff($$$) {
my ($fhem_dbh,$search,$searchversion) = @_;
my ($sql, $sth, @line, $ret);
@ -771,7 +768,7 @@ sub __cfgDB_Diff($$$) {
return $ret;
}
# compare device configurations from 2 versions
# compare device configurations from 2 versions
sub _cfgDB_Diff($$) {
my ($search,$searchversion) = @_;
use Text::Diff;
@ -786,41 +783,14 @@ sub _cfgDB_Diff($$) {
return $ret;
}
sub _cfgDB_AttrTypeSet($$){
my ($dName,$tName) = @_;
my @typeAttr = cfgDB_AttrRead($tName);
foreach my $ta (@typeAttr) {
my (undef,$n,$v) = split(/,/,$ta);
$attr{$dName}{$n} = $v;
}
return;
}
##################################################
# functions used for file handling
# called by 98_configdb.pm
#
# find dbtable for file
sub _cfgDB_Filefind($) {
my ($filename) = @_;
my $fhem_dbh = _cfgDB_Connect;
my @dbtable = ('fhembinfilesave');
my $retfile;
foreach (@dbtable) {
$retfile = $_;
my $ret = $fhem_dbh->selectrow_array("SELECT COUNT(*) from $retfile where filename = '$filename'");
last if $ret;
$retfile = undef;
}
$fhem_dbh->disconnect();
return $retfile;
}
# delete file from database
# delete file from database
sub _cfgDB_Filedelete($) {
my ($filename) = @_;
# my $dbtable = _cfgDB_Filefind($filename);
# return "File $filename not found in database." if(!$dbtable);
my $fhem_dbh = _cfgDB_Connect;
my $ret = $fhem_dbh->do("delete from fhembinfilesave where filename = '$filename'");
$fhem_dbh->commit();
@ -833,44 +803,27 @@ sub _cfgDB_Filedelete($) {
return $ret;
}
# export file from database to filesystem
# export file from database to filesystem
sub _cfgDB_Fileexport($) {
my ($filename) = @_;
my $dbtable = _cfgDB_Filefind($filename);
return "File $filename not found in database." if(!$dbtable);
my $counter = 0;
my $binfile = ($dbtable eq 'fhembinfilesave') ? 1 : 0;
my $sunit = ($binfile) ? 'bytes' : 'lines';
my $fhem_dbh = _cfgDB_Connect;
my $sth = $fhem_dbh->prepare( "SELECT * FROM $dbtable WHERE filename = '$filename'" );
my $sth = $fhem_dbh->prepare( "SELECT content FROM fhembinfilesave WHERE filename = '$filename'" );
$sth->execute();
my $blobContent = $sth->fetchrow_array();
my $counter = length($blobContent);
return "No data found for file $filename" unless $counter;
if($binfile) { # write binfile
open( FILE,">$filename" );
binmode(FILE);
print FILE $blobContent;
close( FILE );
my $blobContent = $sth->fetchrow_array();
$counter = length($blobContent);
open( FILE,">$filename" );
binmode(FILE);
print FILE $blobContent;
close( FILE );
} else { # write textfile
open( FILE, ">$filename" );
while (my @line = $sth->fetchrow_array()) {
$counter++;
print FILE $line[1], "\n";
}
close ( FILE );
}
$sth->finish();
$fhem_dbh->disconnect();
return "$counter $sunit written from database into file $filename";
return "$counter bytes written from database into file $filename";
}
# import file into database
# import file into database
sub _cfgDB_binFileimport($$;$) {
my ($filename,$filesize,$doDelete) = @_;
$doDelete = (defined($doDelete)) ? 1 : 0;
@ -892,7 +845,7 @@ sub _cfgDB_binFileimport($$;$) {
return "$readBytes bytes written from file $filename to database";
}
# show a list containing all file(names) in database
# list all files stored in database
sub _cfgDB_Filelist(;$) {
my ($notitle) = @_;
my $ret = "Files found in database:\n".
@ -916,10 +869,11 @@ sub _cfgDB_Filelist(;$) {
#
# temporary inserted funktions
# for data migration
# and database maintenance
#
#######################################
sub _cfgDB_move() {
sub _cfgDB_Move() {
my $fhem_dbh = _cfgDB_Connect;
my $sth = $fhem_dbh->prepare( "select filename from fhemfilesave group by filename" );
$sth->execute();
@ -983,7 +937,6 @@ sub _cfgDB_Updatefile($) {
return "";
}
1;
=pod