[icinga-checkins] icinga.org: icingaweb2/feature/localization-form-6073: Add new table columns and change the preferences DB save process

git at icinga.org git at icinga.org
Wed Nov 12 13:37:18 CET 2014


Module: icingaweb2
Branch: feature/localization-form-6073
Commit: 33107ff8f2cd7730f42984c0f6e049ba87f6c3d6
URL:    https://git.icinga.org/?p=icingaweb2.git;a=commit;h=33107ff8f2cd7730f42984c0f6e049ba87f6c3d6

Author: Alexander Fuhr <alexander.fuhr at netways.de>
Date:   Wed Nov 12 10:55:34 2014 +0100

Add new table columns and change the preferences DB save process

---

 library/Icinga/User/Preferences/Store/DbStore.php |   82 +++++++++++++++------
 1 file changed, 59 insertions(+), 23 deletions(-)

diff --git a/library/Icinga/User/Preferences/Store/DbStore.php b/library/Icinga/User/Preferences/Store/DbStore.php
index 5ef4a5b..1391b25 100644
--- a/library/Icinga/User/Preferences/Store/DbStore.php
+++ b/library/Icinga/User/Preferences/Store/DbStore.php
@@ -9,6 +9,7 @@ use Icinga\Exception\NotReadableError;
 use Icinga\Exception\NotWritableError;
 use Icinga\User\Preferences;
 use Icinga\User\Preferences\PreferencesStore;
+use Zend_Db_Expr;
 
 /**
  * Load and save user preferences by using a database
@@ -21,9 +22,14 @@ class DbStore extends PreferencesStore
     const COLUMN_USERNAME = 'username';
 
     /**
+     * Column name for section
+     */
+    const COLUMN_SECTION = 'section';
+
+    /**
      * Column name for preference
      */
-    const COLUMN_PREFERENCE = 'key';
+    const COLUMN_PREFERENCE = 'name';
 
     /**
      * Column name for value
@@ -31,11 +37,21 @@ class DbStore extends PreferencesStore
     const COLUMN_VALUE = 'value';
 
     /**
+     * Column name for created time
+     */
+    const COLUMN_CREATED_TIME = 'ctime';
+
+    /**
+     * Column name for modified time
+     */
+    const COLUMN_MODIFIED_TIME = 'mtime';
+
+    /**
      * Table name
      *
      * @var string
      */
-    protected $table = 'preference';
+    protected $table = 'icingaweb_user_preference';
 
     /**
      * Stored preferences
@@ -74,7 +90,7 @@ class DbStore extends PreferencesStore
         try {
             $select = $this->getStoreConfig()->connection->getDbAdapter()->select();
             $result = $select
-                ->from($this->table, array(self::COLUMN_PREFERENCE, self::COLUMN_VALUE))
+                ->from($this->table, array(self::COLUMN_SECTION, self::COLUMN_PREFERENCE, self::COLUMN_VALUE))
                 ->where(self::COLUMN_USERNAME . ' = ?', $this->getUser()->getUsername())
                 ->query()
                 ->fetchAll();
@@ -89,7 +105,7 @@ class DbStore extends PreferencesStore
         if ($result !== false) {
             $values = array();
             foreach ($result as $row) {
-                $values[$row->{self::COLUMN_PREFERENCE}] = $row->{self::COLUMN_VALUE};
+                $values[$row->{self::COLUMN_SECTION}][$row->{self::COLUMN_PREFERENCE}] = $row->{self::COLUMN_VALUE};
             }
             $this->preferences = $values;
         }
@@ -106,22 +122,30 @@ class DbStore extends PreferencesStore
     {
         $preferences = $preferences->toArray();
 
-        $toBeInserted = array_diff_key($preferences, $this->preferences);
-        if (!empty($toBeInserted)) {
-            $this->insert($toBeInserted);
-        }
+        $sections = array_keys($preferences);
 
-        $toBeUpdated = array_intersect_key(
-            array_diff_assoc($preferences, $this->preferences),
-            array_diff_assoc($this->preferences, $preferences)
-        );
-        if (!empty($toBeUpdated)) {
-            $this->update($toBeUpdated);
-        }
+        foreach ($sections as $section) {
+            if (! array_key_exists($section, $this->preferences)) {
+                $this->preferences[$section] = array();
+            }
+
+            $toBeInserted = array_diff_key($preferences[$section], $this->preferences[$section]);
+            if (!empty($toBeInserted)) {
+                $this->insert($toBeInserted, $section);
+            }
 
-        $toBeDeleted = array_keys(array_diff_key($this->preferences, $preferences));
-        if (!empty($toBeDeleted)) {
-            $this->delete($toBeDeleted);
+            $toBeUpdated = array_intersect_key(
+                array_diff_assoc($preferences[$section], $this->preferences[$section]),
+                array_diff_assoc($this->preferences[$section], $preferences[$section])
+            );
+            if (!empty($toBeUpdated)) {
+                $this->update($toBeUpdated, $section);
+            }
+
+            $toBeDeleted = array_keys(array_diff_key($this->preferences[$section], $preferences[$section]));
+            if (!empty($toBeDeleted)) {
+                $this->delete($toBeDeleted, $section);
+            }
         }
     }
 
@@ -129,11 +153,13 @@ class DbStore extends PreferencesStore
      * Insert the given preferences into the database
      *
      * @param   array   $preferences    The preferences to insert
+     * @param   string  $section        The preferences in section to update
      *
      * @throws  NotWritableError        In case the database operation failed
      */
-    protected function insert(array $preferences)
+    protected function insert(array $preferences, $section)
     {
+        /** @var \Zend_Db_Adapter_Abstract $db */
         $db = $this->getStoreConfig()->connection->getDbAdapter();
 
         try {
@@ -142,8 +168,11 @@ class DbStore extends PreferencesStore
                     $this->table,
                     array(
                         self::COLUMN_USERNAME => $this->getUser()->getUsername(),
+                        $db->quoteIdentifier(self::COLUMN_SECTION) => $section,
                         $db->quoteIdentifier(self::COLUMN_PREFERENCE) => $key,
-                        self::COLUMN_VALUE => $value
+                        self::COLUMN_VALUE => $value,
+                        self::COLUMN_CREATED_TIME => new Zend_Db_Expr('NOW()'),
+                        self::COLUMN_MODIFIED_TIME => new Zend_Db_Expr('NOW()')
                     )
                 );
             }
@@ -160,11 +189,13 @@ class DbStore extends PreferencesStore
      * Update the given preferences in the database
      *
      * @param   array   $preferences    The preferences to update
+     * @param   string  $section        The preferences in section to update
      *
      * @throws  NotWritableError        In case the database operation failed
      */
-    protected function update(array $preferences)
+    protected function update(array $preferences, $section)
     {
+        /** @var \Zend_Db_Adapter_Abstract $db */
         $db = $this->getStoreConfig()->connection->getDbAdapter();
 
         try {
@@ -174,7 +205,9 @@ class DbStore extends PreferencesStore
                     array(self::COLUMN_VALUE => $value),
                     array(
                         self::COLUMN_USERNAME . '=?' => $this->getUser()->getUsername(),
-                        $db->quoteIdentifier(self::COLUMN_PREFERENCE) . '=?' => $key
+                        $db->quoteIdentifier(self::COLUMN_SECTION) . '=?' => $section,
+                        $db->quoteIdentifier(self::COLUMN_PREFERENCE) . '=?' => $key,
+                        self::COLUMN_MODIFIED_TIME => new Zend_Db_Expr('NOW()')
                     )
                 );
             }
@@ -191,11 +224,13 @@ class DbStore extends PreferencesStore
      * Delete the given preference names from the database
      *
      * @param   array   $preferenceKeys     The preference names to delete
+     * @param   string  $section            The preferences in section to update
      *
      * @throws  NotWritableError            In case the database operation failed
      */
-    protected function delete(array $preferenceKeys)
+    protected function delete(array $preferenceKeys, $section)
     {
+        /** @var \Zend_Db_Adapter_Abstract $db */
         $db = $this->getStoreConfig()->connection->getDbAdapter();
 
         try {
@@ -203,6 +238,7 @@ class DbStore extends PreferencesStore
                 $this->table,
                 array(
                     self::COLUMN_USERNAME . '=?' => $this->getUser()->getUsername(),
+                    $db->quoteIdentifier(self::COLUMN_SECTION) . '=?' => $section,
                     $db->quoteIdentifier(self::COLUMN_PREFERENCE) . ' IN (?)' => $preferenceKeys
                 )
             );



More information about the icinga-checkins mailing list