So my husband asked for a program that would go out to the OpenHAB persistence database and identify all of the item tables that are no longer associated with active items. If you rename or delete an item from OpenHAB, the associated data is retained in the persistence database. Might be a good thing – maybe you wanted that data. But if it’s useless fluff … well, no need to keep the state changes from a door sensor that’s no longer around.
Wrote the code, and asked him how many days old he wanted the last update to be before the item table got dropped … and he told me this was a useless way to do it and maybe something really hadn’t updated in six months or three years and age of last update is no way to be identifying tables to be removed. Which, yeah, then why ask for it!? Then I needed to write something that takes a list of items from OpenHAB and identifies everything in the items table that does not appear in the OpenHAB list so those tables can be deleted. But I figured I’d post the original code too in case anyone else could use it. Both in perl, and neither in particularly well written perl. I trust the data and don’t want to protect against insertion attacks.
Drop tables for items that no longer appear in OpenHAB:
use strict;
use DBI;
my %strItemsFromOpenHAB = ();
open(INPUT,"./openhabItemList.txt");
while(<INPUT>){
chomp();
my $strCurrentItem = $_;
$strItemsFromOpenHAB{$strCurrentItem}++;
}
close INPUT;
my $dbh = DBI->connect('DBI:mysql:openhabdb;host=DBHOST', 'DBUID', 'DBPassword', { RaiseError => 1 } );
my $sth = $dbh->prepare("SELECT * FROM items");
$sth->execute();
while (my @row = $sth->fetchrow_array) {
my $strItemID = $row[0];
my $strItemName = $row[1];
if(! $strItemsFromOpenHAB{$strItemName} ){ # If the current item name is not in the list of items from OpenHAB
# print "DELETE FROM items where ItemID = $strItemID\n";
print "DROP TABLE Item$strItemID; # $strItemName \n";
}
}
$sth->finish();
$dbh->disconnect();
close OUTPUT;
Identify tables that have not been updated in iTooOldInDays days:
use strict;
use DBI;
use Date::Parse;
use Time::Local;
my $iTooOldInDays = 365;
my $iCurrentEpochTime = time();
my @strItems = ();
my $iItems = 0;
my $dbh = DBI->connect('DBI:mysql:openhabdb;host=DBHOST', 'DBUID', 'DBPassword', { RaiseError => 1 } );
my $sth = $dbh->prepare("SELECT * FROM Items");
$sth->execute();
while (my @row = $sth->fetchrow_array) {
$strItems[$iItems++] = $row[0];
}
$sth->finish();
for(my $i = 0; $i < $iItems; $i++){ my $strTableName = 'Item' . $strItems[$i]; my $sth = $dbh->prepare("SELECT * FROM $strTableName ORDER BY Time DESC LIMIT 1");
$sth->execute();
while (my @row = $sth->fetchrow_array) {
my $strUpdateTime = $row[0];
my @strDateTimeBreakout = split(/ /,$strUpdateTime);
my $strDate = $strDateTimeBreakout[0];
my $strTime = $strDateTimeBreakout[1];
my @strDateBreakout = split(/-/,$strDate);
my @strTimeBreakout = split(/:/,$strTime);
my $iUpdateEpochTime = timelocal($strTimeBreakout[2],$strTimeBreakout[1],$strTimeBreakout[0], $strDateBreakout[2],$strDateBreakout[1]-1,$strDateBreakout[0]);
my $iTableAge = $iCurrentEpochTime - $iUpdateEpochTime;
if($iTableAge > ($iTooOldInDays * 86400) ){
print "$strTableName last updated $strUpdateTime - $iUpdateEpochTime\n";
}
}
$sth->finish();
}
$dbh->disconnect();
close OUTPUT;