public static function getCreateTable($recordClass, $historyVariant = false) { $queryFields = array(); $indexes = $historyVariant ? array() : $recordClass::$indexes; $fulltextColumns = array(); // history table revisionID field if ($historyVariant) { $queryFields[] = '`RevisionID` int(10) unsigned NOT NULL auto_increment'; $queryFields[] = 'PRIMARY KEY (`RevisionID`)'; } // compile fields $rootClass = !empty($recordClass::$rootClass) ? $recordClass::$rootClass : $recordClass; foreach ($recordClass::getClassFields() as $fieldId => $field) { //Debug::dump($field, "Field: $field[columnName]"); if ($field['columnName'] == 'RevisionID') { continue; } // force notnull=false on non-rootclass fields if ($rootClass && !$rootClass::_fieldExists($fieldId)) { $field['notnull'] = false; } // auto-prepend class type if ($field['columnName'] == 'Class' && $field['type'] == 'enum' && !in_array($rootClass, $field['values']) && empty($rootClass::$subClasses)) { array_unshift($field['values'], $rootClass); } // escape namespaces in field names if ($field['columnName'] == 'Class') { foreach ($field['values'] as $index => $value) { $field['values'][$index] = str_replace('\\', '\\\\', $value); } } $fieldDef = '`' . $field['columnName'] . '`'; $fieldDef .= ' ' . static::getSQLType($field); $fieldDef .= ' ' . ($field['notnull'] ? 'NOT NULL' : 'NULL'); if ($field['autoincrement'] && !$historyVariant) { $fieldDef .= ' auto_increment'; } elseif ($field['type'] == 'timestamp' && $field['default'] == 'CURRENT_TIMESTAMP') { $fieldDef .= ' default CURRENT_TIMESTAMP'; } elseif (empty($field['notnull']) && $field['default'] == null) { $fieldDef .= ' default NULL'; } elseif (isset($field['default'])) { if ($field['type'] == 'boolean') { $fieldDef .= ' default ' . ($field['default'] ? 1 : 0); } else { $fieldDef .= ' default "' . DB::escape($field['default']) . '"'; } } $queryFields[] = $fieldDef; if ($field['primary']) { if ($historyVariant) { $queryFields[] = 'KEY `' . $field['columnName'] . '` (`' . $field['columnName'] . '`)'; } else { $queryFields[] = 'PRIMARY KEY (`' . $field['columnName'] . '`)'; } } if ($field['unique'] && !$historyVariant) { $queryFields[] = 'UNIQUE KEY `' . $field['columnName'] . '` (`' . $field['columnName'] . '`)'; } if ($field['index'] && !$historyVariant) { $queryFields[] = 'KEY `' . $field['columnName'] . '` (`' . $field['columnName'] . '`)'; } if ($field['fulltext'] && !$historyVariant) { $fulltextColumns[] = $field['columnName']; } } // context index if (!$historyVariant && $recordClass::_fieldExists('ContextClass') && $recordClass::_fieldExists('ContextID')) { $queryFields[] = 'KEY `CONTEXT` (`' . $recordClass::getColumnName('ContextClass') . '`,`' . $recordClass::getColumnName('ContextID') . '`)'; } // compile indexes foreach ($indexes as $indexName => $index) { if (is_array($index['fields'])) { $indexFields = $index['fields']; } elseif ($index['fields']) { $indexFields = array($index['fields']); } else { continue; } // translate field names foreach ($index['fields'] as &$indexField) { $indexField = $recordClass::getColumnName($indexField); } if (!empty($index['fulltext'])) { $fulltextColumns = array_unique(array_merge($fulltextColumns, $index['fields'])); continue; } $queryFields[] = sprintf('%s KEY `%s` (`%s`)', !empty($index['unique']) ? 'UNIQUE' : '', $indexName, join('`,`', $index['fields'])); } if (!empty($fulltextColumns)) { $queryFields[] = 'FULLTEXT KEY `FULLTEXT` (`' . join('`,`', $fulltextColumns) . '`)'; } $createSQL = sprintf("--\n-- %s for class %s\n--\n" . "CREATE TABLE IF NOT EXISTS `%s` (\n\t%s\n) ENGINE=MyISAM DEFAULT CHARSET=%s;", $historyVariant ? 'History table' : 'Table', $recordClass, $historyVariant ? $recordClass::$historyTable : $recordClass::$tableName, join("\n\t,", $queryFields), DB::$charset); return $createSQL; }
protected static function _mapConditions($conditions) { foreach ($conditions as $field => &$condition) { if (is_string($field)) { $fieldOptions = static::$_classFields[get_called_class()][$field]; if ($condition === null || $condition == '' && $fieldOptions['blankisnull']) { $condition = sprintf('`%s` IS NULL', static::_cn($field)); } else { if (is_array($condition)) { $condition = sprintf('`%s` %s "%s"', static::_cn($field), $condition['operator'], DB::escape($condition['value'])); } else { $condition = sprintf('`%s` = "%s"', static::_cn($field), DB::escape($condition)); } } } } return $conditions; }