From: Will Budic Date: Wed, 19 Feb 2020 01:16:37 +0000 (+1100) Subject: Made CSV back import compatible. X-Git-Url: https://lifelog.hopto.org/gitweb/?a=commitdiff_plain;h=3f274c1402749dca0e657e1595c7632658f22c2a;p=LifeLog.git Made CSV back import compatible. --- diff --git a/htdocs/cgi-bin/config.cgi b/htdocs/cgi-bin/config.cgi index d6983e0..9e98885 100755 --- a/htdocs/cgi-bin/config.cgi +++ b/htdocs/cgi-bin/config.cgi @@ -19,6 +19,7 @@ use DateTime::Format::SQLite; use DateTime::Duration; use Date::Language; use Text::CSV; +use Scalar::Util qw(looks_like_number); #DEFAULT SETTINGS HERE! use lib "system/modules"; @@ -945,22 +946,26 @@ sub exportToCSV { sub importCatCSV { my $hndl = $cgi->upload("data_cat"); - my $csv = Text::CSV->new ( { binary => 1, strict => 1, eol => $/ } ); - while (my $line = <$hndl>) { - chomp $line; - if ($csv->parse($line)) { - my @fields = $csv->fields(); - updateCATDB(@fields); - }else{ - warn "Data could not be parsed: $line\n"; - } + my $csv; try{ + $csv = Text::CSV->new ( { binary => 1, strict => 1, eol => $/ } ); + while (my $line = <$hndl>) { + chomp $line; + if ($csv->parse($line)) { + my @fields = $csv->fields(); + updateCATDB(@fields); + }else{ + warn "Data could not be parsed: $line\n"; + } + } } + catch{ + LifeLogException->throw(error=>"Category update failed! CSV_STATUS->".$csv->error_diag()."\nfile_hndl->$hndl",show_trace=>&Settings::debug); + }; } sub updateCATDB { my @fields = @_; if(@fields>2){ - try{ my $id = $fields[0]; my $name = $fields[1]; my $desc = $fields[2]; @@ -975,62 +980,78 @@ sub updateCATDB { else{ #TODO Update } - - } - catch{ - print "SERVER ERROR->updateCATDB:".$_; } + else{ + LifeLogException->throw("Invalid CSV data format!"); } } sub importLogCSV { my $hndl = $cgi->upload("data_log"); - my $csv = Text::CSV->new ( { binary => 1, strict => 1, eol => $/ } ); + my $csv; + try{ + + $csv = Text::CSV->new ( { binary => 1, strict => 1, eol => $/ } ); + + while (my $line = <$hndl>) { + chomp $line; + if ($csv->parse($line)) { + my @fields = $csv->fields(); + updateLOGDB(@fields); + }else{ + warn "Data could not be parsed: $line\n"; + } + } + &renumerate; + $db->disconnect(); + print $cgi->redirect('main.cgi'); - while (my $line = <$hndl>) { - chomp $line; - if ($csv->parse($line)) { - my @fields = $csv->fields(); - updateLOGDB(@fields); - }else{ - warn "Data could not be parsed: $line\n"; - } } - &renumerate; - $db->disconnect(); - print $cgi->redirect('main.cgi'); + catch{ + LifeLogException->throw(error=>"Log update failed! CSV_STATUS->".$csv->error_diag()."\nfile_hndl->$hndl",show_trace=>&Settings::debug); + }; exit; } sub updateLOGDB { my @fields = @_; - if(@fields>3){ - try{ - my $i = 0; - my $id_cat = $fields[$i++]; - my $id_rtf = $fields[$i++]; - my $date = $fields[$i++]; - my $log = $fields[$i++]; - my $amv = $fields[$i++]; - my $amf = $fields[$i++]; - my $sticky = $fields[$i++]; - my $pdate = DateTime::Format::SQLite->parse_datetime($date); - #Check if valid date log entry? - if($id_cat==0||$id_cat==""||!$pdate){ - return; - } - #is it existing entry? - $dbs = Settings::selectRecords($db,"SELECT DATE FROM LOG WHERE DATE is '$pdate';"); - my @rows = $dbs->fetchrow_array(); - if(scalar @rows == 0){ - $dbs = $db->prepare('INSERT INTO LOG VALUES (?,?,?,?,?,?,?)'); - $dbs->execute($id_cat, $id_rtf, $pdate, $log, $amv, $amf, $sticky); - } - $dbs->finish(); - } - catch{ - print "SERVER ERROR->exportLogToCSV:".$_; + if(scalar(@fields)>6){ + + my $i = 0; + my $id_cat = $fields[$i++]; + my $id_rtf = $fields[$i++]; + my $date = $fields[$i++]; + my $log = $fields[$i++]; + my $amv = $fields[$i++]; + my $amf = $fields[$i++]; + my $sticky = $fields[$i++]; + # Is it old pre. 1.8 format -> ID, DATE, LOG, AMOUNT, AFLAG, RTF, STICKY + if(!looks_like_number($id_rtf)){ + $i = 0; + $id_cat = $fields[$i++]; + $date = $fields[$i++]; + $log = $fields[$i++]; + $amv = $fields[$i++]; + $amf = $fields[$i++]; + $id_rtf = $fields[$i++]; + $sticky = $fields[$i++]; + } + my $pdate = DateTime::Format::SQLite->parse_datetime($date); + #Check if valid date log entry? + if($id_cat==0||$id_cat==""||!$pdate){ + return; + } + #is it existing entry? + $dbs = Settings::selectRecords($db,"SELECT DATE FROM LOG WHERE DATE is '$pdate';"); + my @rows = $dbs->fetchrow_array(); + if(scalar @rows == 0){ + $dbs = $db->prepare('INSERT INTO LOG VALUES (?,?,?,?,?,?,?)'); + $dbs->execute($id_cat, $id_rtf, $pdate, $log, $amv, $amf, $sticky); + } + $dbs->finish(); } + else{ + LifeLogException->throw("Invalid CSV data format!"); } } @@ -1064,14 +1085,14 @@ sub error { sub renumerate { #Renumerate Log! Copy into temp. table. my $sql; - $dbs = Settings::selectRecords($db, "CREATE TABLE life_log_temp_table AS SELECT * FROM LOG;"); - $dbs = Settings::selectRecords($db, 'SELECT rowid, DATE FROM LOG WHERE RTF == 1 ORDER BY DATE;'); + $db->do("CREATE TABLE life_log_temp_table AS SELECT * FROM LOG;"); + $dbs = Settings::selectRecords($db, 'SELECT rowid, DATE FROM LOG WHERE ID_RTF >0 ORDER BY DATE;'); #update notes with new log id while(my @row = $dbs->fetchrow_array()) { my $sql_date = $row[1]; #$sql_date =~ s/T/ /; $sql_date = DateTime::Format::SQLite->parse_datetime($sql_date); - $sql = "SELECT rowid, DATE FROM life_log_temp_table WHERE RTF = 1 AND DATE = '".$sql_date."';"; + $sql = "SELECT rowid, DATE FROM life_log_temp_table WHERE ID_RTF > 0 AND DATE = '".$sql_date."';"; $dbs = Settings::selectRecords($db, $sql); my @new = $dbs->fetchrow_array(); if(scalar @new > 0){ @@ -1085,20 +1106,11 @@ sub renumerate { while(my @row = $dbs->fetchrow_array()) { $db->do("DELETE FROM NOTES WHERE LID=$row[0];"); } - $dbs = Settings::selectRecords($db, 'DROP TABLE LOG;'); - $dbs = Settings::selectRecords($db, qq(CREATE TABLE LOG ( - ID_CAT TINY NOT NULL, - DATE DATETIME NOT NULL, - LOG VCHAR (128) NOT NULL, - AMOUNT INTEGER, - AFLAG TINY DEFAULT 0, - RTF BOOL DEFAULT 0, - STICKY BOOL DEFAULT 0 - );)); - $dbs = Settings::selectRecords($db, 'INSERT INTO LOG (ID_CAT,DATE,LOG,AMOUNT,AFLAG, RTF) - SELECT ID_CAT, DATE, LOG, AMOUNT, AFLAG, RTF - FROM life_log_temp_table ORDER by DATE;'); - $dbs = Settings::selectRecords($db, 'DROP TABLE life_log_temp_table;'); + $db->do('DROP TABLE LOG;'); + $db->do(&Settings::createLOGStmt); + $db->do(q(INSERT INTO LOG (ID_CAT, ID_RTF, DATE, LOG, AMOUNT,AFLAG) + SELECT ID_CAT, ID_RTF, DATE, LOG, AMOUNT, AFLAG FROM life_log_temp_table ORDER by DATE;)); + $db->do('DROP TABLE life_log_temp_table;'); } 1; \ No newline at end of file