]> git.mxchange.org Git - friendica.git/commitdiff
Merge branch 'develop' into MySQL5.7
authorAlexandre Alapetite <alexandre@alapetite.fr>
Sun, 16 Apr 2017 13:16:58 +0000 (15:16 +0200)
committerAlexandre Alapetite <alexandre@alapetite.fr>
Sun, 16 Apr 2017 13:16:58 +0000 (15:16 +0200)
32 files changed:
boot.php
database.sql
doc/KeyboardShortcuts.md [new file with mode: 0644]
doc/Settings.md
doc/database.md
doc/database/db_deliverq.md [deleted file]
doc/de/Settings.md
include/acl_selectors.php
include/api.php
include/dba.php
include/dbstructure.php
include/notifier.php
include/ostatus.php
include/photos.php
include/socgraph.php
js/main.js
mod/acl.php
mod/admin.php
mod/manifest.php [new file with mode: 0644]
mod/message.php
mod/photos.php
mod/ping.php
mod/profile.php
mod/search.php
mod/videos.php
update.php
view/templates/admin_summary.tpl
view/templates/head.tpl
view/templates/hovercard.tpl
view/templates/manifest.tpl [new file with mode: 0644]
view/theme/frio/templates/contact_template.tpl
view/theme/frio/templates/head.tpl

index 070dcf726661db2b95bd907565f97d06cc68421d..05588b8d2c419cc40eb360f41da0960e6db7bb3c 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM',     'Friendica');
 define ( 'FRIENDICA_CODENAME',     'Asparagus');
 define ( 'FRIENDICA_VERSION',      '3.5.2-dev' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1216      );
+define ( 'DB_UPDATE_VERSION',      1218      );
 
 /**
  * @brief Constant with a HTML line break.
index 67e6755126c020a30ec44ca0fe4715653c4b4b72..bc336d5a32d81590147b7ac79c2604cf0c91ae14 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 3.5.2-dev (Asparagus)
--- DB_UPDATE_VERSION 1215
+-- DB_UPDATE_VERSION 1218
 -- ------------------------------------------
 
 
@@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `addon` (
        `plugin_admin` tinyint(1) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`),
         UNIQUE INDEX `name` (`name`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE attach
@@ -37,7 +37,7 @@ CREATE TABLE IF NOT EXISTS `attach` (
        `deny_cid` mediumtext,
        `deny_gid` mediumtext,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE auth_codes
@@ -49,7 +49,7 @@ CREATE TABLE IF NOT EXISTS `auth_codes` (
        `expires` int(11) NOT NULL DEFAULT 0,
        `scope` varchar(250) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE cache
@@ -61,7 +61,7 @@ CREATE TABLE IF NOT EXISTS `cache` (
        `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`k`),
         INDEX `expire_mode_updated` (`expire_mode`,`updated`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE challenge
@@ -74,7 +74,7 @@ CREATE TABLE IF NOT EXISTS `challenge` (
        `type` varchar(255) NOT NULL DEFAULT '',
        `last_update` varchar(255) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE clients
@@ -87,7 +87,7 @@ CREATE TABLE IF NOT EXISTS `clients` (
        `icon` text,
        `uid` int(11) NOT NULL DEFAULT 0,
         PRIMARY KEY(`client_id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE config
@@ -99,7 +99,7 @@ CREATE TABLE IF NOT EXISTS `config` (
        `v` mediumtext,
         PRIMARY KEY(`id`),
         UNIQUE INDEX `cat_k` (`cat`,`k`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE contact
@@ -159,7 +159,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
        `writable` tinyint(1) NOT NULL DEFAULT 0,
        `forum` tinyint(1) NOT NULL DEFAULT 0,
        `prv` tinyint(1) NOT NULL DEFAULT 0,
-       `contact-type` int(11) unsigned NOT NULL DEFAULT 0,
+       `contact-type` int(11) NOT NULL DEFAULT 0,
        `hidden` tinyint(1) NOT NULL DEFAULT 0,
        `archive` tinyint(1) NOT NULL DEFAULT 0,
        `pending` tinyint(1) NOT NULL DEFAULT 1,
@@ -186,7 +186,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
         INDEX `nick_uid` (`nick`(32),`uid`),
         INDEX `dfrn-id` (`dfrn-id`),
         INDEX `issued-id` (`issued-id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE conv
@@ -202,7 +202,7 @@ CREATE TABLE IF NOT EXISTS `conv` (
        `subject` text,
         PRIMARY KEY(`id`),
         INDEX `uid` (`uid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE event
@@ -230,7 +230,7 @@ CREATE TABLE IF NOT EXISTS `event` (
        `deny_gid` mediumtext,
         PRIMARY KEY(`id`),
         INDEX `uid_start` (`uid`,`start`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE fcontact
@@ -256,7 +256,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
         PRIMARY KEY(`id`),
         INDEX `addr` (`addr`(32)),
         INDEX `url` (`url`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE ffinder
@@ -267,7 +267,7 @@ CREATE TABLE IF NOT EXISTS `ffinder` (
        `cid` int(10) unsigned NOT NULL DEFAULT 0,
        `fid` int(10) unsigned NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE fserver
@@ -279,7 +279,7 @@ CREATE TABLE IF NOT EXISTS `fserver` (
        `key` text,
         PRIMARY KEY(`id`),
         INDEX `server` (`server`(32))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE fsuggest
@@ -295,7 +295,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
        `note` text,
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE gcign
@@ -307,7 +307,7 @@ CREATE TABLE IF NOT EXISTS `gcign` (
         PRIMARY KEY(`id`),
         INDEX `uid` (`uid`),
         INDEX `gcid` (`gcid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE gcontact
@@ -346,7 +346,7 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
         INDEX `addr` (`addr`(64)),
         INDEX `hide_network_updated` (`hide`,`network`,`updated`),
         INDEX `updated` (`updated`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE glink
@@ -361,7 +361,7 @@ CREATE TABLE IF NOT EXISTS `glink` (
         PRIMARY KEY(`id`),
         UNIQUE INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
         INDEX `gcid` (`gcid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE group
@@ -374,7 +374,7 @@ CREATE TABLE IF NOT EXISTS `group` (
        `name` varchar(255) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`),
         INDEX `uid` (`uid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE group_member
@@ -388,7 +388,7 @@ CREATE TABLE IF NOT EXISTS `group_member` (
         INDEX `contactid` (`contact-id`),
         INDEX `gid_contactid` (`gid`,`contact-id`),
         UNIQUE INDEX `uid_gid_contactid` (`uid`,`gid`,`contact-id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE gserver
@@ -411,7 +411,7 @@ CREATE TABLE IF NOT EXISTS `gserver` (
        `last_failure` datetime DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`id`),
         INDEX `nurl` (`nurl`(32))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE hook
@@ -424,7 +424,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
        `priority` int(11) unsigned NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`),
         UNIQUE INDEX `hook_file_function` (`hook`(50),`file`(80),`function`(60))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE intro
@@ -442,7 +442,7 @@ CREATE TABLE IF NOT EXISTS `intro` (
        `blocked` tinyint(1) NOT NULL DEFAULT 1,
        `ignore` tinyint(1) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE item
@@ -539,7 +539,7 @@ CREATE TABLE IF NOT EXISTS `item` (
         INDEX `uid_eventid` (`uid`,`event-id`),
         INDEX `uid_authorlink` (`uid`,`author-link`),
         INDEX `uid_ownerlink` (`uid`,`owner-link`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE item_id
@@ -555,7 +555,7 @@ CREATE TABLE IF NOT EXISTS `item_id` (
         INDEX `sid` (`sid`),
         INDEX `service` (`service`(32)),
         INDEX `iid` (`iid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE locks
@@ -566,7 +566,7 @@ CREATE TABLE IF NOT EXISTS `locks` (
        `locked` tinyint(1) NOT NULL DEFAULT 0,
        `created` datetime DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE mail
@@ -594,7 +594,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
         INDEX `convid` (`convid`),
         INDEX `uri` (`uri`(64)),
         INDEX `parent-uri` (`parent-uri`(64))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE mailacct
@@ -614,7 +614,7 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
        `pubmail` tinyint(1) NOT NULL DEFAULT 0,
        `last_check` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE manage
@@ -625,7 +625,7 @@ CREATE TABLE IF NOT EXISTS `manage` (
        `mid` int(11) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`),
         UNIQUE INDEX `uid_mid` (`uid`,`mid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE notify
@@ -653,7 +653,7 @@ CREATE TABLE IF NOT EXISTS `notify` (
         INDEX `seen_uid_date` (`seen`,`uid`,`date`),
         INDEX `uid_date` (`uid`,`date`),
         INDEX `uid_type_link` (`uid`,`type`,`link`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE notify-threads
@@ -665,7 +665,7 @@ CREATE TABLE IF NOT EXISTS `notify-threads` (
        `parent-item` int(10) unsigned NOT NULL DEFAULT 0,
        `receiver-uid` int(11) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE oembed
@@ -676,7 +676,7 @@ CREATE TABLE IF NOT EXISTS `oembed` (
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`url`),
         INDEX `created` (`created`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE parsed_url
@@ -689,7 +689,7 @@ CREATE TABLE IF NOT EXISTS `parsed_url` (
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`url`,`guessing`,`oembed`),
         INDEX `created` (`created`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE pconfig
@@ -702,7 +702,7 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
        `v` mediumtext,
         PRIMARY KEY(`id`),
         UNIQUE INDEX `uid_cat_k` (`uid`,`cat`,`k`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE photo
@@ -736,7 +736,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
         INDEX `uid_album_scale_created` (`uid`,`album`(32),`scale`,`created`),
         INDEX `uid_album_resource-id_created` (`uid`,`album`(32),`resource-id`(64),`created`),
         INDEX `resource-id` (`resource-id`(64))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE poll
@@ -756,7 +756,7 @@ CREATE TABLE IF NOT EXISTS `poll` (
        `q9` text,
         PRIMARY KEY(`id`),
         INDEX `uid` (`uid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE poll_result
@@ -768,7 +768,7 @@ CREATE TABLE IF NOT EXISTS `poll_result` (
         PRIMARY KEY(`id`),
         INDEX `poll_id` (`poll_id`),
         INDEX `choice` (`choice`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE process
@@ -779,7 +779,7 @@ CREATE TABLE IF NOT EXISTS `process` (
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`pid`),
         INDEX `command` (`command`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE profile
@@ -829,7 +829,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
        `net-publish` tinyint(1) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`),
         INDEX `uid_is-default` (`uid`,`is-default`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE profile_check
@@ -842,7 +842,7 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
        `sec` varchar(255) NOT NULL DEFAULT '',
        `expire` int(11) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE push_subscriber
@@ -857,7 +857,7 @@ CREATE TABLE IF NOT EXISTS `push_subscriber` (
        `last_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
        `secret` varchar(255) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE queue
@@ -876,7 +876,7 @@ CREATE TABLE IF NOT EXISTS `queue` (
         INDEX `last` (`last`),
         INDEX `network` (`network`),
         INDEX `batch` (`batch`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE register
@@ -890,7 +890,7 @@ CREATE TABLE IF NOT EXISTS `register` (
        `language` varchar(16) NOT NULL DEFAULT '',
        `note` text,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE search
@@ -901,7 +901,7 @@ CREATE TABLE IF NOT EXISTS `search` (
        `term` varchar(255) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`),
         INDEX `uid` (`uid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE session
@@ -914,7 +914,7 @@ CREATE TABLE IF NOT EXISTS `session` (
         PRIMARY KEY(`id`),
         INDEX `sid` (`sid`(64)),
         INDEX `expire` (`expire`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE sign
@@ -927,7 +927,7 @@ CREATE TABLE IF NOT EXISTS `sign` (
        `signer` varchar(255) NOT NULL DEFAULT '',
         PRIMARY KEY(`id`),
         INDEX `iid` (`iid`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE spam
@@ -944,7 +944,7 @@ CREATE TABLE IF NOT EXISTS `spam` (
         INDEX `spam` (`spam`),
         INDEX `ham` (`ham`),
         INDEX `term` (`term`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE term
@@ -967,7 +967,7 @@ CREATE TABLE IF NOT EXISTS `term` (
         INDEX `uid_otype_type_term_global_created` (`uid`,`otype`,`type`,`term`(32),`global`,`created`),
         INDEX `uid_otype_type_url` (`uid`,`otype`,`type`,`url`(64)),
         INDEX `guid` (`guid`(64))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE thread
@@ -1007,7 +1007,7 @@ CREATE TABLE IF NOT EXISTS `thread` (
         INDEX `uid_created` (`uid`,`created`),
         INDEX `uid_commented` (`uid`,`commented`),
         INDEX `uid_wall_created` (`uid`,`wall`,`created`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE tokens
@@ -1020,7 +1020,7 @@ CREATE TABLE IF NOT EXISTS `tokens` (
        `scope` varchar(200) NOT NULL DEFAULT '',
        `uid` int(11) NOT NULL DEFAULT 0,
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE user
@@ -1071,7 +1071,7 @@ CREATE TABLE IF NOT EXISTS `user` (
        `openidserver` text,
         PRIMARY KEY(`uid`),
         INDEX `nickname` (`nickname`(32))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE userd
@@ -1081,7 +1081,7 @@ CREATE TABLE IF NOT EXISTS `userd` (
        `username` varchar(255) NOT NULL,
         PRIMARY KEY(`id`),
         INDEX `username` (`username`(32))
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
 --
 -- TABLE workerqueue
@@ -1094,5 +1094,5 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
        `pid` int(11) NOT NULL DEFAULT 0,
        `executed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
         PRIMARY KEY(`id`)
-) DEFAULT CHARSET=utf8mb4;
+) DEFAULT COLLATE utf8mb4_general_ci;
 
diff --git a/doc/KeyboardShortcuts.md b/doc/KeyboardShortcuts.md
new file mode 100644 (file)
index 0000000..cf783b0
--- /dev/null
@@ -0,0 +1,10 @@
+Keyboard shortcuts in Friendica
+=======================
+
+* [Home](help)
+
+General
+-------
+
+* j: Scroll to next thread
+* k: Scroll to previous thread
index 5055ed7d23df6d328c6a2dc20bcd4b97ee719224..3652562720d440e8f6cb6970cf5e6b4de0005448 100644 (file)
@@ -6,12 +6,10 @@ If you are the admin of a Friendica node, you have access to the so called **Adm
 
 On the front page of the admin panel you will see a summary of information about your node.
 These information include the amount of messages currently being processed in the queues.
-The first number is the number of messages being actively sent.
-This number should decrease quickly.
-The second is the messages which could for various reasons not being delivered.
+The first number is the number of messages which could not been delivered for various reasons.
 They will be resend later.
 You can have a quick glance into that second queus in the "Inspect Queue" section of the admin panel.
-If you have activated the background workers, there is a third number representing the count of jobs queued for the workers.
+The second number represents the current number of jobs for the background workers.
 These worker tasks are prioritised and are done accordingly.
 
 Then you get an overview of the accounts on your node, which can be moderated in the "Users" section of the panel.
index f48404c17d0bc219e66c40d8d84248386b948a3a..4c61505202c9459d3bd3ff6e776fb1798a52b635 100644 (file)
@@ -14,7 +14,6 @@ Database Tables
 | [config](help/database/db_config)                    | main configuration storage                       |
 | [contact](help/database/db_contact)                  | contact table                                    |
 | [conv](help/database/db_conv)                        | private messages                                 |
-| [deliverq](help/database/db_deliverq)                |                                                  |
 | [event](help/database/db_event)                      | Events                                           |
 | [fcontact](help/database/db_fcontact)                | friend suggestion stuff                          |
 | [ffinder](help/database/db_ffinder)                  | friend suggestion stuff                          |
diff --git a/doc/database/db_deliverq.md b/doc/database/db_deliverq.md
deleted file mode 100644 (file)
index 5335899..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Table deliverq
-==============
-
-| Field   | Description      | Type             | Null | Key | Default | Extra          |
-|---------|------------------|------------------|------|-----|---------|----------------|
-| id      | sequential ID    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
-| cmd     |                  | varchar(32)      | NO   |     |         |                |
-| item    |                  | int(11)          | NO   |     | 0       |                |
-| contact |                  | int(11)          | NO   |     | 0       |                |
-
-
-Return to [database documentation](help/database)
index 2b7e89a52cbc59c18b4cb78b222b0fc0d9ad2d96..68e17adc787b19d9be28dc4e5f8b2a192a91b762 100644 (file)
@@ -5,17 +5,14 @@
 Wenn du der Administrator einer Friendica Instanz bist, hast du Zugriff auf das so genannte **Admin Panel** in dem du die Friendica Instanz konfigurieren kannst,
 
 Auf der Startseite des Admin Panels werden die Informationen zu der Instanz zusammengefasst.
-Diese Informationen beinhalten die Anzahl der Nachrichten, die sich aktuell in den Warteschlangen befinden.
-Hierbei ist die erste Zahl die Zahl der Nachrichten die gerade aktiv verteilt werden.
-Diese Zahl sollte sich relativ schnell sinken.
-Die zweite Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten.
+Die erste Zahl gibt die Anzahl von Nachrichten an, die nicht zugestellt werden konnten.
 Die Zustellung wird zu einem späteren Zeitpunkt noch einmal versucht.
 Unter dem Punkt "Warteschlange Inspizieren" kannst du einen schnellen Blick auf die zweite Warteschlange werfen.
-Solltest du für die Hintergrundprozesse die Worker aktiviert haben, wird eine dritte Zahl angezeigt.
-Diese repräsentiert die Anzahl der Aufgaben, die die Worker noch vor sich haben.
+Die zweite Zahl steht für die Anzahl der Aufgaben, die die Worker noch vor sich haben. 
+Die Worker arbeiten Hintergrundprozesse ab. 
 Die Aufgaben der Worker sind priorisiert und werden anhand dieser Prioritäten abgearbeitet.
 
-Des weiteren findest du eine Ãœbersicht Ã¼ber die Accounts auf dem Friendica Knoten, die unter dem Punkt "Nutzer" moderiert werden können.
+Desweiteren findest du eine Ãœbersicht Ã¼ber die Accounts auf dem Friendica Knoten, die unter dem Punkt "Nutzer" moderiert werden können.
 Sowie eine Liste der derzeit aktivierten Addons.
 Diese Liste ist verlinkt, so dass du schnellen Zugriff auf die Informationsseiten der einzelnen Addons hast.
 Abschließend findest du auf der Startseite des Admin Panels die installierte Version von Friendica.
index f4b644d68fb0201a322db05d497f324fe31f74df..f2d2999ba6175341ef254b4754e29f0f4b9c0083 100644 (file)
@@ -502,7 +502,7 @@ function acl_lookup(App $a, $out_type = 'json') {
                                INNER JOIN `group_member` ON `group_member`.`gid`=`group`.`id` AND `group_member`.`uid` = `group`.`uid`
                                WHERE NOT `group`.`deleted` AND `group`.`uid` = %d
                                        $sql_extra
-                               GROUP BY `group`.`name`
+                               GROUP BY `group`.`name`, `group`.`id`
                                ORDER BY `group`.`name`
                                LIMIT %d,%d",
                        intval(local_user()),
@@ -610,46 +610,50 @@ function acl_lookup(App $a, $out_type = 'json') {
        $items = array_merge($groups, $contacts);
 
        if ($conv_id) {
-               /* if $conv_id is set, get unknow contacts in thread */
-               /* but first get know contacts url to filter them out */
-               function _contact_link($i){ return dbesc($i['link']); }
-               $known_contacts = array_map(_contact_link, $contacts);
-               $unknow_contacts=array();
-               $r = q("SELECT `author-avatar`,`author-name`,`author-link`
+               /*
+                * if $conv_id is set, get unknown contacts in thread
+                * but first get known contacts url to filter them out
+                */
+               $known_contacts = array_map(
+                       function ($i) {
+                               return dbesc($i['link']);
+                       }
+               , $contacts);
+
+               $unknown_contacts = array();
+               $r = q("SELECT `author-link`
                                FROM `item` WHERE `parent` = %d
                                        AND (`author-name` LIKE '%%%s%%' OR `author-link` LIKE '%%%s%%')
                                        AND `author-link` NOT IN ('%s')
-                               GROUP BY `author-link`
+                               GROUP BY `author-link`, `author-avatar`, `author-name`
                                ORDER BY `author-name` ASC
                                ",
                                intval($conv_id),
                                dbesc($search),
                                dbesc($search),
-                               implode("','", $known_contacts)
+                               implode("', '", $known_contacts)
                );
-               if (dbm::is_result($r)){
+               if (dbm::is_result($r)) {
                        foreach ($r as $row) {
-                               // nickname..
-                               $up = parse_url($row['author-link']);
-                               $nick = explode("/",$up['path']);
-                               $nick = $nick[count($nick)-1];
-                               $nick .= "@".$up['host'];
-                               // /nickname
-                               $unknow_contacts[] = array(
-                                       'type'    => 'c',
-                                       'photo'   => proxy_url($row['author-avatar'], false, PROXY_SIZE_MICRO),
-                                       'name'    => htmlentities($row['author-name']),
-                                       'id'      => '',
-                                       'network' => 'unknown',
-                                       'link'    => $row['author-link'],
-                                       'nick'    => htmlentities($nick),
-                                       'forum'   => false
-                               );
+                               $contact = get_contact_details_by_url($row['author-link']);
+
+                               if (count($contact) > 0) {
+                                       $unknown_contacts[] = array(
+                                               'type'    => 'c',
+                                               'photo'   => proxy_url($contact['micro'], false, PROXY_SIZE_MICRO),
+                                               'name'    => htmlentities($contact['name']),
+                                               'id'      => intval($contact['cid']),
+                                               'network' => $contact['network'],
+                                               'link'    => $contact['url'],
+                                               'nick'    => htmlentities($contact['nick'] ? : $contact['addr']),
+                                               'forum'   => $contact['forum']
+                                       );
+                               }
                        }
                }
 
-               $items = array_merge($items, $unknow_contacts);
-               $tot += count($unknow_contacts);
+               $items = array_merge($items, $unknown_contacts);
+               $tot += count($unknown_contacts);
        }
 
        $results = array(
index 9fc853340af520d22f9a56b945906a7bd54e9fd2..75f8ab069a83b1d4f8286d0183f1017d533c3ee2 100644 (file)
@@ -3064,7 +3064,7 @@ use \Friendica\Core\Config;
        function api_fr_photos_list($type) {
                if (api_user()===false) throw new ForbiddenException();
                $r = q("select `resource-id`, max(scale) as scale, album, filename, type from photo
-                               where uid = %d and album != 'Contact Photos' group by `resource-id`",
+                               where uid = %d and album != 'Contact Photos' group by `resource-id`, album, filename, type",
                        intval(local_user())
                );
                $typetoext = array(
@@ -3099,11 +3099,14 @@ use \Friendica\Core\Config;
 
                $scale = (x($_REQUEST, 'scale') ? intval($_REQUEST['scale']) : false);
                $scale_sql = ($scale === false ? "" : sprintf("and scale=%d",intval($scale)));
-               $data_sql = ($scale === false ? "" : "data, ");
-
-               $r = q("select %s `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
-                                               `type`, `height`, `width`, `datasize`, `profile`, min(`scale`) as minscale, max(`scale`) as maxscale
-                               from photo where `uid` = %d and `resource-id` = '%s' %s group by `resource-id`",
+               $data_sql = ($scale === false ? "" : "ANY_VALUE(data) AS data,");
+
+               $r = q("select %s ANY_VALUE(`resource-id`) AS `resource-id`, ANY_VALUE(`created`) AS `created`,
+                               ANY_VALUE(`edited`) AS `edited`, ANY_VALUE(`title`) AS `title`, ANY_VALUE(`desc`) AS `desc`,
+                               ANY_VALUE(`album`) AS `album`, ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`type`) AS `type`,
+                               ANY_VALUE(`height`) AS `height`, ANY_VALUE(`width`) AS `width`, ANY_VALUE(`datasize`) AS `datasize`,
+                               ANY_VALUE(`profile`) AS `profile`, min(`scale`) as minscale, max(`scale`) as maxscale
+                               from photo where `uid` = %d and `resource-id` = '%s' %s",
                        $data_sql,
                        intval(local_user()),
                        dbesc($_REQUEST['photo_id']),
index 62728acaed0294ba467cb126cd5ed022f1329e95..5066dcd56d8f53e7f0f3c0a02037d4fdb62983b9 100644 (file)
@@ -20,6 +20,7 @@ class dba {
        private $driver;
        public  $connected = false;
        public  $error = false;
+       private $_server_info = '';
 
        function __construct($server, $user, $pass, $db, $install = false) {
                $a = get_app();
@@ -103,18 +104,20 @@ class dba {
         * @return string
         */
        public function server_info() {
-               switch ($this->driver) {
-                       case 'pdo':
-                               $version = $this->db->getAttribute(PDO::ATTR_SERVER_VERSION);
-                               break;
-                       case 'mysqli':
-                               $version = $this->db->server_info;
-                               break;
-                       case 'mysql':
-                               $version = mysql_get_server_info($this->db);
-                               break;
+               if ($this->_server_info == '') {
+                       switch ($this->driver) {
+                               case 'pdo':
+                                       $this->_server_info = $this->db->getAttribute(PDO::ATTR_SERVER_VERSION);
+                                       break;
+                               case 'mysqli':
+                                       $this->_server_info = $this->db->server_info;
+                                       break;
+                               case 'mysql':
+                                       $this->_server_info = mysql_get_server_info($this->db);
+                                       break;
+                       }
                }
-               return $version;
+               return $this->_server_info;
        }
 
        /**
@@ -474,6 +477,26 @@ class dba {
                        }
                }
        }
+
+       /**
+        * @brief Replaces ANY_VALUE() function by MIN() function,
+        *  if the database server does not support ANY_VALUE().
+        *
+        * Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
+        * ANY_VALUE() is available from MySQL 5.7.5 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
+        * A standard fall-back is to use MIN().
+        *
+        * @param string $sql An SQL string without the values
+        * @return string The input SQL string modified if necessary.
+        */
+       public function any_value_fallback($sql) {
+               $server_info = $this->server_info();
+               if (version_compare($server_info, '5.7.5', '<') ||
+                       (stripos($server_info, 'MariaDB') !== false)) {
+                       $sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql);
+               }
+               return $sql;
+       }
 }
 
 function printable($s) {
@@ -514,6 +537,7 @@ function q($sql) {
        unset($args[0]);
 
        if ($db && $db->connected) {
+               $sql = $db->any_value_fallback($sql);
                $stmt = @vsprintf($sql,$args); // Disabled warnings
                //logger("dba: q: $stmt", LOGGER_ALL);
                if ($stmt === false)
@@ -550,6 +574,7 @@ function qu($sql) {
        unset($args[0]);
 
        if ($db && $db->connected) {
+               $sql = $db->any_value_fallback($sql);
                $stmt = @vsprintf($sql,$args); // Disabled warnings
                if ($stmt === false)
                        logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG);
index 885ea2c0669f27b45e24aed0504fdb350551318a..73432626627d63e74808634be391cc125cf7f9c7 100644 (file)
@@ -78,8 +78,18 @@ function update_fail($update_id, $error_message){
 function table_structure($table) {
        $structures = q("DESCRIBE `%s`", $table);
 
+       $full_columns = q("SHOW FULL COLUMNS FROM `%s`", $table);
+
        $indexes = q("SHOW INDEX FROM `%s`", $table);
 
+       $table_status = q("SHOW TABLE STATUS WHERE `name` = '%s'", $table);
+
+       if (dbm::is_result($table_status)) {
+               $table_status = $table_status[0];
+       } else {
+               $table_status = array();
+       }
+
        $fielddata = array();
        $indexdata = array();
 
@@ -104,7 +114,6 @@ function table_structure($table) {
 
                        $indexdata[$index["Key_name"]][] = $column;
                }
-
        if (dbm::is_result($structures)) {
                foreach ($structures AS $field) {
                        $fielddata[$field["Field"]]["type"] = $field["Type"];
@@ -125,10 +134,16 @@ function table_structure($table) {
                        }
                }
        }
-       return(array("fields"=>$fielddata, "indexes"=>$indexdata));
+       if (dbm::is_result($full_columns)) {
+               foreach ($full_columns AS $column) {
+                       $fielddata[$column["Field"]]["Collation"] = $column["Collation"];
+               }
+       }
+
+       return array("fields" => $fielddata, "indexes" => $indexdata, "table_status" => $table_status);
 }
 
-function print_structure($database, $charset) {
+function print_structure($database) {
        echo "-- ------------------------------------------\n";
        echo "-- ".FRIENDICA_PLATFORM." ".FRIENDICA_VERSION." (".FRIENDICA_CODENAME,")\n";
        echo "-- DB_UPDATE_VERSION ".DB_UPDATE_VERSION."\n";
@@ -137,7 +152,7 @@ function print_structure($database, $charset) {
                echo "--\n";
                echo "-- TABLE $name\n";
                echo "--\n";
-               db_create_table($name, $structure['fields'], $charset, true, false, $structure["indexes"]);
+               db_create_table($name, $structure['fields'], true, false, $structure["indexes"]);
 
                echo "\n";
        }
@@ -148,13 +163,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
 
        if ($action) {
                Config::set('system', 'maintenance', 1);
-               Config::set('system', 'maintenance_reason', 'Database update');
-       }
-
-       if (isset($a->config["system"]["db_charset"])) {
-               $charset = $a->config["system"]["db_charset"];
-       } else {
-               $charset = "utf8";
+               Config::set('system', 'maintenance_reason', sprintf(t(': Database update'), dbm::date().' '.date('e')));
        }
 
        $errors = false;
@@ -168,16 +177,18 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
                $tables = q("SHOW TABLES");
        }
 
-       foreach ($tables AS $table) {
-               $table = current($table);
+       if (dbm::is_result($tables)) {
+               foreach ($tables AS $table) {
+                       $table = current($table);
 
-               logger(sprintf('updating structure for table %s ...', $table), LOGGER_DEBUG);
-               $database[$table] = table_structure($table);
+                       logger(sprintf('updating structure for table %s ...', $table), LOGGER_DEBUG);
+                       $database[$table] = table_structure($table);
+               }
        }
 
        // Get the definition
        if (is_null($definition)) {
-               $definition = db_definition($charset);
+               $definition = db_definition();
        }
 
        // MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements
@@ -194,7 +205,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
                $group_by = "";
                $sql3 = "";
                if (!isset($database[$name])) {
-                       $r = db_create_table($name, $structure["fields"], $charset, $verbose, $action, $structure['indexes']);
+                       $r = db_create_table($name, $structure["fields"], $verbose, $action, $structure['indexes']);
                        if (!dbm::is_result($r)) {
                                $errors .=  t('Errors encountered creating database tables.').$name.EOL;
                        }
@@ -252,17 +263,25 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
                                        }
                                } else {
                                        // Compare the field definition
-                                       $current_field_definition = implode(",",$database[$name]["fields"][$fieldname]);
-                                       $new_field_definition = implode(",",$parameters);
+                                       $field_definition = $database[$name]["fields"][$fieldname];
+
+                                       // Define the default collation if not given
+                                       if (!isset($parameters['Collation']) AND !is_null($field_definition['Collation'])) {
+                                               $parameters['Collation'] = 'utf8mb4_general_ci';
+                                       } else {
+                                               $parameters['Collation'] = null;
+                                       }
+
+                                       $current_field_definition = implode(",", $field_definition);
+                                       $new_field_definition = implode(",", $parameters);
                                        if ($current_field_definition != $new_field_definition) {
-                                               $sql2=db_modify_table_field($fieldname, $parameters);
+                                               $sql2 = db_modify_table_field($fieldname, $parameters);
                                                if ($sql3 == "") {
                                                        $sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
                                                } else {
                                                        $sql3 .= ", ".$sql2;
                                                }
                                        }
-
                                }
                        }
                }
@@ -288,10 +307,23 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
                                                $group_by = db_group_by($indexname, $fieldnames);
                                        }
                                        if ($sql2 != "") {
-                                               if ($sql3 == "")
+                                               if ($sql3 == "") {
                                                        $sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
-                                               else
+                                               } else {
                                                        $sql3 .= ", ".$sql2;
+                                               }
+                                       }
+                               }
+                       }
+
+                       if (isset($database[$name]["table_status"]["Collation"])) {
+                               if ($database[$name]["table_status"]["Collation"] != 'utf8mb4_general_ci') {
+                                       $sql2 = "DEFAULT COLLATE utf8mb4_general_ci";
+
+                                       if ($sql3 == "") {
+                                               $sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
+                                       } else {
+                                               $sql3 .= ", ".$sql2;
                                        }
                                }
                        }
@@ -323,6 +355,8 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
                        }
 
                        if ($action) {
+                               Config::set('system', 'maintenance_reason', sprintf(t('%s: updating %s table.'), dbm::date().' '.date('e'), $name));
+
                                // Ensure index conversion to unique removes duplicates
                                if ($is_unique) {
                                        if ($ignore != "") {
@@ -376,6 +410,10 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
 function db_field_command($parameters, $create = true) {
        $fieldstruct = $parameters["type"];
 
+       if (!is_null($parameters["Collation"])) {
+               $fieldstruct .= " COLLATE ".$parameters["Collation"];
+       }
+
        if ($parameters["not null"])
                $fieldstruct .= " NOT NULL";
 
@@ -395,7 +433,7 @@ function db_field_command($parameters, $create = true) {
        return($fieldstruct);
 }
 
-function db_create_table($name, $fields, $charset, $verbose, $action, $indexes=null) {
+function db_create_table($name, $fields, $verbose, $action, $indexes=null) {
        global $a, $db;
 
        $r = true;
@@ -420,7 +458,7 @@ function db_create_table($name, $fields, $charset, $verbose, $action, $indexes=n
 
        $sql = implode(",\n\t", $sql_rows);
 
-       $sql = sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n\t", dbesc($name)).$sql."\n) DEFAULT CHARSET=".$charset;
+       $sql = sprintf("CREATE TABLE IF NOT EXISTS `%s` (\n\t", dbesc($name)).$sql."\n) DEFAULT COLLATE utf8mb4_general_ci";
        if ($verbose)
                echo $sql.";\n";
 
@@ -503,18 +541,7 @@ function db_group_by($indexname, $fieldnames) {
        return $sql;
 }
 
-function db_index_suffix($charset, $reduce = 0) {
-       if ($charset != "utf8mb4") {
-               return "";
-       }
-
-       // On utf8mb4 indexes can only have a length of 191
-       $indexlength = 191 - $reduce;
-
-       return "(".$indexlength.")";
-}
-
-function db_definition($charset) {
+function db_definition() {
 
        $database = array();
 
@@ -671,7 +698,7 @@ function db_definition($charset) {
                                        "writable" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
                                        "forum" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
                                        "prv" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
-                                       "contact-type" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
+                                       "contact-type" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
                                        "hidden" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
                                        "archive" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
                                        "pending" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
@@ -1658,9 +1685,7 @@ function dbstructure_run(&$argv, &$argc) {
                                set_config('system','build',DB_UPDATE_VERSION);
                                return;
                        case "dumpsql":
-                               // For the dump that is used to create the database.sql we always assume utfmb4
-                               $charset = "utf8mb4";
-                               print_structure(db_definition($charset), $charset);
+                               print_structure(db_definition());
                                return;
                }
        }
index e3d7d10d6b2a7595e76143eaf60ae4cf4b6e78d3..370611b4eb438aaf69509aee01622e80d15436a9 100644 (file)
@@ -516,7 +516,8 @@ function notifier_run(&$argv, &$argc){
                                $r0 = Diaspora::relay_list();
                        }
 
-                       $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
+                       $r1 = q("SELECT `batch`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`name`) AS `name`, ANY_VALUE(`network`) AS `network`
+                               FROM `contact` WHERE `network` = '%s'
                                AND `uid` = %d AND `rel` != %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` GROUP BY `batch` ORDER BY rand()",
                                dbesc(NETWORK_DIASPORA),
                                intval($owner['uid']),
index e0b33a1a474839338927c95ed2bc3c228a2d03b9..e0ed1df19a9f2a8123cddaa35978186e61432cb6 100644 (file)
@@ -720,11 +720,11 @@ class ostatus {
                        $conversations = q("SELECT `term`.`oid`, `term`.`url`, `term`.`uid` FROM `term`
                                                STRAIGHT_JOIN `thread` ON `thread`.`iid` = `term`.`oid` AND `thread`.`uid` = `term`.`uid`
                                                WHERE `term`.`type` = 7 AND `term`.`term` > '%s' AND `thread`.`mention`
-                                               GROUP BY `term`.`url`, `term`.`uid` ORDER BY `term`.`term` DESC", dbesc($start));
+                                               GROUP BY `term`.`url`, `term`.`uid`, `term`.`oid`, `term`.`term` ORDER BY `term`.`term` DESC", dbesc($start));
                } else {
                        $conversations = q("SELECT `oid`, `url`, `uid` FROM `term`
                                                WHERE `type` = 7 AND `term` > '%s'
-                                               GROUP BY `url`, `uid` ORDER BY `term` DESC", dbesc($start));
+                                               GROUP BY `url`, `uid`, `oid`, `term` ORDER BY `term` DESC", dbesc($start));
                }
 
                foreach ($conversations AS $conversation) {
index 9d8d3309c2bb49d0abce8e5e8a68e653021d5bc0..e872532a481ae78dd882f5532c6fb36a8fb77c6f 100644 (file)
@@ -48,7 +48,7 @@ function photo_albums($uid, $update = false) {
                if (!Config::get('system', 'no_count', false)) {
                        /// @todo This query needs to be renewed. It is really slow
                        // At this time we just store the data in the cache
-                       $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`
+                       $albums = qu("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created`
                                FROM `photo`
                                WHERE `uid` = %d  AND `album` != '%s' AND `album` != '%s' $sql_extra
                                GROUP BY `album` ORDER BY `created` DESC",
@@ -59,9 +59,8 @@ function photo_albums($uid, $update = false) {
                } else {
                        // This query doesn't do the count and is much faster
                        $albums = qu("SELECT DISTINCT(`album`), '' AS `total`
-                               FROM `photo`
-                               WHERE `uid` = %d  AND `album` != '%s' AND `album` != '%s' $sql_extra
-                               GROUP BY `album` ORDER BY `created` DESC",
+                               FROM `photo` USE INDEX (`uid_album_scale_created`)
+                               WHERE `uid` = %d  AND `album` != '%s' AND `album` != '%s' $sql_extra",
                                intval($uid),
                                dbesc('Contact Photos'),
                                dbesc(t('Contact Photos'))
index 642d03d8911a6bf8b204f40ce9915bd092fbacbc..a39eca5e86fe9ec39628a60b04cccb255ccec7b4 100644 (file)
@@ -7,6 +7,8 @@
  * @todo Detect if it is a forum
  */
 
+use \Friendica\Core\Config;
+
 require_once('include/datetime.php');
 require_once("include/Scrape.php");
 require_once("include/network.php");
@@ -1656,6 +1658,20 @@ function poco_discover_federation() {
                }
        }
 
+       // Disvover Mastodon servers
+       if (!Config::get('system','ostatus_disabled')) {
+               $serverdata = fetch_url("https://instances.mastodon.xyz/instances.json");
+
+               if ($serverdata) {
+                       $servers = json_decode($serverdata);
+
+                       foreach ($servers AS $server) {
+                               $url = (is_null($server->https_score) ? 'http' : 'https').'://'.$server->name;
+                               proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($url));
+                       }
+               }
+       }
+
        // Currently disabled, since the service isn't available anymore.
        // It is not removed since I hope that there will be a successor.
        // Discover GNU Social Servers.
@@ -2096,7 +2112,7 @@ function update_gcontact($contact) {
        fix_alternate_contact_address($contact);
 
        if (!isset($contact["updated"]))
-               $contact["updated"] = datetime_convert();
+               $contact["updated"] = dbm::date();
 
        if ($contact["server_url"] == "") {
                $server_url = $contact["url"];
@@ -2151,7 +2167,7 @@ function update_gcontact($contact) {
                        dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]),
                        intval($contact["nsfw"]), intval($contact["contact-type"]), dbesc($contact["alias"]),
                        dbesc($contact["notify"]), dbesc($contact["url"]), dbesc($contact["location"]),
-                       dbesc($contact["about"]), intval($contact["generation"]), dbesc($contact["updated"]),
+                       dbesc($contact["about"]), intval($contact["generation"]), dbesc(dbm::date($contact["updated"])),
                        dbesc($contact["server_url"]), dbesc($contact["connect"]),
                        dbesc(normalise_link($contact["url"])), intval($contact["generation"]));
 
index 556e4ed8cf082a32dd8f0578197b3647d76b76c4..c85aab4a2786ec74446a00b3695c106f7f424d2f 100644 (file)
                        }
                });
 
+               // Scroll to the next/previous thread when pressing J and K
+               $(document).keydown(function (event) {
+                       var threads = $('.thread_level_1');
+                       if ((event.keyCode === 74 || event.keyCode === 75) && !$(event.target).is('textarea, input')) {
+                               var scrollTop = $(window).scrollTop();
+                               if (event.keyCode === 75) {
+                                       threads = $(threads.get().reverse());
+                               }
+                               threads.each(function(key, item) {
+                                       var comparison;
+                                       var top = $(item).offset().top - 100;
+                                       if (event.keyCode === 74) {
+                                               comparison = top > scrollTop + 1;
+                                       } else if (event.keyCode === 75) {
+                                               comparison = top < scrollTop - 1;
+                                       }
+                                       if (comparison) {
+                                               $('html, body').animate({ scrollTop: top }, 200);
+                                               return false;
+                                       }
+                               });
+                       }
+               });
+
                // Set an event listener for infinite scroll
                if(typeof infinite_scroll !== 'undefined') {
                        $(window).scroll(function(e){
index 04aa9f50a6ff3b6ce4c847cc41717ded31a57314..9220bc77a9097198aed0bc2c5b7e3800eaf245a7 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /* ACL selector json backend */
 
-require_once("include/acl_selectors.php");
+require_once 'include/acl_selectors.php';
 
 function acl_init(App $a) {
        acl_lookup($a);
index e86bb90ddda94c658502f583b2f06dabc706277b..fb463d31c014d6dd94e030d5f5bd341c2ee16d0c 100644 (file)
@@ -290,7 +290,8 @@ function admin_page_federation(App $a) {
        foreach ($platforms as $p) {
                // get a total count for the platform, the name and version of the
                // highest version and the protocol tpe
-               $c = qu('SELECT COUNT(*) AS `total`, `platform`, `network`, `version` FROM `gserver`
+               $c = qu('SELECT COUNT(*) AS `total`, ANY_VALUE(`platform`) AS `platform`,
+                               ANY_VALUE(`network`) AS `network`, MAX(`version`) AS `version` FROM `gserver`
                                WHERE `platform` LIKE "%s" AND `last_contact` >= `last_failure`
                                ORDER BY `version` ASC;', $p);
                $total = $total + $c[0]['total'];
@@ -474,9 +475,6 @@ function admin_page_summary(App $a) {
        $r = qu("SELECT COUNT(`id`) AS `count` FROM `register`");
        $pending = $r[0]['count'];
 
-       $r = qu("SELECT COUNT(*) AS `total` FROM `deliverq` WHERE 1");
-       $deliverq = (($r) ? $r[0]['total'] : 0);
-
        $r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1");
        $queue = (($r) ? $r[0]['total'] : 0);
 
@@ -485,7 +483,7 @@ function admin_page_summary(App $a) {
 
        // We can do better, but this is a quick queue status
 
-       $queues = array('label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue, 'workerq' => $workerqueue);
+       $queues = array('label' => t('Message queues'), 'queue' => $queue, 'workerq' => $workerqueue);
 
 
        $t = get_markup_template("admin_summary.tpl");
diff --git a/mod/manifest.php b/mod/manifest.php
new file mode 100644 (file)
index 0000000..6dc0d10
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+    use Friendica\Core\Config;
+
+    function manifest_content(App $a) {
+
+               $tpl = get_markup_template('manifest.tpl');
+
+               header('Content-type: application/manifest+json');
+
+               $touch_icon = Config::get('system', 'touch_icon', 'images/friendica-128.png');
+               if ($touch_icon == '') {
+                       $touch_icon = 'images/friendica-128.png';
+               }
+
+               $o = replace_macros($tpl, array(
+                       '$baseurl' => App::get_baseurl(),
+                       '$touch_icon' => $touch_icon,
+                       '$title' => Config::get('config', 'sitename', 'Friendica'),
+               ));
+
+               echo $o;
+
+               killme();
+
+       }
+?>
index 9e966914668e40d760be76c3ac0e2f9e950e8fdd..d3bd1558cc8d5f6116755677be3e0a54250e7180 100644 (file)
@@ -349,7 +349,7 @@ function message_content(App $a) {
 
                $o .= $header;
 
-               $r = q("SELECT count(*) AS `total` FROM `mail`
+               $r = q("SELECT count(*) AS `total` FROM `mail`, ANY_VALUE(`created`) AS `created`
                        WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `created` DESC",
                        intval(local_user())
                );
@@ -528,9 +528,14 @@ function message_content(App $a) {
 }
 
 function get_messages($user, $lstart, $lend) {
-
+       //TODO: rewritte with a sub-query to get the first message of each private thread with certainty
        return q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`,
-               `mail`.* , `contact`.`name`, `contact`.`url`, `contact`.`thumb` , `contact`.`network`,
+               ANY_VALUE(`mail`.`id`), ANY_VALUE(`mail`.`uid`), ANY_VALUE(`mail`.`guid`), ANY_VALUE(`mail`.`from-name`),
+               ANY_VALUE(`mail`.`from-photo`), ANY_VALUE(`mail`.`from-url`), ANY_VALUE(`mail`.`contact-id`),
+               ANY_VALUE(`mail`.`convid`), ANY_VALUE(`mail`.`title`), ANY_VALUE(`mail`.`body`), ANY_VALUE(`mail`.`seen`),
+               ANY_VALUE(`mail`.`reply`), ANY_VALUE(`mail`.`replied`), ANY_VALUE(`mail`.`unknown`),
+               ANY_VALUE(`mail`.`uri`), ANY_VALUE(`mail`.`parent-uri`), ANY_VALUE(`mail`.`created`),
+               ANY_VALUE(`contact`.`name`), ANY_VALUE(`contact`.`url`), ANY_VALUE(`contact`.`thumb`), ANY_VALUE(`contact`.`network`),
                count( * ) as count
                FROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id`
                WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `mailcreated` DESC  LIMIT %d , %d ",
index 3acd39b2af6311f144a1af9fc86a44b13cdaa556..8e4782977437448d6f25a1673e7f02a03b8811d2 100644 (file)
@@ -1240,7 +1240,9 @@ function photos_content(App $a) {
                        $order = 'DESC';
                }
 
-               $r = q("SELECT `resource-id`, `id`, `filename`, type, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
+               $r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,
+                       ANY_VALUE(`type`) AS `type`, max(`scale`) AS `scale`, ANY_VALUE(`desc`) as `desc`
+                       FROM `photo` WHERE `uid` = %d AND `album` = '%s'
                        AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT %d , %d",
                        intval($owner_uid),
                        dbesc($album),
index b5330c7b330bcfebdf64c51446432ebfb1baf8b5..ba496a70bd87bdbbe7d00f6431077c8be192eabe 100644 (file)
@@ -199,7 +199,7 @@ function ping_init(App $a)
                $cachekey = "ping_init:".local_user();
                $ev = Cache::get($cachekey);
                if (is_null($ev)) {
-                       $ev = qu("SELECT count(`event`.`id`) AS total, type, start, adjust FROM `event`
+                       $ev = qu("SELECT type, start, adjust FROM `event`
                                WHERE `event`.`uid` = %d AND `start` < '%s' AND `finish` > '%s' and `ignore` = 0
                                ORDER BY `start` ASC ",
                                intval(local_user()),
@@ -212,7 +212,7 @@ function ping_init(App $a)
                }
 
                if (dbm::is_result($ev)) {
-                       $all_events = intval($ev[0]['total']);
+                       $all_events = count($ev);
 
                        if ($all_events) {
                                $str_now = datetime_convert('UTC', $a->timezone, 'now', 'Y-m-d');
index fbce509d29634e4f6a2402b1636c8360190366fc..a83cb076f26b883a04504be31e9a5974e95ed64d 100644 (file)
@@ -210,7 +210,7 @@ function profile_content(App $a, $update = 0) {
 
        if ($update) {
 
-               $r = q("SELECT distinct(parent) AS `item_id`, `item`.`network` AS `item_network`
+               $r = q("SELECT distinct(parent) AS `item_id`, `item`.`network` AS `item_network`, `item`.`created`
                        FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
                        AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
                        WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND
index 7d588aa4d15693c12b16dad0bf61006d697223fb..f274b2a8798f6139e16ac11af1aa440e5d164d83 100644 (file)
@@ -214,7 +214,7 @@ function search_content(App $a) {
                        FROM `item` %s
                        WHERE %s AND (`item`.`uid` = 0 OR (`item`.`uid` = %s AND NOT `item`.`global`))
                                $sql_extra
-                       GROUP BY `item`.`uri` ORDER BY `item`.`id` DESC LIMIT %d , %d",
+                       GROUP BY `item`.`uri`, `item`.`id` ORDER BY `item`.`id` DESC LIMIT %d , %d",
                                item_fieldlists(), item_joins(), item_condition(),
                                intval(local_user()),
                                intval($a->pager['start']), intval($a->pager['itemspage']));
index 3828b8f1fefb649df1a5973261639dac46636b10..269d537854c5467f4fbb9ceef166a15017735168 100644 (file)
@@ -356,7 +356,9 @@ function videos_content(App $a) {
                $a->set_pager_itemspage(20);
        }
 
-       $r = q("SELECT hash, `id`, `filename`, filetype FROM `attach`
+       $r = q("SELECT hash, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`created`) AS `created`,
+               ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`filetype`) as `filetype`
+               FROM `attach`
                WHERE `uid` = %d AND filetype LIKE '%%video%%'
                $sql_extra GROUP BY hash ORDER BY `created` DESC LIMIT %d , %d",
                intval($a->data['user']['uid']),
index 8404f5bf26ad7e11e6f324180690e9fd44fcfa8c..f1117e9b7733c6cd4a49f8b00646715cdf5533bc 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-define('UPDATE_VERSION' , 1216);
+define('UPDATE_VERSION' , 1218);
 
 /**
  *
index a8243b6149f57dcb96637655c45327aa9be9f726..e650144134960f583579228821372ada5fe20461 100644 (file)
@@ -11,7 +11,7 @@
 
        <dl>
                <dt>{{$queues.label}}</dt>
-               <dd>{{$queues.deliverq}} - <a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a> - {{$queues.workerq}}</dd>
+               <dd><a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a> - {{$queues.workerq}}</dd>
        </dl>
        <dl>
                <dt>{{$pending.0}}</dt>
index bfc5728ed267e6641db596388e30a0b7923ad351..e7df8a18cde05c16b15cc43ceff67801ecbe30ca 100644 (file)
@@ -19,6 +19,7 @@
 <link rel="apple-touch-icon" href="{{$touch_icon}}"/>
 
 <meta name="apple-mobile-web-app-capable" content="yes" />
+<link rel="manifest" href="{{$baseurl}}/manifest" />
 <script>
 // Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
 (function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
index b7acd6c50583a74b3389e38e65ff9c152ff585a7..aff1c320a26786cd94c0ec6d95973af3972d35ed 100644 (file)
@@ -15,7 +15,7 @@
                                        {{if $profile.network}}<span class="profile-network"> ({{$profile.network}})</span>{{/if}}
                                </div>
                                {{*{{if $profile.about}}<div class="profile-details profile-about">{{$profile.about}}</div>{{/if}}*}}
-       
+
                        </div>
                        <div class="hover-card-actions  right-aligned">
                                {{* here are the differnt actions like privat message, poke, delete and so on *}}
@@ -26,7 +26,7 @@
                                </div>
                                <div class="hover-card-actions-connection">
                                        {{if $profile.actions.network}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.network.1}}" title="{{$profile.actions.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
-                                       {{if $profile.actions.edit}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.edit.1}}" title="{{$profile.actions.edit.0}}"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}}
+                                       {{if $profile.actions.edit}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.edit.1}}" title="{{$profile.actions.edit.0}}"><i class="fa fa-user" aria-hidden="true"></i></a>{{/if}}
                                        {{if $profile.actions.follow}}<a class="btn btn-labeled btn-primary btn-sm" href="{{$profile.actions.follow.1}}" title="{{$profile.actions.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
                                </div>
                        </div>
diff --git a/view/templates/manifest.tpl b/view/templates/manifest.tpl
new file mode 100644 (file)
index 0000000..6f92947
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "name": "{{$title}}",
+  "start_url": "{{$baseurl}}",
+  "display": "standalone",
+  "description": "A Decentralized Social Network",
+  "icons": [{
+    "src": "{{$baseurl}}/{{$touch_icon}}"
+  }]
+}
index 5ae4fd4f793e06707def5a4175425b246a6afd50..36564cf3370d7b97d6c91b3e904d517a78d8f6da 100644 (file)
@@ -42,7 +42,6 @@
 
                                {{/if}}
                        </div>
-
                </div>
 
                <div class="media-body">
@@ -51,7 +50,7 @@
                                {{if $contact.photo_menu.pm     }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.pm.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.pm.0}}"><i class="fa fa-envelope" aria-hidden="true"></i></button>{{/if}}
                                {{if $contact.photo_menu.poke   }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.poke.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.poke.0}}"><i class="fa fa-heartbeat" aria-hidden="true"></i></button>{{/if}}
                                {{if $contact.photo_menu.network}}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.network.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.network.0}}"><i class="fa fa-cloud" aria-hidden="true"></i></a>{{/if}}
-                               {{if $contact.photo_menu.edit   }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.edit.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.edit.0}}"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}}
+                               {{if $contact.photo_menu.edit   }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.edit.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.edit.0}}"><i class="fa fa-user" aria-hidden="true"></i></a>{{/if}}
                                {{if $contact.photo_menu.drop   }}<button type="button" class="contact-action-link btn-link" onclick="addToModal('{{$contact.photo_menu.drop.1}}')" data-toggle="tooltip" title="{{$contact.photo_menu.drop.0}}"><i class="fa fa-user-times" aria-hidden="true"></i></button>{{/if}}
                                {{if $contact.photo_menu.follow }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.follow.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.follow.0}}"><i class="fa fa-user-plus" aria-hidden="true"></i></a>{{/if}}
                                {{if $contact.photo_menu.hide   }}<a class="contact-action-link btn-link" href="{{$contact.photo_menu.hide.1}}" data-toggle="tooltip" title="{{$contact.photo_menu.hide.0}}"><i class="fa fa-times" aria-hidden="true"></i></a>{{/if}}
index 32005417c82b7e1916172ac6c939aceac700b88c..882d2215cfe58396913d0fb40ec5aa026be46eef 100644 (file)
@@ -41,6 +41,7 @@
 <link rel="apple-touch-icon" href="{{$touch_icon}}"/>
 
 <meta name="apple-mobile-web-app-capable" content="yes" />
+<link rel="manifest" href="{{$baseurl}}/manifest" />
 <script>
 // Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
 (function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");