emb_tags = array(); $this->ref = -1; $this->results = array(); $this->db_cols = array(); $this->id_start = -1; $this->id_end = 1000000; } function startHandler($xp, $element, $attributes) { $element = strtolower($element); set_time_limit(100); } function endHandler($xp, $element) { $element = strtolower($element); if($element == $this->id_field) { $this->id = $this->data; } else if(($this->id >= $this->id_start) && ($this->id <= $this->id_end)) { if(ereg("<",$this->data)) { $line = "<$element>$this->data"; $this->cur_tag = $element; xml_parse($this->emb_parser,$line,false); } } $this->data = ""; } function cDataHandler($xp,$data) { if(trim($data) != "") { $this->data .= $data; } } function embStart($xp,$element,$attributes) { $element = strtolower($element); $this->emb_data = ""; if(!$this->group->contains_field($element)) { if(!in_array($element,$this->emb_tags)) { $this->emb_tags[] = $element; } } } function embEnd($xp,$element) { $element = strtolower($element); if(array_key_exists($element,$this->db_cols)) { $this->results[$this->id][$this->cur_tag][$element][] = $this->emb_data; } $this->emb_data = ""; } function embCData($xp,$data) { if(trim($data) != "") { $this->emb_data .= $data; } } function get_embedded_tag_content($xml) { $this->parser = xml_parser_create(); xml_set_object($this->parser, $this); xml_set_element_handler($this->parser, "startHandler", "endHandler"); xml_set_character_data_handler($this->parser, "cDataHandler"); $this->emb_parser = xml_parser_create(); xml_set_object($this->emb_parser, $this); xml_set_element_handler($this->emb_parser, "embStart", "embEnd"); xml_set_character_data_handler($this->emb_parser, "embCData"); xml_parse($this->emb_parser,"",false); $in = fopen($xml,"r"); $line_num = 0; while($line = fgets($in)) { $line_num++; xml_parse($this->parser,$line,false); set_time_limit(100); //echo "line: $line_num \n"; } sort($this->emb_tags); return $this->results; } /** * This takes a string argument in the form tag = field1,field2,field3,etc. */ function get_db_cols($textarea) { $lines = explode("\n",$textarea); $db_cols = array(); foreach($lines as $line) { $vals = explode(" = ",$line); $tag = trim($vals[0]); $db_cols[$tag] = explode(",",$vals[1]); } return $db_cols; } function get_starter_queries($project, $db_cols) { $starter_queries = array(); foreach($db_cols as $tag=>$cols) { $query_cols = ""; $tables_used = array(); foreach($cols as $col) { if(ereg("[!]",$col)) { $col = substr($col,1); } $group_names = $this->group->find_group($col); foreach($group_names as $group_name=>$count) { $table = $project."_".$group_name; if(!in_array($table,$tables_used)) { $tables_used[] = $table; } for($j=0;$j<$count;$j++) { $query_cols .= $col."_$j,"; } } } $query_cols = substr($query_cols,0,-1); $query = "SELECT $query_cols FROM "; $t = array_shift($tables_used); foreach($tables_used as $table) { $t .= " LEFT JOIN $table USING (".$this->group->name."_id)"; } $query .= $t; $starter_queries[$tag] = $query; } return $starter_queries; } function find_errors($form_vars) { $project = $form_vars["project"]; $this->id_field = $form_vars["id_field"]; /* $head_tag = strtolower($form_vars["head_tag"]); $sd = new schema_discoverer(); $schema = $sd->create_schema($xml,$head_tag); $out = fopen("nahuatl_full_schema.xml","w"); fwrite($out,$schema); fclose($out); */ $schema = "nahuatl_full_schema.xml"; $sl = new schema_loader(); $this->group = $sl->create_group_structure($schema,""); $textarea = $form_vars["db_cols"]; $this->db_cols = $this->get_db_cols($textarea); $starter_queries = $this->get_starter_queries($project,$this->db_cols); $this->id_start = $form_vars["id_start"]; if($this->id_start == "") { $this->id_start == -1; } $this->id_end = $form_vars["id_end"]; if($this->id_end == "") { $this->id_end = 1000000; } $db_xml = $form_vars["db_xml"]; $this->get_embedded_tag_content($db_xml); foreach($this->results as $id=>$fields) { foreach($fields as $field=>$tags) { foreach($tags as $tag=>$vals) { foreach($vals as $value) { if(array_key_exists($tag,$starter_queries)) { $col = $this->db_cols[$tag][0]; if(ereg("[!]",$col)) { $col = substr($col,1); } $query = $starter_queries[$tag]." WHERE ".$col."_0='$value'"; $query_result = mysql_query($query); $row = mysql_fetch_assoc($query_result); foreach($this->db_cols[$tag] as $col) { if(strpos($col,"!") === false) { $should_be_empty = false; } else { $col = substr($col,1); $should_be_empty = true; } $group_names = $this->group->find_group($col); $has_value = false; foreach($group_names as $name=>$count) { if($has_value) { break; } for($i=0;$i<$count;$i++) { if($row[$col."_".$i] != "") { $has_value = true; break; } } } if(!$has_value && !$should_be_empty) { $has_error = true; $message = "tag is $tag : but no entry exists with $col=$value"; } else if($has_value && $should_be_empty){ $has_error = true; $message = "tag is $tag : but there exists an entry with $col=$value"; } if($has_error) { echo "$this->id_field: $id : $field : $message
"; $message = ""; $has_error = false; } } } } } } } } } $form_vars = array_merge($_POST,$_GET); $exc = new embedded_xml_cleanser(); $results = $exc->find_errors($form_vars); ?>