$tags_rule=parse_hstore($elem_rule['tags']); $tags_old=$tags_rule; foreach($lang_cat_list["$category_id:{$elem_rule['rule_id']}"] as $tag=>$dummy) { foreach($dummy as $l=>$value) { if(is_array($value)) { $value=implode(";", $value); } if($l==$lang) $tags_rule["$tag"]=$value; else $tags_rule["$tag:$l"]=$value; } } if(sizeof(array_diff_assoc($tags_rule, $tags_old))) $change=true; $sql_str.="insert into category_rule values ( '$category_id', '{$elem_rule['rule_id']}', ".array_to_hstore($tags_rule).", '$new_version');\n"; } $sql_str.="commit;\n"; if($change) { print "Update category $category_id\n"; sql_query($sql_str, $db_central); } }
function match_to_sql($match, $table_def, $type="exact") { $not=""; $same="false"; switch($match[0]) { case "or": if(sizeof($match)==1) return "true"; $ret=array(); for($i=1; $i<sizeof($match); $i++) { $ret[]=match_to_sql($match[$i], $table_def, $type); } return "(".implode(") or (", $ret).")"; case "and": if(sizeof($match)==1) return "true"; $ret=array(); for($i=1; $i<sizeof($match); $i++) { $ret[]=match_to_sql($match[$i], $table_def, $type); } return "(".implode(") and (", $ret).")"; case "not": return "not ".match_to_sql($match[1], $table_def, $type); case "is not": $not="not"; case "is": switch($type) { case "index": $ret=array(); for($i=2; $i<sizeof($match); $i++) { $ret[]="osm_tags @> ".array_to_hstore(array($match[1]=>$match[$i])); } if($not) $ret[]="osm_tags ? ".postgre_escape($match[1]); return "$not (".implode(") or (", $ret).")"; default: $ret=array(); for($i=2; $i<sizeof($match); $i++) { $ret[]=postgre_escape($match[$i]); } if($not) $not="not osm_tags ? ".postgre_escape($match[1])." or not"; return "($not coalesce(osm_tags->".postgre_escape($match[1]).", '') in (".implode(", ", $ret)."))"; } case "~is not": $not="not"; case "~is": switch($type) { case "index": $ret=array(); for($i=2; $i<sizeof($match); $i++) { $ret[]=postgre_escape($match[$i]); } register_index($table_def['table'], $match[1], "tsvector", $table_def['id']); return "$not to_tsvector('simple', ".match_to_sql_colname($match[1], $table_def, $type).") @@ to_tsquery('simple', ".implode("||' | '||", $ret).")"; default: $ret=array(); for($i=2; $i<sizeof($match); $i++) { $ret[]=postgre_escape($match[$i]); } return "$not oneof_in(".match_to_sql_colname($match[1], $table_def, $type).", ARRAY[".implode(", ", $ret)."])"; } case "exist": return "osm_tags ? ".postgre_escape($match[1]); case "exist not": return "not osm_tags ? ".postgre_escape($match[1]); case ">=": $same="true"; case ">": $number=parse_number($match[2]); if($type=="index") { // for index-search we make an index every 100 // units and change the select-statement accordingly $same="true"; $number=pow(100, floor(log($number, 100)+0.000001)); register_index($table_def['table'], $match[1], "gteq", $table_def['id'], $number); $var="split_semicolon(".match_to_sql_colname($match[1], $table_def, $type).")"; } else { $var=match_to_sql_colname($match[1], $table_def, $type); } return "oneof_between($var, $number, $same, null, null)"; case "<=": $same="true"; case "<": $number=parse_number($match[2]); if($type=="index") { $same="true"; $number=pow(100, ceil(log($number, 100))); register_index($table_def['table'], $match[1], "lteq", $table_def['id'], $number); $var="split_semicolon(".match_to_sql_colname($match[1], $table_def, $type).")"; } else { $var=match_to_sql_colname($match[1], $table_def, $type); } return "oneof_between($var, null, null, $number, $same)"; case "true": return "true"; case "false": return "false"; default: print "invalid match! "; print_r($match); return "true"; } }
function save() { global $db_central; if(!$this->authenticated) return; sql_query("update user_list set osm_tags=". array_to_hstore($this->tags->data()). " where username=$this->pg_username", $db_central); }
function category_restore($id, $param=array()) { global $db_central; global $current_user; if(!isset($param['version'])) return false; $cat=new category($id); $newest=$cat->get_newest_version(); $pg_id=postgre_escape($id); $pg_version=postgre_escape($param['version']); $pg_newest=postgre_escape($newest); $future=uniqid(); $pg_future=postgre_escape($future); // compile version tags $version_tags=new tags(); $version_tags->set("user", $current_user->username); $version_tags->set("date", Date("c")); $version_tags->set("msg", "Restore version '{$param['version']}'"); $pg_version_tags=array_to_hstore($version_tags->data()); $sql ="begin;"; $sql.="insert into category (select $pg_id, tags, $pg_future, Array[$pg_newest], $pg_version_tags from category where version=$pg_version);"; $sql.="insert into category_rule (select $pg_id, rule_id, tags, $pg_future from category_rule where version=$pg_version);"; $sql.="delete from category_current where category_id=$pg_id;"; $sql.="insert into category_current values ($pg_id, $pg_future, now());"; $sql.="commit;"; sql_query($sql, $db_central); return array("status"=>true, "version"=>$future); }
function save($param=array()) { global $current_user; global $db_central; $sql="begin;"; $version=uniqid(); $parent_version=$this->get_newest_version($db_central); $version_tags=new tags(); $version_tags->set("user", $current_user->username); $version_tags->set("date", Date("c")); $version_tags->set("msg", $param['msg']); $sql.="insert into category values ('{$this->id}', ".array_to_hstore($this->tags->data()).", '$version', Array['$parent_version'], ".array_to_hstore($version_tags->data()).");\n"; foreach($this->rules as $id=>$rule) { $sql.="insert into category_rule values ('{$this->id}', '{$rule->id}', ".array_to_hstore($rule->tags->data()).", '$version');\n"; } $sql.="update category_current set version='$version', now=now() where category_id='{$this->id}';\n"; $sql.="commit;\n"; sql_query($sql, $db_central); }