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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs