]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - wiki_dbmlib.php3
This commit was generated by cvs2svn to compensate for changes in r2,
[SourceForge/phpwiki.git] / wiki_dbmlib.php3
1 <?
2    /*
3       Database functions:
4       OpenDataBase($dbname)
5       CloseDataBase($dbi)
6       RetrievePage($dbi, $pagename)
7       InsertPage($dbi, $pagename, $pagehash)
8       UpdateRecentChanges($dbi, $pagename) 
9       IsWikiPage($dbi, $pagename)
10       SaveCopyToArchive($pagename, $pagehash) 
11       PageExists($dbi, $pagename)
12    */
13
14
15    // open a database and return the handle
16    // loop until we get a handle; php has its own
17    // locking mechanism, thank god. This prints
18    // an ugly error message. Cannot prevent.
19
20    function OpenDataBase($dbname) {
21       while (($dbi = dbmopen($dbname, "c")) < 1) {
22          if ($numattempts > MAX_DBM_ATTEMPTS) {
23             echo "Cannot open database, giving up.";
24             exit();
25          }
26          $numattempts++;
27          sleep(1);
28       }
29       return $dbi;
30    }
31
32
33    function CloseDataBase($dbi) {
34       return dbmclose($dbi);
35    }
36
37
38    // Return hash of page + attributes or default
39    function RetrievePage($dbi, $pagename) {
40       if ($data = dbmfetch($dbi, $pagename)) {
41          // unserialize $data into a hash
42          $pagehash = unserialize($data);
43          return $pagehash;
44       } else {
45          return -1;
46       }
47    }
48
49
50    // Either insert or replace a key/value (a page)
51    function InsertPage($dbi, $pagename, $pagehash) {
52       $pagedata = serialize($pagehash);
53
54       if (dbminsert($dbi, $pagename, $pagedata)) {
55          if (dbmreplace($dbi, $pagename, $pagedata)) {
56             echo "error writing value";
57             exit();
58          }
59       } 
60    }
61
62    // The Recent Changes file is solely handled here
63    function UpdateRecentChanges($dbi, $pagename) {
64       global $remoteuser;
65
66       $recentchanges = RetrievePage($dbi, "RecentChanges");
67
68       if ($recentchanges == -1) {
69          $recentchanges = array(); // First-time user, eh? :-)
70       }
71
72       $recentchanges["text"] = preg_replace("/.*$pagename.*/",
73                                             "",
74                                             $recentchanges["text"]);
75
76       $numlines = sizeof($recentchanges["text"]);
77       $currentdate = GetCurrentDate();
78
79       if ($recentchanges["date"] != $currentdate) {
80          $recentchanges["text"][$numlines++] = "$currentdate";
81          $recentchanges["text"][$numlines++] = "\n";
82          $recentchanges["date"] = "$currentdate";
83       }
84
85
86       $recentchanges["text"][$numlines] = "\t*$pagename .....  $remoteuser";
87
88       // Clear out blank lines (they are size zero, not even \n)
89       $k = 0;
90       for ($i = 0; $i < ($numlines + 1); $i++) {
91          if (strlen($recentchanges["text"][$i]) != 0) {
92             $newpage[$k++] = $recentchanges["text"][$i];
93          }
94       }
95       $recentchanges["text"] = $newpage;
96
97       InsertPage($dbi, "RecentChanges", $recentchanges);
98    }
99
100
101    function IsWikiPage($dbi, $pagename) {
102       return dbmexists($dbi, $pagename);
103    }
104
105
106    // for archiving pages to a seperate dbm
107    function SaveCopyToArchive($pagename, $pagehash) {
108       global $ArchiveDataBase;
109       $adbi = OpenDataBase($ArchiveDataBase);
110       $newpagename = $pagename;
111       InsertPage($adbi, $newpagename, $pagehash);
112       dbmclose($adbi);
113    }
114
115
116 ?>