Enlightenment CVS committal

Author  : chaos
Project : e17
Module  : apps/evfs

Dir     : e17/apps/evfs/src/bin


Modified Files:
        evfs_metadata.c evfs_metadata_db.c 


Log Message:
* EVFS metadata now runs a parallel ecore event runner that scans currently 
know files, and nuked info in the DB for them, if they have been deleted.

===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- evfs_metadata.c     28 Dec 2006 16:17:08 -0000      1.31
+++ evfs_metadata.c     26 Jun 2007 02:35:28 -0000      1.32
@@ -55,6 +55,9 @@
 /*Directory scan queue*/
 static Ecore_List* evfs_metadata_directory_scan_queue = NULL;
 
+/*Deleted scan queue*/
+static int deletedPage = 0;
+
 /*--*/
 static Ecore_List* evfs_metadata_queue = NULL;
 pid_t _metadata_fork= 0;
@@ -73,6 +76,7 @@
 
 int evfs_metadata_extract_runner(void* data);
 int evfs_metadata_scan_runner(void* data);
+int evfs_metadata_scan_deleted(void* data);
 
 
 /*DB Helper functions*/
@@ -121,28 +125,6 @@
        _evfs_metadata_db_wait = 1;
 }
 
-static int evfs_metadata_db_callback(void *NotUsed, int argc, char **argv, 
char **azColName){
-  int i;
-  evfs_metadata_db_result* result;
-
-  result = calloc(1, sizeof(evfs_metadata_db_result));
-  result->fields = calloc(argc, sizeof(evfs_metadata_db_item*));
-  result->fieldcount = argc;
-  
-  for(i=0; i<argc; i++){
-       evfs_metadata_db_item* item = calloc(1, sizeof(evfs_metadata_db_item));
-       item->name = strdup(azColName[i]);
-       item->value = strdup(argv[i]);
-       result->fields[i] = item;
-  }
-
-  ecore_dlist_append(evfs_metdata_db_results, result);
-
-   _evfs_metadata_db_wait = 0;
-  return 0;
-}
-/*-------------*/
-
 Eet_Data_Descriptor* _evfs_metadata_edd_create(char* desc, int size) 
 {
        Eet_Data_Descriptor* edd;
@@ -391,6 +373,7 @@
 
                if (forker) {
                        ecore_timer_add(0.5, evfs_metadata_scan_runner, NULL);
+                       ecore_timer_add(5, evfs_metadata_scan_deleted, NULL);
                        ecore_timer_add(0.5, evfs_metadata_extract_runner, 
NULL);
                }
        }
@@ -427,12 +410,6 @@
        return ret_list;
 }
 
-void evfs_metadata_file_set_key_value_edd(evfs_filereference* ref, char* key, 
-               void* value, Eet_Data_Descriptor* edd) 
-{
-
-}
-
 Ecore_List*
 evfs_metadata_file_group_list(char* group) 
 {
@@ -724,6 +701,90 @@
                }
        }
        
+       return 1;
+}
+
+int evfs_metadata_scan_deleted(void* data) 
+{
+       sqlite3* dbi;
+       int handleCount=0;
+       sqlite3_stmt* pStmt;
+       char query[1024];
+       int pageSize=30;
+       int ret;
+       unsigned const char* str;
+       int res = 0;
+       Ecore_List* delList;
+
+       delList = ecore_list_new();
+       
+       ret = sqlite3_open(metadata_db, &dbi);
+       if( ret ){
+           fprintf(stderr, "Can't open metadata database: %s\n", 
sqlite3_errmsg(dbi));
+           sqlite3_close(dbi);
+           return 0;
+       }
+
+       /*Wait up to 10 seconds in this fork for the db to be available*/
+       sqlite3_busy_timeout(dbi,10000);
+
+       snprintf(query,sizeof(query), "select filename,id from File order by id 
limit %d offset %d", pageSize, deletedPage);
+       
+       ret = sqlite3_prepare(db, query, -1, &pStmt, 0);
+        if (ret == SQLITE_OK) {
+               while ( (ret = sqlite3_step(pStmt) == SQLITE_ROW)) {
+                       str = sqlite3_column_text(pStmt,0);
+                       handleCount++;
+                       /*printf("Filename: %s - ", str);*/
+
+                       evfs_filereference* file = 
evfs_parse_uri_single((char*)str);
+                       if (file) {
+                               evfs_command* proxy;
+                               struct stat file_stat;
+
+                               proxy = evfs_file_command_single_build(file);
+                               res = 
(*EVFS_PLUGIN_FILE(file->plugin)->functions->evfs_file_stat)(proxy, 
&file_stat,0);
+
+                               if (res == 0) {
+                                       /*printf("*\n");*/
+                               } else {
+                                       /*printf("DELETED\n");*/
+
+                                       ecore_list_append(delList, 
(int*)sqlite3_column_int(pStmt,1));
+                               }
+                               evfs_cleanup_command(proxy, 
EVFS_CLEANUP_FREE_COMMAND);
+                       }
+               }
+               sqlite3_reset(pStmt);
+               sqlite3_finalize(pStmt);
+               
+               /*If we saw no rows, we're at the end - go back
+                * to the start*/
+               if (handleCount ==0) {
+                       deletedPage = 0;
+               } else {
+                       if (ecore_list_nodes(delList) > 0) {
+                               int id;
+                               ecore_list_goto_first(delList);
+                               while ( (id = (int)ecore_list_next(delList))) {
+                                       evfs_metadata_db_delete_file(db,id);
+                               }
+                       } else {
+                               /*Only advance page if we didn't delete
+                                * This may result in dupe scans - but there's 
no
+                                * way to avoid this, because the position of 
all the rows
+                                * will have changed */
+                               deletedPage += pageSize;
+                               /*printf("No deletes, next page\n");*/
+                       }
+               }
+       } else {
+               printf("Query failed..\n");
+       }
+
+       ecore_list_destroy(delList);
+       sqlite3_close(dbi);     
+
        return 1;
 }
 
===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata_db.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- evfs_metadata_db.c  28 Dec 2006 16:18:29 -0000      1.8
+++ evfs_metadata_db.c  26 Jun 2007 02:35:28 -0000      1.9
@@ -308,13 +308,14 @@
 
 void evfs_metadata_db_file_keyword_add(sqlite3* db, int file, char* key, char* 
value)
 {
-       char query[512];
+       char query[1024];
        int ret;
        char* errMsg = 0;
        int cnt;
        sqlite3_stmt *pStmt;
 
        /*Check we don't already have a match for this file/keyword/value 
triplet*/
+       /*FIXME: This is bad - what if the filename is >1024 chars*/
        snprintf(query, sizeof(query), "select count(*) from FileMeta where 
file=%d and keyword='%s' and value='%s'", file,key,value);
        ret = sqlite3_prepare(db, query, -1, &pStmt, 0);
        if (ret == SQLITE_OK) {
@@ -341,3 +342,26 @@
        }
 
 }
+
+void evfs_metadata_db_delete_file(sqlite3* db, int file)
+{
+       char query[1024];
+       int ret;
+       char* errMsg = 0;
+
+       /*First delete the file parent reference*/
+       snprintf(query, sizeof(query), "delete from File where id = %d", file);
+       ret = sqlite3_exec(db, query, NULL,0,&errMsg);
+       if (errMsg) printf("ERROR: %s\n", errMsg);
+
+       /*Now delete any meta for this file*/
+       snprintf(query, sizeof(query), "delete from FileMeta where File = %d", 
file);
+       ret = sqlite3_exec(db, query, NULL,0,&errMsg);
+       if (errMsg) printf("ERROR: %s\n", errMsg);
+
+       /*...And any group memberships*/
+       snprintf(query, sizeof(query), "delete from FileGroup where File = %d", 
file);
+       ret = sqlite3_exec(db, query, NULL,0,&errMsg);
+       if (errMsg) printf("ERROR: %s\n", errMsg);              
+}
+



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to