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:
* OK - works again now.  Will extract metadata from any file placed in a 
vfolder group, for now.

===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- evfs_metadata.c     22 Jul 2006 16:21:03 -0000      1.23
+++ evfs_metadata.c     22 Jul 2006 18:11:44 -0000      1.24
@@ -11,6 +11,11 @@
 #include <string.h>
 #include <sys/types.h>
 
+#include <errno.h>
+#include <sys/wait.h>
+#include <sys/param.h>
+#include <inttypes.h>
+
 #include <Eet.h>
 #include <Evas.h>
 #include <limits.h>
@@ -47,7 +52,10 @@
 static int _evfs_metadata_db_wait = 0;
 static Ecore_DList* evfs_metdata_db_results = NULL;
 
-static pid_t _metadata_fork;
+/*--*/
+static Ecore_List* evfs_metadata_queue = NULL;
+pid_t _metadata_fork= 0;
+/*--*/
 
 /*DB Helper types*/
 typedef struct {
@@ -60,7 +68,7 @@
        evfs_metadata_db_item** fields;
 } evfs_metadata_db_result;
 
-
+int evfs_metadata_extract_runner(void* data);
 
 
 /*DB Helper functions*/
@@ -285,6 +293,8 @@
        if (!evfs_object_client_is_get()) {
                printf(". EVFS metadata initialise..\n");
 
+               evfs_metadata_queue = ecore_list_new();
+
                /*String edd*/
                Evfs_Metadata_String_Edd = 
_evfs_metadata_edd_create("evfs_metadata_string", sizeof(evfs_metadata_object));
                EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, 
evfs_metadata_object,
@@ -365,6 +375,8 @@
 
        
                evfs_metadata_db_init(&db);
+
+               ecore_timer_add(1.0, evfs_metadata_extract_runner, NULL);
        }
 
 }
@@ -631,64 +643,101 @@
 
 /*----------------*/
 /*This section defines the fork/grab part of the metadata system*/
-
-int evfs_metadata_extract_fork(evfs_filereference* ref)
-{      
-       int pid;
-
+void evfs_metadata_extract_queue(evfs_filereference* ref)
+{
        /*At the moment, we only extract meta from posix folders*/
        /*This may change, but we'll have to copy the file locally,
         * so libextractor can have a shot at it*/
+       if (!strcmp(ref->plugin_uri,"file")) {
+               evfs_filereference* clone;
 
-       return; /*FIXME - there's a bug here*/
+               clone = evfs_filereference_clone(ref);
+               ecore_list_append(evfs_metadata_queue, clone);
+       }
+}
+
+int evfs_metadata_extract_runner(void* data)
+{
+       evfs_filereference* ref;
+       int status;
        
-       if (!strcmp(ref->plugin_uri,"file")) {
+       if (!_metadata_fork) {
+               ecore_list_goto_first(evfs_metadata_queue);
 
-               if (!(pid = fork())) {
-                       evfs_plugin* plugin;
-                       evfs_command* command;
-                       Evas_List* meta_list;
-                       int ret;
-                       sqlite3* db;
-                       int file;
-                       Evas_List* l;
-                       evfs_meta_obj* o;
-
-                       ret = sqlite3_open(metadata_db, &db);
-                       if( ret ){
-                           fprintf(stderr, "Can't open metadata database: 
%s\n", sqlite3_errmsg(db));
-                           sqlite3_close(db);
-                           return 0;
-                       }
+               if ( (ref = ecore_list_current(evfs_metadata_queue))) {
+                       printf("..item on queue..\n");
+                       evfs_metadata_extract_fork(ref);
+               }
+       } else {
+               printf("...metadata runner executing..\n");
 
-                       printf("Extract fork started: %s..\n", ref->path);
+               if ((waitpid(_metadata_fork, &status, WNOHANG) > 0) ||
+                              errno == ECHILD) {
+                       _metadata_fork = 0;
 
-                       file = evfs_metadata_db_id_for_file(db,ref,1);
+                       ecore_list_goto_first(evfs_metadata_queue);
+                       ref = ecore_list_current(evfs_metadata_queue);
+                       evfs_cleanup_filereference(ref);
 
-                       if (file) {
-                               command = NEW(evfs_command);
-                               command->file_command.files = calloc(1, 
sizeof(evfs_filereference*));
-                               command->file_command.files[0] = ref;
-                               plugin = 
evfs_meta_plugin_get_for_type(evfs_server_get(), "object/undefined");
-                               meta_list = 
(*EVFS_PLUGIN_META(plugin)->functions->evfs_file_meta_retrieve)(NULL,command);
-       
-                               for (l=meta_list;l;) {
-                                       o=l->data;
-
-                                       evfs_metadata_db_file_keyword_add(db, 
file, o->key, o->value);  
-                                       
-                                       if (o->key) free(o->key);
-                                       if (o->value) free(o->value);
-                                       free(o);
-                                       l=l->next;
-                               }
-                       } else {
-                               printf("metadata_extract_fork: could not insert 
file to db\n");
-                       }
+                       ecore_list_remove_first(evfs_metadata_queue);
+
+                       printf("Execution complete..\n");
+               }
+       }
+       return 1;
+}
+
+int evfs_metadata_extract_fork(evfs_filereference* ref)
+{      
+       _metadata_fork = fork();
+       if (!_metadata_fork) {
+               evfs_plugin* plugin;
+               evfs_command* command;
+               Evas_List* meta_list;
+               int ret;
+               sqlite3* dbi;
+               int file;
+               Evas_List* l;
+               evfs_meta_obj* o;
+
+               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;
+               }
 
-                       sqlite3_close(db);
+               /*Wait up to 10 seconds in this fork for the db to be 
available*/
+               sqlite3_busy_timeout(dbi,10000);
+
+               printf("Extract fork started: %s..\n", ref->path);
+
+               file = evfs_metadata_db_id_for_file(dbi,ref,1);
+
+               if (file) {
+                       command = NEW(evfs_command);
+                       command->file_command.files = calloc(1, 
sizeof(evfs_filereference*));
+                       command->file_command.files[0] = ref;
+                       plugin = 
evfs_meta_plugin_get_for_type(evfs_server_get(), "object/undefined");
+                       meta_list = 
(*EVFS_PLUGIN_META(plugin)->functions->evfs_file_meta_retrieve)(NULL,command);
+
+                       for (l=meta_list;l;) {
+                               o=l->data;
+
+                               evfs_metadata_db_file_keyword_add(dbi, file, 
o->key, o->value); 
+                               
+                               if (o->key) free(o->key);
+                               if (o->value) free(o->value);
+                               free(o);
+                               l=l->next;
+                       }
+               } else {
+                       printf("metadata_extract_fork: could not insert file to 
db\n");
                }
 
+               sqlite3_close(dbi);
+
+               exit(0);
        }
 
        return 1;
===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata_db.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- evfs_metadata_db.c  22 Jul 2006 16:12:46 -0000      1.4
+++ evfs_metadata_db.c  22 Jul 2006 18:11:44 -0000      1.5
@@ -286,9 +286,11 @@
 
        if (key&&value) {
                snprintf(query,sizeof(query), "insert into FileMeta (File, 
keyword, value) select %d, '%s', '%s';", file,key,value);
+               printf("Running %p:%s\n", db,query);
                ret = sqlite3_exec(db, 
                query, 
                NULL, 0,&errMsg);
+               if (errMsg) printf("ERROR: %s\n", errMsg);
        } else {
                printf("db_file_keyword_add: key or value is null\n");
        }



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to