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
|
||||
- Rename feeds correctly via TTRSS protocol
|
||||
- Toggle marks correctly via TTRSS protocol
|
||||
- Sort everything case-insensitively
|
||||
- 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)
|
||||
==========================
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ use JKingWeb\Arsse\Misc\Date;
|
|||
use JKingWeb\Arsse\Misc\ValueInfo;
|
||||
|
||||
class Database {
|
||||
const SCHEMA_VERSION = 2;
|
||||
const SCHEMA_VERSION = 3;
|
||||
const LIMIT_ARTICLES = 50;
|
||||
// articleList verbosity levels
|
||||
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;
|
||||
$path = ($basePath ?? \JKingWeb\Arsse\BASE."sql").$sep."SQLite3".$sep;
|
||||
// turn off foreign keys
|
||||
$this->exec("PRAGMA foreign_keys = no");
|
||||
// lock the database
|
||||
$this->savepointCreate(true);
|
||||
for ($a = $this->schemaVersion(); $a < $to; $a++) {
|
||||
|
@ -124,6 +126,8 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver {
|
|||
$this->savepointRelease();
|
||||
}
|
||||
$this->savepointRelease();
|
||||
// turn foreign keys back on
|
||||
$this->exec("PRAGMA foreign_keys = yes");
|
||||
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() {
|
||||
$this->data['arsse_feeds']['rows'] = [
|
||||
[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"),''],
|
||||
];
|
||||
// initialize a partial mock of the Database object to later manipulate the feedUpdate method
|
||||
|
@ -237,7 +237,7 @@ trait SeriesSubscription {
|
|||
$exp = [
|
||||
[
|
||||
'url' => "http://example.com/feed2",
|
||||
'title' => "Eek",
|
||||
'title' => "eek",
|
||||
'folder' => null,
|
||||
'top_folder' => null,
|
||||
'unread' => 4,
|
||||
|
@ -254,7 +254,7 @@ trait SeriesSubscription {
|
|||
'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");
|
||||
$this->assertArraySubset($exp[0], Arsse::$db->subscriptionPropertiesGet($this->user, 1));
|
||||
Phake::verify(Arsse::$user)->authorize($this->user, "subscriptionPropertiesGet");
|
||||
|
@ -265,7 +265,7 @@ trait SeriesSubscription {
|
|||
$exp = [
|
||||
[
|
||||
'url' => "http://example.com/feed2",
|
||||
'title' => "Eek",
|
||||
'title' => "eek",
|
||||
'folder' => null,
|
||||
'top_folder' => null,
|
||||
'unread' => 4,
|
||||
|
|
Loading…
Reference in a new issue