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:
* Metadata will now be extracted for files placed in 'groups'.  I have yet to 
decide the scan algorithm we'll use to decide which files/locations will be 
'automatically' searched for metadata-containing files.  Open to suggestions :)

===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- evfs_metadata.c     22 Jul 2006 13:12:57 -0000      1.21
+++ evfs_metadata.c     22 Jul 2006 16:12:46 -0000      1.22
@@ -40,6 +40,7 @@
 
 static char* homedir;
 static char metadata_file[PATH_MAX];
+static char metadata_db[PATH_MAX];
 static Eet_File* _evfs_metadata_eet;
 
 static sqlite3 *db;
@@ -318,6 +319,7 @@
                }
 
                snprintf(metadata_file, PATH_MAX, 
"%s/.e/evfs/evfs_metadata.eet", homedir);
+               snprintf(metadata_db, PATH_MAX, "%s/.e/evfs/evfs_metadata.db", 
homedir);
 
                if (stat(metadata_file, &config_dir_stat)) {
                        printf("Making new metadata file..\n");
@@ -492,6 +494,7 @@
 }
 
 
+
 void evfs_metadata_group_header_file_remove(evfs_filereference* ref, char* 
group)
 {
        char* file_path;
@@ -633,17 +636,56 @@
 {      
        int pid;
 
-       if (!(pid = fork())) {
-               evfs_plugin* plugin;
-               evfs_command* command;
-
-               printf("Extract fork started: %s..\n", ref->path);
-
-               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");
-               
(*EVFS_PLUGIN_META(plugin)->functions->evfs_file_meta_retrieve)(NULL,command);
+       /*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")) {
+
+               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;
+                       }
+
+                       printf("Extract fork started: %s..\n", ref->path);
+
+                       file = evfs_metadata_db_id_for_file(db,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(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");
+                       }
+
+                       sqlite3_close(db);
+               }
+
        }
 
        return 1;
===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata_db.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- evfs_metadata_db.c  22 Jul 2006 05:43:37 -0000      1.3
+++ evfs_metadata_db.c  22 Jul 2006 16:12:46 -0000      1.4
@@ -3,6 +3,7 @@
 #include <limits.h>
 #include <sqlite3.h>
 #include "evfs_metadata_db.h"
+#include "evfs.h"
 
 
 /* TODO
@@ -98,7 +99,6 @@
 {
        int ret;
        char* errMsg = 0;
-       char query[1024];
 
        printf("Performing upgrade from v.2 to v.3\n");
 
@@ -149,8 +149,6 @@
        
        /*Check if we need to seed the DB*/
        if (stat(metadata_db, &config_dir_stat)) {
-               char* errMsg = 0;
-               
                ret = sqlite3_open(metadata_db, db);
                if( ret ){
                    fprintf(stderr, "Can't open metadata database: %s\n", 
sqlite3_errmsg(*db));
@@ -232,4 +230,67 @@
        } else {
                return EVFS_METADATA_DB_CONFIG_LATEST;
        }
+}
+
+
+int evfs_metadata_db_id_for_file(sqlite3* db, evfs_filereference* ref, int 
create)
+{
+       char* file_path;
+       char query[PATH_MAX];
+       int ret;
+       int file = 0;
+       char* errMsg = 0;
+       sqlite3_stmt *pStmt;
+
+       
+       /*Build a path*/
+       file_path = evfs_filereference_to_string(ref);
+       printf("File path is: %s\n", file_path);
+
+
+       snprintf(query, sizeof(query), "select id from File where filename 
='%s'", file_path);
+       ret = sqlite3_prepare(db, query, 
+                       -1, &pStmt, 0);
+
+       if (ret == SQLITE_OK) {
+               ret = sqlite3_step(pStmt);
+               if (ret == SQLITE_ROW)  {
+                       file = sqlite3_column_int(pStmt,0);
+               } else {
+                       if (create) {
+                               snprintf(query, sizeof(query), "insert into 
File (filename) select '%s';", file_path);
+                               ret = sqlite3_exec(db, query, 
+                               NULL, 0,&errMsg);
+       
+                               file = (int)sqlite3_last_insert_rowid(db);
+                       } else {
+                               file = 0;
+                       }
+               }
+       } else {
+               printf("id_for_file: sqlite error\n");
+               file = 0;
+       }
+       sqlite3_reset(pStmt);
+       sqlite3_finalize(pStmt);
+
+       return file;
+}
+
+void evfs_metadata_db_file_keyword_add(sqlite3* db, int file, char* key, char* 
value)
+{
+       char* file_path;
+       char query[512];
+       int ret;
+       char* errMsg = 0;
+
+       if (key&&value) {
+               snprintf(query,sizeof(query), "insert into FileMeta (File, 
keyword, value) select %d, '%s', '%s';", file,key,value);
+               ret = sqlite3_exec(db, 
+               query, 
+               NULL, 0,&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