]> git.mxchange.org Git - friendica.git/commitdiff
added index to config and pconfig table
authorAlexander Kampmann <programmer@nurfuerspam.de>
Thu, 5 Apr 2012 11:27:09 +0000 (13:27 +0200)
committerAlexander Kampmann <programmer@nurfuerspam.de>
Thu, 5 Apr 2012 11:27:09 +0000 (13:27 +0200)
changed config.php to use REPLACE instead of INSERT,
this removes one db hit.

boot.php [changed mode: 0755->0644]
database.sql [changed mode: 0755->0644]
include/config.php [changed mode: 0755->0644]
update.php [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 04e16e6..5654816
--- a/boot.php
+++ b/boot.php
@@ -11,7 +11,7 @@ require_once('include/cache.php');
 define ( 'FRIENDICA_PLATFORM',     'Friendica');
 define ( 'FRIENDICA_VERSION',      '2.3.1288' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1133      );
+define ( 'DB_UPDATE_VERSION',      1134      );
 
 define ( 'EOL',                    "<br />\r\n"     );
 define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
old mode 100755 (executable)
new mode 100644 (file)
index 327b482..a039746
@@ -34,10 +34,11 @@ CREATE TABLE IF NOT EXISTS `challenge` (
 
 CREATE TABLE IF NOT EXISTS `config` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat` char(255) NOT NULL,
-  `k` char(255) NOT NULL,
+  `cat` char(255) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
+  `k` char(255) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
   `v` text NOT NULL,
-  PRIMARY KEY (`id`)
+  PRIMARY KEY (`id`), 
+  UNIQUE KEY `access`(`cat`,`k`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
@@ -536,9 +537,10 @@ INDEX ( `batch` )
 CREATE TABLE IF NOT EXISTS `pconfig` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `uid` INT NOT NULL DEFAULT '0',
-`cat` CHAR( 255 ) NOT NULL ,
-`k` CHAR( 255 ) NOT NULL ,
-`v` MEDIUMTEXT NOT NULL
+`cat` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ,
+`k` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ,
+`v` MEDIUMTEXT NOT NULL, 
+UNIQUE KEY `access`(`cat`, `k`)
 ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
old mode 100755 (executable)
new mode 100644 (file)
index 2cddda0..f93cb52
 <?php
-
 /**
  *
  * Arbitrary configuration storage
  * Note:
  * Please do not store booleans - convert to 0/1 integer values
  * The get_?config() functions return boolean false for keys that are unset,
- * and this could lead to subtle bugs.  
+ * and this could lead to subtle bugs.
  *
  * There are a few places in the code (such as the admin panel) where boolean
  * configurations need to be fixed as of 10/08/2011.
+ *
+ * @package config;
  */
 
 
-// retrieve a "family" of config variables from database to cached storage
-
+/**
+ * retrieve a "family" of config variables
+ * from database to cached storage
+ */
 if(! function_exists('load_config')) {
-function load_config($family) {
-       global $a;
-       $r = q("SELECT * FROM `config` WHERE `cat` = '%s'",
-               dbesc($family)
-       );
-       if(count($r)) {
-               foreach($r as $rr) {
-                       $k = $rr['k'];
-                       if ($rr['cat'] === 'config') {
-                               $a->config[$k] = $rr['v'];
-                       } else {
-                               $a->config[$family][$k] = $rr['v'];
+       function load_config($family) {
+               global $a;
+               $r = q("SELECT * FROM `config` WHERE `cat` = '%s'",
+                               dbesc($family)
+               );
+               if(count($r)) {
+                       foreach($r as $rr) {
+                               $k = $rr['k'];
+                               if ($rr['cat'] === 'config') {
+                                       $a->config[$k] = $rr['v'];
+                               } else {
+                                       $a->config[$family][$k] = $rr['v'];
+                               }
                        }
                }
        }
-}}
-
-// get a particular config variable given the family name
-// and key. Returns false if not set.
-// $instore is only used by the set_config function
-// to determine if the key already exists in the DB
-// If a key is found in the DB but doesn't exist in
-// local config cache, pull it into the cache so we don't have
-// to hit the DB again for this item.
+}
 
+/**
+ * get a particular config variable given the family name
+ * and key. Returns false if not set.
+ *
+ * If a key is found in the DB but doesn't exist in
+ * local config cache, pull it into the cache so we don't have
+ *to hit the DB again for this item.
+ */
 if(! function_exists('get_config')) {
-function get_config($family, $key, $instore = false) {
+       function get_config($family, $key) {
+
+               global $a;
 
-       global $a;
 
-       if(! $instore) {
                if(isset($a->config[$family][$key])) {
                        if($a->config[$family][$key] === '!<unset>!') {
                                return false;
                        }
                        return $a->config[$family][$key];
                }
+               $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+                               dbesc($family),
+                               dbesc($key)
+               );
+               if(count($ret)) {
+                       // manage array value
+                       $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
+                       $a->config[$family][$key] = $val;
+                       return $val;
+               }
+               else {
+                       $a->config[$family][$key] = '!<unset>!';
+               }
+               return false;
        }
-       $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               dbesc($family),
-               dbesc($key)
-       );
-       if(count($ret)) {
-               // manage array value
-               $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
-               $a->config[$family][$key] = $val;
-               return $val;
-       }
-       else {
-               $a->config[$family][$key] = '!<unset>!';
-       }
-       return false;
-}}
-
-// Store a config value ($value) in the category ($family)
-// under the key ($key)
-// Return the value, or false if the database update failed
+}
 
+/**
+ * Store a config value ($value) in the category ($family)
+ * under the key ($key)
+ * 
+ * Return the value, or false if the database update failed
+ */
 if(! function_exists('set_config')) {
-function set_config($family,$key,$value) {
-       global $a;
-       
-       // manage array value
-       $dbvalue = (is_array($value)?serialize($value):$value);
+       function set_config($family,$key,$value) {
+               global $a;
+
+               // manage array value
+               $dbvalue = (is_array($value)?serialize($value):$value);
 
-       if(get_config($family,$key,true) === false) {
                $a->config[$family][$key] = $value;
-               $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
-                       dbesc($family),
-                       dbesc($key),
-                       dbesc($dbvalue)
+               $ret = q("REPLACE INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
+                               dbesc($family),
+                               dbesc($key),
+                               dbesc($dbvalue)
                );
-               if($ret) 
+               if($ret) {
                        return $value;
+               }
                return $ret;
-       }
-       
-       $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               dbesc($dbvalue),
-               dbesc($family),
-               dbesc($key)
-       );
-
-       $a->config[$family][$key] = $value;
 
-       if($ret)
-               return $value;
-       return $ret;
-}}
+       }
+}
 
 
 if(! function_exists('load_pconfig')) {
-function load_pconfig($uid,$family) {
-       global $a;
-       $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
-               dbesc($family),
-               intval($uid)
-       );
-       if(count($r)) {
-               foreach($r as $rr) {
-                       $k = $rr['k'];
-                       $a->config[$uid][$family][$k] = $rr['v'];
+       function load_pconfig($uid,$family) {
+               global $a;
+               $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
+                               dbesc($family),
+                               intval($uid)
+               );
+               if(count($r)) {
+                       foreach($r as $rr) {
+                               $k = $rr['k'];
+                               $a->config[$uid][$family][$k] = $rr['v'];
+                       }
                }
        }
-}}
-
+}
 
 
+/**\r
+ * get a particular user-specific config variable given the family name, 
+ * the user id and key. Returns false if not set.\r
+ *\r
+ * If a key is found in the DB but doesn't exist in\r
+ * local config cache, pull it into the cache so we don't have\r
+ * to hit the DB again for this item.\r
+ */
 if(! function_exists('get_pconfig')) {
-function get_pconfig($uid,$family, $key, $instore = false) {
+       function get_pconfig($uid,$family, $key) {
+
+               global $a;
 
-       global $a;
 
-       if(! $instore) {
                if(isset($a->config[$uid][$family][$key])) {
                        if($a->config[$uid][$family][$key] === '!<unset>!') {
                                return false;
                        }
                        return $a->config[$uid][$family][$key];
                }
-       }
 
-       $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               intval($uid),
-               dbesc($family),
-               dbesc($key)
-       );
 
-       if(count($ret)) {
-               $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
-               $a->config[$uid][$family][$key] = $val;
-               return $val;
-       }
-       else {
-               $a->config[$uid][$family][$key] = '!<unset>!';
+               $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+                               intval($uid),
+                               dbesc($family),
+                               dbesc($key)
+               );
+
+               if(count($ret)) {
+                       $val = (preg_match("|^a:[0-9]+:{.*}$|", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
+                       $a->config[$uid][$family][$key] = $val;
+                       return $val;
+               }
+               else {
+                       $a->config[$uid][$family][$key] = '!<unset>!';
+               }
+               return false;
        }
-       return false;
-}}
+}
 
+/**
+ * Delete a value from config. This function 
+ * deletes both: db value and cache entry. 
+ */
 if(! function_exists('del_config')) {
-function del_config($family,$key) {
-
-       global $a;
-       if(x($a->config[$family],$key))
-               unset($a->config[$family][$key]);
-       $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               dbesc($family),
-               dbesc($key)
-       );
-       return $ret;
-}}
-
-
+       function del_config($family,$key) {
+
+               global $a;
+               if(x($a->config[$family],$key))
+                       unset($a->config[$family][$key]);
+               $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+                               dbesc($family),
+                               dbesc($key)
+               );
+               return $ret;
+       }
+}
 
-// Same as above functions except these are for personal config storage and take an
-// additional $uid argument.
 
+/**\r
+ * Store a user-specific config value ($value) for user $uid in the category ($family)\r
+ * under the key ($key). 
+ * \r
+ * Return the value, or false if the database update failed\r
+ */
 if(! function_exists('set_pconfig')) {
-function set_pconfig($uid,$family,$key,$value) {
+       function set_pconfig($uid,$family,$key,$value) {
 
-       global $a;
+               global $a;
+
+               // manage array value
+               $dbvalue = (is_array($value)?serialize($value):$value);
 
-       // manage array value
-       $dbvalue = (is_array($value)?serialize($value):$value);
 
-       if(get_pconfig($uid,$family,$key,true) === false) {
                $a->config[$uid][$family][$key] = $value;
-               $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
-                       intval($uid),
-                       dbesc($family),
-                       dbesc($key),
-                       dbesc($dbvalue)
+               $ret = q("REPLACE INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
+                               intval($uid),
+                               dbesc($family),
+                               dbesc($key),
+                               dbesc($dbvalue)
                );
-               if($ret) 
+               if($ret) {
                        return $value;
+               }
                return $ret;
-       }
-       $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               dbesc($dbvalue),
-               intval($uid),
-               dbesc($family),
-               dbesc($key)
-       );
-
-       $a->config[$uid][$family][$key] = $value;
 
-       if($ret)
-               return $value;
-       return $ret;
-}}
+       }
+}
 
 if(! function_exists('del_pconfig')) {
-function del_pconfig($uid,$family,$key) {
-
-       global $a;
-       if(x($a->config[$uid][$family],$key))
-               unset($a->config[$uid][$family][$key]);
-       $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
-               intval($uid),
-               dbesc($family),
-               dbesc($key)
-       );
-       return $ret;
-}}
+       function del_pconfig($uid,$family,$key) {
+
+               global $a;
+               if(x($a->config[$uid][$family],$key))
+                       unset($a->config[$uid][$family][$key]);
+               $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+                               intval($uid),
+                               dbesc($family),
+                               dbesc($key)
+               );
+               return $ret;
+       }
+}
old mode 100755 (executable)
new mode 100644 (file)
index a69742a..adb96b8
@@ -1,6 +1,6 @@
 <?php
 
-define( 'UPDATE_VERSION' , 1133 );
+define( 'UPDATE_VERSION' , 1134 );
 
 /**
  *
@@ -1136,3 +1136,17 @@ INDEX ( `username` )
 
 }
 
+function update_1133() {
+       //there can't be indexes with more than 1000 bytes in mysql, 
+       //so change charset to be smaller
+       q("ALTER TABLE `config` CHANGE `cat` `cat` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ,
+CHANGE `k` `k` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL"); 
+       //and add the index
+       q("ALTER TABLE `friendica`.`config` ADD UNIQUE `access` ( `cat` , `k` ) "); 
+       
+       //same thing for pconfig
+       q("ALTER TABLE `pconfig` CHANGE `cat` `cat` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ,
+       CHANGE `k` `k` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL"); 
+       
+       q("ALTER TABLE `friendica`.`pconfig` ADD UNIQUE `access` ( `uid` , `cat` , `k` )"); 
+}