prepare("SELECT DIRID FROM $ibFolder WHERE NAME=?"); $dbh_ibFolder_insert = $dbh_LB->prepare("INSERT INTO $ibFolder (NAME,FILE_LMD,FILE_SIZE,SYNC_DATE) values (?,?,?,?)"); $dbh_ibFile_insert = $dbh_LB->prepare("INSERT INTO $ibFile (DIRID,NAME,FILE_LMD,FILE_SIZE,BKSET_LMD,SYNC_DATE,BKSET_NAME,HASH_VALUE,FOLDER_ID,MPC,ENC_NAME,FILE_OR_FOLDER,BACKUP_STATUS) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"); $dbh_ibFolder_update = $dbh_LB->prepare("UPDATE $ibFolder SET FILE_LMD=? WHERE NAME=?"); $dbh_ibFile_update = $dbh_LB->prepare("UPDATE $ibFile SET FILE_LMD=?,FILE_SIZE=? WHERE NAME=? AND FOLDER_ID=?") ; } catch (PDOException $e){ $errStr = "Error: Prepare statement failed for insert/update for Local Backup, ".customErrorMsg(); traceDBLog($errStr); writeOperationErrorToErrorFile($errStr); if($dbh_LB) unset($dbh_LB); exit; } $db_info_maualTask = $userDir.PATHSEPARATOR.LOCALBACKUP.PATHSEPARATOR.MANUALTASK.PATHSEPARATOR.TEMP_DB_FILES; $db_info_file = $db_info_maualTask.LOCALDBINFOFILE; $db_info_retry_file = $db_info_maualTask."db_info_retry.txt"; $old_data = ""; while(1){ if(!file_exists($db_info_file)) sleep(2); else break; } commitXmlData(); $dbh_LB->commit(); # Retry scenario if(file_exists($db_info_retry_file)){ file_put_contents($db_info_retry_file,"PROCESS_COMPLETED",FILE_APPEND); rename($db_info_retry_file,$db_info_file); @chmod($db_info_file, PERMISSIONVAL); commitXmlData(1); $dbh_LB->commit(); } exit; #************************************************************************************************************************ # Subroutine Name : commitXmlData # Objective : This subroutine helps to read xml data and pass the details to insert/update process # Added By : Vijay Vinoth [23/01/2018] # Modified By : #************************************************************************************************************************* function commitXmlData($retry = 0) { GLOBAL $dbh_LB, $db_info_file, $db_info_maualTask, $db_info_retry_file, $fileCount, $databaseLB; $handle = fopen($db_info_file,'r'); if(!$handle){ traceDBLog("Unable to open $db_info_file\n"); exit; } $extendedAsciiChars = getExtendedASCIIChrOrd(); while (1) { $dbXmlFileName = ''; $error = 0; $dbXmlFileName = trim(fgets($handle)); if($dbXmlFileName == ''){ sleep(WAIT_FOR); fseek($handle, 0, SEEK_CUR); //to clear eof flag continue; } if($dbXmlFileName == 'PROCESS_COMPLETED'){ break; } $xml=simplexml_load_file($db_info_maualTask.$dbXmlFileName); if(!$xml) { $resultListXML = str_replace($extendedAsciiChars['chr'], $extendedAsciiChars['ord'], $xml); $xml = simplexml_load_string($resultListXML); if(!$xml){ $xmlResult = file_get_contents($db_info_maualTask.$dbXmlFileName); $xml = constructXMLByParsingEachLine($xmlResult); } } if(!$xml) { $string = file_get_contents($db_info_maualTask.$dbXmlFileName); $search = "/>"; $string = explode("\n", $string); // \n is the character for a line break foreach($string as $val) { if(strpos(trim($val),$search) !== false) { $dbpaths = simplexml_load_string($val); if(!$dbpaths){ traceDBLog("Error: Unable commit :: ".trim($val)); continue; } insertUpdatedBbData($dbpaths); } else if((strpos(trim($val),'dbpaths>') === false) && (strpos(trim($val),'') === false)){ traceDBLog("Error: Unable commit :: ".trim($val)); } } continue; } if($retry == 0) { $dbh_LB->beginTransaction(); @chmod($databaseLB . '-shm', PERMISSIONVAL); @chmod($databaseLB . '-wal', PERMISSIONVAL); } foreach($xml->children() as $dbpaths) insertUpdatedBbData($dbpaths); try{ if($retry == 0) { $dbh_LB->commit(); } } catch (PDOException $e) { traceDBLog('Exception: ' . $e->getMessage()); $error = 1; if($retry == 1) file_put_contents($db_info_retry_file,"$dbXmlFileName \n",FILE_APPEND); } if($retry == 0 and $error != 1) @unlink($db_info_maualTask.$dbXmlFileName); } fclose($handle); } #************************************************************************************************************************ # Subroutine Name : insertUpdatedBbData # Objective : This subroutine inserts/update entry to IbFile/IbFolder # Added By : Vijay Vinoth [23/01/2018] # Modified By : #************************************************************************************************************************* function insertUpdatedBbData($dbpaths) { $operation = trim($dbpaths->attributes()->operation); $dbtable = trim($dbpaths->attributes()->dbtable); if($operation == 'insert'){ if($dbtable == 'file') insertIbFile(1,0,$dbpaths); else if($dbtable == 'folder') insertIbFolder(1, $dbpaths->attributes()->modtime, $dbpaths->attributes()->fileName, $dbpaths->attributes()->fieldSize); } else if($operation == 'update'){ if($dbtable == 'file') updateIbFile(1, $dbpaths); else if($dbtable == 'folder') updateIbFolder(1, $dbpaths->attributes()->modtime, $dbpaths->attributes()->fileName); } return; } #************************************************************************************************************************ # Subroutine Name : insertIbFile # Objective : This subroutine inserts entry to IbFile # Added By : Senthil Pandian [12/01/2016] # Modified By : #************************************************************************************************************************* function insertIbFile($retry,$dirID,$dbpaths) { GLOBAL $dbh_ibFile_insert; $fileDetail = array(); if(!$dirID){ $dirID = folderExistenceinDB($dbpaths); if(!$dirID) $dirID = insertFolders($retry,$dbpaths); } $fileDetail[0] = $dirID; $fileDetail[1] = $dbpaths->attributes()->fileName; $fileDetail[2] = $dbpaths->attributes()->modtime; $fileDetail[3] = $dbpaths->attributes()->fieldSize; $fileDetail[4] = $dbpaths->attributes()->bksetLMD; $fileDetail[5] = $dbpaths->attributes()->syncDate; $fileDetail[6] = $dbpaths->attributes()->bksetName; $fileDetail[7] = $dbpaths->attributes()->hashValue; $fileDetail[8] = $dbpaths->attributes()->fieldFolderId; $fileDetail[9] = $dbpaths->attributes()->fieldMPC; $fileDetail[10] = $dbpaths->attributes()->fieldEncName; $fileDetail[11] = $dbpaths->attributes()->fileOrFolder; $fileDetail[12] = $dbpaths->attributes()->backupStatus; if($retry == 0){ $fileDetail[4] = 'NA'; $fileDetail[5] = 'NA'; $fileDetail[6] = 'Default Backupset'; $fileDetail[7] = '0'; $fileDetail[11] = '1'; $fileDetail[12] = '1'; } try{ $rows = $dbh_ibFile_insert->execute($fileDetail); $dbh_ibFile_insert->closeCursor(); } catch(PDOException $e) { traceDBLog("Insert entry to IbFile table has failed for file: $fileName. Reason:".$e->getMessage()); if($retry === TRY_UPDATE) updateIbFile(0, $dbpaths); } } #************************************************************************************************************************ # Subroutine Name : insertIbFolder # Objective : This subroutine inserts entry to IbFolder # Added By : Senthil Pandian [12/01/2016] # Modified By : #************************************************************************************************************************* function insertIbFolder($retry, $modtime, $fileName, $fieldSize) { GLOBAL $dbh_ibFolder_insert; $fileDetail = array(); $fileDetail[0] = $fileName; $fileDetail[1] = $modtime; $fileDetail[2] = $fieldSize; $fileDetail[3] = "NA"; try{ $rows = $dbh_ibFolder_insert->execute($fileDetail); $dbh_ibFolder_insert->closeCursor(); } catch(PDOException $e) { traceDBLog("Insert entry to IbFolder table has failed for file: $fileName. Reason:".$e->getMessage()); if($retry === TRY_UPDATE){ updateIbFolder(0, $modtime, $fileName); } } } #************************************************************************************************************************ # Subroutine Name : updateIbFile # Objective : This subroutine updates entry to IbFile # Added By : Senthil Pandian [12/01/2016] # Modified By : #************************************************************************************************************************* function updateIbFile($retry, $dbpaths) { GLOBAL $dbh_ibFile_update; $fileDetail = array(); $fileDetail[0] = $dbpaths->attributes()->modtime; $fileDetail[1] = $dbpaths->attributes()->fieldSize; $fileDetail[2] = $dbpaths->attributes()->fileName; $fileDetail[3] = $dbpaths->attributes()->fieldFolderId; try{ $rows = $dbh_ibFile_update->execute($fileDetail); $dbh_ibFile_update->closeCursor(); } catch(PDOException $e) { traceDBLog("Update entry to IbFile table has failed for file: $fileName. Reason:".$e->getMessage()); if($retry === TRY_INSERT){ insertIbFile(0, 0, $dbpaths); } } } #************************************************************************************************************************ # Subroutine Name : updateIbFolder # Objective : This subroutine updates entry to IbFolder # Added By : Senthil Pandian [12/01/2016] # Modified By : #************************************************************************************************************************* function updateIbFolder($retry, $modtime, $fileName) { GLOBAL $dbh_ibFolder_update; $fileDetail = array(); $fileDetail[0] = $modtime; $fileDetail[1] = $fileName; try{ $rows = $dbh_ibFolder_update->execute($fileDetail); $dbh_ibFolder_update->closeCursor(); } catch(PDOException $e) { traceDBLog("Update entry to IbFolder table has failed for file: $fileName. Reason:".$e->getMessage()); if($retry === TRY_INSERT){ insertIbFolder(0, $modtime, $fileName, 0); } } } #******************************************************************************************************** # Subroutine Name : folderExistenceinDB # Objective : This subroutine checks whether the folder path already exists in the DB, # and if it does, updates entry and returns the resp dirID # Added By : Pooja Havaldar [12/01/2016] # Modified By : Senthil Pandian #********************************************************************************************************* /*function folderExistenceinDB($keyString) { GLOBAL $localBackupHash; $fieldMPC = ($keyString != '/') ? "/".$keyString : "/"; $keyString = substr($keyString,0,strrpos($keyString, '/'))."/"; $searchItem = "'".$fieldMPC.$keyString."'"; if(isset($localBackupHash[$searchItem])) return $localBackupHash[$searchItem]; $dirID = getDirID($keyString, $fieldMPC); if($dirID){ $localBackupHash[$searchItem] = $dirID; } return $dirID; }*/ function folderExistenceinDB($dbpaths) { GLOBAL $localBackupHash, $dedupDetailFile; $keyString = $dbpaths->attributes()->keyString; $fieldMPC = $dbpaths->attributes()->fieldMPC; //if(!file_exists($dedupDetailFile) && $fieldMPC != '/') // $fieldMPC = "/".$fieldMPC; $fieldMPC = "/".$keyString; $keyString = substr($keyString,0,strrpos($keyString, '/'))."/"; $searchItem = "'".$fieldMPC.$keyString."'"; if(isset($localBackupHash[$searchItem])) return $localBackupHash[$searchItem]; $dirID = getDirID($keyString, $fieldMPC); if($dirID) $localBackupHash[$searchItem] = $dirID; return $dirID; } #***************************************************************************************************************************************** # Subroutine Name : insertFolders # Objective : This subroutine makes level by level folder entry into the DB and returns the dirID of the full folder path # Added By : Pooja Havaldar # Modified By : Senthil Pandian #*****************************************************************************************************************************************/ function insertFolders($retry,$dbpaths) { GLOBAL $dbh_LB,$localBackupHash,$fileCount,$dedupDetailFile; $keyString = $dbpaths->attributes()->keyString; $fieldMPC = $dbpaths->attributes()->fieldMPC; if(!file_exists($dedupDetailFile) && $fieldMPC != '/') $fieldMPC = "/".$fieldMPC; $folderPath = substr($keyString,0,strrpos($keyString, '/'))."/"; $folder_list = explode('/', $folderPath); for($index = count($folder_list)-1; $index >= 0; $index--){ $keyString = substr($keyString,0,strrpos($keyString, '/')); $folderList = $keyString."/"; $searchItem = "'$fieldMPC$folderList'"; if(isset($localBackupHash[$searchItem])) break; $localBackupHash[$searchItem] = getDirID($folderList, $fieldMPC); if($localBackupHash[$searchItem]) break; $modtime = date("Y/m/d h:i:s A", filemtime($folderList)); insertIbFolder(1, $modtime, $searchItem, 0); //list($modtime, $fieldSize) = getSizeLMD($folderList); /*$fileCount++; if($fileCount % $localDBCommitFreq == 0){ $dbh_LB->commit(); $dbh_LB->beginTransaction(); $fileCount = 0; } if($retry == 0){ $dbh_LB->commit(); $dbh_LB->beginTransaction(); } */ $localBackupHash[$searchItem] = getDirID($folderList, $fieldMPC); } $folderPath = "'".$fieldMPC.$folderPath."'"; return $localBackupHash[$folderPath]; } #******************************************************************************************************* # Subroutine Name : getDirID # Objective : This subroutine returns the dirID of full folder path # Added By : Senthil Pandian [12/01/2016] # Modified By : #******************************************************************************************************** function getDirID($keyString,$fieldMPC) { GLOBAL $selectFolderCount; $finalPath = "'".$fieldMPC.$keyString."'"; $selectFolderCount->execute(array($finalPath)); $dir = $selectFolderCount->fetch(); $selectFolderCount->closeCursor(); $dirID = $dir['DIRID']; if($dirID == "") $dirID = 0; return $dirID; } #************************************************************************************************************************** # Subroutine Name : getSizeLMD # Objective : This subroutine returns the modtime and size of file/folder path using the stat cmd # Added By : Senthil Pandian [12/01/2016] # Modified By : #************************************************************************************************************************** function getSizeLMD($filePath) { $actualPath = getLocalFilePath($filePath); $modtime = date("Y/m/d h:i:s A", filemtime($actualPath)); $size = customFileSize($actualPath); return array($modtime, $size); } #**************************************************************************************************** # Subroutine Name : process_term # Objective : The signal handler invoked when SIGTERM signal is received by the script # Added By : Vijay Vinoth [30/03/2018] # Modified By : #***************************************************************************************************** function process_term() { GLOBAL $dbh_LB; if($dbh_LB){ $dbh_LB->commit(); unset($dbh_LB); } exit; } ?>