Changes to the files table and interface. Changed "age" to
authorSteve McIntyre <steve@einval.com>
Sun, 22 May 2005 13:28:57 +0000 (13:28 +0000)
committerSteve McIntyre <steve@einval.com>
Sun, 22 May 2005 13:28:57 +0000 (13:28 +0000)
"time_added" for a more logical interface.

Rather than do DB cleanup using "lookup_by_age"/"lookup_file_older"
and then "delete_by_name", just use "delete_by_age"

jigdb-sql.c
jigdb.h
jigsum.c

index 2187b4d..f60a897 100644 (file)
@@ -119,7 +119,7 @@ static int db_create_files_table(db_state_t *dbp)
     sprintf(sql_command, "CREATE TABLE files ("
             "size INTEGER,"
             "mtime INTEGER,"
-            "age INTEGER,"
+            "time_added INTEGER,"
             "filetype INTEGER,"
             "md5 VARCHAR(32),"
             "filename VARCHAR(%d),"
@@ -151,7 +151,7 @@ static int db_create_files_table(db_state_t *dbp)
             sqlite3_free(open_error);
         return error;
     }
-    sprintf(sql_command, "CREATE INDEX files_age ON files (age);");
+    sprintf(sql_command, "CREATE INDEX files_time_added ON files (time_added);");
     error = sqlite3_exec(dbp->db, sql_command, NULL, NULL, &open_error);
     if (error)
     {
@@ -401,7 +401,7 @@ static int results_callback(void *pArg, int argc, char **argv, char **columnName
             if (argv[1])
                 entry->data.file.mtime = strtoul(argv[1], NULL, 10);
             if (argv[2])
-                entry->data.file.age = strtoul(argv[2], NULL, 10);
+                entry->data.file.time_added = strtoul(argv[2], NULL, 10);
             if (argv[3])
                 entry->data.file.type = strtol(argv[3], NULL, 10);
             if (argv[4])
@@ -539,7 +539,7 @@ int db_store_file(JIGDB *dbp, db_file_entry_t *entry)
     sprintf(sql_command, "INSERT INTO files VALUES(%lld,%ld,%ld,%d,'%s','%s','%s');",
             entry->file_size,
             entry->mtime,
-            entry->age,
+            entry->time_added,
             entry->type,
             entry->md5,
             entry->filename,
@@ -555,9 +555,7 @@ int db_store_file(JIGDB *dbp, db_file_entry_t *entry)
     return error;
 }
 
-/* Look up the most recent record that is older than the specified
- * age */
-int db_lookup_file_by_age(JIGDB *dbp, time_t age, db_file_entry_t **out)
+int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out)
 {
     int error = 0;
     db_state_t *state = dbp;
@@ -566,11 +564,11 @@ int db_lookup_file_by_age(JIGDB *dbp, time_t age, db_file_entry_t **out)
 
     free_results();
 
-    sprintf(sql_command, "SELECT * FROM files WHERE age > %ld", age);
+    sprintf(sql_command, "SELECT * FROM files WHERE md5 == '%s' ORDER BY filetype ASC;", md5);
     error = sqlite3_exec(state->db, sql_command, results_callback, &result_type, &open_error);
     if (error)
     {
-        fprintf(stderr, "db_lookup_file_by_age: Failed to lookup, error %d (%s)\n", error, open_error);
+        fprintf(stderr, "db_lookup_file_by_md5: Failed to lookup, error %d (%s)\n", error, open_error);
         return error;
     }
 
@@ -586,26 +584,7 @@ int db_lookup_file_by_age(JIGDB *dbp, time_t age, db_file_entry_t **out)
     return error;
 }
 
-/* Look up the next oldest record */
-int db_lookup_file_older(JIGDB *dbp, db_file_entry_t **out)
-{
-    int error = 0;
-
-    if (!res_head)
-        return EINVAL;
-    
-    if (res_current)
-    {
-        *out = &res_current->data.file;
-        res_current = res_current->next;
-    }
-    else
-        error = ENOENT;
-
-    return error;
-}
-
-int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out)
+int db_lookup_file_by_name(JIGDB *dbp, char *filename, db_file_entry_t **out)
 {
     int error = 0;
     db_state_t *state = dbp;
@@ -614,11 +593,11 @@ int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out)
 
     free_results();
 
-    sprintf(sql_command, "SELECT * FROM files WHERE md5 == '%s' ORDER BY filetype ASC;", md5);
+    sprintf(sql_command, "SELECT * FROM files WHERE filename == '%s';", filename);
     error = sqlite3_exec(state->db, sql_command, results_callback, &result_type, &open_error);
     if (error)
     {
-        fprintf(stderr, "db_lookup_file_by_md5: Failed to lookup, error %d (%s)\n", error, open_error);
+        fprintf(stderr, "db_lookup_file_by_name: Failed to lookup, error %d (%s)\n", error, open_error);
         return error;
     }
 
@@ -634,42 +613,28 @@ int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out)
     return error;
 }
 
-int db_lookup_file_by_name(JIGDB *dbp, char *filename, db_file_entry_t **out)
+int db_delete_file_by_name(JIGDB *dbp, char *md5, enum filetype type, char *filename)
 {
     int error = 0;
     db_state_t *state = dbp;
     char *open_error;
-    int result_type = RES_FILE;
 
-    free_results();
-
-    sprintf(sql_command, "SELECT * FROM files WHERE filename == '%s';", filename);
-    error = sqlite3_exec(state->db, sql_command, results_callback, &result_type, &open_error);
+    sprintf(sql_command, "DELETE FROM files WHERE md5 == '%s' AND filetype == '%d' AND filename == '%s';", md5, type, filename);
+    error = sqlite3_exec(state->db, sql_command, NULL, NULL, &open_error);
     if (error)
-    {
-        fprintf(stderr, "db_lookup_file_by_name: Failed to lookup, error %d (%s)\n", error, open_error);
-        return error;
-    }
-
-    res_current = res_head;
-    if (res_current)
-    {
-        *out = &res_current->data.file;
-        res_current = res_current->next;
-    }
-    else
-        error = ENOENT;
+        fprintf(stderr, "db_delete_file: Failed to delete, error %d (%s)\n", error, open_error);
 
     return error;
 }
 
-int db_delete_file(JIGDB *dbp, char *md5, enum filetype type, char *filename)
+/* Delete all file records older than the specified date */
+int db_delete_files_by_age(JIGDB *dbp, time_t date)
 {
     int error = 0;
     db_state_t *state = dbp;
     char *open_error;
 
-    sprintf(sql_command, "DELETE FROM files WHERE md5 == '%s' AND filetype == '%d' AND filename == '%s';", md5, type, filename);
+    sprintf(sql_command, "DELETE FROM files WHERE time_added < %ld", date);
     error = sqlite3_exec(state->db, sql_command, NULL, NULL, &open_error);
     if (error)
         fprintf(stderr, "db_delete_file: Failed to delete, error %d (%s)\n", error, open_error);
diff --git a/jigdb.h b/jigdb.h
index c31c5ca..34b47f7 100644 (file)
--- a/jigdb.h
+++ b/jigdb.h
@@ -52,7 +52,7 @@ typedef struct
 {
     unsigned long long file_size;          /* size of the file in bytes */
     time_t             mtime;              /* mtime of the file when we saw it */
-    time_t             age;                /* UINT_MAX - time when added */
+    time_t             time_added;         /* time when this record was added */
     enum filetype      type;
     unsigned char      md5[32];            /* md5sum of the file */
     char               filename[PATH_MAX]; /* path to the file */
@@ -106,8 +106,7 @@ int db_dump(JIGDB *dbp);
 /* Store a template entry */
 int db_store_template(JIGDB *dbp, db_template_entry_t *entry);
 
-/* Lookup a template entry by output offset. The specified offset will
- * be within the range covered by the returned entry, or ENOENT. */
+/* Lookup a template entry. */
 int db_lookup_template_by_path(JIGDB *dbp, char *template_name, db_template_entry_t **out);
 
 /********************
@@ -133,18 +132,18 @@ int db_lookup_block_by_offset(JIGDB *dbp, unsigned long long image_offset,
 /* Store details of a file */
 int db_store_file(JIGDB *dbp, db_file_entry_t *entry);
 
-/* Lookup files added older than a specified age */
-int db_lookup_file_by_age(JIGDB *dbp, time_t added, db_file_entry_t **out);
-
-/* Lookup the next older file */
-int db_lookup_file_older(JIGDB *dbp, db_file_entry_t **out);
-
 /* Lookup a file by md5 */
 int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out);
 
 /* Lookup a file by name */
 int db_lookup_file_by_name(JIGDB *dbp, char *filename, db_file_entry_t **out);
 
+/* Delete a file by name */
+int db_delete_file_by_name(JIGDB *dbp, char *md5, enum filetype type, char *filename);
+
+/* Delete files added previous to a specified date */
+int db_delete_files_by_age(JIGDB *dbp, time_t date);
+
 /* Delete a file entry */
 int db_delete_file(JIGDB *dbp, char *md5, enum filetype type, char *filename);
 
index 88b5dab..925da4a 100644 (file)
--- a/jigsum.c
+++ b/jigsum.c
@@ -21,6 +21,8 @@
 #include "jigdb.h"
 
 #define BUF_SIZE 65536
+#define OLD_FILE_RECORD_AGE 86400
+#define DB_NAME "jigit_db.sql"
 
 #ifndef MIN
 #define MIN(x,y)        ( ((x) < (y)) ? (x) : (y))
@@ -49,7 +51,7 @@ static int check_cache(char *filename, struct stat *sb, char **base64_md5)
             /* We have an entry for this file, but the mtime or size
              * has changed. Delete the old entry and replace it later
              * on */
-            error = db_delete_file(database, entry->md5, entry->type, entry->filename);
+            error = db_delete_file_by_name(database, entry->md5, entry->type, entry->filename);
             if (error)
                 printf("check_cache: unable to delete old entry for file %s\n", filename);
         }
@@ -159,7 +161,7 @@ static int md5_file(char *filename)
         strncpy(&entry.md5[0], base64_md5, sizeof(entry.md5));
         entry.type = FT_LOCAL;
         entry.mtime = sb.st_mtime;
-        entry.age = UINT_MAX - time(NULL);
+        entry.time_added = time(NULL);
         entry.file_size = bytes_read;
         strncpy(&entry.filename[0], fullpath, sizeof(entry.filename));
         /* "extra" blanked already */
@@ -176,32 +178,13 @@ static int md5_file(char *filename)
 /* Walk through the database deleting entries more than <n> seconds old */
 static void jigsum_db_cleanup(int delay)
 {
-    time_t delete_time = UINT_MAX - time(NULL);
-    int error = 0;
-    db_file_entry_t *entry = NULL;
-
-    delete_time += delay;
-
-    while (!error)
-    {
-        error = db_lookup_file_by_age(database, delete_time, &entry);
-        if (error)
-            break;
-        error = db_delete_file(database, entry->md5, entry->type, entry->filename);
-        if (error)
-        {
-            printf("jigsum_db_cleanup: error %d from delete call\n", error);
-            break;
-        }
-    }
+    (void)db_delete_files_by_age(database, time(NULL) - delay);
 }
 
 int main(int argc, char **argv)
 {
     int i = 0;
 
-#define DB_NAME "jigit_db.sql"
-
     database = db_open(DB_NAME);
     if (!database)
     {
@@ -210,7 +193,7 @@ int main(int argc, char **argv)
     }                
 
     /* Clear out old records */
-    jigsum_db_cleanup(86400);
+    jigsum_db_cleanup(OLD_FILE_RECORD_AGE);
     
     for (i = 1; i < argc; i++)
         (void) md5_file(argv[i]);