]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/database.c
Log how long it takes to open the database
[people/ms/libloc.git] / src / database.c
index 41b5ffd3c9687bd635915f4521f82035211b1165..1512fd2a1fdfceed67a35679fb7290bf0b5bf4d5 100644 (file)
@@ -120,11 +120,8 @@ static int loc_database_read_header_v0(struct loc_database* db) {
        off_t pool_offset  = ntohl(header.pool_offset);
        size_t pool_length = ntohl(header.pool_length);
 
-       int r = loc_stringpool_new(db->ctx, &db->pool, 0);
-       if (r)
-               return r;
-
-       r = loc_stringpool_read(db->pool, db->file, pool_offset, pool_length);
+       int r = loc_stringpool_open(db->ctx, &db->pool,
+               db->file, pool_length, pool_offset);
        if (r)
                return r;
 
@@ -159,6 +156,27 @@ static FILE* copy_file_pointer(FILE* f) {
        return fdopen(fd, "r");
 }
 
+static int loc_database_read(struct loc_database* db) {
+       clock_t start = clock();
+
+       // Read magic bytes
+       int r = loc_database_read_magic(db);
+       if (r)
+               return r;
+
+       // Read the header
+       r = loc_database_read_header(db);
+       if (r)
+               return r;
+
+       clock_t end = clock();
+
+       INFO(db->ctx, "Opened database in %.8fs\n",
+               (double)(end - start) / CLOCKS_PER_SEC);
+
+       return 0;
+}
+
 LOC_EXPORT int loc_database_new(struct loc_ctx* ctx, struct loc_database** database, FILE* f) {
        struct loc_database* db = calloc(1, sizeof(*db));
        if (!db)
@@ -176,15 +194,11 @@ LOC_EXPORT int loc_database_new(struct loc_ctx* ctx, struct loc_database** datab
        if (!db->file)
                goto FAIL;
 
-       // Read magic bytes
-       int r = loc_database_read_magic(db);
-       if (r)
-               return r;
-
-       // Read the header
-       r = loc_database_read_header(db);
-       if (r)
+       int r = loc_database_read(db);
+       if (r) {
+               loc_database_unref(db);
                return r;
+       }
 
        *database = db;
 
@@ -275,6 +289,9 @@ LOC_EXPORT int loc_database_get_as(struct loc_database* db, struct loc_as** as,
        off_t lo = 0;
        off_t hi = db->as_count - 1;
 
+       // Save start time
+       clock_t start = clock();
+
        while (lo <= hi) {
                off_t i = (lo + hi) / 2;
 
@@ -285,8 +302,15 @@ LOC_EXPORT int loc_database_get_as(struct loc_database* db, struct loc_as** as,
 
                // Check if this is a match
                uint32_t as_number = loc_as_get_number(*as);
-               if (as_number == number)
+               if (as_number == number) {
+                       clock_t end = clock();
+
+                       // Log how fast this has been
+                       DEBUG(db->ctx, "Found AS%u in %.8fs\n", as_number,
+                               (double)(end - start) / CLOCKS_PER_SEC);
+
                        return 0;
+               }
 
                // If it wasn't, we release the AS and
                // adjust our search pointers
@@ -301,5 +325,5 @@ LOC_EXPORT int loc_database_get_as(struct loc_database* db, struct loc_as** as,
        // Nothing found
        *as = NULL;
 
-       return 0;
+       return 1;
 }