Exemplo n.º 1
0
    $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);
  }
}
Exemplo n.º 2
0
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";
  }
}
Exemplo n.º 3
0
  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);
  }
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
  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);
  }