| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2010, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Wrapper for Memcached_DataObject which knows its own schema definition. | 
					
						
							|  |  |  |  * Builds its own damn settings from a schema definition. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-08-16 15:14:16 -07:00
										 |  |  |  * @author Brion Vibber <brion@status.net> | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-08-16 15:14:16 -07:00
										 |  |  | abstract class Managed_DataObject extends Memcached_DataObject | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The One True Thingy that must be defined and declared. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static abstract function schemaDef(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * get/set an associative array of table columns | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @access public | 
					
						
							|  |  |  |      * @return array (associative) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function table() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-10-07 14:21:06 -07:00
										 |  |  |         // Hack for PHP 5.2 not supporting late static binding
 | 
					
						
							|  |  |  |         //$table = static::schemaDef();
 | 
					
						
							|  |  |  |         $table = call_user_func(array(get_class($this), 'schemaDef')); | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         return array_map(array($this, 'columnBitmap'), $table['fields']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * get/set an  array of table primary keys | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Key info is pulled from the table definition array. | 
					
						
							|  |  |  |      *  | 
					
						
							|  |  |  |      * @access private | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function keys() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array_keys($this->keyTypes()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a sequence key | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Returns the first serial column defined in the table, if any. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @access private | 
					
						
							|  |  |  |      * @return array (column,use_native,sequence_name) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function sequenceKey() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-01 14:31:32 -07:00
										 |  |  |         $table = call_user_func(array(get_class($this), 'schemaDef')); | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         foreach ($table['fields'] as $name => $column) { | 
					
						
							|  |  |  |             if ($column['type'] == 'serial') { | 
					
						
							|  |  |  |                 // We have a serial/autoincrement column.
 | 
					
						
							|  |  |  |                 // Declare it to be a native sequence!
 | 
					
						
							|  |  |  |                 return array($name, true, false); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // No sequence key on this table.
 | 
					
						
							|  |  |  |         return array(false, false, false); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Return key definitions for DB_DataObject and Memcache_DataObject. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * DB_DataObject needs to know about keys that the table has; this function
 | 
					
						
							|  |  |  |      * defines them. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array key definitions | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function keyTypes() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-01 14:31:32 -07:00
										 |  |  |         $table = call_user_func(array(get_class($this), 'schemaDef')); | 
					
						
							| 
									
										
										
										
											2011-03-21 15:04:32 -07:00
										 |  |  |         $keys = array(); | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($table['unique keys'])) { | 
					
						
							|  |  |  |             foreach ($table['unique keys'] as $idx => $fields) { | 
					
						
							|  |  |  |                 foreach ($fields as $name) { | 
					
						
							|  |  |  |                     $keys[$name] = 'U'; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($table['primary key'])) { | 
					
						
							|  |  |  |             foreach ($table['primary key'] as $name) { | 
					
						
							|  |  |  |                 $keys[$name] = 'K'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $keys; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Build the appropriate DB_DataObject bitfield map for this field. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $column | 
					
						
							|  |  |  |      * @return int | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function columnBitmap($column) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-08-16 15:28:00 -07:00
										 |  |  |         $type = $column['type']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // For quoting style...
 | 
					
						
							|  |  |  |         $intTypes = array('int', | 
					
						
							|  |  |  |                           'integer', | 
					
						
							|  |  |  |                           'float', | 
					
						
							|  |  |  |                           'serial', | 
					
						
							|  |  |  |                           'numeric'); | 
					
						
							|  |  |  |         if (in_array($type, $intTypes)) { | 
					
						
							|  |  |  |             $style = DB_DATAOBJECT_INT; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $style = DB_DATAOBJECT_STR; | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-16 15:28:00 -07:00
										 |  |  |         // Data type formatting style...
 | 
					
						
							|  |  |  |         $formatStyles = array('blob' => DB_DATAOBJECT_BLOB, | 
					
						
							|  |  |  |                               'text' => DB_DATAOBJECT_TXT, | 
					
						
							|  |  |  |                               'date' => DB_DATAOBJECT_DATE, | 
					
						
							|  |  |  |                               'time' => DB_DATAOBJECT_TIME, | 
					
						
							|  |  |  |                               'datetime' => DB_DATAOBJECT_DATE | DB_DATAOBJECT_TIME, | 
					
						
							|  |  |  |                               'timestamp' => DB_DATAOBJECT_MYSQLTIMESTAMP); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($formatStyles[$type])) { | 
					
						
							|  |  |  |             $style |= $formatStyles[$type]; | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-16 15:28:00 -07:00
										 |  |  |         // Nullable?
 | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         if (!empty($column['not null'])) { | 
					
						
							| 
									
										
										
										
											2010-08-16 15:28:00 -07:00
										 |  |  |             $style |= DB_DATAOBJECT_NOTNULL; | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-16 15:28:00 -07:00
										 |  |  |         return $style; | 
					
						
							| 
									
										
										
										
											2010-08-16 14:02:31 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | } |