changed git call from https to git readonly
[atutor.git] / mods / wiki / plugins / db / phpwiki13.php
1 <?php
2
3 /*/
4
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
9  approach used herein.
10
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.
14
15 /*/
16
17  define("PHPWIKI13_WRITEACCESS", 0);
18  define("EWIKI_PAGE_INDEX", "WikiWikiWeb");
19  $ewiki_plugins["database"][0] = "ewiki_database_phpwiki13";
20  
21
22
23
24 class ewiki_database_phpwiki13 {
25
26
27    function ewiki_database_phpwiki13() {
28    }
29
30
31    function GET($id, $version=false) {
32       if ($version) {
33          $ver_sql = " AND version=$version";
34       }
35       $id = mysql_escape_string($id);
36
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)) )
41       {
42
43          #-- decode meta data
44          $dec1 = unserialize($row["pagedata"]);
45          $dec2 = unserialize($row["versiondata"]);
46          $dec1["markup"] = $dec2["markup"];
47          $created = ($dec1["created"] ? $dec1["created"] : UNIX_MILLENNIUM);
48          $r = array(
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,
57             "refs" => "\n",
58             "meta" => $dec1
59          );
60
61          #-- get flags
62          if ($dec1["locked"]=="yes") { 
63             $r["flags"] |= EWIKI_DB_F_READONLY;
64          }
65          if (is_int($flags = $dec1["flags"])) {
66             $r["flags"] = $flags;
67          }
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
72
73          #-- fetch $refs[]
74          $num_id = $row["id"];
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"))
79          {
80             while ($row = mysql_fetch_array($result)) {
81                $r["refs"] .= $row["pagename"] . "\n";
82             }
83          }
84          return($r);
85       }
86
87    }
88
89
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");
94       }
95
96       #-- make all ewiki page vars available in local/func var scope
97       extract($hash);
98
99       #-- get existing or new $num_id
100       $id = addslashes($id);
101       $num_id = $this->NUM_ID($id);
102
103       #-- split data into parts
104       $meta = unserialize($meta);
105       ($markup = $meta["markup"]) or ($markup = 2);
106       unset($meta["markup"]);
107       $versiondata = array(
108          "markup" => $markup,
109          "author" => $author,
110          "author_id" => $author,
111       );
112       $versiondata = addslashes(serialize($versiondata));
113
114       $pagedata = $meta;
115       $pagedata["created"] = $created;
116       $pagedata["flags"] = $flags;
117       if ($flags & EWIKI_DB_F_READONLY) {
118          $pagedata["locked"] = "yes";
119       }
120       $pagedata = addslashes(serialize($pagedata));
121
122       #-- save content
123       $content = addslashes($content);
124       $result =
125          mysql_query("INSERT INTO version (id, version, mtime, minor_edit, content, versiondata) VALUES ($num_id, $version, $lastmodified, 0, '$content', '$versiondata')")
126          &&
127          mysql_query("UPDATE recent SET latestversion=$version WHERE id=$num_id")
128          &&
129          mysql_query("UPDATE page SET pagedata='$pagedata' WHERE id=$num_id")
130          &&
131          mysql_query("REPLACE INTO nonempty (id) VALUES ($num_id)");
132       if (!$result) {
133          return;
134       }
135
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)");
144          }
145       }
146
147       return(true);
148    }
149
150
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"];
155       }
156       else {
157          $result = mysql_query("SELECT id FROM page ORDER BY id DESC");
158          $row = mysql_fetch_array($result);
159          if ($num_id = $row["id"]) {
160             $num_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");
163             }
164          }
165          else {
166             die("db_phpwiki13: could not fetch num_id for page\n");
167          }
168       }
169       return($num_id);
170    }
171
172    function HIT($id) {
173       $id = mysql_escape_string($id);
174       mysql_query("UPDATE page SET hits=(hits+1) WHERE pagename='$id'");
175    }
176
177
178    #-- returns: array("WikiPage"=>exists)
179    function FIND($list) {
180       $r = array();
181       $sql = "";
182       foreach (array_values($list) as $id) if (strlen($id)) {
183          $r[$id] = 0;
184          $sql .= ($sql ? " OR " : "") .
185                  "(pagename = '" . mysql_escape_string($id) .  "')";
186       }
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;
190       }
191       return($r);
192    }
193
194
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);
199          $r->add($row);
200       }
201       return($r);
202    }
203
204
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);
209       }
210       foreach ($this->ALLFILES() as $id) {
211          $row = $this->GET($id);
212          if ($regex) {
213             $match = preg_match("\007$content\007$ci", $row[$field]);
214          }
215          elseif ($ci) {
216             $match = false !== strpos(strtolower($row[$field]), $content);
217          }
218          else {
219             $match = false !== strpos($row[$field], $content);
220          }
221          if ($match) {
222             $r->add($row);
223          }
224       }
225       return($r);
226    }
227
228
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.");
231 #    }
232
233    function OTHER() {
234       die("Not all features can be used with PhpWiki v1.3 databases.");
235    }
236
237    function INIT() {
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!");
239    }
240    
241    
242    
243    #---------------------------------------------------------- internal ---
244    
245    function ALLFILES() {
246       $r = array();
247       $result = mysql_query("SELECT pagename AS id FROM nonempty
248                              NATURAL LEFT JOIN page");
249       if ($result) while ($row = mysql_fetch_array($result)) {
250          $r[] = $row["id"];
251       }
252       return($r);
253    }
254    
255    
256 } // end of class
257
258
259
260 ?>