Skip to content

Commit

Permalink
FIX Cache ClassName enum so we dont query DB every call
Browse files Browse the repository at this point in the history
  • Loading branch information
Hamish Friedlander committed Sep 11, 2012
1 parent f49439c commit df5a9e0
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions model/DataObject.php
Expand Up @@ -172,6 +172,11 @@ static function set_validation_enabled($enable) {
self::$validation_enabled = (bool) $enable;
}

/**
* @var [string] - class => ClassName field definition cache for self::database_fields
*/
private static $classname_spec_cache = array();

/**
* Return the complete map of fields on this object, including "Created", "LastEdited" and "ClassName".
* See {@link custom_database_fields()} for a getter that excludes these "base fields".
Expand All @@ -181,12 +186,21 @@ static function set_validation_enabled($enable) {
*/
public static function database_fields($class) {
if(get_parent_class($class) == 'DataObject') {
$db = DB::getConn();
$existing = $db->hasField($class, 'ClassName') ? $db->query("SELECT DISTINCT \"ClassName\" FROM \"$class\"")->column() : array();
if(!isset(self::$classname_spec_cache[$class])) {
$classNames = ClassInfo::subclassesFor($class);

$db = DB::getConn();
if($db->hasField($class, 'ClassName')) {
$existing = $db->query("SELECT DISTINCT \"ClassName\" FROM \"$class\"")->column();
$classNames = array_unique(array_merge($existing, $classNames));
}

self::$classname_spec_cache[$class] = "Enum('" . implode(', ', $classNames) . "')";
}

return array_merge (
array (
'ClassName' => "Enum('" . implode(', ', array_unique(array_merge($existing, ClassInfo::subclassesFor($class)))) . "')",
'ClassName' => self::$classname_spec_cache[$class],
'Created' => 'SS_Datetime',
'LastEdited' => 'SS_Datetime'
),
Expand Down

0 comments on commit df5a9e0

Please sign in to comment.