73 lines
2.3 KiB
Diff
73 lines
2.3 KiB
Diff
# UNDF: UNDF-2026-000001188
|
|
--- a/src/objects.c
|
|
+++ b/src/objects.c
|
|
@@ -28,6 +28,12 @@
|
|
STATLIST(database_list);
|
|
STATLIST(pool_list);
|
|
STATLIST(peer_list);
|
|
STATLIST(peer_pool_list);
|
|
+/* AA-tree index for O(log D) database lookup by name.
|
|
+ * Mirrors the pattern used by user_tree for global user lookup. */
|
|
+static struct AATree db_name_tree;
|
|
+
|
|
+static int db_name_node_cmp(uintptr_t nameptr, struct AANode *node)
|
|
+{
|
|
+ PgDatabase *db = container_of(node, PgDatabase, name_tree_node);
|
|
+ return strcmp((const char *)nameptr, db->name);
|
|
+}
|
|
|
|
/* find an existing database */
|
|
PgDatabase *find_database(const char *name)
|
|
{
|
|
- struct List *item, *tmp;
|
|
- PgDatabase *db;
|
|
- statlist_for_each(item, &database_list) {
|
|
- db = container_of(item, PgDatabase, head);
|
|
- if (strcmp(db->name, name) == 0)
|
|
- return db;
|
|
- }
|
|
- /* also trying to find in idle autodatabases list */
|
|
- statlist_for_each_safe(item, &autodatabase_idle_list, tmp) {
|
|
- db = container_of(item, PgDatabase, head);
|
|
- if (strcmp(db->name, name) == 0) {
|
|
- db->inactive_time = 0;
|
|
- statlist_remove(&autodatabase_idle_list, &db->head);
|
|
- put_in_order(&db->head, &database_list, cmp_database);
|
|
- return db;
|
|
- }
|
|
- }
|
|
- return NULL;
|
|
+ struct List *item, *tmp;
|
|
+ PgDatabase *db;
|
|
+ struct AANode *node;
|
|
+
|
|
+ /* O(log D) lookup in the AA-tree index */
|
|
+ node = aatree_search(&db_name_tree, (uintptr_t)name);
|
|
+ if (node) {
|
|
+ db = container_of(node, PgDatabase, name_tree_node);
|
|
+ return db;
|
|
+ }
|
|
+
|
|
+ /* also trying to find in idle autodatabases list (linear, but rare) */
|
|
+ statlist_for_each_safe(item, &autodatabase_idle_list, tmp) {
|
|
+ db = container_of(item, PgDatabase, head);
|
|
+ if (strcmp(db->name, name) == 0) {
|
|
+ db->inactive_time = 0;
|
|
+ statlist_remove(&autodatabase_idle_list, &db->head);
|
|
+ put_in_order(&db->head, &database_list, cmp_database);
|
|
+ aatree_insert(&db_name_tree, (uintptr_t)db->name, &db->name_tree_node);
|
|
+ return db;
|
|
+ }
|
|
+ }
|
|
+ return NULL;
|
|
}
|
|
|
|
/* create new object if new, then return it */
|
|
PgDatabase *add_database(const char *name)
|
|
@@ -480,6 +506,7 @@ PgDatabase *add_database(const char *name)
|
|
aatree_init(&db->user_tree, credentials_node_cmp, credentials_node_release);
|
|
put_in_order(&db->head, &database_list, cmp_database);
|
|
+ aatree_insert(&db_name_tree, (uintptr_t)db->name, &db->name_tree_node);
|
|
}
|
|
|
|
return db;
|