5 This plugin makes PhpWiki v1.3.x database tables accessible for ewiki.
6 It is mainly used for conversion from PhpWiki to ErfurtWiki - and you
7 should not rely on it for daily work, as the PhpWiki tables will
8 probably always become inconsistent due to the rather simple access
11 The code is mainly based upon the PhpWiki database scheme and some
12 experiments with an existing setup (after five hours of PhpWikiSetup).
13 You must first enable write access - working, but not well tested.
17 define("PHPWIKI13_WRITEACCESS", 0);
18 define("EWIKI_PAGE_INDEX", "WikiWikiWeb");
19 $ewiki_plugins["database"][0] = "ewiki_database_phpwiki13";
24 class ewiki_database_phpwiki13 {
27 function ewiki_database_phpwiki13() {
31 function GET($id, $version=false) {
33 $ver_sql = " AND version=$version";
35 $id = mysql_escape_string($id);
37 if (($result = mysql_query("SELECT *
38 FROM version LEFT JOIN page USING (id)
39 WHERE pagename='$id' $ver_sql ORDER BY version DESC LIMIT 1"))
40 and ($row = mysql_fetch_array($result)) )
44 $dec1 = unserialize($row["pagedata"]);
45 $dec2 = unserialize($row["versiondata"]);
46 $dec1["markup"] = $dec2["markup"];
47 $created = ($dec1["created"] ? $dec1["created"] : UNIX_MILLENNIUM);
49 "id" => $row["pagename"],
50 "version" => $row["version"],
51 "content" => $row["content"],
52 "author" => $dec2["author"],
53 "lastmodified" => $row["mtime"],
54 "hits" => $row["hits"],
55 "flags" => EWIKI_DB_F_TEXT,
56 "created" => $created,
62 if ($dec1["locked"]=="yes") {
63 $r["flags"] |= EWIKI_DB_F_READONLY;
65 if (is_int($flags = $dec1["flags"])) {
68 unset($r["meta"]["flags"]);
69 unset($r["meta"]["created"]);
70 unset($r["meta"]["locked"]);
71 // $r["meta"] = serialize($r["meta"]); // must be serialized() in inner ewiki_db:: layer
75 if ($result = mysql_query("SELECT p2.pagename FROM link
76 LEFT JOIN page p1 ON (link.linkfrom=p1.id)
77 LEFT JOIN page p2 ON (p2.id=link.linkto)
78 WHERE p1.id=$num_id"))
80 while ($row = mysql_fetch_array($result)) {
81 $r["refs"] .= $row["pagename"] . "\n";
90 #-- better don't use this!
91 function WRITE($hash, $overwrite=0) {
92 if (!PHPWIKI13_WRITEACCESS) {
93 die("The plugins/db_phpwiki13 interface is meant for READ ONLY access to PhpWiki databases. To enable write access you first need to set the PHPWIKI13_WRITEACCESS configuration constant. But beware that this may make your database inconsistent and thus could prevent PhpWiki to reuse it afterwards.!<br>\n");
96 #-- make all ewiki page vars available in local/func var scope
99 #-- get existing or new $num_id
100 $id = addslashes($id);
101 $num_id = $this->NUM_ID($id);
103 #-- split data into parts
104 $meta = unserialize($meta);
105 ($markup = $meta["markup"]) or ($markup = 2);
106 unset($meta["markup"]);
107 $versiondata = array(
110 "author_id" => $author,
112 $versiondata = addslashes(serialize($versiondata));
115 $pagedata["created"] = $created;
116 $pagedata["flags"] = $flags;
117 if ($flags & EWIKI_DB_F_READONLY) {
118 $pagedata["locked"] = "yes";
120 $pagedata = addslashes(serialize($pagedata));
123 $content = addslashes($content);
125 mysql_query("INSERT INTO version (id, version, mtime, minor_edit, content, versiondata) VALUES ($num_id, $version, $lastmodified, 0, '$content', '$versiondata')")
127 mysql_query("UPDATE recent SET latestversion=$version WHERE id=$num_id")
129 mysql_query("UPDATE page SET pagedata='$pagedata' WHERE id=$num_id")
131 mysql_query("REPLACE INTO nonempty (id) VALUES ($num_id)");
136 #-- encode $refs[] into relational database
137 mysql_query("DELETE FROM link WHERE linkfrom=$num_id");
138 $refs = explode("\n", trim($refs));
139 foreach ($refs as $pagename) {
140 $pagename = addslashes($pagename);
141 $row = mysql_fetch_array(mysql_query("SELECT id FROM page WHERE pagename='$pagename'"));
142 if ($to = $row["id"]) {
143 mysql_query($sql="REPLACE INTO link (linkfrom, linkto) VALUES ($num_id, $to)");
151 function NUM_ID($id) {
152 if (($result = mysql_query("SELECT id FROM page WHERE pagename='$id'"))
153 and ($row = mysql_fetch_array($result)) ) {
154 $num_id = $row["id"];
157 $result = mysql_query("SELECT id FROM page ORDER BY id DESC");
158 $row = mysql_fetch_array($result);
159 if ($num_id = $row["id"]) {
161 if (! ($result = mysql_query("INSERT INTO page (id, pagename, hits, pagedata) VALUES ($num_id, '$id', 0, '')")) ) {
162 die("db_phpwiki13: could not create new num_id for page\n");
166 die("db_phpwiki13: could not fetch num_id for page\n");
173 $id = mysql_escape_string($id);
174 mysql_query("UPDATE page SET hits=(hits+1) WHERE pagename='$id'");
178 #-- returns: array("WikiPage"=>exists)
179 function FIND($list) {
182 foreach (array_values($list) as $id) if (strlen($id)) {
184 $sql .= ($sql ? " OR " : "") .
185 "(pagename = '" . mysql_escape_string($id) . "')";
187 $result = mysql_query($sql = "SELECT pagename, pagedata AS meta FROM page WHERE $sql");
188 while ($result && ($row = mysql_fetch_array($result))) {
189 $r[$row["pagename"]] = $row["meta"] ? unserialize($row["meta"]) : 1;
195 function GETALL($fields, $mask=0, $filter=0) {
196 $r = new ewiki_dbquery_result($fields);
197 foreach ($this->ALLFILES() as $id) {
198 $row = $this->GET($id);
205 function SEARCH($field, $content, $ci="i", $regex=0, $mask=0, $filter=0) {
206 $r = new ewiki_dbquery_result(array($field));
207 if ($ci && !$regex) {
208 $content = strtolower($content);
210 foreach ($this->ALLFILES() as $id) {
211 $row = $this->GET($id);
213 $match = preg_match("\007$content\007$ci", $row[$field]);
216 $match = false !== strpos(strtolower($row[$field]), $content);
219 $match = false !== strpos($row[$field], $content);
229 # function DELETE($id, $version) {
230 # die("This interface would probably garbage your PhpWiki v1.3 database, so your issued 'DELETE' action will not be executed.");
234 die("Not all features can be used with PhpWiki v1.3 databases.");
238 die("You cannot create a PhpWiki v1.3 database using this plugin! Please use the default database structure of ErfurtWiki, you're better off with it!");
243 #---------------------------------------------------------- internal ---
245 function ALLFILES() {
247 $result = mysql_query("SELECT pagename AS id FROM nonempty
248 NATURAL LEFT JOIN page");
249 if ($result) while ($row = mysql_fetch_array($result)) {