(no commit message)
[paste/71.git] / Db.php
1 <?php\r
2 class Tagebuch_Db\r
3 {\r
4     /**\r
5      * @var PDO\r
6      */\r
7     public $db = null;\r
8 \r
9     protected $config = null;\r
10 \r
11 \r
12     public function __construct()\r
13     {\r
14         $this->config = Tagebuch_Config::get();\r
15         $this->prepare();\r
16         $this->loadFiles();\r
17     }\r
18 \r
19 \r
20 \r
21     /**\r
22      * Returns a post object from the given file.\r
23      *\r
24      * @param string $file File name without path\r
25      *\r
26      * @return Tagebuch_Post or boolean false if not found\r
27      */\r
28     public function getPost($file)\r
29     {\r
30         $stmt = $this->db->prepare('SELECT * FROM posts WHERE file = ?');\r
31         $stmt->execute(array($file));\r
32         return $stmt->fetchObject('Tagebuch_Post');\r
33     }\r
34 \r
35 \r
36 \r
37     public function getPosts($tag = null, $limit = null)\r
38     {\r
39         if ($tag === null) {\r
40             $tag = '%';\r
41         } else {\r
42             $tag = '%,' . $tag . ',%';\r
43         }\r
44         $stmt = $this->db->prepare(\r
45             'SELECT * FROM posts'\r
46             . ' WHERE tags LIKE ?'\r
47             . ' ORDER BY modified DESC'\r
48             . ($limit !== null ? ' LIMIT ' . $limit : '')\r
49         );\r
50         $stmt->execute(array($tag));\r
51         return $stmt->fetchAll(PDO::FETCH_CLASS, 'Tagebuch_Post');\r
52     }\r
53 \r
54 \r
55 \r
56     /**\r
57      * Fetches the next and previous posts from the database.\r
58      *\r
59      * @param string $file Filename to fetch\r
60      * @param string $tag  Tag name that determines the file list\r
61      *                     - may be null for no tag\r
62      *\r
63      * @return array Array with prev and next keys, post objects\r
64      *               as value. NULL when empty\r
65      */\r
66     public function getPrevNext($file, $tag = null)\r
67     {\r
68         if ($tag === null) {\r
69             $tag = '%';\r
70         } else {\r
71             $tag = '%,' . $tag . ',%';\r
72         }\r
73         $qfile = $this->db->quote($file);\r
74         $qtag  = $this->db->quote($tag);\r
75         list($date) = $this->db->query(\r
76             'SELECT modified FROM posts WHERE file LIKE '\r
77             . $qfile\r
78             . ' LIMIT 1'\r
79         )->fetch();\r
80         $qdate = $this->db->quote($date);\r
81 \r
82         $prev = $this->db\r
83             ->query('SELECT * FROM posts'\r
84                     . ' WHERE modified < ' . $qdate\r
85                     . ' AND tags LIKE ' . $qtag\r
86                     . ' ORDER BY modified DESC LIMIT 1'\r
87             )->fetchObject('Tagebuch_Post');\r
88         $next = $this->db\r
89             ->query('SELECT * FROM posts'\r
90                     . ' WHERE modified > ' . $qdate\r
91                     . ' AND tags LIKE ' . $qtag\r
92                     . ' ORDER BY modified ASC LIMIT 1'\r
93             )->fetchObject('Tagebuch_Post');\r
94 \r
95         return array(\r
96             'prev' => $prev,\r
97             'next' => $next\r
98         );\r
99     }\r
100 \r
101 \r
102 \r
103     /**\r
104      * Returns an array of all tags\r
105      */\r
106     public function getTags()\r
107     {\r
108         $stmt = $this->db->query('SELECT tags FROM posts');\r
109         $tags = array();\r
110         while ($row = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {\r
111             $rtags = array_flip(explode(',', substr($row->tags, 1, -1)));\r
112             $tags = array_merge($tags, $rtags);\r
113         }\r
114         unset($tags['']);\r
115 \r
116         return array_keys($tags);\r
117     }\r
118 \r
119 \r
120 \r
121 \r
122     /**\r
123      * Prepares the table structure\r
124      *\r
125      * @return void\r
126      */\r
127     protected function prepare()\r
128     {\r
129         $this->db = new PDO('sqlite::memory:');\r
130         $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\r
131         $this->db->exec("CREATE TABLE posts(\r
132 title TEXT,\r
133 file TEXT,\r
134 size INTEGER,\r
135 created DATE,\r
136 modified DATE,\r
137 tags TEXT,\r
138 license TEXT\r
139 )");\r
140         \r
141     }\r
142 \r
143 \r
144 \r
145     /**\r
146      * Loads raw files into database\r
147      *\r
148      * @return void\r
149      */\r
150     protected function loadFiles()\r
151     {\r
152         $query = $this->db->prepare(\r
153             'insert into posts (title,file,size,created,modified,tags,license)'\r
154             . ' VALUES(:title,:file,:size,:created,:modified,:tags,:license)'\r
155         );\r
156         $query->bindParam(':title', $title);\r
157         $query->bindParam(':file', $filename);\r
158         $query->bindParam(':size', $size);\r
159         $query->bindParam(':created', $crdate);\r
160         $query->bindParam(':modified', $mdate);\r
161         $query->bindParam(':tags', $tags);\r
162         $query->bindParam(':license', $license);\r
163 \r
164         foreach ($this->getRawFiles() as $file) {\r
165             $hp = new Tagebuch_HtmlPost($file);\r
166             $crdate = $hp->getCreationDate();\r
167             $mdate  = $hp->getModificationDate();\r
168             $tags   = ',' . implode(\r
169                 ',',\r
170                 $hp->getTags()\r
171             ) . ',';\r
172             $title    = $hp->getTitle();\r
173             $filename = basename($file);\r
174             $size     = filesize($file);\r
175             $license  = $hp->getLicense();\r
176             $query->execute();\r
177         }\r
178     }\r
179 \r
180 \r
181 \r
182     /**\r
183      * Returns an array full of raw filename paths\r
184      *\r
185      * @return array Array of raw file names\r
186      */\r
187     protected function getRawFiles()\r
188     {\r
189         return glob($this->config->raw . '*.htm');\r
190     }\r
191 }\r
192 \r
193 ?>