use Exception;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
+use Friendica\Core\Renderer;
use Friendica\DI;
use Friendica\Model\Item;
use Friendica\Model\User;
$old_tables = ['fserver', 'gcign', 'gcontact', 'gcontact-relation', 'gfollower' ,'glink', 'item-delivery-data',
'item-activity', 'item-content', 'item_id', 'participation', 'poll', 'poll_result', 'queue', 'retriever_rule',
- 'sign', 'spam', 'term', 'user-item', 'thread', 'item'];
+ 'deliverq', 'dsprphotoq', 'ffinder', 'sign', 'spam', 'term', 'user-item', 'thread', 'item', 'challenge',
+ 'auth_codes', 'clients', 'tokens', 'profile_check'];
$tables = DBA::selectToArray(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_NAME'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_TYPE' => 'BASE TABLE']);
return DI::l10n()->t('Errors encountered performing database changes: ') . $message . EOL;
}
+ public static function writeStructure()
+ {
+ $tables = [];
+ foreach (self::definition(null) as $name => $definition) {
+ $indexes = [[
+ 'name' => 'Name',
+ 'fields' => 'Fields',
+ ],
+ [
+ 'name' => '-',
+ 'fields' => '-',
+ ]];
+
+ $lengths = ['name' => 4, 'fields' => 6];
+ foreach ($definition['indexes'] as $key => $value) {
+ $fieldlist = implode(', ', $value);
+ $indexes[] = ['name' => $key, 'fields' => $fieldlist];
+ $lengths['name'] = max($lengths['name'], strlen($key));
+ $lengths['fields'] = max($lengths['fields'], strlen($fieldlist));
+ }
+
+ array_walk_recursive($indexes, function(&$value, $key) use ($lengths)
+ {
+ $value = str_pad($value, $lengths[$key], $value === '-' ? '-' : ' ');
+ });
+
+ $foreign = [];
+ $fields = [[
+ 'name' => 'Field',
+ 'comment' => 'Description',
+ 'type' => 'Type',
+ 'null' => 'Null',
+ 'primary' => 'Key',
+ 'default' => 'Default',
+ 'extra' => 'Extra',
+ ],
+ [
+ 'name' => '-',
+ 'comment' => '-',
+ 'type' => '-',
+ 'null' => '-',
+ 'primary' => '-',
+ 'default' => '-',
+ 'extra' => '-',
+ ]];
+ $lengths = [
+ 'name' => 5,
+ 'comment' => 11,
+ 'type' => 4,
+ 'null' => 4,
+ 'primary' => 3,
+ 'default' => 7,
+ 'extra' => 5,
+ ];
+ foreach ($definition['fields'] as $key => $value) {
+ $field = [];
+ $field['name'] = $key;
+ $field['comment'] = $value['comment'] ?? '';
+ $field['type'] = $value['type'];
+ $field['null'] = ($value['not null'] ?? false) ? 'NO' : 'YES';
+ $field['primary'] = ($value['primary'] ?? false) ? 'PRI' : '';
+ $field['default'] = $value['default'] ?? 'NULL';
+ $field['extra'] = $value['extra'] ?? '';
+
+ foreach ($field as $fieldname => $fieldvalue) {
+ $lengths[$fieldname] = max($lengths[$fieldname] ?? 0, strlen($fieldvalue));
+ }
+ $fields[] = $field;
+
+ if (!empty($value['foreign'])) {
+ $foreign[] = [
+ 'field' => $key,
+ 'targettable' => array_keys($value['foreign'])[0],
+ 'targetfield' => array_values($value['foreign'])[0]
+ ];
+ }
+ }
+
+ array_walk_recursive($fields, function(&$value, $key) use ($lengths)
+ {
+ $value = str_pad($value, $lengths[$key], $value === '-' ? '-' : ' ');
+ });
+
+ $tables[] = ['name' => $name, 'comment' => $definition['comment']];
+ $content = Renderer::replaceMacros(Renderer::getMarkupTemplate('structure.tpl'), [
+ '$name' => $name,
+ '$comment' => $definition['comment'],
+ '$fields' => $fields,
+ '$indexes' => $indexes,
+ '$foreign' => $foreign,
+ ]);
+ $filename = DI::basePath() . '/doc/database/db_' . $name . '.md';
+ file_put_contents($filename, $content);
+ }
+ asort($tables);
+ $content = Renderer::replaceMacros(Renderer::getMarkupTemplate('tables.tpl'), [
+ '$tables' => $tables,
+ ]);
+ $filename = DI::basePath() . '/doc/database.md';
+ file_put_contents($filename, $content);
+ }
+
public static function printStructure($basePath)
{
$database = self::definition($basePath, false);
public static function definition($basePath, $with_addons_structure = true)
{
if (!self::$definition) {
+ if (empty($basePath)) {
+ $basePath = DI::app()->getBasePath();
+ }
$filename = $basePath . '/static/dbstructure.config.php';
// Assign all field that are present in the table
foreach ($fieldnames as $field) {
if (isset($data[$field])) {
+ // Limit the length of varchar, varbinary, char and binrary fields
+ if (is_string($data[$field]) && preg_match("/char\((\d*)\)/", $definition[$table]['fields'][$field]['type'], $result)) {
+ $data[$field] = mb_substr($data[$field], 0, $result[1]);
+ } elseif (is_string($data[$field]) && preg_match("/binary\((\d*)\)/", $definition[$table]['fields'][$field]['type'], $result)) {
+ $data[$field] = substr($data[$field], 0, $result[1]);
+ }
$fields[$field] = $data[$field];
}
}
$current_field_definition = DBA::cleanQuery(implode(",", $field_definition));
$new_field_definition = DBA::cleanQuery(implode(",", $parameters));
if ($current_field_definition != $new_field_definition) {
+ // When the field structure changes then we will not perform the special index handling for MySQL.
+ // See issue #10768
+ $is_unique = false;
+ $temp_name = $name;
+
$sql2 = self::modifyTableField($fieldname, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER" . $ignore . " TABLE `" . $temp_name . "` " . $sql2;
if ($verbose) {
echo "Zero contact added\n";
}
- }
+ }
} elseif (self::existsTable('contact') && $verbose) {
echo "Zero contact already added\n";
} elseif ($verbose) {
if (self::existsTable('permissionset')) {
if (!DBA::exists('permissionset', ['id' => 0])) {
- DBA::insert('permissionset', ['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '']);
+ DBA::insert('permissionset', ['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '']);
$lastid = DBA::lastInsertId();
if ($lastid != 0) {
DBA::update('permissionset', ['id' => 0], ['id' => $lastid]);
} elseif ($verbose) {
echo "permissionset: Table not found\n";
}
-
- if (!self::existsForeignKeyForField('tokens', 'client_id')) {
+
+ if (self::existsTable('tokens') && self::existsTable('clients') && !self::existsForeignKeyForField('tokens', 'client_id')) {
$tokens = DBA::p("SELECT `tokens`.`id` FROM `tokens`
LEFT JOIN `clients` ON `clients`.`client_id` = `tokens`.`client_id`
WHERE `clients`.`client_id` IS NULL");