Download note as XML and JSON
[grauphel.git] / lib / notestorage.php
index bca7dfd5d1cea3cc4d63da932c945ad1257701f0..6802e2f88a481d8e18ef331f672ec2998b5b8f9d 100644 (file)
@@ -189,6 +189,22 @@ class NoteStorage
         \OC_DB::executeAudited($sql, $params);
     }
 
+    /**
+     * Delete synchronization data for the given user.
+     *
+     * @param SyncData $syncdata Synchronization data object
+     *
+     * @return void
+     */
+    public function deleteSyncData()
+    {
+        \OC_DB::executeAudited(
+            'DELETE FROM `*PREFIX*grauphel_syncdata`'
+            . ' WHERE `syncdata_user` = ?',
+            array($this->username)
+        );
+    }
+
     /**
      * Load a note from the storage.
      *
@@ -225,10 +241,82 @@ class NoteStorage
                 'tags'            => array(),
             );
         }
-        
+
         return $this->noteFromRow($row);
     }
 
+    /**
+     * Load a GUID of a note by the note title.
+     *
+     * The note title is stored html-escaped in the database because we
+     * get it that way from tomboy. Thus we have to escape the search
+     * input, too.
+     *
+     * @param string $title Note title.
+     *
+     * @return string GUID, NULL if note could not be found
+     */
+    public function loadGuidByTitle($title)
+    {
+        $row = \OC_DB::executeAudited(
+            'SELECT note_guid FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE `note_user` = ? AND `note_title` = ?',
+            array($this->username, htmlspecialchars($title))
+        )->fetchRow();
+
+        if ($row === false) {
+            return null;
+        }
+
+        return $row['note_guid'];
+    }
+
+    /**
+     * Search for a note
+     *
+     * @param array $keywords arrays of query strings within keys AND and NOT
+     *
+     * @return array Database rows with note_guid and note_title
+     */
+    public function search($keywordGroups)
+    {
+        if (!isset($keywordGroups['AND'])) {
+            $keywordGroups['AND'] = array();
+        }
+        if (!isset($keywordGroups['NOT'])) {
+            $keywordGroups['NOT'] = array();
+        }
+
+        $sqlTplAnd = ' AND (note_title LIKE ? OR note_tags LIKE ? OR note_content LIKE ?)';
+        $sqlTplNot = ' AND NOT (note_title LIKE ? OR note_tags LIKE ? OR note_content LIKE ?)';
+        $arData = array(
+            $this->username
+        );
+        foreach (array('AND', 'NOT') as $group) {
+            $keywords = $keywordGroups[$group];
+            foreach ($keywords as $keyword) {
+                $arData[] = '%' . $keyword . '%';//title
+                $arData[] = '%' . $keyword . '%';//tags
+                $arData[] = '%' . $keyword . '%';//content
+            }
+        }
+
+        $result = \OC_DB::executeAudited(
+            'SELECT `note_guid`, `note_title`'
+            . ' FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE note_user = ?'
+            . str_repeat($sqlTplAnd, count($keywordGroups['AND']))
+            . str_repeat($sqlTplNot, count($keywordGroups['NOT'])),
+            $arData
+        );
+
+        $notes = array();
+        while ($row = $result->fetchRow()) {
+            $notes[] = $row;
+        }
+        return $notes;
+    }
+
     /**
      * Save a note into storage.
      *
@@ -280,6 +368,20 @@ class NoteStorage
         );
     }
 
+    /**
+     * Delete all notes from storage.
+     *
+     * @return void
+     */
+    public function deleteAll()
+    {
+        \OC_DB::executeAudited(
+            'DELETE FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE `note_user` = ?',
+            array($this->username)
+        );
+    }
+
     /**
      * Load notes for the given user in short form.
      * Optionally only those changed after $since revision
@@ -363,14 +465,24 @@ class NoteStorage
         return $notes;
     }
 
+    protected function fixDate($date)
+    {
+        if (strlen($date) == 32) {
+            //Bug in grauphel 0.1.1; date fields in DB had only 32 instead of 33
+            // characters. The last digit of the time zone was missing
+            $date .= '0';
+        }
+        return $date;
+    }
+
     protected function noteFromRow($row)
     {
         return (object) array(
             'guid'  => $row['note_guid'],
 
-            'create-date'               => $row['note_create_date'],
-            'last-change-date'          => $row['note_last_change_date'],
-            'last-metadata-change-date' => $row['note_last_metadata_change_date'],
+            'create-date'               => $this->fixDate($row['note_create_date']),
+            'last-change-date'          => $this->fixDate($row['note_last_change_date']),
+            'last-metadata-change-date' => $this->fixDate($row['note_last_metadata_change_date']),
 
             'title'                => $row['note_title'],
             'note-content'         => $row['note_content'],
@@ -388,17 +500,17 @@ class NoteStorage
     {
         return array(
             'note_guid'  => $note->guid,
-            'note_title' => $note->title,
+            'note_title' => (string) $note->title,
 
-            'note_content'         => $note->{'note-content'},
-            'note_content_version' => $note->{'note-content-version'},
+            'note_content'         => (string) $note->{'note-content'},
+            'note_content_version' => (string) $note->{'note-content-version'},
 
             'note_create_date'               => $note->{'create-date'},
             'note_last_change_date'          => $note->{'last-change-date'},
             'note_last_metadata_change_date' => $note->{'last-metadata-change-date'},
-            
-            'note_open_on_startup' => $note->{'open-on-startup'},
-            'note_pinned'          => $note->pinned,
+
+            'note_open_on_startup' => (int) $note->{'open-on-startup'},
+            'note_pinned'          => (int) $note->pinned,
             'note_tags'            => json_encode($note->tags),
 
             'note_last_sync_revision' => $note->{'last-sync-revision'},