]> git.mxchange.org Git - friendica.git/commitdiff
Dynamic config loading
authorPhilipp Holzer <admin+github@philipp.info>
Sun, 23 Jun 2019 17:56:21 +0000 (19:56 +0200)
committerPhilipp Holzer <admin+github@philipp.info>
Tue, 16 Jul 2019 18:16:43 +0000 (20:16 +0200)
- Move settings, defaults and dbstructure to directory 'static'
- Dynamic loading of config files (after the static loading)
- Filter out '-sample.config.php' and '-sample.ini.php' files
- Remove unnecessary ConfigFileManager
- Move ConfigFileLoader to Utils
- Add tests for multi-loading for INI, config and sample-filtering

31 files changed:
config/dbstructure.config.php [deleted file]
config/defaults.config.php [deleted file]
config/local-sample.config.php
config/settings.config.php [deleted file]
doc/Config.md
src/App.php
src/Console/AutomaticInstallation.php
src/Core/Config/Configuration.php
src/Database/DBStructure.php
src/Factory/ConfigFactory.php
src/Factory/DependencyFactory.php
src/Module/Admin/Summary.php
src/Util/Config/ConfigFileLoader.php [deleted file]
src/Util/Config/ConfigFileManager.php [deleted file]
src/Util/ConfigFileLoader.php [new file with mode: 0644]
static/dbstructure.config.php [new file with mode: 0755]
static/defaults.config.php [new file with mode: 0644]
static/settings.config.php [new file with mode: 0644]
tests/DatabaseTest.php
tests/Util/VFSTrait.php
tests/datasets/config/A.config.php [new file with mode: 0644]
tests/datasets/config/A.ini.php [new file with mode: 0644]
tests/datasets/config/B.config.php [new file with mode: 0644]
tests/datasets/config/B.ini.php [new file with mode: 0644]
tests/datasets/config/local.config.php [deleted file]
tests/datasets/config/local.ini.php [deleted file]
tests/include/ApiTest.php
tests/src/Console/AutomaticInstallationConsoleTest.php
tests/src/Util/Config/ConfigFileLoaderTest.php
update.php
view/templates/local.config.tpl

diff --git a/config/dbstructure.config.php b/config/dbstructure.config.php
deleted file mode 100755 (executable)
index 787a439..0000000
+++ /dev/null
@@ -1,1421 +0,0 @@
-<?php
-
-/* Main database structure configuration file.
- *
- * Here are described all the tables, fields and indexes Friendica needs to work.
- *
- * Syntax (braces indicate optionale values):
- * "<table name>" => [
- *     "comment" => "Description of the table",
- *     "fields" => [
- *             "<field name>" => [
- *                     "type" => "<field type>{(<field size>)} <unsigned>",
- *                     "not null" => 0|1,
- *                     {"extra" => "auto_increment",}
- *                     {"default" => "<default value>",}
- *                     {"default" => NULL_DATE,} (for datetime fields)
- *                     {"primary" => "1",}
- *                     {"relation" => ["<foreign key table name>" => "<foreign key field name>"],}
- *                     "comment" => "Description of the fields"
- *             ],
- *             ...
- *     ],
- *     "indexes" => [
- *             "PRIMARY" => ["<primary key field name>", ...],
- *             "<index name>" => [{"UNIQUE",} "<field name>{(<key size>)}", ...]
- *             ...
- *     ],
- * ],
- *
- * If you need to make any change, make sure to increment the DB_UPDATE_VERSION constant value below.
- *
- */
-
-use Friendica\Database\DBA;
-
-if (!defined('DB_UPDATE_VERSION')) {
-       define('DB_UPDATE_VERSION', 1318);
-}
-
-return [
-       "2fa_recovery_codes" => [
-               "comment" => "Two-factor authentication recovery codes",
-               "fields" => [
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User ID"],
-                       "code" => ["type" => "varchar(50)", "not null" => "1", "primary" => "1", "comment" => "Recovery code string"],
-                       "generated" => ["type" => "datetime", "not null" => "1", "comment" => "Datetime the code was generated"],
-                       "used" => ["type" => "datetime", "comment" => "Datetime the code was used"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "code"]
-               ]
-       ],
-       "addon" => [
-               "comment" => "registered addons",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "name" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "addon base (file)name"],
-                       "version" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "currently unused"],
-                       "installed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently always 1"],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently unused"],
-                       "timestamp" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "file timestamp to check for reloads"],
-                       "plugin_admin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = has admin config, 0 = has no admin config"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "name" => ["UNIQUE", "name"],
-               ]
-       ],
-       "apcontact" => [
-               "comment" => "ActivityPub compatible contacts - used in the ActivityPub implementation",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the contact"],
-                       "uuid" => ["type" => "varchar(255)", "comment" => ""],
-                       "type" => ["type" => "varchar(20)", "not null" => "1", "comment" => ""],
-                       "following" => ["type" => "varchar(255)", "comment" => ""],
-                       "followers" => ["type" => "varchar(255)", "comment" => ""],
-                       "inbox" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
-                       "outbox" => ["type" => "varchar(255)", "comment" => ""],
-                       "sharedinbox" => ["type" => "varchar(255)", "comment" => ""],
-                       "manually-approve" => ["type" => "boolean", "comment" => ""],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => ""],
-                       "baseurl" => ["type" => "varchar(255)", "comment" => "baseurl of the ap contact"],
-                       "generator" => ["type" => "varchar(255)", "comment" => "Name of the contact's system"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url"],
-                       "addr" => ["addr(32)"],
-                       "alias" => ["alias(190)"],
-                       "url" => ["followers(190)"]
-               ]
-       ],
-       "attach" => [
-               "comment" => "file attachments",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "generated index"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "hash"],
-                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "filename of original"],
-                       "filetype" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "mimetype"],
-                       "filesize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "size in bytes"],
-                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-                       "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"],
-                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "auth_codes" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"],
-                               "comment" => ""],
-                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
-                       "scope" => ["type" => "varchar(250)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "cache" => [
-               "comment" => "Stores temporary data",
-               "fields" => [
-                       "k" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "cache key"],
-                       "v" => ["type" => "mediumtext", "comment" => "cached serialized value"],
-                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache insertion"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["k"],
-                       "k_expires" => ["k", "expires"],
-               ]
-       ],
-       "challenge" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "challenge" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "type" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "last_update" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "clients" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "pw" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => ""],
-                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "text", "comment" => ""],
-                       "icon" => ["type" => "text", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["client_id"],
-               ]
-       ],
-       "config" => [
-               "comment" => "main configuration storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "k" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "v" => ["type" => "mediumtext", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "cat_k" => ["UNIQUE", "cat", "k"],
-               ]
-       ],
-       "contact" => [
-               "comment" => "contact table",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => "Date of last contact update"],
-                       "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"],
-                       "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"],
-                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network of the contact"],
-                       "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
-                       "location" => ["type" => "varchar(255)", "default" => "", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "keywords" => ["type" => "text", "comment" => "public keywords (interests) of the contact"],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"],
-                       "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"],
-                       "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"],
-                       "site-pubkey" => ["type" => "text", "comment" => ""],
-                       "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
-                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
-                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "comment" => ""],
-                       "poll" => ["type" => "varchar(255)", "comment" => ""],
-                       "confirm" => ["type" => "varchar(255)", "comment" => ""],
-                       "poco" => ["type" => "varchar(255)", "comment" => ""],
-                       "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"],
-                       "success_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful contact update"],
-                       "failure_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed update"],
-                       "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "term-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last-item" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last post"],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Node-wide block status"],
-                       "block_reason" => ["type" => "text", "comment" => "Node-wide block reason"],
-                       "readonly" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "posts of the contact are readonly"],
-                       "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum"],
-                       "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group"],
-                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"],
-                       "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "unsearchable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact prefers to not be searchable"],
-                       "sensitive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact posts sensitive content"],
-                       "baseurl" => ["type" => "varchar(255)", "default" => "", "comment" => "baseurl of the contact"],
-                       "reason" => ["type" => "text", "comment" => ""],
-                       "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => ""],
-                       "info" => ["type" => "mediumtext", "comment" => ""],
-                       "profile-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "bd" => ["type" => "date", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
-                       "notify_new_posts" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "fetch_further_information" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ffi_keyword_blacklist" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_name" => ["uid", "name(190)"],
-                       "self_uid" => ["self", "uid"],
-                       "alias_uid" => ["alias(32)", "uid"],
-                       "pending_uid" => ["pending", "uid"],
-                       "blocked_uid" => ["blocked", "uid"],
-                       "uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"],
-                       "uid_network_batch" => ["uid", "network", "batch(64)"],
-                       "addr_uid" => ["addr(32)", "uid"],
-                       "nurl_uid" => ["nurl(32)", "uid"],
-                       "nick_uid" => ["nick(32)", "uid"],
-                       "dfrn-id" => ["dfrn-id(64)"],
-                       "issued-id" => ["issued-id(64)"],
-               ]
-       ],
-       "conv" => [
-               "comment" => "private messages",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this conversation"],
-                       "recips" => ["type" => "text", "comment" => "sender_handle;recipient_handle"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "creator" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "handle of creator"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation timestamp"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "edited timestamp"],
-                       "subject" => ["type" => "text", "comment" => "subject of initial message"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "conversation" => [
-               "comment" => "Raw data and structure information for messages",
-               "fields" => [
-                       "item-uri" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "Original URI of the item - unrelated to the table with the same name"],
-                       "reply-to-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "URI to which this item is a reply"],
-                       "conversation-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation URI"],
-                       "conversation-href" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation link"],
-                       "protocol" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "255", "comment" => "The protocol of the item"],
-                       "source" => ["type" => "mediumtext", "comment" => "Original source"],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Receiving date"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["item-uri"],
-                       "conversation-uri" => ["conversation-uri"],
-                       "received" => ["received"],
-               ]
-       ],
-       "diaspora-interaction" => [
-               "comment" => "Signed Diaspora Interaction",
-               "fields" => [
-                       "uri-id" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "interaction" => ["type" => "mediumtext", "comment" => "The Diaspora interaction"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uri-id"]
-               ]
-       ],
-       "event" => [
-               "comment" => "Events",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact_id (ID of the contact in contact table)"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
-                       "start" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event start time"],
-                       "finish" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event end time"],
-                       "summary" => ["type" => "text", "comment" => "short description or title of the event"],
-                       "desc" => ["type" => "text", "comment" => "event description"],
-                       "location" => ["type" => "text", "comment" => "event location"],
-                       "type" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => "event or birthday"],
-                       "nofinish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if event does have no end this is 1"],
-                       "adjust" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "adjust to timezone of the recipient (0 or 1)"],
-                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "0 or 1"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_start" => ["uid", "start"],
-               ]
-       ],
-       "fcontact" => [
-               "comment" => "Diaspora compatible contacts - used in the Diaspora implementation",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "unique id"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "poll" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "confirm" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubkey" => ["type" => "text", "comment" => ""],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "addr" => ["addr(32)"],
-                       "url" => ["UNIQUE", "url(190)"],
-               ]
-       ],
-       "fsuggest" => [
-               "comment" => "friend suggestion stuff",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "gcign" => [
-               "comment" => "contacts ignored by friend suggestions",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Local User id"],
-                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => "gcontact.id of ignored contact"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-                       "gcid" => ["gcid"],
-               ]
-       ],
-       "gcontact" => [
-               "comment" => "global contacts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
-                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the contacts profile page"],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the profile photo"],
-                       "connect" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "archive_date" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "archived" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "keywords" => ["type" => "text", "comment" => "puplic keywords (interests)"],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "birthday" => ["type" => "varchar(32)", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
-                       "community" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if contact is forum account"],
-                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "-1", "comment" => ""],
-                       "hide" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = should be hidden from search"],
-                       "nsfw" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = contact posts nsfw content"],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "social network protocol"],
-                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "notify" => ["type" => "varchar(255)", "comment" => ""],
-                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "generation" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "server_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "baseurl of the contacts server"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "nurl" => ["UNIQUE", "nurl(190)"],
-                       "name" => ["name(64)"],
-                       "nick" => ["nick(32)"],
-                       "addr" => ["addr(64)"],
-                       "hide_network_updated" => ["hide", "network", "updated"],
-                       "updated" => ["updated"],
-               ]
-       ],
-       "glink" => [
-               "comment" => "'friends of friends' linkages derived from poco",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
-                       "zcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "cid_uid_gcid_zcid" => ["UNIQUE", "cid", "uid", "gcid", "zcid"],
-                       "gcid" => ["gcid"],
-               ]
-       ],
-       "group" => [
-               "comment" => "privacy groups, group info",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the group has been deleted"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of group"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "group_member" => [
-               "comment" => "privacy groups, member info",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["group" => "id"], "comment" => "groups.id of the associated group"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated group"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "contactid" => ["contact-id"],
-                       "gid_contactid" => ["UNIQUE", "gid", "contact-id"],
-               ]
-       ],
-       "gserver" => [
-               "comment" => "Global servers",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "version" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "site_name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "info" => ["type" => "text", "comment" => ""],
-                       "register_policy" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
-                       "registered-users" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Number of registered users"],
-                       "poco" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "noscrape" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "platform" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "relay-subscribe" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Has the server subscribed to the relay system"],
-                       "relay-scope" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => "The scope of messages that the server wants to get"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_poco_query" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "nurl" => ["UNIQUE", "nurl(190)"],
-               ]
-       ],
-       "gserver-tag" => [
-               "comment" => "Tags that the server has subscribed",
-               "fields" => [
-                       "gserver-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gserver" => "id"], "primary" => "1",
-                               "comment" => "The id of the gserver"],
-                       "tag" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "primary" => "1", "comment" => "Tag that the server has subscribed"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["gserver-id", "tag"],
-                       "tag" => ["tag"],
-               ]
-       ],
-       "hook" => [
-               "comment" => "addon hook registry",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hook" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => "name of hook"],
-                       "file" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "relative filename of hook handler"],
-                       "function" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "function name of hook handler"],
-                       "priority" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => "not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "hook_file_function" => ["UNIQUE", "hook", "file", "function"],
-               ]
-       ],
-       "inbox-status" => [
-               "comment" => "Status of ActivityPub inboxes",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the inbox"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date of this entry"],
-                       "success" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful delivery"],
-                       "failure" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed delivery"],
-                       "previous" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Previous delivery date"],
-                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the inbox archived?"],
-                       "shared" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is it a shared inbox?"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url"]
-               ]
-       ],
-       "intro" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "fid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["fcontact" => "id"], "comment" => ""],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "knowyou" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "datetime" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "item" => [
-               "comment" => "Structure for all posts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"],
-                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the parent to this item"],
-                       "parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the parent uri"],
-                       "thr-parent" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri"],
-                       "thr-parent-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the thread parent uri"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation timestamp."],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last edit (default is created)"],
-                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last comment/reply to this item"],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime"],
-                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date that something in the conversation changed, indicating clients should fetch the conversation again"],
-                       "gravity" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network from where the item comes from"],
-                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the owner of this item"],
-                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the author of this item"],
-                       "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"],
-                       "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"],
-                       "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
-                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "distribution is restricted"],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"],
-                       // User specific fields. Eventually they will move to user-item
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"],
-                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item originated at this site"],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been favourited"],
-                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "item has not been seen"],
-                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "The owner of this item was mentioned in it"],
-                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "psid" => ["type" => "int unsigned", "relation" => ["permissionset" => "id"], "comment" => "ID of the permission set of this post"],
-                       // It has to be decided whether these fields belong to the user or the structure
-                       "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"],
-                       "event-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"],
-                       // Could possibly be replaced by the "attach" table?
-                       "attach" => ["type" => "mediumtext", "comment" => "JSON structure representing attachments to this item"],
-                       // Deprecated fields. Will be removed in upcoming versions
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "postopts" => ["type" => "text", "comment" => "Deprecated"],
-                       "inform" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "type" => ["type" => "varchar(20)", "comment" => "Deprecated"],
-                       "bookmark" => ["type" => "boolean", "comment" => "Deprecated"],
-                       "file" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "location" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "coord" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "tag" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "plink" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "title" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "content-warning" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "body" => ["type" => "mediumtext", "comment" => "Deprecated"],
-                       "app" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "verb" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "object-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "object" => ["type" => "text", "comment" => "Deprecated"],
-                       "target-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
-                       "target" => ["type" => "text", "comment" => "Deprecated"],
-                       "author-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "author-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "author-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "owner-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
-                       "rendered-hash" => ["type" => "varchar(32)", "comment" => "Deprecated"],
-                       "rendered-html" => ["type" => "mediumtext", "comment" => "Deprecated"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "guid" => ["guid(191)"],
-                       "uri" => ["uri(191)"],
-                       "parent" => ["parent"],
-                       "parent-uri" => ["parent-uri(191)"],
-                       "extid" => ["extid(191)"],
-                       "uid_id" => ["uid", "id"],
-                       "uid_contactid_id" => ["uid", "contact-id", "id"],
-                       "uid_received" => ["uid", "received"],
-                       "uid_commented" => ["uid", "commented"],
-                       "uid_unseen_contactid" => ["uid", "unseen", "contact-id"],
-                       "uid_network_received" => ["uid", "network", "received"],
-                       "uid_network_commented" => ["uid", "network", "commented"],
-                       "uid_thrparent" => ["uid", "thr-parent(190)"],
-                       "uid_parenturi" => ["uid", "parent-uri(190)"],
-                       "uid_contactid_received" => ["uid", "contact-id", "received"],
-                       "authorid_received" => ["author-id", "received"],
-                       "ownerid" => ["owner-id"],
-                       "contact-id" => ["contact-id"],
-                       "uid_uri" => ["uid", "uri(190)"],
-                       "resource-id" => ["resource-id"],
-                       "deleted_changed" => ["deleted", "changed"],
-                       "uid_wall_changed" => ["uid", "wall", "changed"],
-                       "uid_eventid" => ["uid", "event-id"],
-                       "icid" => ["icid"],
-                       "iaid" => ["iaid"],
-                       "psid_wall" => ["psid", "wall"],
-               ]
-       ],
-       "item-activity" => [
-               "comment" => "Activities for items",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "uri" => ["type" => "varchar(255)", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "activity" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri-hash" => ["UNIQUE", "uri-hash"],
-                       "uri" => ["uri(191)"],
-                       "uri-id" => ["uri-id"]
-               ]
-       ],
-       "item-content" => [
-               "comment" => "Content for all posts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
-                       "uri" => ["type" => "varchar(255)", "comment" => ""],
-                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
-                       "uri-plink-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
-                       "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "body" => ["type" => "mediumtext", "comment" => "item body content"],
-                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "text location where this item originated"],
-                       "coord" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "longitude/latitude pair representing location where this item originated"],
-                       "language" => ["type" => "text", "comment" => "Language information about this post"],
-                       "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "application which generated this item"],
-                       "rendered-hash" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "rendered-html" => ["type" => "mediumtext", "comment" => "item.body converted to html"],
-                       "object-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams object type"],
-                       "object" => ["type" => "text", "comment" => "JSON encoded object structure unless it is an implied object (normal post)"],
-                       "target-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams target type if applicable (URI)"],
-                       "target" => ["type" => "text", "comment" => "JSON encoded target structure if used"],
-                       "plink" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "permalink or URL to a displayable copy of the message at its source"],
-                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams verb"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri-plink-hash" => ["UNIQUE", "uri-plink-hash"],
-                       "uri" => ["uri(191)"],
-                       "uri-id" => ["uri-id"]
-               ]
-       ],
-       "item-delivery-data" => [
-               "comment" => "Delivery data for items",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
-                       "postopts" => ["type" => "text", "comment" => "External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery"],
-                       "inform" => ["type" => "mediumtext", "comment" => "Additional receivers of the linked item"],
-                       "queue_count" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Initial number of delivery recipients, used as item.delivery_queue_count"],
-                       "queue_done" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries, used as item.delivery_queue_done"],
-                       "activitypub" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via ActivityPub"],
-                       "dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via DFRN"],
-                       "legacy_dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via legacy DFRN"],
-                       "diaspora" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via Diaspora"],
-                       "ostatus" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via OStatus"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid"],
-               ]
-       ],
-       "item-uri" => [
-               "comment" => "URI and GUID for items",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
-                       "uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
-                       "guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uri" => ["UNIQUE", "uri"],
-                       "guid" => ["guid"]
-               ]
-       ],
-       "locks" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "name" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => ""],
-                       "locked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process ID"],
-                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "name_expires" => ["name", "expires"]
-               ]
-       ],
-       "mail" => [
-               "comment" => "private messages",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this private message"],
-                       "from-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "name of the sender"],
-                       "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"],
-                       "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"],
-                       "contact-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "convid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["conv" => "id"], "comment" => "conv.id"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "body" => ["type" => "mediumtext", "comment" => ""],
-                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if message visited it is 1"],
-                       "reply" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"],
-                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_seen" => ["uid", "seen"],
-                       "convid" => ["convid"],
-                       "uri" => ["uri(64)"],
-                       "parent-uri" => ["parent-uri(64)"],
-                       "contactid" => ["contact-id(32)"],
-               ]
-       ],
-       "mailacct" => [
-               "comment" => "Mail account data for fetching mails",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "server" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "port" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ssltype" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
-                       "mailbox" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "user" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pass" => ["type" => "text", "comment" => ""],
-                       "reply_to" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "action" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "movetofolder" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "last_check" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "manage" => [
-               "comment" => "table of accounts that can manage each other",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "mid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_mid" => ["UNIQUE", "uid", "mid"],
-               ]
-       ],
-       "notify" => [
-               "comment" => "notifications",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => ""],
-                       "type" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "msg" => ["type" => "mediumtext", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
-                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
-                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],
-                       "otype" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => ""],
-                       "name_cache" => ["type" => "tinytext", "comment" => "Cached bbcode parsing of name"],
-                       "msg_cache" => ["type" => "mediumtext", "comment" => "Cached bbcode parsing of msg"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "hash_uid" => ["hash", "uid"],
-                       "seen_uid_date" => ["seen", "uid", "date"],
-                       "uid_date" => ["uid", "date"],
-                       "uid_type_link" => ["uid", "type", "link(190)"],
-               ]
-       ],
-       "notify-threads" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "notify-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["notify" => "id"], "comment" => ""],
-                       "master-parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"],
-                               "comment" => ""],
-                       "parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "receiver-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
-                               "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "oembed" => [
-               "comment" => "cache for OEmbed queries",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
-                       "maxwidth" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "comment" => "Maximum width passed to Oembed"],
-                       "content" => ["type" => "mediumtext", "comment" => "OEmbed data of the page"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url", "maxwidth"],
-                       "created" => ["created"],
-               ]
-       ],
-       "openwebauth-token" => [
-               "comment" => "Store OpenWebAuth token to verify contacts",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "type" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Verify type"],
-                       "token" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A generated token"],
-                       "meta" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "parsed_url" => [
-               "comment" => "cache for 'parse_url' queries",
-               "fields" => [
-                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
-                       "guessing" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the 'guessing' mode active?"],
-                       "oembed" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the data the result of oembed?"],
-                       "content" => ["type" => "mediumtext", "comment" => "page data"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["url", "guessing", "oembed"],
-                       "created" => ["created"],
-               ]
-       ],
-       "participation" => [
-               "comment" => "Storage for participation messages from Diaspora",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => ""],
-                       "server" => ["type" => "varchar(60)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["contact" => "id"], "comment" => ""],
-                       "fid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["fcontact" => "id"], "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid", "server"],
-                       "cid" => ["cid"],
-                       "fid" => ["fid"]
-               ]
-       ],
-       "pconfig" => [
-               "comment" => "personal (per user) configuration storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
-                       "k" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => ""],
-                       "v" => ["type" => "mediumtext", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_cat_k" => ["UNIQUE", "uid", "cat", "k"],
-               ]
-       ],
-       "permissionset" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id of this permission set"],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_allow_cid_allow_gid_deny_cid_deny_gid" => ["allow_cid(50)", "allow_gid(30)", "deny_cid(50)", "deny_gid(30)"],
-               ]
-       ],
-       "photo" => [
-               "comment" => "photo storage",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "guid" => ["type" => "char(16)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this photo"],
-                       "resource-id" => ["type" => "char(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation date"],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edited date"],
-                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "desc" => ["type" => "text", "comment" => ""],
-                       "album" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "The name of the album to which the photo belongs"],
-                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "type" => ["type" => "varchar(30)", "not null" => "1", "default" => "image/jpeg"],
-                       "height" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "width" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "datasize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "data" => ["type" => "mediumblob", "not null" => "1", "comment" => ""],
-                       "scale" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "profile" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
-                       "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"],
-                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"],
-                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "contactid" => ["contact-id"],
-                       "uid_contactid" => ["uid", "contact-id"],
-                       "uid_profile" => ["uid", "profile"],
-                       "uid_album_scale_created" => ["uid", "album(32)", "scale", "created"],
-                       "uid_album_resource-id_created" => ["uid", "album(32)", "resource-id", "created"],
-                       "resource-id" => ["resource-id"],
-               ]
-       ],
-       "poll" => [
-               "comment" => "Currently unused table for storing poll results",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "q0" => ["type" => "text", "comment" => ""],
-                       "q1" => ["type" => "text", "comment" => ""],
-                       "q2" => ["type" => "text", "comment" => ""],
-                       "q3" => ["type" => "text", "comment" => ""],
-                       "q4" => ["type" => "text", "comment" => ""],
-                       "q5" => ["type" => "text", "comment" => ""],
-                       "q6" => ["type" => "text", "comment" => ""],
-                       "q7" => ["type" => "text", "comment" => ""],
-                       "q8" => ["type" => "text", "comment" => ""],
-                       "q9" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "poll_result" => [
-               "comment" => "data for polls - currently unused",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "poll_id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["poll" => "id"]],
-                       "choice" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "poll_id" => ["poll_id"],
-               ]
-       ],
-       "process" => [
-               "comment" => "Currently running system processes",
-               "fields" => [
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "command" => ["type" => "varbinary(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["pid"],
-                       "command" => ["command"],
-               ]
-       ],
-       "profile" => [
-               "comment" => "user profiles data",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
-                       "profile-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name of the profile"],
-                       "is-default" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Mark this profile as default profile"],
-                       "hide-friends" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide friend list from viewers of this profile"],
-                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pdesc" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Title or description"],
-                       "dob" => ["type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00", "comment" => "Day of birth"],
-                       "address" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "locality" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "region" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "postal-code" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "country-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "hometown" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
-                       "marital" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "with" => ["type" => "text", "comment" => ""],
-                       "howlong" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "sexual" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "politic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "religion" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "pub_keywords" => ["type" => "text", "comment" => ""],
-                       "prv_keywords" => ["type" => "text", "comment" => ""],
-                       "likes" => ["type" => "text", "comment" => ""],
-                       "dislikes" => ["type" => "text", "comment" => ""],
-                       "about" => ["type" => "text", "comment" => ""],
-                       "summary" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "music" => ["type" => "text", "comment" => ""],
-                       "book" => ["type" => "text", "comment" => ""],
-                       "tv" => ["type" => "text", "comment" => ""],
-                       "film" => ["type" => "text", "comment" => ""],
-                       "interest" => ["type" => "text", "comment" => ""],
-                       "romance" => ["type" => "text", "comment" => ""],
-                       "work" => ["type" => "text", "comment" => ""],
-                       "education" => ["type" => "text", "comment" => ""],
-                       "contact" => ["type" => "text", "comment" => ""],
-                       "homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "thumb" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish default profile in local directory"],
-                       "net-publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish profile in global directory"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid_is-default" => ["uid", "is-default"],
-                       "pub_keywords" => ["FULLTEXT", "pub_keywords"],
-               ]
-       ],
-       "profile_check" => [
-               "comment" => "DFRN remote auth use",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
-                       "dfrn_id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "sec" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "push_subscriber" => [
-               "comment" => "Used for OStatus: Contains feed subscribers",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "callback_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "topic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "push" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
-                       "last_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last successful trial"],
-                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
-                       "renewed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last subscription renewal"],
-                       "secret" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "next_try" => ["next_try"],
-               ]
-       ],
-       "register" => [
-               "comment" => "registrations requiring admin approval",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "language" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
-                       "note" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "search" => [
-               "comment" => "",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "uid" => ["uid"],
-               ]
-       ],
-       "session" => [
-               "comment" => "web session storage",
-               "fields" => [
-                       "id" => ["type" => "bigint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "sid" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "data" => ["type" => "text", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "sid" => ["sid(64)"],
-                       "expire" => ["expire"],
-               ]
-       ],
-       "sign" => [
-               "comment" => "Diaspora signatures",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
-                       "signed_text" => ["type" => "mediumtext", "comment" => ""],
-                       "signature" => ["type" => "text", "comment" => ""],
-                       "signer" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "iid" => ["UNIQUE", "iid"],
-               ]
-       ],
-       "term" => [
-               "comment" => "item taxonomy (categories, tags, etc.) table",
-               "fields" => [
-                       "tid" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
-                       "oid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
-                       "otype" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["tid"],
-                       "term_type" => ["term(64)", "type"],
-                       "oid_otype_type_term" => ["oid", "otype", "type", "term(32)"],
-                       "uid_otype_type_term_global_created" => ["uid", "otype", "type", "term(32)", "global", "created"],
-                       "uid_otype_type_url" => ["uid", "otype", "type", "url(64)"],
-                       "guid" => ["guid(64)"],
-               ]
-       ],
-       "thread" => [
-               "comment" => "Thread related data",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"],
-                               "comment" => "sequential ID"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
-                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item owner"],
-                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item author"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
-                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "ignored" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
-                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
-                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
-                       "bookmark" => ["type" => "boolean", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["iid"],
-                       "uid_network_commented" => ["uid", "network", "commented"],
-                       "uid_network_received" => ["uid", "network", "received"],
-                       "uid_contactid_commented" => ["uid", "contact-id", "commented"],
-                       "uid_contactid_received" => ["uid", "contact-id", "received"],
-                       "contactid" => ["contact-id"],
-                       "ownerid" => ["owner-id"],
-                       "authorid" => ["author-id"],
-                       "uid_received" => ["uid", "received"],
-                       "uid_commented" => ["uid", "commented"],
-                       "uid_wall_received" => ["uid", "wall", "received"],
-                       "private_wall_origin_commented" => ["private", "wall", "origin", "commented"],
-               ]
-       ],
-       "tokens" => [
-               "comment" => "OAuth usage",
-               "fields" => [
-                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "secret" => ["type" => "text", "comment" => ""],
-                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"]],
-                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
-                       "scope" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-               ]
-       ],
-       "user" => [
-               "comment" => "The local users",
-               "fields" => [
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "parent-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
-                               "comment" => "The parent user that has full control about this user"],
-                       "guid" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this user"],
-                       "username" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this user is known by"],
-                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "encrypted password"],
-                       "legacy_password" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the password hash double-hashed?"],
-                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "nick- and user name"],
-                       "email" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "the users email address"],
-                       "openid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
-                       "timezone" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => "PHP-legal timezone"],
-                       "language" => ["type" => "varchar(32)", "not null" => "1", "default" => "en", "comment" => "default language"],
-                       "register_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of registration"],
-                       "login_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last login"],
-                       "default-location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Default for item.location"],
-                       "allow_location" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 allows to display the location"],
-                       "theme" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "user theme preference"],
-                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
-                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
-                       "spubkey" => ["type" => "text", "comment" => ""],
-                       "sprvkey" => ["type" => "text", "comment" => ""],
-                       "verified" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "user is verified through email"],
-                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 for user is blocked"],
-                       "blockwall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to post to the profile page of the user"],
-                       "hidewall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide profile details from unkown viewers"],
-                       "blocktags" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to tag the post of this user"],
-                       "unkmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Permit unknown people to send private mails to this user"],
-                       "cntunkmail" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
-                       "notify-flags" => ["type" => "smallint unsigned", "not null" => "1", "default" => "65535", "comment" => "email notification options"],
-                       "page-flags" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "page/profile type"],
-                       "account-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "prvnets" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "pwdreset" => ["type" => "varchar(255)", "comment" => "Password reset request token"],
-                       "pwdreset_time" => ["type" => "datetime", "comment" => "Timestamp of the last password reset request"],
-                       "maxreq" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
-                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "account_removed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if 1 the account is removed"],
-                       "account_expired" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
-                       "account_expires_on" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp when account expires and will be deleted"],
-                       "expire_notification_sent" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last warning of account expiration"],
-                       "def_gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
-                       "allow_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "allow_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "deny_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "deny_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
-                       "openidserver" => ["type" => "text", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid"],
-                       "nickname" => ["nickname(32)"],
-               ]
-       ],
-       "userd" => [
-               "comment" => "Deleted usernames",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
-                       "username" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "username" => ["username(32)"],
-               ]
-       ],
-       "user-contact" => [
-               "comment" => "User specific public contact data",
-               "fields" => [
-                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["contact" => "id"], "comment" => "Contact id of the linked public contact"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"],
-                       "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"],
-                       "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "cid"]
-               ]
-       ],
-       "user-item" => [
-               "comment" => "User specific item data",
-               "fields" => [
-                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
-                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
-                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marker to hide an item from the user"],
-                       "ignored" => ["type" => "boolean", "comment" => "Ignore this thread if set"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["uid", "iid"]
-               ]
-       ],
-       "worker-ipc" => [
-               "comment" => "Inter process communication between the frontend and the worker",
-               "fields" => [
-                       "key" => ["type" => "int", "not null" => "1", "primary" => "1", "comment" => ""],
-                       "jobs" => ["type" => "boolean", "comment" => "Flag for outstanding jobs"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["key"],
-               ],
-               "engine" => "MEMORY",
-       ],
-       "workerqueue" => [
-               "comment" => "Background tasks queue entries",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented worker task id"],
-                       "parameter" => ["type" => "mediumtext", "comment" => "Task command"],
-                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Task priority"],
-                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date"],
-                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process id of the worker"],
-                       "executed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Execution date"],
-                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
-                       "retrial" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
-                       "done" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marked 1 when the task was done - will be deleted later"],
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"],
-                       "done_parameter" => ["done", "parameter(64)"],
-                       "done_executed" => ["done", "executed"],
-                       "done_priority_created" => ["done", "priority", "created"],
-                       "done_priority_next_try" => ["done", "priority", "next_try"],
-                       "done_pid_next_try" => ["done", "pid", "next_try"],
-                       "done_pid_priority_created" => ["done", "pid", "priority", "created"]
-               ]
-       ],
-       "storage" => [
-               "comment" => "Data stored by Database storage backend",
-               "fields" => [
-                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented image data id"],
-                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"]
-               ],
-               "indexes" => [
-                       "PRIMARY" => ["id"]
-               ]
-       ]
-];
-
diff --git a/config/defaults.config.php b/config/defaults.config.php
deleted file mode 100644 (file)
index b4471af..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-<?php
-
-// CONFIG.PHP
-
-/* This file declares the default values for the base config of Friendica.
- *
- * These configuration values aren't accessible from the admin settings page and custom values must be set in config/local.config.php
- *
- * Please don't edit this file directly as its content may change in the upcoming versions.
- */
-
-return [
-       'database' => [
-               // host (String)
-               // Hostname or IP address of the database server.
-               // Can contain the port number with the syntax "hostname:port".
-               'hostname' => '',
-
-               // user (String)
-               // Database user name. Please don't use "root".
-               'username' => '',
-
-               // pass (String)
-               // Database user password. Please don't use empty passwords.
-               'password' => '',
-
-               // base (String)
-               // Database name.
-               'database' => '',
-
-               // charset (String)
-               // Database connexion charset. Changing this value will likely corrupt special characters.
-               'charset' => 'utf8mb4',
-       ],
-       'config' => [
-               // admin_email (Comma-separated list)
-               // In order to perform system administration via the admin panel,
-               // this must precisely match the email address of the person logged in.
-               'admin_email' => '',
-
-               // admin_nickname (String)
-               // Nickname of the main admin user, used if there are more than one admin user defined in config => admin_email.
-               'admin_nickname' => '',
-
-               // max_import_size (Integer)
-               // Maximum body size of DFRN and Mail messages in characters. 0 is unlimited.
-               'max_import_size' => 200000,
-
-               // php_path (String)
-               // Location of PHP command line processor.
-               'php_path' => 'php',
-       ],
-       'system' => [
-               // allowed_link_protocols (Array)
-               // Allowed protocols in links URLs, add at your own risk. http is always allowed.
-               'allowed_link_protocols' => ['ftp', 'ftps', 'mailto', 'cid', 'gopher'],
-
-               // always_show_preview (Boolean)
-               // Only show small preview pictures.
-               'always_show_preview' => false,
-
-               // archival_days (Integer)
-               // Number of days that we try to deliver content before we archive a contact.
-               'archival_days' => 32,
-
-               // auth_cookie_lifetime (Integer)
-               // Number of days that should pass without any activity before a user who
-               // chose "Remember me" when logging in is considered logged out.
-               'auth_cookie_lifetime' => 7,
-
-               // block_local_dir (Boolean)
-               // Deny public access to the local user directory.
-               'block_local_dir' => false,
-
-               // cron_interval (Integer)
-               // Minimal period in minutes between two calls of the "Cron" worker job.
-               'cron_interval' => 5,
-
-               // cache_driver (database|memcache|memcached|redis)
-               // Whether to use Memcache or Memcached or Redis to store temporary cache.
-               'cache_driver' => 'database',
-
-               // config_adapter (jit|preload)
-               // Allow to switch the configuration adapter to improve performances at the cost of memory consumption.
-               'config_adapter' => 'jit',
-
-               // curl_range_bytes (Integer)
-               // Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
-               'curl_range_bytes' => 0,
-
-               // crawl_permit_period (Integer)
-               // Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated.
-               'crawl_permit_period' => 60,
-
-               // db_log (Path)
-               // Name of a logfile to log slow database queries.
-               'db_log' => '',
-
-               // db_log_index (Path)
-               // Name of a logfile to log queries with bad indexes.
-               'db_log_index' => '',
-
-               // db_log_index_watch (Comma-separated list)
-               // Watchlist of indexes to watch.
-               'db_log_index_watch' => '',
-
-               // db_log_index_blacklist (Comma-separated list)
-               // Blacklist of indexes that shouldn't be watched.
-               'db_log_index_blacklist' => '',
-
-               // db_loglimit (Integer)
-               // If a database call lasts longer than this value in seconds it is logged.
-               // Inactive if system => db_log is empty.
-               'db_loglimit' => 10,
-
-               // db_loglimit_index (Integer)
-               // Number of index rows needed to be logged for indexes on the watchlist. 0 to disable.
-               'db_loglimit_index' => 0,
-
-               // db_loglimit_index_high (Integer)
-               // Number of index rows to be logged anyway (for any index). 0 to disable.
-               'db_loglimit_index_high' => 0,
-
-               // dbclean_expire_conversation (Integer)
-               // When DBClean is enabled, any entry in the conversation table will be deleted after this many days.
-               // This data is used for ActivityPub, so it shouldn't be lower than the average duration of a discussion.
-               'dbclean_expire_conversation' => 90,
-
-               // dbclean-expire-limit (Integer)
-               // This defines the number of items that are to be deleted in a single call.
-               // Reduce this value when you are getting memory issues.
-               'dbclean-expire-limit' => 1000,
-
-               // diaspora_test (Boolean)
-               // For development only. Disables the message transfer.
-               'diaspora_test' => false,
-
-               // disable_email_validation (Boolean)
-               // Disables the check if a mail address is in a valid format and can be resolved via DNS.
-               'disable_email_validation' => false,
-
-               // disable_implicit_mentions (Boolean) since 2019.03
-               // Implicit mentions are mentions in the body of replies that are redundant in a thread-enabled system like Friendica.
-               // This config key disables the gathering of implicit mentions in incoming and outgoing posts.
-               // Also disables the default automatic removal of implicit mentions from the body of incoming posts.
-               // Also disables the default automatic addition of implicit mentions in the body of outgoing posts.
-               // Disabling implicit mentions also affects the "explicit_mentions" additional feature by limiting it
-               // to the replied-to post author mention in the comment boxes.
-               'disable_implicit_mentions' => false,
-
-               // disable_url_validation (Boolean)
-               // Disables the DNS lookup of an URL.
-               'disable_url_validation' => false,
-
-               // disable_password_exposed (Boolean)
-               // Disable the exposition check against the remote haveibeenpwned API on password change.
-               'disable_password_exposed' => false,
-
-               // disable_polling (Boolean)
-               // Disable the polling of DFRN and OStatus contacts through onepoll.php.
-               'disable_polling' => false,
-
-               // dlogfile (Path)
-               // location of the developer log file.
-               'dlogfile' => '',
-
-               // dlogip (String)
-               // restricts develop log writes to requests originating from this IP address.
-               'dlogip' => '',
-
-               // free_crawls (Integer)
-               // Number of "free" searches when system => permit_crawling is enabled.
-               'free_crawls' => 10,
-
-               // frontend_worker_timeout (Integer)
-               // Value in minutes after we think that a frontend task was killed by the webserver.
-               'frontend_worker_timeout' => 10,
-
-               // groupedit_image_limit (Integer)
-               // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names.
-               // This can alternatively be set on a per account basis in the pconfig table.
-               'groupedit_image_limit' => 400,
-
-               // hsts (Boolean)
-               // Enables the sending of HTTP Strict Transport Security headers.
-               'hsts' => false,
-
-               // ignore_cache (Boolean)
-               // For development only. Disables the item cache.
-               'ignore_cache' => false,
-
-               // instances_social_key (String)
-               // Key to the API of https://instances.social which retrieves data about mastodon servers.
-               // See https://instances.social/api/token to get an API key.
-               'instances_social_key' => '',
-
-               // ipv4_resolve (Boolean)
-               // Resolve IPV4 addresses only. Don't resolve to IPV6.
-               'ipv4_resolve' => false,
-
-               // invitation_only (Boolean)
-               // If set true registration is only possible after a current member of the node has send an invitation.
-               'invitation_only' => false,
-
-               // like_no_comment (Boolean)
-               // Don't update the "commented" value of an item when it is liked.
-               'like_no_comment' => false,
-
-               // local_block (Boolean)
-               // Used in conjunction with "block_public".
-               'local_block' => false,
-
-               // local_search (Boolean)
-               // Blocks search for users who are not logged in to prevent crawlers from blocking your system.
-               'local_search' => false,
-
-               // local_tags (Boolean)
-               // If activated, all hashtags will point to the local server.
-               'local_tags' => false,
-
-               // logger_config (String)
-               // Sets the logging adapter of Friendica globally (monolog, syslog, stream)
-               'logger_config' => 'stream',
-
-               // max_batch_queue (Integer)
-               // Maximum number of batched queue items for a single contact before subsequent messages are discarded.
-               'max_batch_queue' => 1000,
-
-               // max_connections (Integer)
-               // The maximum number of database connections which can be in use before the worker process is deferred to its next interval.
-               // When the system can't detect the maximum numbers of connection then this value can be used. Use 0 for auto-detection.
-               'max_connections' => 0,
-
-               // max_connections_level (Integer 0-100)
-               // The maximum percentage of connections that are allowed to let the worker start.
-               'max_connections_level' => 75,
-
-               // max_contact_queue (Integer)
-               // Maximum number of queue items for a single contact before subsequent messages are discarded.
-               'max_contact_queue' => 500,
-
-               // max_image_length (Integer)
-               // An alternate way of limiting picture upload sizes.
-               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
-               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
-               // If you don't want to set a maximum length, set to -1.
-               'max_image_length' => -1,
-
-               // max_processes_backend (Integer)
-               // Maximum number of concurrent database processes for background tasks.
-               'max_processes_backend' => 5,
-
-               // max_processes_frontend (Integer)
-               // Maximum number of concurrent database processes for foreground tasks.
-               'max_processes_frontend' => 20,
-
-               // maximagesize (Integer)
-               // Maximum size in bytes of an uploaded photo.
-               'maximagesize' => 800000,
-
-               // memcache_host (String)
-               // Host name of the memcache daemon.
-               'memcache_host' => '127.0.0.1',
-
-               // memcache_port (Integer)
-               // Port number of the memcache daemon.
-               'memcache_port' => 11211,
-
-               // memcached_hosts (Array)
-               // Array of Memcached servers info [host, port(, weight)], see Memcached::addServers.
-               'memcached_hosts' => [
-                       ['127.0.0.1', '11211'],
-               ],
-
-               // min_poll_interval (Integer)
-               // minimal distance in minutes between two polls for a contact. Reasonable values are between 1 and 59.
-               'min_poll_interval' => 1,
-
-               // no_count (Boolean)
-               // Don't do count calculations (currently only when showing photo albums).
-               'no_count' => false,
-
-               // no_oembed (Boolean)
-               // Don't use OEmbed to fetch more information about a link.
-               'no_oembed' => false,
-
-               // no_smilies (Boolean)
-               // Don't show smilies.
-               'no_smilies' => false,
-
-               // no_view_full_size (Boolean)
-               // Don't add the link "View full size" under a resized image.
-               'no_view_full_size' => false,
-
-               // optimize_items (Boolean)
-               // Triggers an SQL command to optimize the item table before expiring items.
-               'optimize_items' => false,
-
-               // paranoia (Boolean)
-               // Log out users if their IP address changed.
-               'paranoia' => false,
-
-               // permit_crawling (Boolean)
-               // Restricts the search for not logged in users to one search per minute.
-               'permit_crawling' => false,
-
-               // pidfile (Path)
-               // Daemon pid file path. For example: pidfile = /path/to/daemon.pid
-               'pidfile' => '',
-
-               // png_quality (Integer)
-               // Sets the ImageMagick compression level for PNG images. Values ranges from 0 (uncompressed) to 9 (most compressed).
-               'png_quality' => 8,
-
-               // profiler (Boolean)
-               // Enable internal timings to help optimize code. Needed for "rendertime" addon.
-               'profiler' => false,
-
-               // proxy_cache_time (Integer)
-               // Period in seconds after which the cache is cleared.
-               'proxy_cache_time' => 86400,
-
-               // pushpoll_frequency (Integer)
-               // Frequency of contact poll for subhub contact using the DFRM or OStatus network.
-               // Available values:
-               // - 5 = every month
-               // - 4 = every week
-               // - 3 = every day
-               // - 2 = twice a day
-               // - 1 = every hour
-               // - 0 = every minute
-               'pushpoll_frequency' => 3,
-
-               // queue_no_dead_check (Boolean)
-               // Ignore if the target contact or server seems to be dead during queue delivery.
-               'queue_no_dead_check' => false,
-
-               // redis_host (String)
-               // Host name of the redis daemon.
-               'redis_host' => '127.0.0.1',
-
-               // redis_port (String)
-               // Port number of the redis daemon.
-               'redis_port' => 6379,
-
-               // redis_db (Integer)
-               // The sub-database of redis (0 - 15 possible sub-databases)
-               'redis_db' => 0,
-
-               // redis_password (String)
-               // The authentication password for the redis database
-               'redis_password' => null,
-
-               // session_handler (database|cache|native)
-               // Whether to use Cache to store session data or to use PHP native session storage.
-               'session_handler' => 'database',
-
-               // remove_multiplicated_lines (Boolean)
-               // If enabled, multiple linefeeds in items are stripped to a single one.
-               'remove_multiplicated_lines' => false,
-
-               // sendmail_params (Boolean)
-               // Normal sendmail command parameters will be added when the PHP mail() function is called for sending e-mails.
-               // This ensures the Sender Email address setting is applied to the message envelope rather than the host's default address.
-               // Set to false if your non-sendmail agent is incompatible, or to restore old behavior of using the host address.
-               'sendmail_params' => true,
-
-               // show_global_community_hint (Boolean)
-               // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive on your node.
-               'show_global_community_hint' => false,
-
-               // show_unsupported_addons (Boolean)
-               // Show all addons including the unsupported ones.
-               'show_unsupported_addons' => false,
-
-               // show_unsupported_themes (Boolean)
-               // Show all themes including the unsupported ones.
-               'show_unsupported_themes' => false,
-
-               // throttle_limit_day (Integer)
-               // Maximum number of posts that a user can send per day with the API. 0 to disable daily throttling.
-               'throttle_limit_day' => 0,
-
-               // throttle_limit_week (Integer)
-               // Maximum number of posts that a user can send per week with the API. 0 to disable weekly throttling.
-               'throttle_limit_week' => 0,
-
-               // throttle_limit_month (Integer)
-               // Maximum number of posts that a user can send per month with the API. 0 to disable monthly throttling.
-               'throttle_limit_month' => 0,
-
-               // username_min_length (Integer)
-               // The minimum character length a username can be.
-               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
-               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
-               'username_min_length' => 3,
-
-               // username_max_length (Integer)
-               // The maximum character length a username can be.
-               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
-               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
-               'username_max_length' => 48,
-
-               // worker_cooldown (Integer)
-               // Cooldown period in seconds after each worker function call.
-               'worker_cooldown' => 0,
-
-               // worker_debug (Boolean)
-               // If enabled, it prints out the number of running processes split by priority.
-               'worker_debug' => false,
-
-               // worker_fetch_limit (Integer)
-               // Number of worker tasks that are fetched in a single query.
-               'worker_fetch_limit' => 1,
-
-               // worker_jpm (Boolean)
-               // If enabled, it prints out the jobs per minute.
-               'worker_jpm' => false,
-
-               // worker_jpm_range (String)
-               // List of minutes for the jobs per minute (JPM) calculation
-               'worker_jpm_range' => '1, 10, 60',
-
-               // worker_load_exponent (Integer)
-               // Default 3, which allows only 25% of the maximum worker queues when server load reaches around 37% of maximum load.
-               // For a linear response where 25% of worker queues are allowed at 75% of maximum load, set this to 1.
-               // Setting 0 would allow maximum worker queues at all times, which is not recommended.
-               'worker_load_exponent' => 3,
-
-               // xrd_timeout (Integer)
-               // Timeout in seconds for fetching the XRD links.
-               'xrd_timeout' => 20,
-       ],
-       'experimental' => [
-               // exp_themes (Boolean)
-               // Show experimental themes in user settings.
-               'exp_themes' => false,
-       ],
-       'theme' => [
-               // hide_eventlist (Boolean)
-               // Don't show the birthdays and events on the profile and network page.
-               'hide_eventlist' => false,
-       ],
-       'jabber' => [
-               // debug (Boolean)
-               // Enable debug level for the jabber account synchronisation.
-               'debug' => false,
-               // lockpath (Path)
-               // Must be writable by the ejabberd process. if set then it will prevent the running of multiple processes.
-               'lockpath' => '',
-       ],
-       'debug' => [
-               // ap_inbox_log (Boolean)
-               // Logs every call to /inbox as a JSON file in Friendica's temporary directory
-               'ap_inbox_log' => false,
-
-               // total_ap_delivery (Boolean)
-               // Deliver via AP to every possible receiver and we suppress the delivery to these contacts with other protocols
-               'total_ap_delivery' => false,
-       ]
-];
index 9b977ff53f4a49b721d9b77f36fb5578b12910be..9bf073df1d99dffc03198d23589f33baf4fd262d 100644 (file)
@@ -12,7 +12,7 @@
  *
  * Then set the following for your MySQL installation
  *
- * If you're unsure about what any of the config keys below do, please check the config/defaults.config.php file for
+ * If you're unsure about what any of the config keys below do, please check the static/defaults.config.php file for
  * detailed documentation of their data type and behavior.
  */
 
diff --git a/config/settings.config.php b/config/settings.config.php
deleted file mode 100644 (file)
index bf8b62f..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-// SETTINGS.PHP
-
-/* This file declares the default values for the admin settings of Friendica.
- *
- * These values will be overridden by the admin settings page.
- *
- * Please don't edit this file directly as its content may change in the upcoming versions.
- */
-
-return [
-       'config' => [
-               // info (String)
-               // Plaintext description of this node, used in the /friendica module.
-               'info' => '',
-
-               // register_policy (Constant)
-               // Your choices are OPEN, APPROVE, or CLOSED.
-               // Be certain to create your own personal account before setting CLOSED.
-               // APPROVE requires you set system.admin_email to the email address of an
-               // already registered person who can authorize and/or approve/deny the request.
-               'register_policy' => \Friendica\Module\Register::CLOSED,
-
-               // register_text (String)
-               // Will be displayed prominently on the registration page.
-               'register_text' => '',
-
-               // sitename (String)
-               // Displayed server name.
-               'sitename' => 'Friendica Social Network',
-       ],
-       'system' => [
-               // account_abandon_days (Integer)
-               // Will not waste system resources polling external sites for abandonded accounts.
-               // Enter 0 for no time limit.
-               'account_abandon_days' => 0,
-
-               // addon (Comma-separated list)
-               // Manual list of addons which are enabled on this system.
-               'addon' => '',
-
-               // allowed_themes (Comma-separated list)
-               // Themes users can change to in their settings.
-               'allowed_themes' => 'quattro,vier,duepuntozero,smoothly',
-
-               // debugging (boolean)
-               // Enable/Disable Debugging (logging)
-               'debugging' => false,
-
-               // default_timezone (String)
-               // Choose a default timezone. See https://secure.php.net/manual/en/timezones.php
-               // It only applies to timestamps for anonymous viewers.
-               'default_timezone' => 'UTC',
-
-               // directory (String)
-               // URL of the global directory.
-               'directory' => 'https://dir.friendica.social',
-
-               // forbidden_nicknames (Comma-separated list)
-               // Prevents users from registering the specified nicknames on this node.
-               // Default value comprises classic role names from RFC 2142.
-               'forbidden_nicknames' => 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop',
-
-               // jpeg_quality (Integer)
-               // Sets the ImageMagick quality level for JPEG images. Values ranges from 50 (awful) to 100 (near perfect).
-               'jpeg_quality' => 100,
-
-               // language (String)
-               // System default languague, inluding admin-created user default language.
-               // Two-letters ISO 639-1 code.
-               'language' => 'en',
-
-               // logfile (String)
-               // The logfile for storing logs.
-               // Can be a full path or a relative path to the Friendica home directory
-               'logfile' => 'log/friendica.log',
-
-               // loglevel (String)
-               // The loglevel for all logs.
-               // Has to be one of these values: emergency, alert, critical, error, warning, notice, info, debug
-               'loglevel' => 'notice',
-
-               // max_image_length (Integer)
-               // An alternate way of limiting picture upload sizes.
-               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
-               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
-               // If you don't want to set a maximum length, set to -1.
-               'max_image_length' => -1,
-
-               // maximagesize (Integer)
-               // Maximum size in bytes of an uploaded photo.
-               'maximagesize' => 800000,
-
-               // no_regfullname (Boolean)
-               // Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
-               'no_regfullname' => true,
-
-               // optimize_max_tablesize (Integer)
-               // Maximum table size (in MB) for the automatic optimization.
-               // -1 to disable automatic optimization.
-               //  0 to use internal default (100MB)
-               'optimize_max_tablesize' => -1,
-
-               // maxloadavg (Integer)
-               // Maximum system load before delivery and poll processes are deferred.
-               'maxloadavg' => 20,
-
-               // rino_encrypt (Integer)
-               // Server-to-server private message encryption (RINO).
-               // Encryption will only be provided if this setting is set to a non zero value on both servers.
-               // Set to 0 to disable, 2 to enable, 1 is deprecated but won't need mcrypt.
-               'rino_encrypt' => 2,
-
-               // temppath (String)
-               // Custom temporary file directory
-               'temppath' => '',
-
-               // theme (String)
-               // System theme name.
-               'theme' => 'vier',
-
-               // url (String)
-               // The fully-qualified URL of this Friendica node.
-               // Used by the worker in a non-HTTP execution environment.
-               'url' => '',
-       ],
-
-       // Used in the admin settings to lock certain features
-       'featurelock' => [
-       ],
-];
index 7eae371c285a9dca8c90d639e315c60569d71081..f2224f5de7f2d573791e32dc642c441b8376ce09 100644 (file)
@@ -33,15 +33,24 @@ return [
 
 ### Configuration location
 
-The `config` directory holds key configuration files:
+The `config` directory holds key configuration files and can have different config files.
+All of them have to end with `.config.php` and must not include `-sample` in their name.
 
-- `defaults.config.php` holds the default values for all the configuration keys that can only be set in `local.config.php`.
-- `settings.config.php` holds the default values for some configuration keys that are set through the admin settings page.
+Some examples of common known configuration files:
 - `local.config.php` holds the current node custom configuration.
 - `addon.config.php` is optional and holds the custom configuration for specific addons.
 
 Addons can define their own default configuration values in `addon/[addon]/config/[addon].config.php` which is loaded when the addon is activated.
 
+### Static Configuration location
+
+The `static` directory holds the codebase default configurations files.
+They must not be changed by users, because they can get changed from release to release.
+
+Currently, the following configurations are included:
+- `defaults.config.php` holds the default values for all the configuration keys that can only be set in `local.config.php`.
+- `settings.config.php` holds the default values for some configuration keys that are set through the admin settings page.
+
 #### Migrating from .htconfig.php to config/local.config.php
 
 The legacy `.htconfig.php` configuration file is still supported, but is deprecated and will be removed in a subsequent Friendica release.
@@ -292,7 +301,7 @@ Or it is for testing purposes only.
 **Attention:** Please be warned that you shouldn't use one of these values without the knowledge what it could trigger.
 Especially don't do that with undocumented values.
 
-These configurations keys and their default value are listed in `config/defaults.config.php` and should be overwritten in `config/local.config.php`.
+These configurations keys and their default value are listed in `static/defaults.config.php` and should be overwritten in `config/local.config.php`.
 
 ## Administrator Options
 
index 8b2d50512b80b695f3b770db337e5e395e7e5791..21df2505d03b2f81024cc2e4c1d284441f3f905e 100644 (file)
@@ -17,7 +17,7 @@ use Friendica\Database\DBA;
 use Friendica\Model\Profile;
 use Friendica\Network\HTTPException;
 use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Util\HTTPSignature;
 use Friendica\Util\Profiler;
 use Friendica\Util\Strings;
@@ -360,9 +360,6 @@ class App
                $this->getMode()->determine($this->getBasePath());
 
                if ($this->getMode()->has(App\Mode::DBAVAILABLE)) {
-                       $loader = new ConfigFileLoader($this->getBasePath(), $this->getMode());
-                       $this->config->getCache()->load($loader->loadCoreConfig('addon'), true);
-
                        $this->profiler->update(
                                $this->config->get('system', 'profiler', false),
                                $this->config->get('rendertime', 'callstack', false));
index 2978ed1ecfe7a01f5daf856d44c2177de9b8b808..401d9c292c87cc758712c7e43a91932b9deb6154 100644 (file)
@@ -9,7 +9,7 @@ use Friendica\Core\Installer;
 use Friendica\Core\Theme;
 use Friendica\Util\BasePath;
 use Friendica\Util\BaseURL;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use RuntimeException;
 
 class AutomaticInstallation extends Console
index 37b947d11bf7463fd8a131656e07572b323e7390..f904f369bb81455d888254cbff9e80bb4000ff56 100644 (file)
@@ -45,7 +45,7 @@ abstract class Configuration
        /**
         * @brief Loads all configuration values of family into a cached storage.
         *
-        * All configuration values of the system are stored in the cache ( @see IConfigCache )
+        * All configuration values of the system are stored in the cache ( @see ConfigCache )
         *
         * @param string $cat The category of the configuration value
         *
@@ -59,7 +59,7 @@ abstract class Configuration
         *
         * Get a particular config value from the given category ($cat)
         * and the $key from a cached storage either from the $this->configAdapter
-        * (@see IConfigAdapter ) or from the $this->configCache (@see IConfigCache ).
+        * (@see IConfigAdapter ) or from the $this->configCache (@see ConfigCache ).
         *
         * @param string  $cat        The category of the configuration value
         * @param string  $key           The configuration key to query
index abbac4e781795a700b10c52c95cbecf0abc0aeb2..3726183493167c2bf40051f59ac60387970b7ad4 100644 (file)
@@ -96,7 +96,7 @@ class DBStructure
         * Loads the database structure definition from the config/dbstructure.config.php file.
         * On first pass, defines DB_UPDATE_VERSION constant.
         *
-        * @see config/dbstructure.config.php
+        * @see static/dbstructure.config.php
         * @param boolean $with_addons_structure Whether to tack on addons additional tables
         * @param string  $basePath              The base path of this application
         * @return array
@@ -106,16 +106,16 @@ class DBStructure
        {
                if (!self::$definition) {
 
-                       $filename = $basePath . '/config/dbstructure.config.php';
+                       $filename = $basePath . '/static/dbstructure.config.php';
 
                        if (!is_readable($filename)) {
-                               throw new Exception('Missing database structure config file config/dbstructure.config.php');
+                               throw new Exception('Missing database structure config file static/dbstructure.config.php');
                        }
 
                        $definition = require $filename;
 
                        if (!$definition) {
-                               throw new Exception('Corrupted database structure config file config/dbstructure.config.php');
+                               throw new Exception('Corrupted database structure config file static/dbstructure.config.php');
                        }
 
                        self::$definition = $definition;
index 559411d62370425b605410cfa9918bbe0188d3bb..1aba8fc824ae6c7b51ed2b1b15d471814766043f 100644 (file)
@@ -5,9 +5,9 @@ namespace Friendica\Factory;
 use Friendica\Core;
 use Friendica\Core\Config;
 use Friendica\Core\Config\Cache;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Model\Config\Config as ConfigModel;
 use Friendica\Model\Config\PConfig as PConfigModel;
-use Friendica\Util\Config\ConfigFileLoader;
 
 class ConfigFactory
 {
index d444f5d2f3837f00f345db3f76f5055d682dccd1..c0a256a9421c3de059210afee8a4083ad2f6a95d 100644 (file)
@@ -7,7 +7,7 @@ use Friendica\Core\Config\Cache\PConfigCache;
 use Friendica\Factory;
 use Friendica\Util\BasePath;
 use Friendica\Util\BaseURL;
-use Friendica\Util\Config;
+use Friendica\Util\ConfigFileLoader;
 
 class DependencyFactory
 {
@@ -27,7 +27,7 @@ class DependencyFactory
                $basePath = BasePath::create($directory, $_SERVER);
                $mode = new App\Mode($basePath);
                $router = new App\Router();
-               $configLoader = new Config\ConfigFileLoader($basePath, $mode);
+               $configLoader = new ConfigFileLoader($basePath, $mode);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
                $database = Factory\DBFactory::init($configCache, $profiler, $_SERVER);
index ca042c6fa7616175b8741a1f6a71c4eff03af898..beb439de2a9bf1a9a243ba34c3e26909f851913a 100644 (file)
@@ -12,7 +12,7 @@ use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use Friendica\Model\Register;
 use Friendica\Module\BaseAdminModule;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
 
diff --git a/src/Util/Config/ConfigFileLoader.php b/src/Util/Config/ConfigFileLoader.php
deleted file mode 100644 (file)
index cc6f89c..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-<?php
-
-namespace Friendica\Util\Config;
-
-use Friendica\App;
-use Friendica\Core\Addon;
-use Friendica\Core\Config\Cache\ConfigCache;
-
-/**
- * The ConfigFileLoader loads config-files and stores them in a ConfigCache ( @see ConfigCache )
- *
- * It is capable of loading the following config files:
- * - *.config.php   (current)
- * - *.ini.php      (deprecated)
- * - *.htconfig.php (deprecated)
- */
-class ConfigFileLoader extends ConfigFileManager
-{
-       /**
-        * @var App\Mode
-        */
-       private $appMode;
-
-       public function __construct($baseDir, App\Mode $mode)
-       {
-               parent::__construct($baseDir);
-               $this->appMode = $mode;
-       }
-
-       /**
-        * Load the configuration files into an configuration cache
-        *
-        * First loads the default value for all the configuration keys, then the legacy configuration files, then the
-        * expected local.config.php
-        *
-        * @param ConfigCache $config The config cache to load to
-        * @param bool        $raw    Setup the raw config format
-        *
-        * @throws \Exception
-        */
-       public function setupCache(ConfigCache $config, $raw = false)
-       {
-               $config->load($this->loadCoreConfig('defaults'));
-               $config->load($this->loadCoreConfig('settings'));
-
-               $config->load($this->loadLegacyConfig('htpreconfig'), true);
-               $config->load($this->loadLegacyConfig('htconfig'), true);
-
-               $config->load($this->loadCoreConfig('local'), true);
-
-               // In case of install mode, add the found basepath (because there isn't a basepath set yet
-               if (!$raw && ($this->appMode->isInstall() || empty($config->get('system', 'basepath')))) {
-                       // Setting at least the basepath we know
-                       $config->set('system', 'basepath', $this->baseDir);
-               }
-       }
-
-       /**
-        * Tries to load the specified core-configuration and returns the config array.
-        *
-        * @param string $name The name of the configuration (default is empty, which means 'local')
-        *
-        * @return array The config array (empty if no config found)
-        *
-        * @throws \Exception if the configuration file isn't readable
-        */
-       public function loadCoreConfig($name = '')
-       {
-               if (!empty($this->getConfigFullName($name))) {
-                       return $this->loadConfigFile($this->getConfigFullName($name));
-               } elseif (!empty($this->getIniFullName($name))) {
-                       return $this->loadINIConfigFile($this->getIniFullName($name));
-               } else {
-                       return [];
-               }
-       }
-
-       /**
-        * Tries to load the specified addon-configuration and returns the config array.
-        *
-        * @param string $name The name of the configuration
-        *
-        * @return array The config array (empty if no config found)
-        *
-        * @throws \Exception if the configuration file isn't readable
-        */
-       public function loadAddonConfig($name)
-       {
-               $filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
-                       Addon::DIRECTORY       . DIRECTORY_SEPARATOR . // addon/
-                       $name                  . DIRECTORY_SEPARATOR . // openstreetmap/
-                       self::SUBDIRECTORY     . DIRECTORY_SEPARATOR . // config/
-                       $name . ".config.php";                         // openstreetmap.config.php
-
-               if (file_exists($filepath)) {
-                       return $this->loadConfigFile($filepath);
-               } else {
-                       return [];
-               }
-       }
-
-       /**
-        * Tries to load the legacy config files (.htconfig.php, .htpreconfig.php) and returns the config array.
-        *
-        * @param string $name The name of the config file (default is empty, which means .htconfig.php)
-        *
-        * @return array The configuration array (empty if no config found)
-        *
-        * @deprecated since version 2018.09
-        */
-       private function loadLegacyConfig($name = '')
-       {
-               $config = [];
-               if (!empty($this->getHtConfigFullName($name))) {
-                       $a = new \stdClass();
-                       $a->config = [];
-                       include $this->getHtConfigFullName($name);
-
-                       $htConfigCategories = array_keys($a->config);
-
-                       // map the legacy configuration structure to the current structure
-                       foreach ($htConfigCategories as $htConfigCategory) {
-                               if (is_array($a->config[$htConfigCategory])) {
-                                       $keys = array_keys($a->config[$htConfigCategory]);
-
-                                       foreach ($keys as $key) {
-                                               $config[$htConfigCategory][$key] = $a->config[$htConfigCategory][$key];
-                                       }
-                               } else {
-                                       $config['config'][$htConfigCategory] = $a->config[$htConfigCategory];
-                               }
-                       }
-
-                       unset($a);
-
-                       if (isset($db_host)) {
-                               $config['database']['hostname'] = $db_host;
-                               unset($db_host);
-                       }
-                       if (isset($db_user)) {
-                               $config['database']['username'] = $db_user;
-                               unset($db_user);
-                       }
-                       if (isset($db_pass)) {
-                               $config['database']['password'] = $db_pass;
-                               unset($db_pass);
-                       }
-                       if (isset($db_data)) {
-                               $config['database']['database'] = $db_data;
-                               unset($db_data);
-                       }
-                       if (isset($config['system']['db_charset'])) {
-                               $config['database']['charset'] = $config['system']['db_charset'];
-                       }
-                       if (isset($pidfile)) {
-                               $config['system']['pidfile'] = $pidfile;
-                               unset($pidfile);
-                       }
-                       if (isset($default_timezone)) {
-                               $config['system']['default_timezone'] = $default_timezone;
-                               unset($default_timezone);
-                       }
-                       if (isset($lang)) {
-                               $config['system']['language'] = $lang;
-                               unset($lang);
-                       }
-               }
-
-               return $config;
-       }
-
-       /**
-        * Tries to load the specified legacy configuration file and returns the config array.
-        *
-        * @deprecated since version 2018.12
-        * @param string $filepath
-        *
-        * @return array The configuration array
-        * @throws \Exception
-        */
-       private function loadINIConfigFile($filepath)
-       {
-               $contents = include($filepath);
-
-               $config = parse_ini_string($contents, true, INI_SCANNER_TYPED);
-
-               if ($config === false) {
-                       throw new \Exception('Error parsing INI config file ' . $filepath);
-               }
-
-               return $config;
-       }
-
-       /**
-        * Tries to load the specified configuration file and returns the config array.
-        *
-        * The config format is PHP array and the template for configuration files is the following:
-        *
-        * <?php return [
-        *      'section' => [
-        *          'key' => 'value',
-        *      ],
-        * ];
-        *
-        * @param  string $filepath The filepath of the
-        * @return array The config array0
-        *
-        * @throws \Exception if the config cannot get loaded.
-        */
-       private function loadConfigFile($filepath)
-       {
-               $config = include($filepath);
-
-               if (!is_array($config)) {
-                       throw new \Exception('Error loading config file ' . $filepath);
-               }
-
-               return $config;
-       }
-}
diff --git a/src/Util/Config/ConfigFileManager.php b/src/Util/Config/ConfigFileManager.php
deleted file mode 100644 (file)
index 729e59d..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-namespace Friendica\Util\Config;
-
-/**
- * An abstract class in case of handling with config files
- */
-abstract class ConfigFileManager
-{
-       /**
-        * The Sub directory of the config-files
-        * @var string
-        */
-       const SUBDIRECTORY = 'config';
-
-       /**
-        * The default name of the user defined config file
-        * @var string
-        */
-       const CONFIG_LOCAL    = 'local';
-
-       /**
-        * The default name of the user defined ini file
-        * @var string
-        */
-       const CONFIG_INI      = 'local';
-
-       /**
-        * The default name of the user defined legacy config file
-        * @var string
-        */
-       const CONFIG_HTCONFIG = 'htconfig';
-
-       protected $baseDir;
-       protected $configDir;
-
-       /**
-        * @param string $baseDir The base directory of Friendica
-        */
-       public function __construct($baseDir)
-       {
-               $this->baseDir = $baseDir;
-               $this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::SUBDIRECTORY;
-       }
-
-       /**
-        * Gets the full name (including the path) for a *.config.php (default is local.config.php)
-        *
-        * @param string $name The config name (default is empty, which means local.config.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getConfigFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_LOCAL;
-
-               $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-
-       /**
-        * Gets the full name (including the path) for a *.ini.php (default is local.ini.php)
-        *
-        * @param string $name The config name (default is empty, which means local.ini.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getIniFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_INI;
-
-               $fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-
-       /**
-        * Gets the full name (including the path) for a .*.php (default is .htconfig.php)
-        *
-        * @param string $name The config name (default is empty, which means .htconfig.php)
-        *
-        * @return string The full name or empty if not found
-        */
-       protected function getHtConfigFullName($name = '')
-       {
-               $name = !empty($name) ? $name : self::CONFIG_HTCONFIG;
-
-               $fullName = $this->baseDir  . DIRECTORY_SEPARATOR . '.' . $name . '.php';
-               return file_exists($fullName) ? $fullName : '';
-       }
-}
diff --git a/src/Util/ConfigFileLoader.php b/src/Util/ConfigFileLoader.php
new file mode 100644 (file)
index 0000000..7c41097
--- /dev/null
@@ -0,0 +1,330 @@
+<?php
+
+namespace Friendica\Util;
+
+use Exception;
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config\Cache\ConfigCache;
+
+/**
+ * The ConfigFileLoader loads config-files and stores them in a ConfigCache ( @see ConfigCache )
+ *
+ * It is capable of loading the following config files:
+ * - *.config.php   (current)
+ * - *.ini.php      (deprecated)
+ * - *.htconfig.php (deprecated)
+ */
+class ConfigFileLoader
+{
+       /**
+        * The Sub directory of the config-files
+        *
+        * @var string
+        */
+       const CONFIG_DIR = 'config';
+
+       /**
+        * The Sub directory of the static config-files
+        *
+        * @var string
+        */
+       const STATIC_DIR = 'static';
+
+       /**
+        * The default name of the user defined ini file
+        *
+        * @var string
+        */
+       const CONFIG_INI = 'local';
+
+       /**
+        * The default name of the user defined legacy config file
+        *
+        * @var string
+        */
+       const CONFIG_HTCONFIG = 'htconfig';
+
+       /**
+        * The sample string inside the configs, which shouldn't get loaded
+        *
+        * @var string
+        */
+       const SAMPLE_END = '-sample';
+
+       /**
+        * @var App\Mode
+        */
+       private $appMode;
+       /**
+        * @var string
+        */
+       private $baseDir;
+       /**
+        * @var string
+        */
+       private $configDir;
+       /**
+        * @var string
+        */
+       private $staticDir;
+
+       public function __construct($baseDir, App\Mode $mode)
+       {
+               $this->baseDir   = $baseDir;
+               $this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
+               $this->staticDir = $baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR;
+               $this->appMode   = $mode;
+       }
+
+       /**
+        * Load the configuration files into an configuration cache
+        *
+        * First loads the default value for all the configuration keys, then the legacy configuration files, then the
+        * expected local.config.php
+        *
+        * @param ConfigCache $config The config cache to load to
+        * @param bool        $raw    Setup the raw config format
+        *
+        * @throws Exception
+        */
+       public function setupCache(ConfigCache $config, $raw = false)
+       {
+               // Load static config files first, the order is important
+               $config->load($this->loadStaticConfig('defaults'));
+               $config->load($this->loadStaticConfig('settings'));
+
+               // try to load the legacy config first
+               $config->load($this->loadLegacyConfig('htpreconfig'), true);
+               $config->load($this->loadLegacyConfig('htconfig'), true);
+
+               // Now load every other config you find inside the 'config/' directory
+               $this->loadCoreConfig($config);
+
+               // In case of install mode, add the found basepath (because there isn't a basepath set yet
+               if (!$raw && ($this->appMode->isInstall() || empty($config->get('system', 'basepath')))) {
+                       // Setting at least the basepath we know
+                       $config->set('system', 'basepath', $this->baseDir);
+               }
+       }
+
+       /**
+        * Tries to load the static core-configuration and returns the config array.
+        *
+        * @param string $name The name of the configuration
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       private function loadStaticConfig($name)
+       {
+               $configName = $this->staticDir . DIRECTORY_SEPARATOR . $name . '.config.php';
+               $iniName    = $this->staticDir . DIRECTORY_SEPARATOR . $name . '.ini.php';
+
+               if (file_exists($configName)) {
+                       return $this->loadConfigFile($configName);
+               } elseif (file_exists($iniName)) {
+                       return $this->loadINIConfigFile($iniName);
+               } else {
+                       return [];
+               }
+       }
+
+       /**
+        * Tries to load the specified core-configuration into the config cache.
+        *
+        * @param ConfigCache $config The Config cache
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       private function loadCoreConfig(ConfigCache $config)
+       {
+               // try to load legacy ini-files first
+               foreach ($this->getConfigFiles(true) as $configFile) {
+                       $config->load($this->loadINIConfigFile($configFile), true);
+               }
+
+               // try to load supported config at last to overwrite it
+               foreach ($this->getConfigFiles() as $configFile) {
+                       $config->load($this->loadConfigFile($configFile), true);
+               }
+
+               return [];
+       }
+
+       /**
+        * Tries to load the specified addon-configuration and returns the config array.
+        *
+        * @param string $name The name of the configuration
+        *
+        * @return array The config array (empty if no config found)
+        *
+        * @throws Exception if the configuration file isn't readable
+        */
+       public function loadAddonConfig($name)
+       {
+               $filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
+                           Addon::DIRECTORY . DIRECTORY_SEPARATOR . // addon/
+                           $name . DIRECTORY_SEPARATOR . // openstreetmap/
+                           self::CONFIG_DIR . DIRECTORY_SEPARATOR . // config/
+                           $name . ".config.php";                         // openstreetmap.config.php
+
+               if (file_exists($filepath)) {
+                       return $this->loadConfigFile($filepath);
+               } else {
+                       return [];
+               }
+       }
+
+       /**
+        * Get the config files of the config-directory
+        *
+        * @param bool $ini True, if scan for ini-files instead of config files
+        *
+        * @return array
+        */
+       private function getConfigFiles(bool $ini = false)
+       {
+               $files = scandir($this->configDir);
+               $found = array();
+
+               $filePattern = ($ini ? '*.ini.php' : '*.config.php');
+
+               // Don't load sample files
+               $sampleEnd = self::SAMPLE_END . ($ini ? '.ini.php' : '.config.php');
+
+               foreach ($files as $filename) {
+                       if (fnmatch($filePattern, $filename) && substr_compare($filename, $sampleEnd, -strlen($sampleEnd))) {
+                               $found[] = $this->configDir . '/' . $filename;
+                       }
+               }
+
+               return $found;
+       }
+
+       /**
+        * Tries to load the legacy config files (.htconfig.php, .htpreconfig.php) and returns the config array.
+        *
+        * @param string $name The name of the config file (default is empty, which means .htconfig.php)
+        *
+        * @return array The configuration array (empty if no config found)
+        *
+        * @deprecated since version 2018.09
+        */
+       private function loadLegacyConfig($name = '')
+       {
+               $name     = !empty($name) ? $name : self::CONFIG_HTCONFIG;
+               $fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php';
+
+               $config = [];
+               if (file_exists($fullName)) {
+                       $a         = new \stdClass();
+                       $a->config = [];
+                       include $fullName;
+
+                       $htConfigCategories = array_keys($a->config);
+
+                       // map the legacy configuration structure to the current structure
+                       foreach ($htConfigCategories as $htConfigCategory) {
+                               if (is_array($a->config[$htConfigCategory])) {
+                                       $keys = array_keys($a->config[$htConfigCategory]);
+
+                                       foreach ($keys as $key) {
+                                               $config[$htConfigCategory][$key] = $a->config[$htConfigCategory][$key];
+                                       }
+                               } else {
+                                       $config['config'][$htConfigCategory] = $a->config[$htConfigCategory];
+                               }
+                       }
+
+                       unset($a);
+
+                       if (isset($db_host)) {
+                               $config['database']['hostname'] = $db_host;
+                               unset($db_host);
+                       }
+                       if (isset($db_user)) {
+                               $config['database']['username'] = $db_user;
+                               unset($db_user);
+                       }
+                       if (isset($db_pass)) {
+                               $config['database']['password'] = $db_pass;
+                               unset($db_pass);
+                       }
+                       if (isset($db_data)) {
+                               $config['database']['database'] = $db_data;
+                               unset($db_data);
+                       }
+                       if (isset($config['system']['db_charset'])) {
+                               $config['database']['charset'] = $config['system']['db_charset'];
+                       }
+                       if (isset($pidfile)) {
+                               $config['system']['pidfile'] = $pidfile;
+                               unset($pidfile);
+                       }
+                       if (isset($default_timezone)) {
+                               $config['system']['default_timezone'] = $default_timezone;
+                               unset($default_timezone);
+                       }
+                       if (isset($lang)) {
+                               $config['system']['language'] = $lang;
+                               unset($lang);
+                       }
+               }
+
+               return $config;
+       }
+
+       /**
+        * Tries to load the specified legacy configuration file and returns the config array.
+        *
+        * @param string $filepath
+        *
+        * @return array The configuration array
+        * @throws Exception
+        * @deprecated since version 2018.12
+        */
+       private function loadINIConfigFile($filepath)
+       {
+               $contents = include($filepath);
+
+               $config = parse_ini_string($contents, true, INI_SCANNER_TYPED);
+
+               if ($config === false) {
+                       throw new Exception('Error parsing INI config file ' . $filepath);
+               }
+
+               return $config;
+       }
+
+       /**
+        * Tries to load the specified configuration file and returns the config array.
+        *
+        * The config format is PHP array and the template for configuration files is the following:
+        *
+        * <?php return [
+        *      'section' => [
+        *          'key' => 'value',
+        *      ],
+        * ];
+        *
+        * @param string $filepath The filepath of the
+        *
+        * @return array The config array0
+        *
+        * @throws Exception if the config cannot get loaded.
+        */
+       private function loadConfigFile($filepath)
+       {
+               $config = include($filepath);
+
+               if (!is_array($config)) {
+                       throw new Exception('Error loading config file ' . $filepath);
+               }
+
+               return $config;
+       }
+}
diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php
new file mode 100755 (executable)
index 0000000..787a439
--- /dev/null
@@ -0,0 +1,1421 @@
+<?php
+
+/* Main database structure configuration file.
+ *
+ * Here are described all the tables, fields and indexes Friendica needs to work.
+ *
+ * Syntax (braces indicate optionale values):
+ * "<table name>" => [
+ *     "comment" => "Description of the table",
+ *     "fields" => [
+ *             "<field name>" => [
+ *                     "type" => "<field type>{(<field size>)} <unsigned>",
+ *                     "not null" => 0|1,
+ *                     {"extra" => "auto_increment",}
+ *                     {"default" => "<default value>",}
+ *                     {"default" => NULL_DATE,} (for datetime fields)
+ *                     {"primary" => "1",}
+ *                     {"relation" => ["<foreign key table name>" => "<foreign key field name>"],}
+ *                     "comment" => "Description of the fields"
+ *             ],
+ *             ...
+ *     ],
+ *     "indexes" => [
+ *             "PRIMARY" => ["<primary key field name>", ...],
+ *             "<index name>" => [{"UNIQUE",} "<field name>{(<key size>)}", ...]
+ *             ...
+ *     ],
+ * ],
+ *
+ * If you need to make any change, make sure to increment the DB_UPDATE_VERSION constant value below.
+ *
+ */
+
+use Friendica\Database\DBA;
+
+if (!defined('DB_UPDATE_VERSION')) {
+       define('DB_UPDATE_VERSION', 1318);
+}
+
+return [
+       "2fa_recovery_codes" => [
+               "comment" => "Two-factor authentication recovery codes",
+               "fields" => [
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User ID"],
+                       "code" => ["type" => "varchar(50)", "not null" => "1", "primary" => "1", "comment" => "Recovery code string"],
+                       "generated" => ["type" => "datetime", "not null" => "1", "comment" => "Datetime the code was generated"],
+                       "used" => ["type" => "datetime", "comment" => "Datetime the code was used"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "code"]
+               ]
+       ],
+       "addon" => [
+               "comment" => "registered addons",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "name" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "addon base (file)name"],
+                       "version" => ["type" => "varchar(50)", "not null" => "1", "default" => "", "comment" => "currently unused"],
+                       "installed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently always 1"],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "currently unused"],
+                       "timestamp" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "file timestamp to check for reloads"],
+                       "plugin_admin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = has admin config, 0 = has no admin config"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "name" => ["UNIQUE", "name"],
+               ]
+       ],
+       "apcontact" => [
+               "comment" => "ActivityPub compatible contacts - used in the ActivityPub implementation",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the contact"],
+                       "uuid" => ["type" => "varchar(255)", "comment" => ""],
+                       "type" => ["type" => "varchar(20)", "not null" => "1", "comment" => ""],
+                       "following" => ["type" => "varchar(255)", "comment" => ""],
+                       "followers" => ["type" => "varchar(255)", "comment" => ""],
+                       "inbox" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
+                       "outbox" => ["type" => "varchar(255)", "comment" => ""],
+                       "sharedinbox" => ["type" => "varchar(255)", "comment" => ""],
+                       "manually-approve" => ["type" => "boolean", "comment" => ""],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => ""],
+                       "baseurl" => ["type" => "varchar(255)", "comment" => "baseurl of the ap contact"],
+                       "generator" => ["type" => "varchar(255)", "comment" => "Name of the contact's system"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url"],
+                       "addr" => ["addr(32)"],
+                       "alias" => ["alias(190)"],
+                       "url" => ["followers(190)"]
+               ]
+       ],
+       "attach" => [
+               "comment" => "file attachments",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "generated index"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "hash"],
+                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "filename of original"],
+                       "filetype" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "mimetype"],
+                       "filesize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "size in bytes"],
+                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+                       "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"],
+                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "auth_codes" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"],
+                               "comment" => ""],
+                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
+                       "scope" => ["type" => "varchar(250)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "cache" => [
+               "comment" => "Stores temporary data",
+               "fields" => [
+                       "k" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "cache key"],
+                       "v" => ["type" => "mediumtext", "comment" => "cached serialized value"],
+                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache insertion"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["k"],
+                       "k_expires" => ["k", "expires"],
+               ]
+       ],
+       "challenge" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "challenge" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "type" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "last_update" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "clients" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "pw" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => ""],
+                       "redirect_uri" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "text", "comment" => ""],
+                       "icon" => ["type" => "text", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["client_id"],
+               ]
+       ],
+       "config" => [
+               "comment" => "main configuration storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "k" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "v" => ["type" => "mediumtext", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "cat_k" => ["UNIQUE", "cat", "k"],
+               ]
+       ],
+       "contact" => [
+               "comment" => "contact table",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => "Date of last contact update"],
+                       "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"],
+                       "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"],
+                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network of the contact"],
+                       "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
+                       "location" => ["type" => "varchar(255)", "default" => "", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "keywords" => ["type" => "text", "comment" => "public keywords (interests) of the contact"],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"],
+                       "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"],
+                       "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"],
+                       "site-pubkey" => ["type" => "text", "comment" => ""],
+                       "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
+                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
+                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "comment" => ""],
+                       "poll" => ["type" => "varchar(255)", "comment" => ""],
+                       "confirm" => ["type" => "varchar(255)", "comment" => ""],
+                       "poco" => ["type" => "varchar(255)", "comment" => ""],
+                       "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"],
+                       "success_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful contact update"],
+                       "failure_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed update"],
+                       "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "term-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last-item" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last post"],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Node-wide block status"],
+                       "block_reason" => ["type" => "text", "comment" => "Node-wide block reason"],
+                       "readonly" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "posts of the contact are readonly"],
+                       "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum"],
+                       "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group"],
+                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"],
+                       "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "unsearchable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact prefers to not be searchable"],
+                       "sensitive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact posts sensitive content"],
+                       "baseurl" => ["type" => "varchar(255)", "default" => "", "comment" => "baseurl of the contact"],
+                       "reason" => ["type" => "text", "comment" => ""],
+                       "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => ""],
+                       "info" => ["type" => "mediumtext", "comment" => ""],
+                       "profile-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "bd" => ["type" => "date", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
+                       "notify_new_posts" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "fetch_further_information" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ffi_keyword_blacklist" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_name" => ["uid", "name(190)"],
+                       "self_uid" => ["self", "uid"],
+                       "alias_uid" => ["alias(32)", "uid"],
+                       "pending_uid" => ["pending", "uid"],
+                       "blocked_uid" => ["blocked", "uid"],
+                       "uid_rel_network_poll" => ["uid", "rel", "network", "poll(64)", "archive"],
+                       "uid_network_batch" => ["uid", "network", "batch(64)"],
+                       "addr_uid" => ["addr(32)", "uid"],
+                       "nurl_uid" => ["nurl(32)", "uid"],
+                       "nick_uid" => ["nick(32)", "uid"],
+                       "dfrn-id" => ["dfrn-id(64)"],
+                       "issued-id" => ["issued-id(64)"],
+               ]
+       ],
+       "conv" => [
+               "comment" => "private messages",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this conversation"],
+                       "recips" => ["type" => "text", "comment" => "sender_handle;recipient_handle"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "creator" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "handle of creator"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation timestamp"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "edited timestamp"],
+                       "subject" => ["type" => "text", "comment" => "subject of initial message"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "conversation" => [
+               "comment" => "Raw data and structure information for messages",
+               "fields" => [
+                       "item-uri" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "Original URI of the item - unrelated to the table with the same name"],
+                       "reply-to-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "URI to which this item is a reply"],
+                       "conversation-uri" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation URI"],
+                       "conversation-href" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => "GNU Social conversation link"],
+                       "protocol" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "255", "comment" => "The protocol of the item"],
+                       "source" => ["type" => "mediumtext", "comment" => "Original source"],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Receiving date"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["item-uri"],
+                       "conversation-uri" => ["conversation-uri"],
+                       "received" => ["received"],
+               ]
+       ],
+       "diaspora-interaction" => [
+               "comment" => "Signed Diaspora Interaction",
+               "fields" => [
+                       "uri-id" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "interaction" => ["type" => "mediumtext", "comment" => "The Diaspora interaction"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uri-id"]
+               ]
+       ],
+       "event" => [
+               "comment" => "Events",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact_id (ID of the contact in contact table)"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"],
+                       "start" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event start time"],
+                       "finish" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "event end time"],
+                       "summary" => ["type" => "text", "comment" => "short description or title of the event"],
+                       "desc" => ["type" => "text", "comment" => "event description"],
+                       "location" => ["type" => "text", "comment" => "event location"],
+                       "type" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "comment" => "event or birthday"],
+                       "nofinish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if event does have no end this is 1"],
+                       "adjust" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "adjust to timezone of the recipient (0 or 1)"],
+                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "0 or 1"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_start" => ["uid", "start"],
+               ]
+       ],
+       "fcontact" => [
+               "comment" => "Diaspora compatible contacts - used in the Diaspora implementation",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "unique id"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "poll" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "confirm" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubkey" => ["type" => "text", "comment" => ""],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "addr" => ["addr(32)"],
+                       "url" => ["UNIQUE", "url(190)"],
+               ]
+       ],
+       "fsuggest" => [
+               "comment" => "friend suggestion stuff",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "request" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "gcign" => [
+               "comment" => "contacts ignored by friend suggestions",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Local User id"],
+                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => "gcontact.id of ignored contact"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+                       "gcid" => ["gcid"],
+               ]
+       ],
+       "gcontact" => [
+               "comment" => "global contacts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"],
+                       "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the contacts profile page"],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the profile photo"],
+                       "connect" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "archive_date" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "archived" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "keywords" => ["type" => "text", "comment" => "puplic keywords (interests)"],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "birthday" => ["type" => "varchar(32)", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""],
+                       "community" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if contact is forum account"],
+                       "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "-1", "comment" => ""],
+                       "hide" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = should be hidden from search"],
+                       "nsfw" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 = contact posts nsfw content"],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "social network protocol"],
+                       "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "notify" => ["type" => "varchar(255)", "comment" => ""],
+                       "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "generation" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "server_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "baseurl of the contacts server"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "nurl" => ["UNIQUE", "nurl(190)"],
+                       "name" => ["name(64)"],
+                       "nick" => ["nick(32)"],
+                       "addr" => ["addr(64)"],
+                       "hide_network_updated" => ["hide", "network", "updated"],
+                       "updated" => ["updated"],
+               ]
+       ],
+       "glink" => [
+               "comment" => "'friends of friends' linkages derived from poco",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "gcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
+                       "zcid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gcontact" => "id"], "comment" => ""],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "cid_uid_gcid_zcid" => ["UNIQUE", "cid", "uid", "gcid", "zcid"],
+                       "gcid" => ["gcid"],
+               ]
+       ],
+       "group" => [
+               "comment" => "privacy groups, group info",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the group has been deleted"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of group"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "group_member" => [
+               "comment" => "privacy groups, member info",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["group" => "id"], "comment" => "groups.id of the associated group"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated group"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "contactid" => ["contact-id"],
+                       "gid_contactid" => ["UNIQUE", "gid", "contact-id"],
+               ]
+       ],
+       "gserver" => [
+               "comment" => "Global servers",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "version" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "site_name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "info" => ["type" => "text", "comment" => ""],
+                       "register_policy" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""],
+                       "registered-users" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Number of registered users"],
+                       "poco" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "noscrape" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "platform" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "relay-subscribe" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Has the server subscribed to the relay system"],
+                       "relay-scope" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => "The scope of messages that the server wants to get"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_poco_query" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_contact" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "last_failure" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "nurl" => ["UNIQUE", "nurl(190)"],
+               ]
+       ],
+       "gserver-tag" => [
+               "comment" => "Tags that the server has subscribed",
+               "fields" => [
+                       "gserver-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["gserver" => "id"], "primary" => "1",
+                               "comment" => "The id of the gserver"],
+                       "tag" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "primary" => "1", "comment" => "Tag that the server has subscribed"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["gserver-id", "tag"],
+                       "tag" => ["tag"],
+               ]
+       ],
+       "hook" => [
+               "comment" => "addon hook registry",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hook" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => "name of hook"],
+                       "file" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "relative filename of hook handler"],
+                       "function" => ["type" => "varbinary(200)", "not null" => "1", "default" => "", "comment" => "function name of hook handler"],
+                       "priority" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => "not yet implemented - can be used to sort conflicts in hook handling by calling handlers in priority order"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "hook_file_function" => ["UNIQUE", "hook", "file", "function"],
+               ]
+       ],
+       "inbox-status" => [
+               "comment" => "Status of ActivityPub inboxes",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "URL of the inbox"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date of this entry"],
+                       "success" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful delivery"],
+                       "failure" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed delivery"],
+                       "previous" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Previous delivery date"],
+                       "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the inbox archived?"],
+                       "shared" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is it a shared inbox?"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url"]
+               ]
+       ],
+       "intro" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "fid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["fcontact" => "id"], "comment" => ""],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "knowyou" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "datetime" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "item" => [
+               "comment" => "Structure for all posts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id of the parent to this item if it is a reply of some form; otherwise this must be set to the id of this item"],
+                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "uri of the parent to this item"],
+                       "parent-uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the parent uri"],
+                       "thr-parent" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "If the parent of this item is not the top-level item in the conversation, the uri of the immediate parent; otherwise set to parent-uri"],
+                       "thr-parent-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the thread parent uri"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation timestamp."],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last edit (default is created)"],
+                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last comment/reply to this item"],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime"],
+                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date that something in the conversation changed, indicating clients should fetch the conversation again"],
+                       "gravity" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network from where the item comes from"],
+                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the owner of this item"],
+                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 of the author of this item"],
+                       "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"],
+                       "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"],
+                       "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
+                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "distribution is restricted"],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been deleted"],
+                       // User specific fields. Eventually they will move to user-item
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id which owns this copy of the item"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "This item was posted to the wall of uid"],
+                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item originated at this site"],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "item has been favourited"],
+                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "item has not been seen"],
+                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "The owner of this item was mentioned in it"],
+                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "psid" => ["type" => "int unsigned", "relation" => ["permissionset" => "id"], "comment" => "ID of the permission set of this post"],
+                       // It has to be decided whether these fields belong to the user or the structure
+                       "resource-id" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type"],
+                       "event-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["event" => "id"], "comment" => "Used to link to the event.id"],
+                       // Could possibly be replaced by the "attach" table?
+                       "attach" => ["type" => "mediumtext", "comment" => "JSON structure representing attachments to this item"],
+                       // Deprecated fields. Will be removed in upcoming versions
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "postopts" => ["type" => "text", "comment" => "Deprecated"],
+                       "inform" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "type" => ["type" => "varchar(20)", "comment" => "Deprecated"],
+                       "bookmark" => ["type" => "boolean", "comment" => "Deprecated"],
+                       "file" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "location" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "coord" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "tag" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "plink" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "title" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "content-warning" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "body" => ["type" => "mediumtext", "comment" => "Deprecated"],
+                       "app" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "verb" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "object-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "object" => ["type" => "text", "comment" => "Deprecated"],
+                       "target-type" => ["type" => "varchar(100)", "comment" => "Deprecated"],
+                       "target" => ["type" => "text", "comment" => "Deprecated"],
+                       "author-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "author-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "author-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-name" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-link" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "owner-avatar" => ["type" => "varchar(255)", "comment" => "Deprecated"],
+                       "rendered-hash" => ["type" => "varchar(32)", "comment" => "Deprecated"],
+                       "rendered-html" => ["type" => "mediumtext", "comment" => "Deprecated"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "guid" => ["guid(191)"],
+                       "uri" => ["uri(191)"],
+                       "parent" => ["parent"],
+                       "parent-uri" => ["parent-uri(191)"],
+                       "extid" => ["extid(191)"],
+                       "uid_id" => ["uid", "id"],
+                       "uid_contactid_id" => ["uid", "contact-id", "id"],
+                       "uid_received" => ["uid", "received"],
+                       "uid_commented" => ["uid", "commented"],
+                       "uid_unseen_contactid" => ["uid", "unseen", "contact-id"],
+                       "uid_network_received" => ["uid", "network", "received"],
+                       "uid_network_commented" => ["uid", "network", "commented"],
+                       "uid_thrparent" => ["uid", "thr-parent(190)"],
+                       "uid_parenturi" => ["uid", "parent-uri(190)"],
+                       "uid_contactid_received" => ["uid", "contact-id", "received"],
+                       "authorid_received" => ["author-id", "received"],
+                       "ownerid" => ["owner-id"],
+                       "contact-id" => ["contact-id"],
+                       "uid_uri" => ["uid", "uri(190)"],
+                       "resource-id" => ["resource-id"],
+                       "deleted_changed" => ["deleted", "changed"],
+                       "uid_wall_changed" => ["uid", "wall", "changed"],
+                       "uid_eventid" => ["uid", "event-id"],
+                       "icid" => ["icid"],
+                       "iaid" => ["iaid"],
+                       "psid_wall" => ["psid", "wall"],
+               ]
+       ],
+       "item-activity" => [
+               "comment" => "Activities for items",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "uri" => ["type" => "varchar(255)", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "activity" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri-hash" => ["UNIQUE", "uri-hash"],
+                       "uri" => ["uri(191)"],
+                       "uri-id" => ["uri-id"]
+               ]
+       ],
+       "item-content" => [
+               "comment" => "Content for all posts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                       "uri" => ["type" => "varchar(255)", "comment" => ""],
+                       "uri-id" => ["type" => "int unsigned", "relation" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
+                       "uri-plink-hash" => ["type" => "varchar(80)", "not null" => "1", "default" => "", "comment" => "RIPEMD-128 hash from uri"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
+                       "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "body" => ["type" => "mediumtext", "comment" => "item body content"],
+                       "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "text location where this item originated"],
+                       "coord" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "longitude/latitude pair representing location where this item originated"],
+                       "language" => ["type" => "text", "comment" => "Language information about this post"],
+                       "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "application which generated this item"],
+                       "rendered-hash" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "rendered-html" => ["type" => "mediumtext", "comment" => "item.body converted to html"],
+                       "object-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams object type"],
+                       "object" => ["type" => "text", "comment" => "JSON encoded object structure unless it is an implied object (normal post)"],
+                       "target-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams target type if applicable (URI)"],
+                       "target" => ["type" => "text", "comment" => "JSON encoded target structure if used"],
+                       "plink" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "permalink or URL to a displayable copy of the message at its source"],
+                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams verb"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri-plink-hash" => ["UNIQUE", "uri-plink-hash"],
+                       "uri" => ["uri(191)"],
+                       "uri-id" => ["uri-id"]
+               ]
+       ],
+       "item-delivery-data" => [
+               "comment" => "Delivery data for items",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
+                       "postopts" => ["type" => "text", "comment" => "External post connectors add their network name to this comma-separated string to identify that they should be delivered to these networks during delivery"],
+                       "inform" => ["type" => "mediumtext", "comment" => "Additional receivers of the linked item"],
+                       "queue_count" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Initial number of delivery recipients, used as item.delivery_queue_count"],
+                       "queue_done" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries, used as item.delivery_queue_done"],
+                       "activitypub" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via ActivityPub"],
+                       "dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via DFRN"],
+                       "legacy_dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via legacy DFRN"],
+                       "diaspora" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via Diaspora"],
+                       "ostatus" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via OStatus"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid"],
+               ]
+       ],
+       "item-uri" => [
+               "comment" => "URI and GUID for items",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"],
+                       "uri" => ["type" => "varbinary(255)", "not null" => "1", "comment" => "URI of an item"],
+                       "guid" => ["type" => "varbinary(255)", "comment" => "A unique identifier for an item"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uri" => ["UNIQUE", "uri"],
+                       "guid" => ["guid"]
+               ]
+       ],
+       "locks" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "name" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => ""],
+                       "locked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process ID"],
+                       "expires" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of cache expiration"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "name_expires" => ["name", "expires"]
+               ]
+       ],
+       "mail" => [
+               "comment" => "private messages",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this private message"],
+                       "from-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "name of the sender"],
+                       "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"],
+                       "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"],
+                       "contact-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "convid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["conv" => "id"], "comment" => "conv.id"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "body" => ["type" => "mediumtext", "comment" => ""],
+                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if message visited it is 1"],
+                       "reply" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"],
+                       "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_seen" => ["uid", "seen"],
+                       "convid" => ["convid"],
+                       "uri" => ["uri(64)"],
+                       "parent-uri" => ["parent-uri(64)"],
+                       "contactid" => ["contact-id(32)"],
+               ]
+       ],
+       "mailacct" => [
+               "comment" => "Mail account data for fetching mails",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "server" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "port" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ssltype" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
+                       "mailbox" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "user" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pass" => ["type" => "text", "comment" => ""],
+                       "reply_to" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "action" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "movetofolder" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "last_check" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "manage" => [
+               "comment" => "table of accounts that can manage each other",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "mid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_mid" => ["UNIQUE", "uid", "mid"],
+               ]
+       ],
+       "notify" => [
+               "comment" => "notifications",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hash" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => ""],
+                       "type" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "msg" => ["type" => "mediumtext", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
+                       "parent" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
+                       "seen" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],
+                       "otype" => ["type" => "varchar(10)", "not null" => "1", "default" => "", "comment" => ""],
+                       "name_cache" => ["type" => "tinytext", "comment" => "Cached bbcode parsing of name"],
+                       "msg_cache" => ["type" => "mediumtext", "comment" => "Cached bbcode parsing of msg"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "hash_uid" => ["hash", "uid"],
+                       "seen_uid_date" => ["seen", "uid", "date"],
+                       "uid_date" => ["uid", "date"],
+                       "uid_type_link" => ["uid", "type", "link(190)"],
+               ]
+       ],
+       "notify-threads" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "notify-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["notify" => "id"], "comment" => ""],
+                       "master-parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"],
+                               "comment" => ""],
+                       "parent-item" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "receiver-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
+                               "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "oembed" => [
+               "comment" => "cache for OEmbed queries",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
+                       "maxwidth" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "comment" => "Maximum width passed to Oembed"],
+                       "content" => ["type" => "mediumtext", "comment" => "OEmbed data of the page"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url", "maxwidth"],
+                       "created" => ["created"],
+               ]
+       ],
+       "openwebauth-token" => [
+               "comment" => "Store OpenWebAuth token to verify contacts",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "type" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Verify type"],
+                       "token" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A generated token"],
+                       "meta" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "parsed_url" => [
+               "comment" => "cache for 'parse_url' queries",
+               "fields" => [
+                       "url" => ["type" => "varbinary(255)", "not null" => "1", "primary" => "1", "comment" => "page url"],
+                       "guessing" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the 'guessing' mode active?"],
+                       "oembed" => ["type" => "boolean", "not null" => "1", "default" => "0", "primary" => "1", "comment" => "is the data the result of oembed?"],
+                       "content" => ["type" => "mediumtext", "comment" => "page data"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "datetime of creation"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["url", "guessing", "oembed"],
+                       "created" => ["created"],
+               ]
+       ],
+       "participation" => [
+               "comment" => "Storage for participation messages from Diaspora",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "relation" => ["item" => "id"], "comment" => ""],
+                       "server" => ["type" => "varchar(60)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["contact" => "id"], "comment" => ""],
+                       "fid" => ["type" => "int unsigned", "not null" => "1", "relation" => ["fcontact" => "id"], "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid", "server"],
+                       "cid" => ["cid"],
+                       "fid" => ["fid"]
+               ]
+       ],
+       "pconfig" => [
+               "comment" => "personal (per user) configuration storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cat" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
+                       "k" => ["type" => "varbinary(100)", "not null" => "1", "default" => "", "comment" => ""],
+                       "v" => ["type" => "mediumtext", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_cat_k" => ["UNIQUE", "uid", "cat", "k"],
+               ]
+       ],
+       "permissionset" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner id of this permission set"],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_allow_cid_allow_gid_deny_cid_deny_gid" => ["allow_cid(50)", "allow_gid(30)", "deny_cid(50)", "deny_gid(30)"],
+               ]
+       ],
+       "photo" => [
+               "comment" => "photo storage",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "guid" => ["type" => "char(16)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this photo"],
+                       "resource-id" => ["type" => "char(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation date"],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edited date"],
+                       "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "desc" => ["type" => "text", "comment" => ""],
+                       "album" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "The name of the album to which the photo belongs"],
+                       "filename" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "type" => ["type" => "varchar(30)", "not null" => "1", "default" => "image/jpeg"],
+                       "height" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "width" => ["type" => "smallint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "datasize" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "data" => ["type" => "mediumblob", "not null" => "1", "comment" => ""],
+                       "scale" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "profile" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+                       "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"],
+                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "contactid" => ["contact-id"],
+                       "uid_contactid" => ["uid", "contact-id"],
+                       "uid_profile" => ["uid", "profile"],
+                       "uid_album_scale_created" => ["uid", "album(32)", "scale", "created"],
+                       "uid_album_resource-id_created" => ["uid", "album(32)", "resource-id", "created"],
+                       "resource-id" => ["resource-id"],
+               ]
+       ],
+       "poll" => [
+               "comment" => "Currently unused table for storing poll results",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "q0" => ["type" => "text", "comment" => ""],
+                       "q1" => ["type" => "text", "comment" => ""],
+                       "q2" => ["type" => "text", "comment" => ""],
+                       "q3" => ["type" => "text", "comment" => ""],
+                       "q4" => ["type" => "text", "comment" => ""],
+                       "q5" => ["type" => "text", "comment" => ""],
+                       "q6" => ["type" => "text", "comment" => ""],
+                       "q7" => ["type" => "text", "comment" => ""],
+                       "q8" => ["type" => "text", "comment" => ""],
+                       "q9" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "poll_result" => [
+               "comment" => "data for polls - currently unused",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "poll_id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["poll" => "id"]],
+                       "choice" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "poll_id" => ["poll_id"],
+               ]
+       ],
+       "process" => [
+               "comment" => "Currently running system processes",
+               "fields" => [
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "command" => ["type" => "varbinary(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["pid"],
+                       "command" => ["command"],
+               ]
+       ],
+       "profile" => [
+               "comment" => "user profiles data",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "Owner User id"],
+                       "profile-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name of the profile"],
+                       "is-default" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Mark this profile as default profile"],
+                       "hide-friends" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide friend list from viewers of this profile"],
+                       "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pdesc" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Title or description"],
+                       "dob" => ["type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00", "comment" => "Day of birth"],
+                       "address" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "locality" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "region" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "postal-code" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "country-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "hometown" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                       "marital" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "with" => ["type" => "text", "comment" => ""],
+                       "howlong" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "sexual" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "politic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "religion" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "pub_keywords" => ["type" => "text", "comment" => ""],
+                       "prv_keywords" => ["type" => "text", "comment" => ""],
+                       "likes" => ["type" => "text", "comment" => ""],
+                       "dislikes" => ["type" => "text", "comment" => ""],
+                       "about" => ["type" => "text", "comment" => ""],
+                       "summary" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "music" => ["type" => "text", "comment" => ""],
+                       "book" => ["type" => "text", "comment" => ""],
+                       "tv" => ["type" => "text", "comment" => ""],
+                       "film" => ["type" => "text", "comment" => ""],
+                       "interest" => ["type" => "text", "comment" => ""],
+                       "romance" => ["type" => "text", "comment" => ""],
+                       "work" => ["type" => "text", "comment" => ""],
+                       "education" => ["type" => "text", "comment" => ""],
+                       "contact" => ["type" => "text", "comment" => ""],
+                       "homepage" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "thumb" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish default profile in local directory"],
+                       "net-publish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "publish profile in global directory"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid_is-default" => ["uid", "is-default"],
+                       "pub_keywords" => ["FULLTEXT", "pub_keywords"],
+               ]
+       ],
+       "profile_check" => [
+               "comment" => "DFRN remote auth use",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "contact.id"],
+                       "dfrn_id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "sec" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "push_subscriber" => [
+               "comment" => "Used for OStatus: Contains feed subscribers",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "callback_url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "topic" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "push" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
+                       "last_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last successful trial"],
+                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
+                       "renewed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of last subscription renewal"],
+                       "secret" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "next_try" => ["next_try"],
+               ]
+       ],
+       "register" => [
+               "comment" => "registrations requiring admin approval",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "hash" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "language" => ["type" => "varchar(16)", "not null" => "1", "default" => "", "comment" => ""],
+                       "note" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "search" => [
+               "comment" => "",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "uid" => ["uid"],
+               ]
+       ],
+       "session" => [
+               "comment" => "web session storage",
+               "fields" => [
+                       "id" => ["type" => "bigint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "sid" => ["type" => "varbinary(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "data" => ["type" => "text", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "sid" => ["sid(64)"],
+                       "expire" => ["expire"],
+               ]
+       ],
+       "sign" => [
+               "comment" => "Diaspora signatures",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => "item.id"],
+                       "signed_text" => ["type" => "mediumtext", "comment" => ""],
+                       "signature" => ["type" => "text", "comment" => ""],
+                       "signer" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "iid" => ["UNIQUE", "iid"],
+               ]
+       ],
+       "term" => [
+               "comment" => "item taxonomy (categories, tags, etc.) table",
+               "fields" => [
+                       "tid" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
+                       "oid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["item" => "id"], "comment" => ""],
+                       "otype" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "term" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["tid"],
+                       "term_type" => ["term(64)", "type"],
+                       "oid_otype_type_term" => ["oid", "otype", "type", "term(32)"],
+                       "uid_otype_type_term_global_created" => ["uid", "otype", "type", "term(32)", "global", "created"],
+                       "uid_otype_type_url" => ["uid", "otype", "type", "url(64)"],
+                       "guid" => ["guid(64)"],
+               ]
+       ],
+       "thread" => [
+               "comment" => "Thread related data",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"],
+                               "comment" => "sequential ID"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => ""],
+                       "owner-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item owner"],
+                       "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Item author"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "commented" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "changed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""],
+                       "wall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "private" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pubmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "moderated" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "starred" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "ignored" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"],
+                       "unseen" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""],
+                       "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "origin" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "forum_mode" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "mention" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""],
+                       "bookmark" => ["type" => "boolean", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["iid"],
+                       "uid_network_commented" => ["uid", "network", "commented"],
+                       "uid_network_received" => ["uid", "network", "received"],
+                       "uid_contactid_commented" => ["uid", "contact-id", "commented"],
+                       "uid_contactid_received" => ["uid", "contact-id", "received"],
+                       "contactid" => ["contact-id"],
+                       "ownerid" => ["owner-id"],
+                       "authorid" => ["author-id"],
+                       "uid_received" => ["uid", "received"],
+                       "uid_commented" => ["uid", "commented"],
+                       "uid_wall_received" => ["uid", "wall", "received"],
+                       "private_wall_origin_commented" => ["private", "wall", "origin", "commented"],
+               ]
+       ],
+       "tokens" => [
+               "comment" => "OAuth usage",
+               "fields" => [
+                       "id" => ["type" => "varchar(40)", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "secret" => ["type" => "text", "comment" => ""],
+                       "client_id" => ["type" => "varchar(20)", "not null" => "1", "default" => "", "relation" => ["clients" => "client_id"]],
+                       "expires" => ["type" => "int", "not null" => "1", "default" => "0", "comment" => ""],
+                       "scope" => ["type" => "varchar(200)", "not null" => "1", "default" => "", "comment" => ""],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"], "comment" => "User id"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+               ]
+       ],
+       "user" => [
+               "comment" => "The local users",
+               "fields" => [
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "parent-uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "relation" => ["user" => "uid"],
+                               "comment" => "The parent user that has full control about this user"],
+                       "guid" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this user"],
+                       "username" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this user is known by"],
+                       "password" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "encrypted password"],
+                       "legacy_password" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Is the password hash double-hashed?"],
+                       "nickname" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "nick- and user name"],
+                       "email" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "the users email address"],
+                       "openid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                       "timezone" => ["type" => "varchar(128)", "not null" => "1", "default" => "", "comment" => "PHP-legal timezone"],
+                       "language" => ["type" => "varchar(32)", "not null" => "1", "default" => "en", "comment" => "default language"],
+                       "register_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of registration"],
+                       "login_date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last login"],
+                       "default-location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Default for item.location"],
+                       "allow_location" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 allows to display the location"],
+                       "theme" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "user theme preference"],
+                       "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"],
+                       "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"],
+                       "spubkey" => ["type" => "text", "comment" => ""],
+                       "sprvkey" => ["type" => "text", "comment" => ""],
+                       "verified" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "user is verified through email"],
+                       "blocked" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 for user is blocked"],
+                       "blockwall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to post to the profile page of the user"],
+                       "hidewall" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Hide profile details from unkown viewers"],
+                       "blocktags" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Prohibit contacts to tag the post of this user"],
+                       "unkmail" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Permit unknown people to send private mails to this user"],
+                       "cntunkmail" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
+                       "notify-flags" => ["type" => "smallint unsigned", "not null" => "1", "default" => "65535", "comment" => "email notification options"],
+                       "page-flags" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "page/profile type"],
+                       "account-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "prvnets" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "pwdreset" => ["type" => "varchar(255)", "comment" => "Password reset request token"],
+                       "pwdreset_time" => ["type" => "datetime", "comment" => "Timestamp of the last password reset request"],
+                       "maxreq" => ["type" => "int unsigned", "not null" => "1", "default" => "10", "comment" => ""],
+                       "expire" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "account_removed" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if 1 the account is removed"],
+                       "account_expired" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
+                       "account_expires_on" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp when account expires and will be deleted"],
+                       "expire_notification_sent" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "timestamp of last warning of account expiration"],
+                       "def_gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => ""],
+                       "allow_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "allow_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "deny_cid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "deny_gid" => ["type" => "mediumtext", "comment" => "default permission for this user"],
+                       "openidserver" => ["type" => "text", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid"],
+                       "nickname" => ["nickname(32)"],
+               ]
+       ],
+       "userd" => [
+               "comment" => "Deleted usernames",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
+                       "username" => ["type" => "varchar(255)", "not null" => "1", "comment" => ""],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "username" => ["username(32)"],
+               ]
+       ],
+       "user-contact" => [
+               "comment" => "User specific public contact data",
+               "fields" => [
+                       "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["contact" => "id"], "comment" => "Contact id of the linked public contact"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"],
+                       "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"],
+                       "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "cid"]
+               ]
+       ],
+       "user-item" => [
+               "comment" => "User specific item data",
+               "fields" => [
+                       "iid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["item" => "id"], "comment" => "Item id"],
+                       "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "relation" => ["user" => "uid"], "comment" => "User id"],
+                       "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marker to hide an item from the user"],
+                       "ignored" => ["type" => "boolean", "comment" => "Ignore this thread if set"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["uid", "iid"]
+               ]
+       ],
+       "worker-ipc" => [
+               "comment" => "Inter process communication between the frontend and the worker",
+               "fields" => [
+                       "key" => ["type" => "int", "not null" => "1", "primary" => "1", "comment" => ""],
+                       "jobs" => ["type" => "boolean", "comment" => "Flag for outstanding jobs"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["key"],
+               ],
+               "engine" => "MEMORY",
+       ],
+       "workerqueue" => [
+               "comment" => "Background tasks queue entries",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented worker task id"],
+                       "parameter" => ["type" => "mediumtext", "comment" => "Task command"],
+                       "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Task priority"],
+                       "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Creation date"],
+                       "pid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "comment" => "Process id of the worker"],
+                       "executed" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Execution date"],
+                       "next_try" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Next retrial date"],
+                       "retrial" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Retrial counter"],
+                       "done" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Marked 1 when the task was done - will be deleted later"],
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"],
+                       "done_parameter" => ["done", "parameter(64)"],
+                       "done_executed" => ["done", "executed"],
+                       "done_priority_created" => ["done", "priority", "created"],
+                       "done_priority_next_try" => ["done", "priority", "next_try"],
+                       "done_pid_next_try" => ["done", "pid", "next_try"],
+                       "done_pid_priority_created" => ["done", "pid", "priority", "created"]
+               ]
+       ],
+       "storage" => [
+               "comment" => "Data stored by Database storage backend",
+               "fields" => [
+                       "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented image data id"],
+                       "data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"]
+               ],
+               "indexes" => [
+                       "PRIMARY" => ["id"]
+               ]
+       ]
+];
+
diff --git a/static/defaults.config.php b/static/defaults.config.php
new file mode 100644 (file)
index 0000000..b4471af
--- /dev/null
@@ -0,0 +1,461 @@
+<?php
+
+// CONFIG.PHP
+
+/* This file declares the default values for the base config of Friendica.
+ *
+ * These configuration values aren't accessible from the admin settings page and custom values must be set in config/local.config.php
+ *
+ * Please don't edit this file directly as its content may change in the upcoming versions.
+ */
+
+return [
+       'database' => [
+               // host (String)
+               // Hostname or IP address of the database server.
+               // Can contain the port number with the syntax "hostname:port".
+               'hostname' => '',
+
+               // user (String)
+               // Database user name. Please don't use "root".
+               'username' => '',
+
+               // pass (String)
+               // Database user password. Please don't use empty passwords.
+               'password' => '',
+
+               // base (String)
+               // Database name.
+               'database' => '',
+
+               // charset (String)
+               // Database connexion charset. Changing this value will likely corrupt special characters.
+               'charset' => 'utf8mb4',
+       ],
+       'config' => [
+               // admin_email (Comma-separated list)
+               // In order to perform system administration via the admin panel,
+               // this must precisely match the email address of the person logged in.
+               'admin_email' => '',
+
+               // admin_nickname (String)
+               // Nickname of the main admin user, used if there are more than one admin user defined in config => admin_email.
+               'admin_nickname' => '',
+
+               // max_import_size (Integer)
+               // Maximum body size of DFRN and Mail messages in characters. 0 is unlimited.
+               'max_import_size' => 200000,
+
+               // php_path (String)
+               // Location of PHP command line processor.
+               'php_path' => 'php',
+       ],
+       'system' => [
+               // allowed_link_protocols (Array)
+               // Allowed protocols in links URLs, add at your own risk. http is always allowed.
+               'allowed_link_protocols' => ['ftp', 'ftps', 'mailto', 'cid', 'gopher'],
+
+               // always_show_preview (Boolean)
+               // Only show small preview pictures.
+               'always_show_preview' => false,
+
+               // archival_days (Integer)
+               // Number of days that we try to deliver content before we archive a contact.
+               'archival_days' => 32,
+
+               // auth_cookie_lifetime (Integer)
+               // Number of days that should pass without any activity before a user who
+               // chose "Remember me" when logging in is considered logged out.
+               'auth_cookie_lifetime' => 7,
+
+               // block_local_dir (Boolean)
+               // Deny public access to the local user directory.
+               'block_local_dir' => false,
+
+               // cron_interval (Integer)
+               // Minimal period in minutes between two calls of the "Cron" worker job.
+               'cron_interval' => 5,
+
+               // cache_driver (database|memcache|memcached|redis)
+               // Whether to use Memcache or Memcached or Redis to store temporary cache.
+               'cache_driver' => 'database',
+
+               // config_adapter (jit|preload)
+               // Allow to switch the configuration adapter to improve performances at the cost of memory consumption.
+               'config_adapter' => 'jit',
+
+               // curl_range_bytes (Integer)
+               // Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
+               'curl_range_bytes' => 0,
+
+               // crawl_permit_period (Integer)
+               // Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated.
+               'crawl_permit_period' => 60,
+
+               // db_log (Path)
+               // Name of a logfile to log slow database queries.
+               'db_log' => '',
+
+               // db_log_index (Path)
+               // Name of a logfile to log queries with bad indexes.
+               'db_log_index' => '',
+
+               // db_log_index_watch (Comma-separated list)
+               // Watchlist of indexes to watch.
+               'db_log_index_watch' => '',
+
+               // db_log_index_blacklist (Comma-separated list)
+               // Blacklist of indexes that shouldn't be watched.
+               'db_log_index_blacklist' => '',
+
+               // db_loglimit (Integer)
+               // If a database call lasts longer than this value in seconds it is logged.
+               // Inactive if system => db_log is empty.
+               'db_loglimit' => 10,
+
+               // db_loglimit_index (Integer)
+               // Number of index rows needed to be logged for indexes on the watchlist. 0 to disable.
+               'db_loglimit_index' => 0,
+
+               // db_loglimit_index_high (Integer)
+               // Number of index rows to be logged anyway (for any index). 0 to disable.
+               'db_loglimit_index_high' => 0,
+
+               // dbclean_expire_conversation (Integer)
+               // When DBClean is enabled, any entry in the conversation table will be deleted after this many days.
+               // This data is used for ActivityPub, so it shouldn't be lower than the average duration of a discussion.
+               'dbclean_expire_conversation' => 90,
+
+               // dbclean-expire-limit (Integer)
+               // This defines the number of items that are to be deleted in a single call.
+               // Reduce this value when you are getting memory issues.
+               'dbclean-expire-limit' => 1000,
+
+               // diaspora_test (Boolean)
+               // For development only. Disables the message transfer.
+               'diaspora_test' => false,
+
+               // disable_email_validation (Boolean)
+               // Disables the check if a mail address is in a valid format and can be resolved via DNS.
+               'disable_email_validation' => false,
+
+               // disable_implicit_mentions (Boolean) since 2019.03
+               // Implicit mentions are mentions in the body of replies that are redundant in a thread-enabled system like Friendica.
+               // This config key disables the gathering of implicit mentions in incoming and outgoing posts.
+               // Also disables the default automatic removal of implicit mentions from the body of incoming posts.
+               // Also disables the default automatic addition of implicit mentions in the body of outgoing posts.
+               // Disabling implicit mentions also affects the "explicit_mentions" additional feature by limiting it
+               // to the replied-to post author mention in the comment boxes.
+               'disable_implicit_mentions' => false,
+
+               // disable_url_validation (Boolean)
+               // Disables the DNS lookup of an URL.
+               'disable_url_validation' => false,
+
+               // disable_password_exposed (Boolean)
+               // Disable the exposition check against the remote haveibeenpwned API on password change.
+               'disable_password_exposed' => false,
+
+               // disable_polling (Boolean)
+               // Disable the polling of DFRN and OStatus contacts through onepoll.php.
+               'disable_polling' => false,
+
+               // dlogfile (Path)
+               // location of the developer log file.
+               'dlogfile' => '',
+
+               // dlogip (String)
+               // restricts develop log writes to requests originating from this IP address.
+               'dlogip' => '',
+
+               // free_crawls (Integer)
+               // Number of "free" searches when system => permit_crawling is enabled.
+               'free_crawls' => 10,
+
+               // frontend_worker_timeout (Integer)
+               // Value in minutes after we think that a frontend task was killed by the webserver.
+               'frontend_worker_timeout' => 10,
+
+               // groupedit_image_limit (Integer)
+               // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names.
+               // This can alternatively be set on a per account basis in the pconfig table.
+               'groupedit_image_limit' => 400,
+
+               // hsts (Boolean)
+               // Enables the sending of HTTP Strict Transport Security headers.
+               'hsts' => false,
+
+               // ignore_cache (Boolean)
+               // For development only. Disables the item cache.
+               'ignore_cache' => false,
+
+               // instances_social_key (String)
+               // Key to the API of https://instances.social which retrieves data about mastodon servers.
+               // See https://instances.social/api/token to get an API key.
+               'instances_social_key' => '',
+
+               // ipv4_resolve (Boolean)
+               // Resolve IPV4 addresses only. Don't resolve to IPV6.
+               'ipv4_resolve' => false,
+
+               // invitation_only (Boolean)
+               // If set true registration is only possible after a current member of the node has send an invitation.
+               'invitation_only' => false,
+
+               // like_no_comment (Boolean)
+               // Don't update the "commented" value of an item when it is liked.
+               'like_no_comment' => false,
+
+               // local_block (Boolean)
+               // Used in conjunction with "block_public".
+               'local_block' => false,
+
+               // local_search (Boolean)
+               // Blocks search for users who are not logged in to prevent crawlers from blocking your system.
+               'local_search' => false,
+
+               // local_tags (Boolean)
+               // If activated, all hashtags will point to the local server.
+               'local_tags' => false,
+
+               // logger_config (String)
+               // Sets the logging adapter of Friendica globally (monolog, syslog, stream)
+               'logger_config' => 'stream',
+
+               // max_batch_queue (Integer)
+               // Maximum number of batched queue items for a single contact before subsequent messages are discarded.
+               'max_batch_queue' => 1000,
+
+               // max_connections (Integer)
+               // The maximum number of database connections which can be in use before the worker process is deferred to its next interval.
+               // When the system can't detect the maximum numbers of connection then this value can be used. Use 0 for auto-detection.
+               'max_connections' => 0,
+
+               // max_connections_level (Integer 0-100)
+               // The maximum percentage of connections that are allowed to let the worker start.
+               'max_connections_level' => 75,
+
+               // max_contact_queue (Integer)
+               // Maximum number of queue items for a single contact before subsequent messages are discarded.
+               'max_contact_queue' => 500,
+
+               // max_image_length (Integer)
+               // An alternate way of limiting picture upload sizes.
+               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
+               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
+               // If you don't want to set a maximum length, set to -1.
+               'max_image_length' => -1,
+
+               // max_processes_backend (Integer)
+               // Maximum number of concurrent database processes for background tasks.
+               'max_processes_backend' => 5,
+
+               // max_processes_frontend (Integer)
+               // Maximum number of concurrent database processes for foreground tasks.
+               'max_processes_frontend' => 20,
+
+               // maximagesize (Integer)
+               // Maximum size in bytes of an uploaded photo.
+               'maximagesize' => 800000,
+
+               // memcache_host (String)
+               // Host name of the memcache daemon.
+               'memcache_host' => '127.0.0.1',
+
+               // memcache_port (Integer)
+               // Port number of the memcache daemon.
+               'memcache_port' => 11211,
+
+               // memcached_hosts (Array)
+               // Array of Memcached servers info [host, port(, weight)], see Memcached::addServers.
+               'memcached_hosts' => [
+                       ['127.0.0.1', '11211'],
+               ],
+
+               // min_poll_interval (Integer)
+               // minimal distance in minutes between two polls for a contact. Reasonable values are between 1 and 59.
+               'min_poll_interval' => 1,
+
+               // no_count (Boolean)
+               // Don't do count calculations (currently only when showing photo albums).
+               'no_count' => false,
+
+               // no_oembed (Boolean)
+               // Don't use OEmbed to fetch more information about a link.
+               'no_oembed' => false,
+
+               // no_smilies (Boolean)
+               // Don't show smilies.
+               'no_smilies' => false,
+
+               // no_view_full_size (Boolean)
+               // Don't add the link "View full size" under a resized image.
+               'no_view_full_size' => false,
+
+               // optimize_items (Boolean)
+               // Triggers an SQL command to optimize the item table before expiring items.
+               'optimize_items' => false,
+
+               // paranoia (Boolean)
+               // Log out users if their IP address changed.
+               'paranoia' => false,
+
+               // permit_crawling (Boolean)
+               // Restricts the search for not logged in users to one search per minute.
+               'permit_crawling' => false,
+
+               // pidfile (Path)
+               // Daemon pid file path. For example: pidfile = /path/to/daemon.pid
+               'pidfile' => '',
+
+               // png_quality (Integer)
+               // Sets the ImageMagick compression level for PNG images. Values ranges from 0 (uncompressed) to 9 (most compressed).
+               'png_quality' => 8,
+
+               // profiler (Boolean)
+               // Enable internal timings to help optimize code. Needed for "rendertime" addon.
+               'profiler' => false,
+
+               // proxy_cache_time (Integer)
+               // Period in seconds after which the cache is cleared.
+               'proxy_cache_time' => 86400,
+
+               // pushpoll_frequency (Integer)
+               // Frequency of contact poll for subhub contact using the DFRM or OStatus network.
+               // Available values:
+               // - 5 = every month
+               // - 4 = every week
+               // - 3 = every day
+               // - 2 = twice a day
+               // - 1 = every hour
+               // - 0 = every minute
+               'pushpoll_frequency' => 3,
+
+               // queue_no_dead_check (Boolean)
+               // Ignore if the target contact or server seems to be dead during queue delivery.
+               'queue_no_dead_check' => false,
+
+               // redis_host (String)
+               // Host name of the redis daemon.
+               'redis_host' => '127.0.0.1',
+
+               // redis_port (String)
+               // Port number of the redis daemon.
+               'redis_port' => 6379,
+
+               // redis_db (Integer)
+               // The sub-database of redis (0 - 15 possible sub-databases)
+               'redis_db' => 0,
+
+               // redis_password (String)
+               // The authentication password for the redis database
+               'redis_password' => null,
+
+               // session_handler (database|cache|native)
+               // Whether to use Cache to store session data or to use PHP native session storage.
+               'session_handler' => 'database',
+
+               // remove_multiplicated_lines (Boolean)
+               // If enabled, multiple linefeeds in items are stripped to a single one.
+               'remove_multiplicated_lines' => false,
+
+               // sendmail_params (Boolean)
+               // Normal sendmail command parameters will be added when the PHP mail() function is called for sending e-mails.
+               // This ensures the Sender Email address setting is applied to the message envelope rather than the host's default address.
+               // Set to false if your non-sendmail agent is incompatible, or to restore old behavior of using the host address.
+               'sendmail_params' => true,
+
+               // show_global_community_hint (Boolean)
+               // When the global community page is enabled, use this option to display a hint above the stream, that this is a collection of all public top-level postings that arrive on your node.
+               'show_global_community_hint' => false,
+
+               // show_unsupported_addons (Boolean)
+               // Show all addons including the unsupported ones.
+               'show_unsupported_addons' => false,
+
+               // show_unsupported_themes (Boolean)
+               // Show all themes including the unsupported ones.
+               'show_unsupported_themes' => false,
+
+               // throttle_limit_day (Integer)
+               // Maximum number of posts that a user can send per day with the API. 0 to disable daily throttling.
+               'throttle_limit_day' => 0,
+
+               // throttle_limit_week (Integer)
+               // Maximum number of posts that a user can send per week with the API. 0 to disable weekly throttling.
+               'throttle_limit_week' => 0,
+
+               // throttle_limit_month (Integer)
+               // Maximum number of posts that a user can send per month with the API. 0 to disable monthly throttling.
+               'throttle_limit_month' => 0,
+
+               // username_min_length (Integer)
+               // The minimum character length a username can be.
+               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
+               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
+               'username_min_length' => 3,
+
+               // username_max_length (Integer)
+               // The maximum character length a username can be.
+               // This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
+               // Minimum for this config value is 1. Maximum is 64 as the resulting profile URL mustn't be longer than 255 chars.
+               'username_max_length' => 48,
+
+               // worker_cooldown (Integer)
+               // Cooldown period in seconds after each worker function call.
+               'worker_cooldown' => 0,
+
+               // worker_debug (Boolean)
+               // If enabled, it prints out the number of running processes split by priority.
+               'worker_debug' => false,
+
+               // worker_fetch_limit (Integer)
+               // Number of worker tasks that are fetched in a single query.
+               'worker_fetch_limit' => 1,
+
+               // worker_jpm (Boolean)
+               // If enabled, it prints out the jobs per minute.
+               'worker_jpm' => false,
+
+               // worker_jpm_range (String)
+               // List of minutes for the jobs per minute (JPM) calculation
+               'worker_jpm_range' => '1, 10, 60',
+
+               // worker_load_exponent (Integer)
+               // Default 3, which allows only 25% of the maximum worker queues when server load reaches around 37% of maximum load.
+               // For a linear response where 25% of worker queues are allowed at 75% of maximum load, set this to 1.
+               // Setting 0 would allow maximum worker queues at all times, which is not recommended.
+               'worker_load_exponent' => 3,
+
+               // xrd_timeout (Integer)
+               // Timeout in seconds for fetching the XRD links.
+               'xrd_timeout' => 20,
+       ],
+       'experimental' => [
+               // exp_themes (Boolean)
+               // Show experimental themes in user settings.
+               'exp_themes' => false,
+       ],
+       'theme' => [
+               // hide_eventlist (Boolean)
+               // Don't show the birthdays and events on the profile and network page.
+               'hide_eventlist' => false,
+       ],
+       'jabber' => [
+               // debug (Boolean)
+               // Enable debug level for the jabber account synchronisation.
+               'debug' => false,
+               // lockpath (Path)
+               // Must be writable by the ejabberd process. if set then it will prevent the running of multiple processes.
+               'lockpath' => '',
+       ],
+       'debug' => [
+               // ap_inbox_log (Boolean)
+               // Logs every call to /inbox as a JSON file in Friendica's temporary directory
+               'ap_inbox_log' => false,
+
+               // total_ap_delivery (Boolean)
+               // Deliver via AP to every possible receiver and we suppress the delivery to these contacts with other protocols
+               'total_ap_delivery' => false,
+       ]
+];
diff --git a/static/settings.config.php b/static/settings.config.php
new file mode 100644 (file)
index 0000000..bf8b62f
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+// SETTINGS.PHP
+
+/* This file declares the default values for the admin settings of Friendica.
+ *
+ * These values will be overridden by the admin settings page.
+ *
+ * Please don't edit this file directly as its content may change in the upcoming versions.
+ */
+
+return [
+       'config' => [
+               // info (String)
+               // Plaintext description of this node, used in the /friendica module.
+               'info' => '',
+
+               // register_policy (Constant)
+               // Your choices are OPEN, APPROVE, or CLOSED.
+               // Be certain to create your own personal account before setting CLOSED.
+               // APPROVE requires you set system.admin_email to the email address of an
+               // already registered person who can authorize and/or approve/deny the request.
+               'register_policy' => \Friendica\Module\Register::CLOSED,
+
+               // register_text (String)
+               // Will be displayed prominently on the registration page.
+               'register_text' => '',
+
+               // sitename (String)
+               // Displayed server name.
+               'sitename' => 'Friendica Social Network',
+       ],
+       'system' => [
+               // account_abandon_days (Integer)
+               // Will not waste system resources polling external sites for abandonded accounts.
+               // Enter 0 for no time limit.
+               'account_abandon_days' => 0,
+
+               // addon (Comma-separated list)
+               // Manual list of addons which are enabled on this system.
+               'addon' => '',
+
+               // allowed_themes (Comma-separated list)
+               // Themes users can change to in their settings.
+               'allowed_themes' => 'quattro,vier,duepuntozero,smoothly',
+
+               // debugging (boolean)
+               // Enable/Disable Debugging (logging)
+               'debugging' => false,
+
+               // default_timezone (String)
+               // Choose a default timezone. See https://secure.php.net/manual/en/timezones.php
+               // It only applies to timestamps for anonymous viewers.
+               'default_timezone' => 'UTC',
+
+               // directory (String)
+               // URL of the global directory.
+               'directory' => 'https://dir.friendica.social',
+
+               // forbidden_nicknames (Comma-separated list)
+               // Prevents users from registering the specified nicknames on this node.
+               // Default value comprises classic role names from RFC 2142.
+               'forbidden_nicknames' => 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop',
+
+               // jpeg_quality (Integer)
+               // Sets the ImageMagick quality level for JPEG images. Values ranges from 50 (awful) to 100 (near perfect).
+               'jpeg_quality' => 100,
+
+               // language (String)
+               // System default languague, inluding admin-created user default language.
+               // Two-letters ISO 639-1 code.
+               'language' => 'en',
+
+               // logfile (String)
+               // The logfile for storing logs.
+               // Can be a full path or a relative path to the Friendica home directory
+               'logfile' => 'log/friendica.log',
+
+               // loglevel (String)
+               // The loglevel for all logs.
+               // Has to be one of these values: emergency, alert, critical, error, warning, notice, info, debug
+               'loglevel' => 'notice',
+
+               // max_image_length (Integer)
+               // An alternate way of limiting picture upload sizes.
+               // Specify the maximum pixel  length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).
+               // Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately).
+               // If you don't want to set a maximum length, set to -1.
+               'max_image_length' => -1,
+
+               // maximagesize (Integer)
+               // Maximum size in bytes of an uploaded photo.
+               'maximagesize' => 800000,
+
+               // no_regfullname (Boolean)
+               // Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
+               'no_regfullname' => true,
+
+               // optimize_max_tablesize (Integer)
+               // Maximum table size (in MB) for the automatic optimization.
+               // -1 to disable automatic optimization.
+               //  0 to use internal default (100MB)
+               'optimize_max_tablesize' => -1,
+
+               // maxloadavg (Integer)
+               // Maximum system load before delivery and poll processes are deferred.
+               'maxloadavg' => 20,
+
+               // rino_encrypt (Integer)
+               // Server-to-server private message encryption (RINO).
+               // Encryption will only be provided if this setting is set to a non zero value on both servers.
+               // Set to 0 to disable, 2 to enable, 1 is deprecated but won't need mcrypt.
+               'rino_encrypt' => 2,
+
+               // temppath (String)
+               // Custom temporary file directory
+               'temppath' => '',
+
+               // theme (String)
+               // System theme name.
+               'theme' => 'vier',
+
+               // url (String)
+               // The fully-qualified URL of this Friendica node.
+               // Used by the worker in a non-HTTP execution environment.
+               'url' => '',
+       ],
+
+       // Used in the admin settings to lock certain features
+       'featurelock' => [
+       ],
+];
index 999da871dbb047ef8386bee002bcfe611344827e..950da5af6f3d82dc211f846b023a52eb4307b200 100644 (file)
@@ -6,14 +6,13 @@
 namespace Friendica\Test;
 
 use Friendica\App\Mode;
-use Friendica\App\Router;
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Database\Database;
 use Friendica\Factory\ConfigFactory;
 use Friendica\Factory\DBFactory;
 use Friendica\Factory\ProfilerFactory;
 use Friendica\Util\BasePath;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Friendica\Util\Profiler;
 use PHPUnit\DbUnit\DataSet\YamlDataSet;
 use PHPUnit\DbUnit\TestCaseTrait;
index e9b7dfc509a8d066ba7fc0da46ef35c7b7b3fc63..110f24a61ae38e4a54b8c03dcfcb0ac1b3b0ce2f 100644 (file)
@@ -21,33 +21,34 @@ trait VFSTrait
                $structure = [
                        'config' => [],
                        'bin' => [],
-                       'test' => []
+                       'static' => [],
+                       'test' => [],
                ];
 
                // create a virtual directory and copy all needed files and folders to it
                $this->root = vfsStream::setup('friendica', 0777, $structure);
 
-               $this->setConfigFile('defaults.config.php');
-               $this->setConfigFile('settings.config.php');
+               $this->setConfigFile('defaults.config.php', true);
+               $this->setConfigFile('settings.config.php', true);
                $this->setConfigFile('local.config.php');
-               $this->setConfigFile('dbstructure.config.php');
        }
 
        /**
         * Copying a config file from the file system to the Virtual File System
         *
         * @param string $filename The filename of the config file
+        * @param bool $static True, if the folder `static` instead of `config` should be used
         */
-       protected function setConfigFile($filename)
+       protected function setConfigFile($filename, bool $static = false)
        {
                $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
                        '..' . DIRECTORY_SEPARATOR .
-                       'config' . DIRECTORY_SEPARATOR .
+                       ($static ? 'static' : 'config') . DIRECTORY_SEPARATOR .
                        $filename;
 
                if (file_exists($file)) {
                        vfsStream::newFile($filename)
-                               ->at($this->root->getChild('config'))
+                               ->at($this->root->getChild(($static ? 'static' : 'config')))
                                ->setContent(file_get_contents($file));
                }
        }
@@ -56,11 +57,12 @@ trait VFSTrait
         * Delets a config file from the Virtual File System
         *
         * @param string $filename The filename of the config file
+        * @param bool $static True, if the folder `static` instead of `config` should be used
         */
-       protected function delConfigFile($filename)
+       protected function delConfigFile($filename, bool $static = false)
        {
-               if ($this->root->hasChild('config/' . $filename)) {
-                       $this->root->getChild('config')->removeChild($filename);
+               if ($this->root->hasChild(($static ? 'static' : 'config') . '/' . $filename)) {
+                       $this->root->getChild(($static ? 'static' : 'config'))->removeChild($filename);
                }
        }
 }
diff --git a/tests/datasets/config/A.config.php b/tests/datasets/config/A.config.php
new file mode 100644 (file)
index 0000000..f28e1f2
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * A test file for local configuration
+ *
+ */
+
+return [
+       'database' => [
+               'hostname' => 'testhost',
+               'username' => 'testuser',
+               'password' => 'testpw',
+               'database' => 'testdb',
+               'charset' => 'utf8mb4',
+       ],
+
+       'config' => [
+               'admin_email' => 'admin@test.it',
+               'sitename' => 'Friendica Social Network',
+               'register_policy' => \Friendica\Module\Register::OPEN,
+               'register_text' => '',
+       ],
+       'system' => [
+               'default_timezone' => 'UTC',
+               'language' => 'en',
+               'theme' => 'frio',
+       ],
+];
diff --git a/tests/datasets/config/A.ini.php b/tests/datasets/config/A.ini.php
new file mode 100644 (file)
index 0000000..a9e462d
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+/**
+ * A test local ini file
+ */
+
+return <<<INI
+
+[database]
+hostname = testhost
+username = testuser
+password = testpw
+database = testdb
+
+[system]
+theme = frio
+
+[config]
+admin_email = admin@test.it
+INI;
diff --git a/tests/datasets/config/B.config.php b/tests/datasets/config/B.config.php
new file mode 100644 (file)
index 0000000..59fadcf
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * A test file for local configuration
+ *
+ */
+
+return [
+       'database' => [
+               'hostname' => 'testhost',
+               'username' => 'testuser',
+               'password' => 'testpw',
+               'database' => 'testdb',
+               'charset' => 'utf8mb4',
+       ],
+
+       'config' => [
+               'admin_email' => 'admin@overwritten.local',
+               'sitename' => 'Friendica Social Network',
+               'register_policy' => \Friendica\Module\Register::OPEN,
+               'register_text' => '',
+       ],
+       'system' => [
+               'default_timezone' => 'UTC',
+               'language' => 'en',
+               'theme' => 'frio',
+               'newKey' => 'newValue',
+       ],
+];
diff --git a/tests/datasets/config/B.ini.php b/tests/datasets/config/B.ini.php
new file mode 100644 (file)
index 0000000..b9aa311
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+/**
+ * A test local ini file
+ */
+
+return <<<INI
+
+[database]
+hostname = testhost
+username = testuser
+password = testpw
+database = testdb
+
+[system]
+theme = changed
+newKey = newValue
+
+[config]
+admin_email = admin@overwritten.local
+INI;
diff --git a/tests/datasets/config/local.config.php b/tests/datasets/config/local.config.php
deleted file mode 100644 (file)
index f28e1f2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * A test file for local configuration
- *
- */
-
-return [
-       'database' => [
-               'hostname' => 'testhost',
-               'username' => 'testuser',
-               'password' => 'testpw',
-               'database' => 'testdb',
-               'charset' => 'utf8mb4',
-       ],
-
-       'config' => [
-               'admin_email' => 'admin@test.it',
-               'sitename' => 'Friendica Social Network',
-               'register_policy' => \Friendica\Module\Register::OPEN,
-               'register_text' => '',
-       ],
-       'system' => [
-               'default_timezone' => 'UTC',
-               'language' => 'en',
-               'theme' => 'frio',
-       ],
-];
diff --git a/tests/datasets/config/local.ini.php b/tests/datasets/config/local.ini.php
deleted file mode 100644 (file)
index a9e462d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * A test local ini file
- */
-
-return <<<INI
-
-[database]
-hostname = testhost
-username = testuser
-password = testpw
-database = testdb
-
-[system]
-theme = frio
-
-[config]
-admin_email = admin@test.it
-INI;
index 902445baa2055e553db7420df3e164a71002cbc4..9c713d2acf5036b41d7ecda4fd49020493013749 100644 (file)
@@ -14,6 +14,7 @@ use Friendica\Core\System;
 use Friendica\Factory;
 use Friendica\Network\HTTPException;
 use Friendica\Util\BaseURL;
+use Friendica\Util\ConfigFileLoader;
 use Monolog\Handler\TestHandler;
 
 require_once __DIR__ . '/../../include/api.php';
index a5df0e92aa2d71b4156987d7145c03c4e43a3898..bdc38bbf30444314195019f98e6e4b66ec3a3f48 100644 (file)
@@ -392,7 +392,7 @@ FIN;
 
 // Local configuration
 
-// If you're unsure about what any of the config keys below do, please check the config/defaults.config.php for detailed
+// If you're unsure about what any of the config keys below do, please check the static/defaults.config.php for detailed
 // documentation of their data type and behavior.
 
 return [
index ad0fe8afca3fecacecb5a75d4351feb3069301f9..1680f2fdb6f164f14e10986e54e6536ebf8d8f3b 100644 (file)
@@ -6,7 +6,7 @@ use Friendica\App;
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\VFSTrait;
-use Friendica\Util\Config\ConfigFileLoader;
+use Friendica\Util\ConfigFileLoader;
 use Mockery\MockInterface;
 use org\bovigo\vfs\vfsStream;
 
@@ -73,7 +73,7 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.config.php';
+                       'A.config.php';
 
                vfsStream::newFile('local.config.php')
                        ->at($this->root->getChild('config'))
@@ -105,7 +105,7 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.ini.php';
+                       'A.ini.php';
 
                vfsStream::newFile('local.ini.php')
                        ->at($this->root->getChild('config'))
@@ -185,7 +185,7 @@ class ConfigFileLoaderTest extends MockedTest
                        '..' . DIRECTORY_SEPARATOR .
                        'datasets' . DIRECTORY_SEPARATOR .
                        'config' . DIRECTORY_SEPARATOR .
-                       'local.config.php';
+                       'A.config.php';
 
                vfsStream::newFile('test.config.php')
                        ->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
@@ -202,4 +202,91 @@ class ConfigFileLoaderTest extends MockedTest
 
                $this->assertEquals('admin@test.it', $conf['config']['admin_email']);
        }
+
+       /**
+        * test loading multiple config files - the last config should work
+        */
+       public function testLoadMultipleConfigs()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                       '..' . DIRECTORY_SEPARATOR .
+                       '..' . DIRECTORY_SEPARATOR .
+                       'datasets' . DIRECTORY_SEPARATOR .
+                       'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.config.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.config.php'));
+               vfsStream::newFile('B.config.php')
+                               ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.config.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@overwritten.local', $configCache->get('config', 'admin_email'));
+               $this->assertEquals('newValue', $configCache->get('system', 'newKey'));
+       }
+
+       /**
+        * test loading multiple config files - the last config should work (INI-version)
+        */
+       public function testLoadMultipleInis()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          'datasets' . DIRECTORY_SEPARATOR .
+                          'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.ini.php'));
+               vfsStream::newFile('B.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.ini.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@overwritten.local', $configCache->get('config', 'admin_email'));
+               $this->assertEquals('newValue', $configCache->get('system', 'newKey'));
+       }
+
+       /**
+        * Test that sample-files (e.g. local-sample.config.php) is never loaded
+        */
+       public function testNotLoadingSamples()
+       {
+               $this->delConfigFile('local.config.php');
+
+               $fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          '..' . DIRECTORY_SEPARATOR .
+                          'datasets' . DIRECTORY_SEPARATOR .
+                          'config' . DIRECTORY_SEPARATOR;
+
+               vfsStream::newFile('A.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'A.ini.php'));
+               vfsStream::newFile('B-sample.ini.php')
+                        ->at($this->root->getChild('config'))
+                        ->setContent(file_get_contents($fileDir . 'B.ini.php'));
+
+               $configFileLoader = new ConfigFileLoader($this->root->url(), $this->mode);
+               $configCache = new ConfigCache();
+
+               $configFileLoader->setupCache($configCache);
+
+               $this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
+               $this->assertEmpty($configCache->get('system', 'NewKey'));
+       }
 }
index 1bdccddeaa77f951fbb3ab93d365824dab2f7cfc..18442f79588ecea0d6cd154f74c1f161ac4d8c4b 100644 (file)
@@ -22,7 +22,7 @@ use Friendica\Worker\Delivery;
  * This function is responsible for doing post update changes to the data
  * (not the structure) in the database.
  *
- * Database structure changes are done in config/dbstructure.config.php
+ * Database structure changes are done in static/dbstructure.config.php
  *
  * If there is a need for a post process to a structure change, update this file
  * by adding a new function at the end with the number of the new DB_UPDATE_VERSION.
@@ -33,8 +33,8 @@ use Friendica\Worker\Delivery;
  * You are currently on version 4711 and you are preparing changes that demand an update script.
  *
  * 1. Create a function "update_4712()" here in the update.php
- * 2. Apply the needed structural changes in config/dbStructure.php
- * 3. Set DB_UPDATE_VERSION in config/dbstructure.config.php to 4712.
+ * 2. Apply the needed structural changes in static/dbStructure.php
+ * 3. Set DB_UPDATE_VERSION in static/dbstructure.config.php to 4712.
  *
  * If you need to run a script before the database update, name the function "pre_update_4712()"
  */
index 05c87056c69a67ba655e5fd51f13fc49bfec56a1..ad809c9d85a10b017329f563c342df90c39e38b3 100644 (file)
@@ -2,7 +2,7 @@
 
 // Local configuration
 
-// If you're unsure about what any of the config keys below do, please check the config/defaults.config.php for detailed
+// If you're unsure about what any of the config keys below do, please check the static/defaults.config.php for detailed
 // documentation of their data type and behavior.
 
 return [