From ebea2dd0395eee1ecb6cc9d206988efcbbf3e503 Mon Sep 17 00:00:00 2001 From: mchurch Date: Sat, 28 Aug 2004 15:10:16 +0000 Subject: [PATCH] Fixed some SQL statements so they work with PostGreSQL as well as MySQL. Fix provided by paca. --- mod/wiki/ewikimoodlelib.php | 386 ++++++++++++++++-------------------- 1 file changed, 170 insertions(+), 216 deletions(-) diff --git a/mod/wiki/ewikimoodlelib.php b/mod/wiki/ewikimoodlelib.php index 4d5e54dff95..36279a01e85 100644 --- a/mod/wiki/ewikimoodlelib.php +++ b/mod/wiki/ewikimoodlelib.php @@ -19,112 +19,77 @@ define("EWIKI_DB_TABLE_NAME", "wiki_pages"); function ewiki_database_moodle($action, &$args, $sw1, $sw2) { - global $wiki, $wiki_entry, $CFG; - #-- result array - $r = array(); + global $wiki, $wiki_entry, $CFG; + #-- result array + $r = array(); - switch($action) { + switch($action) { - /* Returns database entry as array for the page whose name was given + /* Returns database entry as array for the page whose name was given with the "id" key in the $args array, usually fetches the latest version of a page, unless a specific "version" was requested in the $args array. - */ - # Ugly, but we need to choose which wiki we are about to change/read - case "GET": - $id = "'" . mysql_escape_string($args["id"]) . "'"; - ($version = 0 + @$args["version"]) and ($version = "AND (version=$version)") or ($version=""); + */ + # Ugly, but we need to choose which wiki we are about to change/read + case "GET": + $id = "'" . anydb_escape_string($args["id"]) . "'"; + ($version = 0 + @$args["version"]) and ($version = "AND (version=$version)") or ($version=""); + $select="(pagename=$id) AND wiki=".$wiki_entry->id." $version "; + $sort="version DESC"; - # $result = mysql_query("SELECT * FROM " . EWIKI_DB_TABLE_NAME - # . " WHERE (pagename=$id) $version ORDER BY version DESC LIMIT 1" - #); - #if ($result && ($r = mysql_fetch_array($result, MYSQL_ASSOC))) { - # $r["id"] = $r["pagename"]; - # unset($r["pagename"]); - #} - #if (strlen($r["meta"])) { - # $r["meta"] = @unserialize($r["meta"]); - #} + $result_obj=get_records_select(EWIKI_DB_TABLE_NAME, $select,$sort,"*",0,1); + if($result_obj) { + $r=get_object_vars($result_obj[$args["id"]]); + $r["id"] = $r["pagename"]; + unset($r["pagename"]); + $r["meta"] = @unserialize($r["meta"]); + } + break; - $select="(pagename=$id) AND wiki=".$wiki_entry->id." $version "; - $sort="version DESC"; - $result_obj=get_records_select(EWIKI_DB_TABLE_NAME, $select,$sort,"*",0,1); - if($result_obj) { - $r=get_object_vars($result_obj[$args["id"]]); - $r["id"] = $r["pagename"]; - unset($r["pagename"]); - $r["meta"] = @unserialize($r["meta"]); - } - break; - - - - /* Increases the hit counter for the page name given in $args array - with "id" index key. - */ - case "HIT": - #mysql_query("UPDATE " . EWIKI_DB_TABLE_NAME . " SET hits=(hits+1) WHERE pagename='" . mysql_escape_string($args["id"]) . "'"); - # set_field does not work because of the "hits+1" construct - #print "DO ".mysql_escape_string($args["id"]); exit; - execute_sql("UPDATE " .$CFG->prefix.EWIKI_DB_TABLE_NAME . " SET hits=(hits+1) WHERE pagename='" . mysql_escape_string($args["id"]) . "' and wiki=".$wiki_entry->id, 0); - break; + /* Increases the hit counter for the page name given in $args array + with "id" index key. + */ + case "HIT": + execute_sql("UPDATE " .$CFG->prefix.EWIKI_DB_TABLE_NAME . " SET hits=(hits+1) WHERE pagename='" . anydb_escape_string($args["id"]) . "' and wiki=".$wiki_entry->id, 0); + break; /* Stores the $data array into the database, while not overwriting - existing entries (using WRITE); returns 0 on failure and 1 if - saved correctly. - */ - case "OVERWRITE": - $COMMAND = "REPLACE"; - break; + existing entries (using WRITE); returns 0 on failure and 1 if + saved correctly. + */ + case "OVERWRITE": + $COMMAND = "REPLACE"; + break; - case "WRITE": - $COMMAND="WRITE"; - $args["pagename"] = $args["id"]; - unset($args["id"]); + case "WRITE": + $COMMAND="WRITE"; + $args["pagename"] = $args["id"]; + unset($args["id"]); - if (is_array($args["meta"])) { - $args["meta"] = serialize($args["meta"]); - } + if (is_array($args["meta"])) { + $args["meta"] = serialize($args["meta"]); + } - #$sql1 = $sql2 = ""; - #foreach ($args as $index => $value) { - # if (is_int($index)) { - # continue; - # } - # $a = ($sql1 ? ', ' : ''); - # $sql1 .= $a . $index; - # $sql2 .= $a . "'" . mysql_escape_string($value) . "'"; - #} - - #strlen(@$COMMAND) || ($COMMAND = "INSERT"); - - foreach ($args as $index => $value) { - if (is_int($index)) { + foreach ($args as $index => $value) { + if (is_int($index)) { continue; + } + $args[$index] =anydb_escape_string($value); + } + $args["wiki"]=$wiki_entry->id; + + # Check if Record exists + if($COMMAND=="REPLACE") { + if(count_records(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$args["pagename"],"version",$args["version"])) { + delete_record(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$args["pagename"],"version",$args["version"]); } - $args[$index] =mysql_escape_string($value); - } - $args["wiki"]=$wiki_entry->id; - - # Check if Record exists - if($COMMAND=="REPLACE") { - if(count_records(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$args["pagename"],"version",$args["version"])) { - delete_record(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$args["pagename"],"version",$args["version"]); - } - } - - # Write - $result=insert_record(EWIKI_DB_TABLE_NAME,$args,false,"pagename"); - - #$result = mysql_query("$COMMAND INTO " . EWIKI_DB_TABLE_NAME . - # " (" . $sql1 . ") VALUES (" . $sql2 . ")" - #); - #return($result && mysql_affected_rows() ?1:0); - - return $result; - break; + } + # Write + $result=insert_record(EWIKI_DB_TABLE_NAME,$args,false,"pagename"); + return $result; + break; /* Checks for existence of the WikiPages whose names are given in the $args array. Returns an array with the specified WikiPageNames @@ -132,165 +97,154 @@ function ewiki_database_moodle($action, &$args, $sw1, $sw2) { in the database). For images/binary db entries returns the "meta" field instead of an "1". */ - case "FIND": - $select = ""; - foreach (array_values($args) as $id) { - if (strlen($id)) { - $r[$id] = 0; - $select .= ($select ? " OR " : "") . - "(pagename='" . mysql_escape_string($id) . "')"; + case "FIND": + $select = ""; + foreach (array_values($args) as $id) { + if (strlen($id)) { + $r[$id] = 0; + $select .= ($select ? " OR " : "") . + "(pagename='" . anydb_escape_string($id) . "')"; } - } - if($select) { - $select = "(".$select.") AND wiki=".$wiki_entry->id; - $result = get_records_select(EWIKI_DB_TABLE_NAME,$select); - #$sql = "SELECT pagename AS id, meta FROM " . - # EWIKI_DB_TABLE_NAME . " WHERE $sql " - #); - #while ($result && ($row = mysql_fetch_row($result))) { - # $r[$row[0]] = strpos($row[1], 's:5:"image"') ? $row[1] : 1; - - while(list($key, $val) = @each($result)) { - $r[$val->pagename]=strpos($val->meta, 's:5:"image"') ? $val->meta : 1; - } - } + } + if($select) { + $select = "(".$select.") AND wiki=".$wiki_entry->id; + $result = get_records_select(EWIKI_DB_TABLE_NAME,$select); + while(list($key, $val) = @each($result)) { + $r[$val->pagename]=strpos($val->meta, 's:5:"image"') ? $val->meta : 1; + } + } break; - /* Counts the number of Versions - */ - case "COUNTVERSIONS": - $sql= "SELECT pagename AS id, count(*) as versioncount". - " FROM ". $CFG->prefix.EWIKI_DB_TABLE_NAME . - " WHERE wiki = ".$wiki_entry->id. - " GROUP BY id"; + /* Counts the number of Versions + */ + case "COUNTVERSIONS": + $sql= "SELECT pagename AS id, count(*) as versioncount". + " FROM ". $CFG->prefix.EWIKI_DB_TABLE_NAME . + " WHERE wiki = ".$wiki_entry->id. + " GROUP BY id"; - #print "$sql"; - $result=get_records_sql($sql); - while(list($key, $val) = each($result)) { + $result=get_records_sql($sql); + while(list($key, $val) = each($result)) { $r[$key]=$val->versioncount; - } - break; + } + break; - /* Returns an array of __all__ pages, where each entry is made up - of the fields from the database requested with the $args array, - e.g. array("flags","meta","lastmodified"); - */ - case "GETALL": + /* Returns an array of __all__ pages, where each entry is made up + of the fields from the database requested with the $args array, + e.g. array("flags","meta","lastmodified"); + */ + case "GETALL": + switch ($CFG->dbtype) { + case 'postgres7': + $sql= "SELECT pagename AS id, ". + implode(", ", $args) . + " FROM ". $CFG->prefix.EWIKI_DB_TABLE_NAME . + " WHERE wiki = ".$wiki_entry->id. + " GROUP BY id, ".implode(", ", $args); + break; + default: + $sql= "SELECT pagename AS id, ". + implode(", ", $args) . + " FROM ". $CFG->prefix.EWIKI_DB_TABLE_NAME . + " WHERE wiki = ".$wiki_entry->id. + " GROUP BY id, version" ; + } - #$result = mysql_query("SELECT pagename AS id, ". - # implode(", ", $args) . - # " FROM ". EWIKI_DB_TABLE_NAME . - # " GROUP BY id, version DESC" - #); - $sql= "SELECT pagename AS id, ". - implode(", ", $args) . - " FROM ". $CFG->prefix.EWIKI_DB_TABLE_NAME . - " WHERE wiki = ".$wiki_entry->id. - " GROUP BY id, version"; + $result=get_records_sql($sql); + $r = new ewiki_dbquery_result($args); - #print "$sql"; - $result=get_records_sql($sql); - $r = new ewiki_dbquery_result($args); + $drop = ""; - $drop = ""; - #while ($result && ($row = mysql_fetch_array($result, MYSQL_ASSOC))) { - # $i = EWIKI_CASE_INSENSITIVE ? strtolower($row["id"]) : $row["id"]; - # if ($i != $drop) { - # $drop = $i; - # $r->add($row); - # } - #} - #print "
"; print_r($result); print "
"; - if(!$result) { + if(!$result) { $result=array(); - } - while(list($key, $val) = each($result)) { + } + while(list($key, $val) = each($result)) { $row=get_object_vars($val); $i = EWIKI_CASE_INSENSITIVE ? strtolower($row["id"]) : $row["id"]; if ($i != $drop) { $drop = $i; $r->add($row); } - } + } - break; + break; - /* Returns array of database entries (also arrays), where the one - specified column matches the specified content string, for example - $args = array("content" => "text...piece") - is not guaranteed to only search/return the latest version of a page - */ - case "SEARCH": - $field = implode("", array_keys($args)); - $content = strtolower(implode("", $args)); - if ($field == "id") { $field = "pagename"; } + /* Returns array of database entries (also arrays), where the one + specified column matches the specified content string, for example + $args = array("content" => "text...piece") + is not guaranteed to only search/return the latest version of a page + */ + case "SEARCH": + $field = implode("", array_keys($args)); + $content = strtolower(implode("", $args)); + if ($field == "id") { $field = "pagename"; } - #$result = mysql_query("SELECT pagename AS id, version, flags" . - # (EWIKI_DBQUERY_BUFFER && ($field!="pagename") ? ", $field" : "") . - # " FROM " . EWIKI_DB_TABLE_NAME . - # " WHERE LOCATE('" . mysql_escape_string($content) . "', LCASE($field)) " . - # " GROUP BY id, version DESC" - #); - $sql= "SELECT pagename AS id, version, flags" . - (EWIKI_DBQUERY_BUFFER && ($field!="pagename") ? ", $field" : "") . - " FROM " . $CFG->prefix.EWIKI_DB_TABLE_NAME . - " WHERE LOCATE('" . mysql_escape_string($content) . "', LCASE($field)) and wiki=".$wiki_entry->id . - " GROUP BY id, version DESC"; - $result=get_records_sql($sql); - $r = new ewiki_dbquery_result(array("id","version",$field)); - $drop = ""; - #while ($result && ($row = mysql_fetch_array($result, MYSQL_ASSOC))) { - # $i = EWIKI_CASE_INSENSITIVE ? strtolower($row["id"]) : $row["id"]; - # if ($i != $drop) { - # $drop = $i; - # $r->add($row); - # } - #} - while(list($key, $val) = @each($result)) { + switch ($CFG->dbtype) { + case 'postgres7': + $sql= "SELECT pagename AS id, version, flags" . + (EWIKI_DBQUERY_BUFFER && ($field!="pagename") ? ", $field" : "") . + " FROM " . $CFG->prefix.EWIKI_DB_TABLE_NAME . + " WHERE $field ILIKE '%".$content."%' and wiki=".$wiki_entry->id . + " GROUP BY id, version, flags ". + (EWIKI_DBQUERY_BUFFER && ($field!="pagename") ? ", $field" : "") ; + break; + default: + $sql= "SELECT pagename AS id, version, flags" . + (EWIKI_DBQUERY_BUFFER && ($field!="pagename") ? ", $field" : "") . + " FROM " . $CFG->prefix.EWIKI_DB_TABLE_NAME . + " WHERE LOCATE('" . anydb_escape_string($content) . "', LCASE($field)) and wiki=".$wiki_entry->id . + " GROUP BY id, version "; + } + + $result=get_records_sql($sql); + + $r = new ewiki_dbquery_result(array("id","version",$field)); + $drop = ""; + while(list($key, $val) = @each($result)) { $row=get_object_vars($val); $i = EWIKI_CASE_INSENSITIVE ? strtolower($row["id"]) : $row["id"]; if ($i != $drop) { - $drop = $i; - $r->add($row); + $drop = $i; + $r->add($row); } - } - break; + } + break; - case "DELETE": - $id = mysql_escape_string($args["id"]); - $version = $args["version"]; + case "DELETE": + $id = anydb_escape_string($args["id"]); + $version = $args["version"]; - #mysql_query("DELETE FROM " . EWIKI_DB_TABLE_NAME ." - # WHERE pagename='$id' AND version=$version"); - # print "DELETING wiki:".$wiki_entry->id."Pagename: $id Version: $version
\n"; - delete_records(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$id,"version",$version); + delete_records(EWIKI_DB_TABLE_NAME,"wiki", $wiki_entry->id,"pagename",$id,"version",$version); - break; + break; - case "INIT": - #mysql_query("CREATE TABLE " . EWIKI_DB_TABLE_NAME ." - # (pagename VARCHAR(160) NOT NULL, - # version INTEGER UNSIGNED NOT NULL DEFAULT 0, - # flags INTEGER UNSIGNED DEFAULT 0, - # content MEDIUMTEXT, - # author VARCHAR(100) DEFAULT 'ewiki', - # created INTEGER UNSIGNED DEFAULT ".time().", - # lastmodified INTEGER UNSIGNED DEFAULT 0, - # refs MEDIUMTEXT, - # meta MEDIUMTEXT, - # hits INTEGER UNSIGNED DEFAULT 0, - # PRIMARY KEY id (pagename, version) ) - # "); - #echo mysql_error(); - break; + case "INIT": + break; - default: - } + default: +} return($r); } + +function anydb_escape_string($s) { + global $CFG ; + $type = ($CFG->dbtype); + switch ($CFG->dbtype) { + case 'mysql': + $s = mysql_escape_string($s); + break; + case 'postgres7': + $s = pg_escape_string($s); + break; + default: + $s = addslashes($s); + } + + return($s); +} \ No newline at end of file