+LOC_EXPORT size_t loc_database_count_as(struct loc_database* db) {
+ return db->as_count;
+}
+
+static int loc_database_has_as(struct loc_database* db, struct loc_as* as) {
+ for (unsigned int i = 0; i < db->as_count; i++) {
+ if (loc_as_cmp(as, db->as[i]) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+static int __loc_as_cmp(const void* as1, const void* as2) {
+ return loc_as_cmp(*(struct loc_as**)as1, *(struct loc_as**)as2);
+}
+
+static void loc_database_sort_ases(struct loc_database* db) {
+ qsort(db->as, db->as_count, sizeof(*db->as), __loc_as_cmp);
+}
+
+static struct loc_as* __loc_database_add_as(struct loc_database* db, struct loc_as* as) {
+ // Check if AS exists already
+ int i = loc_database_has_as(db, as);
+ if (i >= 0) {
+ loc_as_unref(as);
+
+ // Select already existing AS
+ as = db->as[i];
+
+ return loc_as_ref(as);
+ }
+
+ db->as_count++;
+
+ // Make space for the new entry
+ db->as = realloc(db->as, sizeof(*db->as) * db->as_count);
+
+ // Add the new entry at the end
+ db->as[db->as_count - 1] = loc_as_ref(as);
+
+ // Sort everything
+ loc_database_sort_ases(db);
+
+ return as;
+}
+
+LOC_EXPORT struct loc_as* loc_database_add_as(struct loc_database* db, uint32_t number) {
+ struct loc_as* as;
+ int r = loc_as_new(db->ctx, db->pool, &as, number);
+ if (r)
+ return NULL;
+
+ return __loc_database_add_as(db, as);
+}
+
+static int loc_database_read_magic(struct loc_database* db) {