sforkowany z mirror/friendica
				
			added index to config and pconfig table
changed config.php to use REPLACE instead of INSERT, this removes one db hit.2022.09-rc
							rodzic
							
								
									9ba5fff865
								
							
						
					
					
						commit
						cbf4544887
					
				|  | @ -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' ); | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| <?php | ||||
| 
 | ||||
| /** | ||||
|  * | ||||
|  * Arbitrary configuration storage | ||||
|  | @ -10,213 +9,216 @@ | |||
|  * | ||||
|  * 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; | ||||
| }} | ||||
| 
 | ||||
| // 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); | ||||
| 
 | ||||
| 	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("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1", | ||||
| 				dbesc($family), | ||||
| 				dbesc($key) | ||||
| 		); | ||||
| 		if($ret)  | ||||
| 			return $value; | ||||
| 		return $ret; | ||||
| 		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("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1", | ||||
| 		dbesc($dbvalue), | ||||
| 		dbesc($family), | ||||
| 		dbesc($key) | ||||
| 	); | ||||
| /** | ||||
|  * 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; | ||||
| 
 | ||||
| 	$a->config[$family][$key] = $value; | ||||
| 		// manage array value
 | ||||
| 		$dbvalue = (is_array($value)?serialize($value):$value); | ||||
| 
 | ||||
| 	if($ret) | ||||
| 		return $value; | ||||
| 	return $ret; | ||||
| }} | ||||
| 		$a->config[$family][$key] = $value; | ||||
| 		$ret = q("REPLACE INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ", | ||||
| 				dbesc($family), | ||||
| 				dbesc($key), | ||||
| 				dbesc($dbvalue) | ||||
| 		); | ||||
| 		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']; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| }} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * get a particular user-specific config variable given the family name,  | ||||
|  * the user id 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_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>!'; | ||||
| 	} | ||||
| 	return false; | ||||
| }} | ||||
| 
 | ||||
| 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; | ||||
| }} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Same as above functions except these are for personal config storage and take an
 | ||||
| // additional $uid argument.
 | ||||
| 
 | ||||
| if(! function_exists('set_pconfig')) { | ||||
| function set_pconfig($uid,$family,$key,$value) { | ||||
| 
 | ||||
| 	global $a; | ||||
| 
 | ||||
| 	// 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("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; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * 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) | ||||
| 		); | ||||
| 		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; | ||||
| }} | ||||
| /** | ||||
|  * Store a user-specific config value ($value) for user $uid in the category ($family) | ||||
|  * under the key ($key).  | ||||
|  *  | ||||
|  * Return the value, or false if the database update failed | ||||
|  */ | ||||
| if(! function_exists('set_pconfig')) { | ||||
| 	function set_pconfig($uid,$family,$key,$value) { | ||||
| 
 | ||||
| 		global $a; | ||||
| 
 | ||||
| 		// manage array value
 | ||||
| 		$dbvalue = (is_array($value)?serialize($value):$value); | ||||
| 
 | ||||
| 
 | ||||
| 		$a->config[$uid][$family][$key] = $value; | ||||
| 		$ret = q("REPLACE INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ", | ||||
| 				intval($uid), | ||||
| 				dbesc($family), | ||||
| 				dbesc($key), | ||||
| 				dbesc($dbvalue) | ||||
| 		); | ||||
| 		if($ret) { | ||||
| 			return $value; | ||||
| 		} | ||||
| 		return $ret; | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| if(! function_exists('del_pconfig')) { | ||||
| function del_pconfig($uid,$family,$key) { | ||||
| 	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; | ||||
| }} | ||||
| 		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; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -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` )");  | ||||
| } | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Alexander Kampmann
						Alexander Kampmann