function sync_table($src, $dst, $cond = array(), $transl = "", $modes = array("INSERT", "UPDATE", "DELETE")) { global $SYNC_STATUS; global $SCHEMA; global $ERROR; global $debug; $tdef = $SCHEMA[$src]; $version = _db_extfield($src, "version"); $limit = @$SYNC_STATUS[$src][$dst]; if ($limit) { $cond["{$version} >"] = $limit; } $qstruct = array("TABLE" => $src, "FIELD" => array(), "COND" => $cond, "ORDER" => "", "START" => 0, "COUNT" => 0); $databases = array(); $q2 = _db_mangle_query($databases, $qstruct); // currently only 1 database supported $database = key($databases); $query = _db_make_query($database, $subqs, $q2); $env = array("DB" => $database, "ARG" => $subqs, "CB_PROCESS" => "_sync_cb_table", "SRC" => $src, "DST" => $dst, "TRANSL" => $transl, "MODES" => $modes, "version" => $version, "MAXTIME" => $limit); $ok = _db_multiquery($env, false, $query, array("_db_cb_process_data")); if (!$ok) { if (!$ERROR) { $ERROR = "unknown sync error"; } if ($debug) { echo "sync oops............................ {$ERROR} <br>\n"; } return false; } $SYNC_STATUS[$src][$dst] = $env["MAXTIME"]; return true; }
function _db_prepare_data($table, $data) { global $SCHEMA; global $USER; global $FROM; $version = _db_extfield($table, "version"); $modified_from = _db_extfield($table, "modified_from"); $modified_by = _db_extfield($table, "modified_by"); $newdata = array(); foreach ($data as $idx => $row) { $newrow = $row; // initialize "automatic" fields $newrow[$version] = null; $newrow[$modified_from] = $FROM; $newrow[$modified_by] = $USER; foreach ($row as $field => $value) { // handle splitted fields $fdef = @$SCHEMA[$table]["FIELDS"][$field]; if (($extra = @$fdef["DATA_SPLIT"]) && is_array($value)) { $delim = $extra[0]; $key = $extra[1]; $newarray = array(); foreach ($value as $rec) { $newarray[] = $rec[$key]; } $newrow[$field] = implode($delim, $newarray); } // callbacks for conversion if ($cb = @$fdef["CB_CONV_WRITE"]) { $newrow[$field] = $cb($table, $field, $newrow[$field]); } } $newdata[$idx] = $newrow; } return $newdata; }
if (!$TOOL["order"]) { $TOOL["order"] = _db_primary($table); } if (!$TOOL["tool_page_start"]) { $TOOL["tool_page_start"] = 1; } if (!$TOOL["tool_page_size"]) { $TOOL["tool_page_size"] = 100; } if (!isset($_REQUEST["tool_level"])) { $TOOL["tool_level"] = 1; } $tp_table = $table; if (@$_REQUEST["tool_history"]) { $tp_table = _db_2temporal($table); $version = _db_extfield($table, "version"); $TOOL["order"] .= ",{$version}"; } //////////////////////////////////////////////////////////////////// function app_get_templates() { global $BASEDIR; global $CONFIG; global $USER; global $PERM; global $debug; global $LANGUAGE; if (!@$LANGUAGE) { $LANGUAGE = "generic_generic.php"; } $lang = $LANGUAGE;
function _mysql_make_update_tp(&$stack, $qstruct, &$cb_list) { global $ERROR; $mode = $qstruct["MODE"]; if ($mode == "DELETE") { // this need not depend on $qstruct["DATA"] return _mysql_make_delete_tp($stack, $qstruct, $cb_list); } $res = ""; $table = $qstruct["TABLE"]; $realtable = _db_realname($table); $realtable_tp = _db_2temporal($realtable); $autoinc = _db_autoinc($table); $version = _db_version($table); $deleted = _db_extfield($table, "deleted"); $fields = implode(", ", _db_realname($table, $qstruct["ALL_FIELDS"])); $count = 0; foreach ($qstruct["DATA"] as $row) { $idcond = _mysql_make_idcond_base($qstruct, $row); if ($count++) { $res .= "; "; } //$res .= "replace into $realtable_tp($fields) "; $res .= "insert into {$realtable_tp}({$fields}) "; $where = _mysql_make_idwhere($qstruct, $row); if ($ERROR) { return null; } $newdata = ""; $rowcount = 0; $oldcount = 0; foreach ($qstruct["ALL_FIELDS"] as $field) { $realfield = _db_realname($table, $field); if ($rowcount++) { $newdata .= ", "; } if ($field == $deleted) { $row[$field] = false; } if ($mode == "INSERT" && $field == $autoinc || $field == $version) { // give AUTO_INCREMENT / versioning a chance $newdata .= "null"; } elseif (array_key_exists($field, $row) && in_array($field, $qstruct["UPDATE_FIELDS"])) { // take new value $value = @$row[$field]; if ($field == $autoinc && $mode == "INSERT") { $value = null; } if (!@$qstruct["RAW_MODE"] && !_mysql_check_allref($stack, $table, $field, $value, $mode, $idcond)) { return null; } $newdata .= db_esc_sql($value); } elseif ($mode == "REPLACE") { // caution: we cannot be sure that the data already exists, handle that case $newdata .= "case when exists(select {$realfield} from {$realtable} where {$where}) then (select max({$realfield}) from {$realtable} where {$where}) else null end"; } else { // fallback to old value from the db $oldcount++; $newdata .= $realfield; } } if ($mode == "REPLACE") { $res .= "select {$newdata}"; } elseif (($oldcount || $mode == "UPDATE") && $mode != "INSERT") { $res .= "select {$newdata} from {$realtable} where {$where}"; } else { $res .= "values ({$newdata})"; } $cb_list[] = $qstruct["CB"]; } return $res; }
function _db_version($table, $MYSCHEMA = null) { if (@$MYSCHEMA[$table]["FIELDNAME_VERSION"]) { return $MYSCHEMA[$table]["FIELDNAME_VERSION"]; } return _db_extfield($table, "version", $MYSCHEMA); }