"; /* $rootLogger = LoggerManager::getRootLogger(); $appenderA2 =& $rootLogger->getAppender('A2'); $layout =& LoggerLayout::factory('LoggerLayoutHtml'); $layout->setLocationInfo(false); $appenderA2->setLayout($layout); */ } $logger = LoggerManager::getLogger($main); $logger->info("start"); } function closeLogger() { global $logger; $logger->info("finish"); LoggerManager::shutdown(); if (isset($_SERVER['SERVER_PROTOCOL'])) { echo ""; } } function createTableCRC($tableid) { global $adodb; $logger = LoggerManager::getLogger(__FUNCTION__); ## CHECK COLUMN ## $metaCol = $adodb->MetaColumns($tableid); if (!is_array($metaCol)) { return $logger->error("Columns must be defined on ".$tableid."!"); } $metaTables = $adodb->MetaTables(); foreach ($metaTables as $k => $v) $metaTables[$k] = strtolower($v); ## _CRC ## $rs = $adodb->Execute("SELECT * FROM qb_config ". " WHERE tableid = ? ", array($tableid)); if (!$rs->EOF) { $sqlCreate = $rs->fields['sqlcreate']; if (! is_int(array_search(strtolower($tableid)."_crc", $metaTables))) { $rs = $adodb->Execute("CREATE TABLE ".$tableid."_crc ". " ( ".$sqlCreate." ) "); if (!$rs) return $logger->error($adodb->ErrorMsg()); } } else { return $logger->error("tableid '".$tableid."' not found on qb_config! ". " ".$adodb->ErrorMsg()); } ## CHECK COLUMN ## $metaCol = $adodb->MetaColumns($tableid."_crc"); if (!is_array($metaCol)) { return $logger->error("Columns must be defined on ".$tableid."_crc !"); } // DROP column where not PK,crc $evalStr = $colPK = $evalStr2 = $metaColStr2 = ''; foreach ($metaCol as $k => $v) { if ($v->name === 'crc') continue; $evalStr2 .= '($rs->fields["'.$v->name.'"])."\\t".'; if ($v->primary_key !== true) { $adodb->Execute("ALTER TABLE ".$tableid."_crc DROP ".$v->name); } else { $evalStr .= '($rs->fields["'.$v->name.'"])."\\t".'; // fwrite $colPK .= $v->name.","; } $metaColStr2 .= $v->name.","; } if ($evalStr) $evalStr = substr($evalStr, 0, -5); if ($evalStr2) $evalStr2 = substr($evalStr2, 0, -5); if ($colPK) $colPK = substr($colPK, 0, -1); if ($metaColStr2) $metaColStr2 = substr($metaColStr2, 0, -1); $evalStr = 'fwrite($fpTemp, '.$evalStr.'"\\t".$crc32."\\n");'; // COLUMN crc, INDEX $metaCol = $adodb->MetaColumns($tableid."_crc"); if (!$metaCol["CRC"]) { $adodb->Execute("ALTER TABLE ".$tableid."_crc ADD crc INTEGER"); } $metaIndexes = $adodb->MetaIndexes($tableid."_crc"); if (! is_array($metaIndexes[$tableid."_crc"."_idx1"])) { $adodb->Execute("CREATE INDEX ".$tableid."_crc"."_idx1 ". " ON ".$tableid."_crc(crc)"); } return compact("evalStr", "evalStr2", "colPK", "metaColStr2"); } function createTableHistory($tableid) { global $adodb; $logger = LoggerManager::getLogger(__FUNCTION__); ## CHECK COLUMN ## $metaCol = $adodb->MetaColumns($tableid); if (!is_array($metaCol)) { return $logger->error("Columns must be defined on ".$tableid."!"); } $metaTables = $adodb->MetaTables(); foreach ($metaTables as $k => $v) $metaTables[$k] = strtolower($v); ##
_history ## $rs = $adodb->Execute("SELECT * FROM qb_config ". " WHERE tableid = ? ", array($tableid)); if (!$rs->EOF) { $sqlCreate = $rs->fields['sqlcreate']; if (! is_int(array_search(strtolower($tableid)."_history", $metaTables))) { $rs = $adodb->Execute("CREATE TABLE ".$tableid."_history ". " ( ".$sqlCreate." ) "); if (!$rs) return $logger->error($adodb->ErrorMsg()); } } else { return $logger->error("tableid '".$tableid."' not found on qb_config! ". " ".$adodb->ErrorMsg()); } ## CHECK COLUMN ## $metaCol = $adodb->MetaColumns($tableid."_history"); if (!is_array($metaCol)) { return $logger->error("Columns must be defined on ".$tableid."_history !"); } // COLUMN date_deleted $metaCol = $adodb->MetaColumns($tableid."_history"); if (!$metaCol["DATE_DELETED"]) { $adodb->Execute("ALTER TABLE ".$tableid."_history ADD date_deleted DATETIME NOT NULL"); $pks = $adodb->MetaPrimaryKeys($tableid."_history"); $adodb->Execute("ALTER TABLE ".$tableid."_history DROP PRIMARY KEY"); $adodb->Execute("ALTER TABLE ".$tableid."_history ADD PRIMARY KEY (".join(", ", $pks).", date_deleted )"); } return true; } function crcTable($conf) { global $adodb; $tableid = $conf['tableid']; $logger = LoggerManager::getLogger(__FUNCTION__); $logger->info("Table: ".$tableid); ## CHECK PK ## $rs3 = $adodb->MetaPrimaryKeys($tableid); if (!is_array($rs3) || (is_array($rs3) && count($rs3) == 0)) { return $logger->error("PrimaryKeys must be defined !"); } $adodb->Execute("DROP TABLE ".$tableid."_crc"); $result = createTableCRC($tableid); if (! is_array($result)) return false; extract($result); ## FILE TEMPORARY ## if (!isset($tmpTemp)) $tmpTemp = tempnam("/tmp/", "tableTemp"); // create chmod($tmpTemp, 0777); $fpTemp = fopen($tmpTemp, "w"); $rs = $adodb->Execute("SELECT * FROM ".$tableid); $j = 0; $logger->info("Progress: ".$j." record(s)"); while (!$rs->EOF) { foreach ($rs->fields as $k => $v) { $rs->fields[$k] = addcslashes($v, "\t\\"); } eval('$buffer = addcslashes('.substr($evalStr2, 0, -1).', "\n");'); $crc32 = crc32($buffer); eval($evalStr); $j++; if ($j%1000===0) { $logger->info("Progress: ".$j." record(s)"); } if ($j%10000===0) { fclose($fpTemp); $rs2 = $adodb->Execute( " LOAD DATA INFILE '".addslashes($tmpTemp)."' ". " REPLACE INTO TABLE ".$tableid."_crc (".$colPK.", crc);"); if (!$rs2) return $logger->error($adodb->ErrorMsg()); $fpTemp = fopen($tmpTemp, "w"); } $rs->MoveNext(); } if ($j%10000!==0) { ## FILE TEMP ## fclose($fpTemp); $rs2 = $adodb->Execute( " LOAD DATA INFILE '".addslashes($tmpTemp)."' ". " REPLACE INTO TABLE ".$tableid."_crc (".$colPK.", crc);"); if (!$rs2) return $logger->error($adodb->ErrorMsg()); } if (file_exists($tmpTemp)) @unlink($tmpTemp); return $logger->info("Total: ".$j." record(s)"); } function checkNew() { global $new_record2, $bufferLog, $fpLog; if ($new_record2 > 0) { $buffer = $bufferLog. "\t"."new". "\t".$new_record2." records"; fwrite($fpLog, $buffer."\n"); } $new_record2 = 0; } function openTemp() { global $tmpData, $tmpLog, $tmpTemp, $openTemp; ## FILE DATA ## $tmpData = tempnam("/tmp/", "tableData"); chmod($tmpData, 0777); ## FILE LOG ## $tmpLog = tempnam("/tmp/", "tableLog"); chmod($tmpLog, 0777); ## FILE TEMP ## $tmpTemp = tempnam("/tmp/", "tableTemp"); chmod($tmpTemp, 0777); $openTemp = true; } function openFile() { global $openTemp; global $fpData, $tmpData; global $fpLog, $tmpLog; global $fpTemp, $tmpTemp; if(!isset($openTemp)) openTemp(); ## FILE DATA ## $fpData = fopen($tmpData, "w"); ## FILE LOG ## $fpLog = fopen($tmpLog, "w"); ## FILE TEMP ## $fpTemp = fopen($tmpTemp, "w"); } function loadData() { global $adodb; global $tableid, $columnTable; global $fpData, $tmpData; global $fpLog, $tmpLog; global $fpTemp, $tmpTemp; global $colPK, $loadDataSolution; global $sqlType; $logger = LoggerManager::getLogger(__FUNCTION__); ## FILE DATA ## fclose($fpData); #if (filesize($tmpData)>0) # echo fread(fopen($tmpData, 'r'), filesize($tmpData)); if ($sqlType === 'new') { checkNew(); $query = ("LOAD DATA INFILE '".addslashes($tmpData)."' ". " REPLACE INTO TABLE ".$tableid." (".$columnTable.");"); $logger->info($query); $rs2 = $adodb->Execute($query); if (!$rs2) return $logger->error($adodb->ErrorMsg()); } ## FILE LOG ## fclose($fpLog); #if (filesize($tmpLog)>0) # echo fread(fopen($tmpLog, 'r'), filesize($tmpLog)); $query = ("LOAD DATA INFILE '".addslashes($tmpLog)."' ". " INTO TABLE qb_log (id, tableid, userid, jam, status, message);"); $logger->info($query); $rs2 = $adodb->Execute($query); if (!$rs2) return $logger->error($adodb->ErrorMsg()); ## FILE TEMP ## fclose($fpTemp); if ($sqlType === 'new' || $sqlType === 'updated') { $query = ("LOAD DATA INFILE '".addslashes($tmpTemp)."' ". " REPLACE INTO TABLE ".$tableid."_crc (".$colPK.", crc);"); $logger->info($query); $rs2 = $adodb->Execute($query); if (!$rs2) return $logger->error($adodb->ErrorMsg()); } } function closeFile() { global $tmpData, $tmpLog, $tmpTemp; if (file_exists($tmpData)) @unlink($tmpData); if (file_exists($tmpLog)) @unlink($tmpLog); if (file_exists($tmpTemp)) @unlink($tmpTemp); } function diffTable($conf) { global $adodb; global $tableid, $columnTable; global $fpData, $tmpData; global $fpLog, $tmpLog; global $fpTemp, $tmpTemp; global $colPK, $loadDataSolution; global $sqlType; global $bufferLog, $new_record2; $logger = LoggerManager::getLogger(__FUNCTION__); //ini_set('max_execution_time', 0); //require_once 'auth.php'; $new_record2 = $new_record = $unchanges = $updated = 0; $del_record2 = $del_record = 0; $tableid = $conf['tableid']; $logger->info("Table: ".$tableid); ## CHECK PK ## $rs3 = $adodb->MetaPrimaryKeys($tableid); if (!is_array($rs3) || (is_array($rs3) && count($rs3) == 0)) { $logger->error("PrimaryKeys must be defined !"); return; } $dummysql = $bindsql = $param = ''; foreach ($rs3 as $k => $v) { if ($bindsql) $bindsql .= " AND "; $bindsql .= $v." = ?"; if ($param) $param .= ', '; $param .= '$record["'.$v.'"]'; } $dummysql = '$rs4 = $adodb->Execute('. '"SELECT * FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableHistory($tableid); if ($result !== true) return false; $rs5 = $adodb->Execute("SELECT * FROM ".$tableid."_history"); $deletesql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $deletecrcsql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.'_crc WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableCRC($tableid); if (! is_array($result)) return false; extract($result); $evalStr = str_replace("\$crc32", "\$rs->fields[\"crc\"]", $evalStr); ## DUMMY LOG ## $recordLog = array(); $recordLog['tableid'] = $tableid; $recordLog['userid'] = $_SESSION['userid']; $recordLog['jam'] = date('Y-m-d H:i:s'); $bufferLog = "\t".$recordLog['tableid']. "\t".$recordLog['userid']. "\t".$recordLog['jam']; $arrSQL = array(); ## EXECUTE ## $sqlBase = "SELECT qb_temp_".$tableid.".* FROM qb_temp_".$tableid." ". " LEFT JOIN ".$tableid."_crc USING (".$colPK.") "; $sqlNew = " WHERE ".$tableid."_crc.crc IS NULL "; $sqlUpd = " WHERE qb_temp_".$tableid.".crc <> ".$tableid."_crc.crc "; //. $arrSQL['new'] = $sqlBase.$sqlNew; $arrSQL['updated'] = $sqlBase.$sqlUpd; $sqlBase = "SELECT ".$tableid."_crc.* FROM ".$tableid."_crc ". " LEFT JOIN qb_temp_".$tableid." USING (".$colPK.") "; $sqlDel = " WHERE qb_temp_".$tableid.".crc IS NULL "; $arrSQL['deleted'] = $sqlBase.$sqlDel; foreach ($arrSQL as $sqlType => $sql) { $j=0; openFile(); $logger->info("SQL: ".$sql); $rs = $adodb->Execute($sql); if (!$rs) { $logger->error($adodb->ErrorMsg()); continue; } $logger->info("Progress: ".$j." record(s)"); if (!$rs->EOF) { $newColumn = $rs->fields; unset($newColumn['crc']); $columnTable = implode(",", array_keys($newColumn)); //$columnTable = $metaColStr2; } while (!$rs->EOF) { $recordLog['status'] = $recordLog['message'] = ''; $record =& $rs->fields; foreach ($record as $k => $v) { $record[$k] = addcslashes($v, "\t\\"); } if ($sqlType === 'new') { $recordLog['status'] = 'new'; $new_record++; $new_record2++; } else if ($sqlType === 'updated') { eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } $updateSQL = $adodb->GetUpdateSQL($rs4, $rs->fields); if (empty($updateSQL)) { $unchanges++; } else { $recordLog['status'] = 'updated'; $updated++; foreach ($rs4->fields as $k => $v) { if ($v === @$record[$k]) continue; $msg = $k.":'".$v."'=>'".$record[$k]."', "; $recordLog['message'] .= $msg; } $adodb->Execute($updateSQL); } } else { #$adodb->debug = 1; #echo ($dummysql); // TODO: bikin table history eval($deletecrcsql); eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } foreach ($rs4->fields as $k => $v) { $msg = $k.":'".$record[$k]."', "; $recordLog['message'] .= $msg; } $recordHistory = $rs4->fields; $recordHistory['date_deleted'] = $recordLog['jam']; $historysql = $adodb->GetInsertSQL($rs5, $recordHistory); $historysql = str_replace("INSERT INTO", "REPLACE INTO", $historysql); $result = $adodb->Execute($historysql); if (!$result) $logger->error($adodb->ErrorMsg()); //else $del_record2++; eval($deletesql); $recordLog['status'] = 'deleted'; $del_record++; } $j++; if ($j%1000===0) { $logger->info("Progress: ".$j." record(s)"); } if ($j%20000===0) { loadData(); openFile(); } ## CRC ## eval($evalStr); ## LOG ## if ($recordLog['message']) { $buffer = $bufferLog. "\t".$recordLog['status']. "\t".$recordLog['message']; fwrite($fpLog, $buffer."\n"); } else { ## DATA ## unset($record['crc']); $buffer = addcslashes(implode("\t", $record), "\n"); fwrite($fpData, $buffer."\n"); } $rs->MoveNext(); } $logger->info("Total: ".$j." record(s)"); if ($j%20000!==0) { loadData(); //openFile(); } } closeFile(); $logger->info($new_record." new record(s)"); $logger->info($updated." updated record(s)"); $logger->info($unchanges." unchanges record(s)"); $logger->info($del_record." deleted record(s)"); } function replaceTable($conf) { global $adodb; global $tableid, $columnTable; global $fpData, $tmpData; global $fpLog, $tmpLog; global $fpTemp, $tmpTemp; global $colPK, $loadDataSolution; global $sqlType; global $bufferLog, $new_record2; $logger = LoggerManager::getLogger(__FUNCTION__); //ini_set('max_execution_time', 0); //require_once 'auth.php'; $new_record2 = $new_record = $unchanges = $updated = 0; $del_record2 = $del_record = 0; $tableid = $conf['tableid']; $logger->info("Table: ".$tableid); ## CHECK PK ## $rs3 = $adodb->MetaPrimaryKeys($tableid); if (!is_array($rs3) || (is_array($rs3) && count($rs3) == 0)) { $logger->error("PrimaryKeys must be defined !"); return; } $dummysql = $bindsql = $param = ''; foreach ($rs3 as $k => $v) { if ($bindsql) $bindsql .= " AND "; $bindsql .= $v." = ?"; if ($param) $param .= ', '; $param .= '$record["'.$v.'"]'; } $dummysql = '$rs4 = $adodb->Execute('. '"SELECT * FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableHistory($tableid); if ($result !== true) return false; $rs5 = $adodb->Execute("SELECT * FROM ".$tableid."_history"); $deletesql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $deletecrcsql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.'_crc WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableCRC($tableid); if (! is_array($result)) return false; extract($result); $evalStr = str_replace("\$crc32", "\$rs->fields[\"crc\"]", $evalStr); ## DUMMY LOG ## $recordLog = array(); $recordLog['tableid'] = $tableid; $recordLog['userid'] = $_SESSION['userid']; $recordLog['jam'] = date('Y-m-d H:i:s'); $bufferLog = "\t".$recordLog['tableid']. "\t".$recordLog['userid']. "\t".$recordLog['jam']; $arrSQL = array(); ## EXECUTE ## $sqlBase = "SELECT qb_temp_".$tableid.".* FROM qb_temp_".$tableid." ". " LEFT JOIN ".$tableid."_crc USING (".$colPK.") "; $sqlNew = " WHERE ".$tableid."_crc.crc IS NULL "; $sqlUpd = " WHERE qb_temp_".$tableid.".crc <> ".$tableid."_crc.crc "; //. $arrSQL['new'] = $sqlBase.$sqlNew; $arrSQL['updated'] = $sqlBase.$sqlUpd; $sqlBase = "SELECT ".$tableid."_crc.* FROM ".$tableid."_crc ". " LEFT JOIN qb_temp_".$tableid." USING (".$colPK.") "; $sqlDel = " WHERE qb_temp_".$tableid.".crc IS NULL "; $arrSQL['deleted'] = $sqlBase; //.$sqlDel; foreach ($arrSQL as $sqlType => $sql) { $j=0; openFile(); $logger->info("SQL: ".$sql); $rs = $adodb->Execute($sql); if (!$rs) { $logger->error($adodb->ErrorMsg()); continue; } $logger->info("Progress: ".$j." record(s)"); if (!$rs->EOF) { $newColumn = $rs->fields; unset($newColumn['crc']); $columnTable = implode(",", array_keys($newColumn)); //$columnTable = $metaColStr2; } while (!$rs->EOF) { $recordLog['status'] = $recordLog['message'] = ''; $record =& $rs->fields; foreach ($record as $k => $v) { $record[$k] = addcslashes($v, "\t\\"); } if ($sqlType === 'new') { $recordLog['status'] = 'new'; $new_record++; $new_record2++; } else if ($sqlType === 'updated') { eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } $updateSQL = $adodb->GetUpdateSQL($rs4, $rs->fields); if (empty($updateSQL)) { $unchanges++; } else { $recordLog['status'] = 'updated'; $updated++; foreach ($rs4->fields as $k => $v) { if ($v === $record[$k]) continue; $msg = $k.":'".$v."'=>'".$record[$k]."', "; $recordLog['message'] .= $msg; } $adodb->Execute($updateSQL); } } else { #$adodb->debug = 1; #echo ($dummysql); // TODO: bikin table history //eval($deletecrcsql); eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } foreach ($rs4->fields as $k => $v) { $msg = $k.":'".$record[$k]."', "; $recordLog['message'] .= $msg; } $recordHistory = $rs4->fields; $recordHistory['date_deleted'] = $recordLog['jam']; $historysql = $adodb->GetInsertSQL($rs5, $recordHistory); //$historysql = str_replace("INSERT INTO", "REPLACE INTO", $historysql); $result = $adodb->Execute($historysql); if (!$result) $logger->error($adodb->ErrorMsg()); //else $del_record2++; //eval($deletesql); $recordLog['status'] = 'deleted'; $del_record++; } $j++; if ($j%1000===0) { $logger->info("Progress: ".$j." record(s)"); } if ($j%20000===0) { loadData(); openFile(); } ## CRC ## eval($evalStr); ## LOG ## if ($recordLog['message']) { $buffer = $bufferLog. "\t".$recordLog['status']. "\t".$recordLog['message']; fwrite($fpLog, $buffer."\n"); } else { ## DATA ## unset($record['crc']); $buffer = addcslashes(implode("\t", $record), "\n"); fwrite($fpData, $buffer."\n"); } $rs->MoveNext(); } $logger->info("Total: ".$j." record(s)"); if ($j%20000!==0) { loadData(); //openFile(); } } closeFile(); $logger->info($new_record." new record(s)"); $logger->info($updated." updated record(s)"); $logger->info($unchanges." unchanges record(s)"); $logger->info($del_record." deleted record(s)"); } function updateTable($conf) { global $adodb; global $tableid, $columnTable; global $fpData, $tmpData; global $fpLog, $tmpLog; global $fpTemp, $tmpTemp; global $colPK, $loadDataSolution; global $sqlType; global $bufferLog, $new_record2; $logger = LoggerManager::getLogger(__FUNCTION__); //ini_set('max_execution_time', 0); //require_once 'auth.php'; $new_record2 = $new_record = $unchanges = $updated = 0; $del_record2 = $del_record = 0; $tableid = $conf['tableid']; $logger->info("Table: ".$tableid); ## CHECK PK ## $rs3 = $adodb->MetaPrimaryKeys($tableid); if (!is_array($rs3) || (is_array($rs3) && count($rs3) == 0)) { $logger->error("PrimaryKeys must be defined !"); return; } $dummysql = $bindsql = $param = ''; foreach ($rs3 as $k => $v) { if ($bindsql) $bindsql .= " AND "; $bindsql .= $v." = ?"; if ($param) $param .= ', '; $param .= '$record["'.$v.'"]'; } $dummysql = '$rs4 = $adodb->Execute('. '"SELECT * FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableHistory($tableid); if ($result !== true) return false; $rs5 = $adodb->Execute("SELECT * FROM ".$tableid."_history"); $deletesql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.' WHERE '.$bindsql.'", array('.$param.'));'; $deletecrcsql = '$rs4 = $adodb->Execute('. '"DELETE FROM '.$tableid.'_crc WHERE '.$bindsql.'", array('.$param.'));'; $result = createTableCRC($tableid); if (! is_array($result)) return false; extract($result); $evalStr = str_replace("\$crc32", "\$rs->fields[\"crc\"]", $evalStr); ## DUMMY LOG ## $recordLog = array(); $recordLog['tableid'] = $tableid; $recordLog['userid'] = $_SESSION['userid']; $recordLog['jam'] = date('Y-m-d H:i:s'); $bufferLog = "\t".$recordLog['tableid']. "\t".$recordLog['userid']. "\t".$recordLog['jam']; $arrSQL = array(); ## EXECUTE ## $sqlBase = "SELECT qb_temp_".$tableid.".* FROM qb_temp_".$tableid." ". " LEFT JOIN ".$tableid."_crc USING (".$colPK.") "; $sqlNew = " WHERE ".$tableid."_crc.crc IS NULL "; $sqlUpd = " WHERE qb_temp_".$tableid.".crc <> ".$tableid."_crc.crc "; //. $arrSQL['new'] = $sqlBase.$sqlNew; $arrSQL['updated'] = $sqlBase.$sqlUpd; $sqlBase = "SELECT ".$tableid."_crc.* FROM ".$tableid."_crc ". " LEFT JOIN qb_temp_".$tableid." USING (".$colPK.") "; // $sqlDel = " WHERE qb_temp_".$tableid.".crc IS NULL "; // $arrSQL['deleted'] = $sqlBase.$sqlDel; foreach ($arrSQL as $sqlType => $sql) { $j=0; openFile(); $logger->info("SQL: ".$sql); $rs = $adodb->Execute($sql); if (!$rs) { $logger->error($adodb->ErrorMsg()); continue; } $logger->info("Progress: ".$j." record(s)"); if (!$rs->EOF) { $newColumn = $rs->fields; unset($newColumn['crc']); $columnTable = implode(",", array_keys($newColumn)); //$columnTable = $metaColStr2; } while (!$rs->EOF) { $recordLog['status'] = $recordLog['message'] = ''; $record =& $rs->fields; foreach ($record as $k => $v) { $record[$k] = addcslashes($v, "\t\\"); } if ($sqlType === 'new') { $recordLog['status'] = 'new'; $new_record++; $new_record2++; } else if ($sqlType === 'updated') { eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } $updateSQL = $adodb->GetUpdateSQL($rs4, $rs->fields); if (empty($updateSQL)) { $unchanges++; } else { $recordLog['status'] = 'updated'; $updated++; foreach ($rs4->fields as $k => $v) { if ($v === $record[$k]) continue; $msg = $k.":'".$v."'=>'".$record[$k]."', "; $recordLog['message'] .= $msg; } $adodb->Execute($updateSQL); } } else { #$adodb->debug = 1; #echo ($dummysql); // TODO: bikin table history eval($deletecrcsql); eval($dummysql); if (!$rs4) { $logger->error($adodb->ErrorMsg()); $rs->MoveNext(); continue; } else if ($rs4->EOF) { $logger->error("EOF"); $rs->MoveNext(); continue; } foreach ($rs4->fields as $k => $v) { $msg = $k.":'".$record[$k]."', "; $recordLog['message'] .= $msg; } $recordHistory = $rs4->fields; $recordHistory['date_deleted'] = $recordLog['jam']; $historysql = $adodb->GetInsertSQL($rs5, $recordHistory); $historysql = str_replace("INSERT INTO", "REPLACE INTO", $historysql); $result = $adodb->Execute($historysql); if (!$result) $logger->error($adodb->ErrorMsg()); //else $del_record2++; eval($deletesql); $recordLog['status'] = 'deleted'; $del_record++; } $j++; if ($j%1000===0) { $logger->info("Progress: ".$j." record(s)"); } if ($j%20000===0) { loadData(); openFile(); } ## CRC ## eval($evalStr); ## LOG ## if ($recordLog['message']) { $buffer = $bufferLog. "\t".$recordLog['status']. "\t".$recordLog['message']; fwrite($fpLog, $buffer."\n"); } else { ## DATA ## unset($record['crc']); $buffer = addcslashes(implode("\t", $record), "\n"); fwrite($fpData, $buffer."\n"); } $rs->MoveNext(); } $logger->info("Total: ".$j." record(s)"); if ($j%20000!==0) { loadData(); //openFile(); } } closeFile(); $logger->info($new_record." new record(s)"); $logger->info($updated." updated record(s)"); $logger->info($unchanges." unchanges record(s)"); $logger->info($del_record." deleted record(s)"); } function importTable($conf) { global $adodb, $tmpTemp; $logger = LoggerManager::getLogger(__FUNCTION__); $odbc_dsn = $conf['dsn']; if (empty($odbc_dsn)) { return $logger->error("Error: Empty DSN"); } $logger->info("DSN: ".$odbc_dsn); $odbc =& ADONewConnection($odbc_dsn); if (!$odbc || $errorMsg=$odbc->ErrorMsg()) { if ($errorMsg) return $logger->error($errorMsg); else return $logger->error("Connect: FAILED"); } $odbc->SetFetchMode(ADODB_FETCH_ASSOC); ## CHECK PK ## $tableid = $conf['tableid']; $rs3 = $adodb->MetaPrimaryKeys($tableid); if (!is_array($rs3) || (is_array($rs3) && count($rs3) == 0)) { return $logger->error("PrimaryKeys must be defined !"); } $sql = $conf['sqlimport']; if (isset($conf['sql'])) $sql = $conf['sql']; if (!$sql) { return $logger->error("Empty SQL Import"); } // $logger->info("SQL Import: ".$sql); ## START EXECUTE ## $rs = $odbc->Execute($sql); $j = 0; $idConfig = null; if (!is_object($rs)) { return $logger->error($odbc->ErrorMsg()); } else { ## qb_temp_
## $adodb->Execute("DROP TABLE qb_temp_".$tableid); $rs2 = $adodb->Execute("SELECT * FROM qb_config ". " WHERE tableid = ? ", array($tableid)); if (!$rs2->EOF) { $idConfig = $rs2->fields['id']; $sqlCreate = $rs2->fields['sqlcreate']; $rs2 = $adodb->Execute("CREATE TABLE qb_temp_".$tableid." ". " ( ".$sqlCreate." ) "); if (!$rs2) return $logger->error($adodb->ErrorMsg()); } else { return $logger->error("tableid '".$tableid."' not found ". " on qb_config! ".$adodb->ErrorMsg()); } // COLUMN crc, INDEX $metaCol = $adodb->MetaColumns("qb_temp_".$tableid); if (!$metaCol["CRC"]) { $adodb->Execute("ALTER TABLE qb_temp_".$tableid." ADD crc INTEGER"); } $metaIndexes = $adodb->MetaIndexes("qb_temp_".$tableid); if (! is_array($metaIndexes["qb_temp_".$tableid."_idx1"])) { $adodb->Execute("CREATE INDEX qb_temp_".$tableid."_idx1 ". " ON qb_temp_".$tableid."(crc)"); } ## FILE TEMPORARY ## if (!isset($tmpTemp)) $tmpTemp = tempnam("/tmp/", "tableTemp"); // create @chmod($tmpTemp, 0777); // chmod $logger->info("File: ".$tmpTemp); $fpTemp = fopen($tmpTemp, "w"); // open if (!$rs->EOF) { // save odbc columns $metaTables = $adodb->MetaTables(); foreach ($metaTables as $k => $v) $metaTables[$k] = strtolower($v); if (! is_int(array_search("qb_config_odbc", $metaTables))) { $rs2 = $adodb->Execute("CREATE TABLE qb_config_odbc ". " ( id INTEGER, serialize TEXT, PRIMARY KEY (id) )"); if (!$rs2) return $logger->error($adodb->ErrorMsg()); } $record = array(); $record['id'] = $idConfig; $record['serialize'] = serialize(array_keys($rs->fields)); $rs2 = $adodb->Execute("SELECT * FROM qb_config_odbc ". " WHERE id = ? ", array($record['id'])); $sql = ''; if (!$rs2) return $logger->error($adodb->ErrorMsg()); if ($rs2->EOF) { $sql = $adodb->GetInsertSQL($rs2, $record); } else { $sql = $adodb->GetUpdateSQL($rs2, $record); } if ($sql) { $rs2 = $adodb->Execute($sql); if (!$rs2) $logger->error($adodb->ErrorMsg()); } $columnTable = implode(",", array_keys($rs->fields)); $metaCol = $adodb->MetaColumns("qb_temp_".$tableid); if (!is_array($metaCol)) { return $logger->error("Columns must be defined ". " on qb_temp_".$tableid."!"); } foreach ($metaCol as $k => $v) { if (!array_key_exists($v->name, $rs->fields) && $v->name != 'crc') { $adodb->Execute("ALTER TABLE qb_temp_".$tableid. " DROP ".$v->name); } } } $logger->info("Progress: ".$j." record(s)"); while (!$rs->EOF) { foreach ($rs->fields as $k => $v) { $rs->fields[$k] = addcslashes($v, "\t\\"); } $buffer = addcslashes(implode("\t", $rs->fields), "\n"); $crc32 = crc32($buffer); fwrite($fpTemp, $buffer."\t".$crc32."\n"); $j++; if ($j%1000===0) $logger->info("Progress: ".$j." record(s)"); $rs->MoveNext(); } fclose($fpTemp); $query = ("LOAD DATA INFILE '".addslashes($tmpTemp)."' ". " INTO TABLE qb_temp_".$tableid." (".$columnTable.", crc);"); $logger->info($query); $rs = $adodb->Execute($query); if (!$rs) return $logger->error($adodb->ErrorMsg()); if (file_exists($tmpTemp)) @unlink($tmpTemp); } $logger->info("Total: ".$j." record(s)"); return 1; } ?>