mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 13:12:41 +00:00
Use SQLite nocase collation; improves #127
This commit is contained in:
parent
c8f012c5fc
commit
0b3b3cb49c
5 changed files with 124 additions and 5 deletions
|
@ -6,8 +6,12 @@ Bug fixes:
|
||||||
- Accept base64-encoded passwords from TTRSS clients
|
- Accept base64-encoded passwords from TTRSS clients
|
||||||
- Rename feeds correctly via TTRSS protocol
|
- Rename feeds correctly via TTRSS protocol
|
||||||
- Toggle marks correctly via TTRSS protocol
|
- Toggle marks correctly via TTRSS protocol
|
||||||
|
- Sort everything case-insensitively
|
||||||
- Be even stricter about output data types in NextCloud News
|
- Be even stricter about output data types in NextCloud News
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- Do not omit read feeds from TTRSS' getCounters, to fix some clients
|
||||||
|
|
||||||
Version 0.2.0 (2017-11-30)
|
Version 0.2.0 (2017-11-30)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ use JKingWeb\Arsse\Misc\Date;
|
||||||
use JKingWeb\Arsse\Misc\ValueInfo;
|
use JKingWeb\Arsse\Misc\ValueInfo;
|
||||||
|
|
||||||
class Database {
|
class Database {
|
||||||
const SCHEMA_VERSION = 2;
|
const SCHEMA_VERSION = 3;
|
||||||
const LIMIT_ARTICLES = 50;
|
const LIMIT_ARTICLES = 50;
|
||||||
// articleList verbosity levels
|
// articleList verbosity levels
|
||||||
const LIST_MINIMAL = 0; // only that metadata which is required for context matching
|
const LIST_MINIMAL = 0; // only that metadata which is required for context matching
|
||||||
|
|
|
@ -90,6 +90,8 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver {
|
||||||
}
|
}
|
||||||
$sep = \DIRECTORY_SEPARATOR;
|
$sep = \DIRECTORY_SEPARATOR;
|
||||||
$path = ($basePath ?? \JKingWeb\Arsse\BASE."sql").$sep."SQLite3".$sep;
|
$path = ($basePath ?? \JKingWeb\Arsse\BASE."sql").$sep."SQLite3".$sep;
|
||||||
|
// turn off foreign keys
|
||||||
|
$this->exec("PRAGMA foreign_keys = no");
|
||||||
// lock the database
|
// lock the database
|
||||||
$this->savepointCreate(true);
|
$this->savepointCreate(true);
|
||||||
for ($a = $this->schemaVersion(); $a < $to; $a++) {
|
for ($a = $this->schemaVersion(); $a < $to; $a++) {
|
||||||
|
@ -124,6 +126,8 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver {
|
||||||
$this->savepointRelease();
|
$this->savepointRelease();
|
||||||
}
|
}
|
||||||
$this->savepointRelease();
|
$this->savepointRelease();
|
||||||
|
// turn foreign keys back on
|
||||||
|
$this->exec("PRAGMA foreign_keys = yes");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
111
sql/SQLite3/2.sql
Normal file
111
sql/SQLite3/2.sql
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
-- Copyright 2017 J. King, Dustin Wilson et al.
|
||||||
|
-- See LICENSE and AUTHORS files for details
|
||||||
|
|
||||||
|
-- Correct collation sequences
|
||||||
|
alter table arsse_users rename to arsse_users_old;
|
||||||
|
create table arsse_users(
|
||||||
|
id text primary key not null collate nocase,
|
||||||
|
password text,
|
||||||
|
name text collate nocase,
|
||||||
|
avatar_type text,
|
||||||
|
avatar_data blob,
|
||||||
|
admin boolean default 0,
|
||||||
|
rights integer not null default 0
|
||||||
|
);
|
||||||
|
insert into arsse_users(id,password,name,avatar_type,avatar_data,admin,rights) select id,password,name,avatar_type,avatar_data,admin,rights from arsse_users_old;
|
||||||
|
drop table arsse_users_old;
|
||||||
|
|
||||||
|
alter table arsse_folders rename to arsse_folders_old;
|
||||||
|
create table arsse_folders(
|
||||||
|
id integer primary key,
|
||||||
|
owner text not null references arsse_users(id) on delete cascade on update cascade,
|
||||||
|
parent integer references arsse_folders(id) on delete cascade,
|
||||||
|
name text not null collate nocase,
|
||||||
|
modified text not null default CURRENT_TIMESTAMP, --
|
||||||
|
unique(owner,name,parent)
|
||||||
|
);
|
||||||
|
insert into arsse_folders select * from arsse_folders_old;
|
||||||
|
drop table arsse_folders_old;
|
||||||
|
|
||||||
|
alter table arsse_feeds rename to arsse_feeds_old;
|
||||||
|
create table arsse_feeds(
|
||||||
|
id integer primary key,
|
||||||
|
url text not null,
|
||||||
|
title text collate nocase,
|
||||||
|
favicon text,
|
||||||
|
source text,
|
||||||
|
updated text,
|
||||||
|
modified text,
|
||||||
|
next_fetch text,
|
||||||
|
orphaned text,
|
||||||
|
etag text not null default '',
|
||||||
|
err_count integer not null default 0,
|
||||||
|
err_msg text,
|
||||||
|
username text not null default '',
|
||||||
|
password text not null default '',
|
||||||
|
size integer not null default 0,
|
||||||
|
scrape boolean not null default 0,
|
||||||
|
unique(url,username,password)
|
||||||
|
);
|
||||||
|
insert into arsse_feeds select * from arsse_feeds_old;
|
||||||
|
drop table arsse_feeds_old;
|
||||||
|
|
||||||
|
alter table arsse_subscriptions rename to arsse_subscriptions_old;
|
||||||
|
create table arsse_subscriptions(
|
||||||
|
id integer primary key,
|
||||||
|
owner text not null references arsse_users(id) on delete cascade on update cascade,
|
||||||
|
feed integer not null references arsse_feeds(id) on delete cascade,
|
||||||
|
added text not null default CURRENT_TIMESTAMP,
|
||||||
|
modified text not null default CURRENT_TIMESTAMP,
|
||||||
|
title text collate nocase,
|
||||||
|
order_type int not null default 0,
|
||||||
|
pinned boolean not null default 0,
|
||||||
|
folder integer references arsse_folders(id) on delete cascade,
|
||||||
|
unique(owner,feed)
|
||||||
|
);
|
||||||
|
insert into arsse_subscriptions select * from arsse_subscriptions_old;
|
||||||
|
drop table arsse_subscriptions_old;
|
||||||
|
|
||||||
|
alter table arsse_articles rename to arsse_articles_old;
|
||||||
|
create table arsse_articles(
|
||||||
|
id integer primary key,
|
||||||
|
feed integer not null references arsse_feeds(id) on delete cascade,
|
||||||
|
url text,
|
||||||
|
title text collate nocase,
|
||||||
|
author text collate nocase,
|
||||||
|
published text,
|
||||||
|
edited text,
|
||||||
|
modified text not null default CURRENT_TIMESTAMP,
|
||||||
|
content text,
|
||||||
|
guid text,
|
||||||
|
url_title_hash text not null,
|
||||||
|
url_content_hash text not null,
|
||||||
|
title_content_hash text not null
|
||||||
|
);
|
||||||
|
insert into arsse_articles select * from arsse_articles_old;
|
||||||
|
drop table arsse_articles_old;
|
||||||
|
|
||||||
|
alter table arsse_categories rename to arsse_categories_old;
|
||||||
|
create table arsse_categories(
|
||||||
|
article integer not null references arsse_articles(id) on delete cascade,
|
||||||
|
name text collate nocase
|
||||||
|
);
|
||||||
|
insert into arsse_categories select * from arsse_categories_old;
|
||||||
|
drop table arsse_categories_old;
|
||||||
|
|
||||||
|
|
||||||
|
alter table arsse_labels rename to arsse_labels_old;
|
||||||
|
create table arsse_labels (
|
||||||
|
id integer primary key,
|
||||||
|
owner text not null references arsse_users(id) on delete cascade on update cascade,
|
||||||
|
name text not null collate nocase,
|
||||||
|
modified text not null default CURRENT_TIMESTAMP,
|
||||||
|
unique(owner,name)
|
||||||
|
);
|
||||||
|
insert into arsse_labels select * from arsse_labels_old;
|
||||||
|
drop table arsse_labels_old;
|
||||||
|
|
||||||
|
-- set version marker
|
||||||
|
pragma user_version = 3;
|
||||||
|
update arsse_meta set value = '3' where key is 'schema_version';
|
|
@ -110,7 +110,7 @@ trait SeriesSubscription {
|
||||||
public function setUpSeries() {
|
public function setUpSeries() {
|
||||||
$this->data['arsse_feeds']['rows'] = [
|
$this->data['arsse_feeds']['rows'] = [
|
||||||
[1,"http://example.com/feed1", "Ook", "", "",strtotime("now"),''],
|
[1,"http://example.com/feed1", "Ook", "", "",strtotime("now"),''],
|
||||||
[2,"http://example.com/feed2", "Eek", "", "",strtotime("now - 1 hour"),'http://example.com/favicon.ico'],
|
[2,"http://example.com/feed2", "eek", "", "",strtotime("now - 1 hour"),'http://example.com/favicon.ico'],
|
||||||
[3,"http://example.com/feed3", "Ack", "", "",strtotime("now + 1 hour"),''],
|
[3,"http://example.com/feed3", "Ack", "", "",strtotime("now + 1 hour"),''],
|
||||||
];
|
];
|
||||||
// initialize a partial mock of the Database object to later manipulate the feedUpdate method
|
// initialize a partial mock of the Database object to later manipulate the feedUpdate method
|
||||||
|
@ -237,7 +237,7 @@ trait SeriesSubscription {
|
||||||
$exp = [
|
$exp = [
|
||||||
[
|
[
|
||||||
'url' => "http://example.com/feed2",
|
'url' => "http://example.com/feed2",
|
||||||
'title' => "Eek",
|
'title' => "eek",
|
||||||
'folder' => null,
|
'folder' => null,
|
||||||
'top_folder' => null,
|
'top_folder' => null,
|
||||||
'unread' => 4,
|
'unread' => 4,
|
||||||
|
@ -254,7 +254,7 @@ trait SeriesSubscription {
|
||||||
'order_type' => 1,
|
'order_type' => 1,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
$this->assertResult($exp, Arsse::$db->subscriptionList($this->user));
|
$this->assertSame($exp, Arsse::$db->subscriptionList($this->user)->getAll());
|
||||||
Phake::verify(Arsse::$user)->authorize($this->user, "subscriptionList");
|
Phake::verify(Arsse::$user)->authorize($this->user, "subscriptionList");
|
||||||
$this->assertArraySubset($exp[0], Arsse::$db->subscriptionPropertiesGet($this->user, 1));
|
$this->assertArraySubset($exp[0], Arsse::$db->subscriptionPropertiesGet($this->user, 1));
|
||||||
Phake::verify(Arsse::$user)->authorize($this->user, "subscriptionPropertiesGet");
|
Phake::verify(Arsse::$user)->authorize($this->user, "subscriptionPropertiesGet");
|
||||||
|
@ -265,7 +265,7 @@ trait SeriesSubscription {
|
||||||
$exp = [
|
$exp = [
|
||||||
[
|
[
|
||||||
'url' => "http://example.com/feed2",
|
'url' => "http://example.com/feed2",
|
||||||
'title' => "Eek",
|
'title' => "eek",
|
||||||
'folder' => null,
|
'folder' => null,
|
||||||
'top_folder' => null,
|
'top_folder' => null,
|
||||||
'unread' => 4,
|
'unread' => 4,
|
||||||
|
|
Loading…
Reference in a new issue