public function userPropertiesSet(string $user, array $data): bool {
public function userPropertiesSet(string $user, array $data): bool {
if (!$this->userExists($user)) {
if (!$this->userExists($user)) {
@ -660,20 +660,27 @@ class Database {
// make sure both that the prospective parent exists, and that the it is not one of its children (a circular dependence);
// make sure both that the prospective parent exists, and that the it is not one of its children (a circular dependence);
// also make sure that a folder with the same prospective name and parent does not already exist: if the parent is null,
// also make sure that a folder with the same prospective name and parent does not already exist: if the parent is null,
// SQL will happily accept duplicates (null is not unique), so we must do this check ourselves
// SQL will happily accept duplicates (null is not unique), so we must do this check ourselves
$p = $this->db->prepare(
$p = $this->db->prepareArray(
"WITH RECURSIVE
"WITH RECURSIVE
target as (select ? as userid, ? as source, ? as dest, ? as new_name),
target as (
folders as (SELECT id from arsse_folders join target on owner = userid and coalesce(parent,0) = source union all select arsse_folders.id as id from arsse_folders join folders on arsse_folders.parent=folders.id)
SELECT ? as userid, ? as source, ? as dest, ? as new_name
".
),
"SELECT
folders as (
case when ((select dest from target) is null or exists(select id from arsse_folders join target on owner = userid and coalesce(id,0) = coalesce(dest,0))) then 1 else 0 end as extant,
SELECT id from arsse_folders join target on owner = userid and coalesce(parent,0) = source
case when not exists(select id from folders where id = coalesce((select dest from target),0)) then 1 else 0 end as valid,
union all
case when not exists(select id from arsse_folders join target on coalesce(parent,0) = coalesce(dest,0) and name = coalesce((select new_name from target),(select name from arsse_folders join target on id = source))) then 1 else 0 end as available
select arsse_folders.id as id from arsse_folders join folders on arsse_folders.parent=folders.id
",
)
"str",
SELECT
"strict int",
case when
"int",
((select dest from target) is null or exists(select id from arsse_folders join target on owner = userid and coalesce(id,0) = coalesce(dest,0)))
"str"
then 1 else 0 end as extant,
case when
not exists(select id from folders where id = coalesce((select dest from target),0))
then 1 else 0 end as valid,
case when
not exists(select id from arsse_folders join target on coalesce(parent,0) = coalesce(dest,0) and name = coalesce((select new_name from target),(select name from arsse_folders join target on id = source)))
then 1 else 0 end as available",
["str", "strict int", "int", "str"]
)->run($user, $id, $parent, $name)->getRow();
)->run($user, $id, $parent, $name)->getRow();
if (!$p['extant']) {
if (!$p['extant']) {
// if the parent doesn't exist or doesn't below to the user, throw an exception
// if the parent doesn't exist or doesn't below to the user, throw an exception
@ -757,7 +764,13 @@ class Database {
left join topmost as t on t.f_id = s.folder
left join topmost as t on t.f_id = s.folder
join arsse_feeds as f on f.id = s.feed
join arsse_feeds as f on f.id = s.feed
left join arsse_icons as i on i.id = f.icon
left join arsse_icons as i on i.id = f.icon
left join (select feed, count(*) as articles from arsse_articles group by feed) as article_stats on article_stats.feed = s.feed
left join (
select
feed,
count(*) as articles
from arsse_articles
group by feed
) as article_stats on article_stats.feed = s.feed
left join (
left join (
select
select
subscription,
subscription,
@ -1042,11 +1055,9 @@ class Database {
}
}
} catch (Feed\Exception $e) {
} catch (Feed\Exception $e) {
// update the database with the resultant error and the next fetch time, incrementing the error count
// update the database with the resultant error and the next fetch time, incrementing the error count
$this->db->prepare(
$this->db->prepareArray(
"UPDATE arsse_feeds SET updated = CURRENT_TIMESTAMP, next_fetch = ?, err_count = err_count + 1, err_msg = ? WHERE id = ?",
"UPDATE arsse_feeds SET updated = CURRENT_TIMESTAMP, next_fetch = ?, err_count = err_count + 1, err_msg = ? WHERE id = ?",
$qInsertEdition = $this->db->prepare("INSERT INTO arsse_editions(article) values(?)", 'int');
$qInsertEdition = $this->db->prepare("INSERT INTO arsse_editions(article) values(?)", 'int');
}
}
if (sizeof($feed->newItems)) {
if (sizeof($feed->newItems)) {
$qInsertArticle = $this->db->prepare(
$qInsertArticle = $this->db->prepareArray(
"INSERT INTO arsse_articles(url,title,author,published,edited,guid,content,url_title_hash,url_content_hash,title_content_hash,feed) values(?,?,?,?,?,?,?,?,?,?,?)",
"INSERT INTO arsse_articles(url,title,author,published,edited,guid,content,url_title_hash,url_content_hash,title_content_hash,feed) values(?,?,?,?,?,?,?,?,?,?,?)",
"SELECT id, edited, guid, url_title_hash, url_content_hash, title_content_hash FROM arsse_articles WHERE feed = ? and (guid in($cId) or url_title_hash in($cHashUT) or url_content_hash in($cHashUC) or title_content_hash in($cHashTC))",
"SELECT id, edited, guid, url_title_hash, url_content_hash, title_content_hash FROM arsse_articles WHERE feed = ? and (guid in($cId) or url_title_hash in($cHashUT) or url_content_hash in($cHashUC) or title_content_hash in($cHashTC))",