expense_id, unique_url=>unique_url, access_time=>created_date $range = date('Y-m-d', strtotime("25 February, 2018")); $expense_counts = $db->query("SELECT id, unique_url, create_date FROM `expenses` WHERE id not in(select id from access_infos) and `create_date` < '$range'"); foreach ($expense_counts as $key=>$value) { $expense_id = $value['expenses']['id']; $unique_url = $value['expenses']['unique_url']; // $access_time = $value['expenses']['create_date']; $access_time = date('Y-m-d H:i:s', $value['expenses']['update_date']); $db->query("insert into access_infos(id, unique_url, access_time) values(".$expense_id.",'".$unique_url."','".$access_time."')"); } } exit; //insert multiple record into the table Expired_Records //check the case whether the record insertion successful or not for multi insertion when pk already exist } /* * command: Console/cake Backup shiftExpiredRecords * Run it in every hours once * This method generates records into the table expired_records and delete all records fron access info */ public function shiftExpiredRecords(){ $backup_mode = Configure::read('expensecount.backup.mode'); $month = isset($this->args[0]) ? (int)$this->args[0] : 4; // default 4 months $type = isset($this->args[1]) ? (int)$this->args[1] : 1; // default 1. 1 = Months, 2 = Days; Type will always be 1 because no value is passed for this parameter. if ($month <= 0) { echo('Month must be a positive number'); exit; } if($backup_mode){ //retrieve all expried records $result = $this->AccessInfo->getExpiredExpenses($month,$type); if(!empty($result)){ $currentDate = $this->getSystemCurrentTimeStamp(); foreach($result as $key=>$value){ $deleteList[] = $value["AccessInfo"]["id"]; $data["ExpiredRecord"][$key]["id"] = $value["AccessInfo"]["id"]; $data["ExpiredRecord"][$key]["unique_url"] = $value["AccessInfo"]["unique_url"]; $data["ExpiredRecord"][$key]["inserted_on"] = $currentDate; } $error = $this->ExpiredRecord->saveAllExpiredRecords($data); if(empty($error)){ //delete all records from AccessInfo table $this->AccessInfo->deleteAllExpiredExpenses($deleteList); } } } exit; //insert multiple record into the table Expired_Records //check the case whether the record insertion successful or not for multi insertion when pk already exist } /* * command: Console/cake Backup initiateBackup 100 * Run it in every six hours once * This method scan expire_records table and shift records to backup tables; * After taking backup, it delete records from expire_records table. */ public function initiateBackup($limit = BACKUP_LIMIT){ $limit = isset($this->args[0]) ? (int)$this->args[0] : BACKUP_LIMIT; $this->backupAndRemoveOriginalRecords($limit); } /* * Command : Console/cake Backup backupSingleExpense 1ILcOUb0fe3JpgB * This method shifts and backup single expense from live tables to backup tables in the production database. */ public function backupSingleExpense($unique_url=null) { $unique_url = isset($this->args[0]) ? $this->args[0] : null; $db = ConnectionManager::getDataSource('default'); try { $backup_expense = $db->query("select * from backup_expenses where unique_url='".$unique_url."'"); } catch (Exception $ex) { } if (empty($backup_expense)) { $expense = $db->query("select * from expenses where unique_url= '".$unique_url."'"); if(!empty($expense)) { $this->loadModel('Backup'); $this->Backup->processBackupAndRemove($expense); } else { echo "Expense is not found in production database. Could not perform backup!"; exit; } } else { echo "Expense is already in backup database. Could not perform backup!"; exit; } } /* * command: Console/cake Backup archieveSingleItem 1ILcOUb0fe3JpgB * Run it to archieve a sinle expense * * This method shifts one single expense from backup tables(live db) to archieve database * */ public function archieveSingleItem($unique_url=null) { $unique_url = isset($this->args[0]) ? $this->args[0] : null; $this->loadModel('Backup'); $this->Backup->archieveSingleExpense($unique_url); } /* * command: Console/cake Backup initiateArchive 10 100 * Run it to archive records older than custom month, with a row limit. * e.g. 10 months before from the current date and 100 records */ public function initiateArchive($month = 50, $limit = BACKUP_LIMIT){ $month = isset($this->args[0]) ? (int)$this->args[0] : 50; $limit = isset($this->args[1]) ? (int)$this->args[1] : BACKUP_LIMIT; $this->archiveAndRemoveOriginalRecords($limit,$month); } /* * command: Console/cake Backup initiateRemoveArchive 10 100 * Run it to remove archived records older than custom month, with a row limit. * e.g. 10 months before from the current date and 100 records */ public function initiateRemoveArchive($month = 50, $limit = BACKUP_LIMIT){ $month = isset($this->args[0]) ? (int)$this->args[0] : 50; $limit = isset($this->args[1]) ? (int)$this->args[1] : BACKUP_LIMIT; $this->removeArchiveRecords($limit,$month); } private function backupAndRemoveOriginalRecords($limit = BACKUP_LIMIT){ $backup_mode = Configure::read('expensecount.backup.mode'); if($backup_mode){ //retrieve 100 records from the table expired_records $query = "select id,unique_url from expired_records limit 0,".$limit; $db = ConnectionManager::getDataSource('default'); $expiredRecordList = $db->query($query); $db->begin(); try { if (!empty($expiredRecordList)) { $this->loadModel('Backup'); $this->Backup->processBackupAndRemove($expiredRecordList, true); $db->commit(); } }catch (Exception $ex) { $db->rollback(); $message = "Backup process failed. Rolled back. Error: " . $ex->getMessage(); $this->emailSend($message,"Backup process failed"); echo $message; } } exit; } private function archiveAndRemoveOriginalRecords($limit = BACKUP_LIMIT, $month = 36){ $month = (int)$month; if ($month <= 0) { echo('Month must be a positive number'); exit; } $backup_mode = Configure::read('expensecount.backup.mode'); $db = ConnectionManager::getDataSource('default'); $before_date = (new DateTime()) ->modify("-{$month} months") ->format('Y-m-d'); $range = strtotime($before_date); if($backup_mode){ //retrieve records from the table back_expenses $query = "SELECT id, unique_url FROM backup_expenses WHERE update_date <= $range LIMIT $limit"; $backupRecordList = $db->query($query); if(!empty($backupRecordList)){ $this->loadModel('Backup'); $this->Backup->processArchiveAndRemove($backupRecordList,true); } } exit; } private function removeArchiveRecords($limit = BACKUP_LIMIT, $month = 36){ $month = (int)$month; if ($month <= 0) { echo('Month must be a positive number'); exit; } $backup_mode = Configure::read('expensecount.backup.mode'); $before_date = (new DateTime()) ->modify("-{$month} months") ->format('Y-m-d'); $range = strtotime($before_date); $db = ConnectionManager::getDataSource('archieve'); if ($backup_mode) { //retrieve records from the table expenses $query = "SELECT id, unique_url FROM expenses WHERE update_date <= $range LIMIT $limit"; $archiveRecordList = $db->query($query); if (!empty($archiveRecordList)) { $this->loadModel('Backup'); $this->Backup->processRemoveArchive($archiveRecordList, true); } } } private function emailSend($message = null, $subject = null) { App::uses('ComponentCollection', 'Controller'); App::uses('NotificationComponent', 'Controller/Component'); $this->Notification = new NotificationComponent(new ComponentCollection()); $this->Notification->sendEmail(array( "email_from" => SUPPORT_EMAIL, "email_to" => REPORTING_EMAIL, "title" => $message, "template" => "backup_archive_process_error", "subject" => $subject, )); } } ?>