From 5129945ad8f4dbabb1830fac9c7c0a5882146fed Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 21 May 2007 03:07:57 +0000 Subject: [PATCH] git-svn-id: http://xe-core.googlecode.com/svn/trunk@1482 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBSqlite2.class.php | 74 +++++++++++++++++------- classes/db/DBSqlite3_pdo.class.php | 59 ++++++++++--------- modules/importer/importer.controller.php | 2 - 3 files changed, 86 insertions(+), 49 deletions(-) diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index 18062f2c9..a3f0fcf3a 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -338,31 +338,65 @@ * @brief updateAct 처리 **/ function _executeUpdateAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - //$table_list[] = '`'.$this->prefix.$key.'` as '.$val; - $table_list[] = '`'.$this->prefix.$key.'`'; - } + $table_count = count(array_values($output->tables)); - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; - else { - if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; - elseif(!$value || is_numeric($value)) $value = (int)$value; + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_keys($output->tables); + $target_table = $this->prefix.$target_table; - $column_list[] = sprintf("`%s` = %s", $name, $value); + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[$val] = $this->prefix.$val; + } + list($source_table, $target_table) = array_values($table_list); + + // 조건절 정리 + $condition = $this->getCondition($output); + foreach($table_list as $key => $val) { + $condition = eregi_replace($key.'\\.', $val.'.', $condition); + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + list($s_prefix, $s_column) = explode('.',$name); + list($t_prefix, $t_column) = explode('.',$value); + + $s_table = $table_list[$s_prefix]; + $t_table = $table_list[$t_prefix]; + $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); + } + + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); + } else { + return; } - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); - return $this->_query($query); } diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 64e051d5f..5ae0e285f 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -375,13 +375,40 @@ * @brief updateAct 처리 **/ function _executeUpdateAct($output) { - // 대상 테이블이 2개 이상일 경우 - if(count(array_values($output->tables) > 1)) { + $table_count = count(array_values($output->tables)); + + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_keys($output->tables); + $target_table = $this->prefix.$target_table; + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { // 테이블 정리 foreach($output->tables as $key => $val) { $table_list[$val] = $this->prefix.$val; } - list($target_table) = array_values($table_list); + list($source_table, $target_table) = array_values($table_list); // 조건절 정리 $condition = $this->getCondition($output); @@ -402,31 +429,9 @@ $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); } - $query = sprintf('update %s set %s', $target_table, implode(',', $column_list)); - - // 대상 테이블이 1개일 경우 + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); } else { - // 테이블 정리 - list($target_table) = array_keys($output->tables); - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; - else { - if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; - elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = sprintf("`%s` = %s", $name, $value); - } - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + return; } $this->_prepare($query); diff --git a/modules/importer/importer.controller.php b/modules/importer/importer.controller.php index 59a01565c..8d30c05a8 100644 --- a/modules/importer/importer.controller.php +++ b/modules/importer/importer.controller.php @@ -351,11 +351,9 @@ function procImporterAdminSync() { // 게시물정보 싱크 $output = executeQuery('importer.updateDocumentSync'); - if(!$output->toBool()) return $output; // 댓글정보 싱크 $output = executeQuery('importer.updateCommentSync'); - if(!$output->toBool()) return $output; $this->setMessage('msg_sync_completed'); }