commit 82bcc4b465f73a5d1f2eebcf3813452bc1c37fbd
parent 6097ba55cf96444aac7fb9b74295722e8e5c3810
Author: default <nobody@localhost>
Date: Mon, 27 Jan 2025 16:59:08 +0100
Minor optimization in timeline retrieving.
Functions now receive an optional int *more, set to 1 if
there are more than the 'show' requested.
Diffstat:
5 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/activitypub.c b/activitypub.c
@@ -3081,7 +3081,7 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path,
int cnt = xs_number_get(xs_dict_get_def(srv_config, "max_public_entries", "20"));
/* get the public outbox or the pinned list */
- xs *elems = *p_path == 'o' ? timeline_simple_list(&snac, "public", 0, cnt) : pinned_list(&snac);
+ xs *elems = *p_path == 'o' ? timeline_simple_list(&snac, "public", 0, cnt, NULL) : pinned_list(&snac);
xs_list_foreach(elems, v) {
xs *i = NULL;
diff --git a/data.c b/data.c
@@ -1489,16 +1489,28 @@ xs_str *user_index_fn(snac *user, const char *idx_name)
}
-xs_list *timeline_simple_list(snac *user, const char *idx_name, int skip, int show)
+xs_list *timeline_simple_list(snac *user, const char *idx_name, int skip, int show, int *more)
/* returns a timeline (with all entries) */
{
xs *idx = user_index_fn(user, idx_name);
- return index_list_desc(idx, skip, show);
+ /* if a more flag is sent, request one more */
+ xs_list *lst = index_list_desc(idx, skip, show + (more != NULL ? 1 : 0));
+
+ if (more != NULL) {
+ if (xs_list_len(lst) > show) {
+ *more = 1;
+ lst = xs_list_del(lst, -1);
+ }
+ else
+ *more = 0;
+ }
+
+ return lst;
}
-xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show)
+xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show, int *more)
/* returns a timeline (only top level entries) */
{
int c_max;
@@ -1510,7 +1522,7 @@ xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show)
if (show > c_max)
show = c_max;
- xs *list = timeline_simple_list(snac, idx_name, skip, show);
+ xs *list = timeline_simple_list(snac, idx_name, skip, show, more);
return timeline_top_level(snac, list);
}
@@ -2709,9 +2721,9 @@ xs_list *content_search(snac *user, const char *regex,
const char *md5s[3] = {0};
int c[3] = {0};
- tls[0] = timeline_simple_list(user, "public", 0, XS_ALL); /* public */
+ tls[0] = timeline_simple_list(user, "public", 0, XS_ALL, NULL); /* public */
tls[1] = timeline_instance_list(0, XS_ALL); /* instance */
- tls[2] = priv ? timeline_simple_list(user, "private", 0, XS_ALL) : xs_list_new(); /* private or none */
+ tls[2] = priv ? timeline_simple_list(user, "private", 0, XS_ALL, NULL) : xs_list_new(); /* private or none */
/* first positioning */
for (int n = 0; n < 3; n++)
diff --git a/html.c b/html.c
@@ -3314,21 +3314,17 @@ int html_get_handler(const xs_dict *req, const char *q_path,
}
else {
xs *list = NULL;
- xs *next = NULL;
+ int more = 0;
- if (xs_is_true(xs_dict_get(srv_config, "strict_public_timelines"))) {
- list = timeline_simple_list(&snac, "public", skip, show);
- next = timeline_simple_list(&snac, "public", skip + show, 1);
- }
- else {
- list = timeline_list(&snac, "public", skip, show);
- next = timeline_list(&snac, "public", skip + show, 1);
- }
+ if (xs_is_true(xs_dict_get(srv_config, "strict_public_timelines")))
+ list = timeline_simple_list(&snac, "public", skip, show, &more);
+ else
+ list = timeline_list(&snac, "public", skip, show, &more);
xs *pins = pinned_list(&snac);
pins = xs_list_cat(pins, list);
- *body = html_timeline(&snac, pins, 1, skip, show, xs_list_len(next), NULL, "", 1, error);
+ *body = html_timeline(&snac, pins, 1, skip, show, more, NULL, "", 1, error);
*b_size = strlen(*body);
status = HTTP_STATUS_OK;
@@ -3490,13 +3486,14 @@ int html_get_handler(const xs_dict *req, const char *q_path,
xs_dict_get(req, "if-none-match"), etag);
}
else {
+ int more = 0;
+
snac_debug(&snac, 1, xs_fmt("building timeline"));
- xs *list = timeline_list(&snac, "private", skip, show);
- xs *next = timeline_list(&snac, "private", skip + show, 1);
+ xs *list = timeline_list(&snac, "private", skip, show, &more);
*body = html_timeline(&snac, list, 0, skip, show,
- xs_list_len(next), NULL, "/admin", 1, error);
+ more, NULL, "/admin", 1, error);
*b_size = strlen(*body);
status = HTTP_STATUS_OK;
@@ -3702,7 +3699,7 @@ int html_get_handler(const xs_dict *req, const char *q_path,
int cnt = xs_number_get(xs_dict_get_def(srv_config, "max_public_entries", "20"));
- xs *elems = timeline_simple_list(&snac, "public", 0, cnt);
+ xs *elems = timeline_simple_list(&snac, "public", 0, cnt, NULL);
xs *bio = xs_dup(xs_dict_get(snac.config, "bio"));
xs *rss_title = xs_fmt("%s (@%s@%s)",
diff --git a/mastoapi.c b/mastoapi.c
@@ -1676,7 +1676,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
else
if (strcmp(opt, "statuses") == 0) { /** **/
/* the public list of posts of a user */
- xs *timeline = timeline_simple_list(&snac2, "public", 0, 256);
+ xs *timeline = timeline_simple_list(&snac2, "public", 0, 256, NULL);
xs_list *p = timeline;
const xs_str *v;
diff --git a/snac.h b/snac.h
@@ -157,8 +157,8 @@ int timeline_here(snac *snac, const char *md5);
int timeline_get_by_md5(snac *snac, const char *md5, xs_dict **msg);
int timeline_del(snac *snac, const char *id);
xs_str *user_index_fn(snac *user, const char *idx_name);
-xs_list *timeline_simple_list(snac *user, const char *idx_name, int skip, int show);
-xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show);
+xs_list *timeline_simple_list(snac *user, const char *idx_name, int skip, int show, int *more);
+xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show, int *more);
int timeline_add(snac *snac, const char *id, const xs_dict *o_msg);
int timeline_admire(snac *snac, const char *id, const char *admirer, int like);