Enlightenment CVS committal Author : chaos Project : e17 Module : apps/evfs
Dir : e17/apps/evfs/src/bin Modified Files: evfs_metadata_db.c evfs_server_handle.c evfs_worker.c Log Message: * Allow persistence of search vfolders =================================================================== RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata_db.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- evfs_metadata_db.c 24 Aug 2007 00:49:46 -0000 1.11 +++ evfs_metadata_db.c 26 Aug 2007 13:08:36 -0000 1.12 @@ -10,8 +10,9 @@ * * Make a 'bulk-run' function to avoid the endless repeated sqlite3_exec */ -#define EVFS_METADATA_DB_CONFIG_LATEST 4 +#define EVFS_METADATA_DB_CONFIG_LATEST 6 static char metadata_db[PATH_MAX]; +static int loc_init = 0; static char* homedir; static Ecore_Hash* db_upgrade_hash = NULL; @@ -146,6 +147,24 @@ return evfs_metadata_db_version_bump(db, "5"); } +int evfs_metadata_db_upgrade_5_6(sqlite3* db) +{ + int ret; + char* errMsg = 0; + + printf("Performing upgrade from v.5 to v.6\n"); + + ret = sqlite3_exec(db, + "create table VfolderSearch (id integer primary key AUTOINCREMENT, name varchar(255));", + NULL, 0,&errMsg); + + ret = sqlite3_exec(db, + "create table VfolderSearchComponent (id integer primary key AUTOINCREMENT, vfolderSearch int, rtype char, rkey varchar(255), rvalue varchar(255));", + NULL, 0,&errMsg); + + return evfs_metadata_db_version_bump(db, "6"); +} + int evfs_metadata_db_version_bump(sqlite3* db, char* ver) { int ret; @@ -160,15 +179,23 @@ } /*---*/ +void evfs_metadata_db_location_init() +{ + if (!loc_init) { + loc_init =1 ; + homedir = strdup(getenv("HOME")); + snprintf(metadata_db, PATH_MAX, "%s/.e/evfs/evfs_metadata.db", homedir); + } +} + void evfs_metadata_db_init(sqlite3** db) { struct stat config_dir_stat; int ret; int ver; int runs = 0; - - homedir = strdup(getenv("HOME")); - snprintf(metadata_db, PATH_MAX, "%s/.e/evfs/evfs_metadata.db", homedir); + + evfs_metadata_db_location_init(); db_upgrade_hash = ecore_hash_new(ecore_direct_hash, ecore_direct_compare); ecore_hash_set(db_upgrade_hash, (int*)0, evfs_metadata_db_upgrade_0_1); @@ -176,6 +203,7 @@ ecore_hash_set(db_upgrade_hash, (int*)2, evfs_metadata_db_upgrade_2_3); ecore_hash_set(db_upgrade_hash, (int*)3, evfs_metadata_db_upgrade_3_4); ecore_hash_set(db_upgrade_hash, (int*)4, evfs_metadata_db_upgrade_4_5); + ecore_hash_set(db_upgrade_hash, (int*)5, evfs_metadata_db_upgrade_5_6); /*Check if we need to seed the DB*/ if (stat(metadata_db, &config_dir_stat)) { @@ -220,6 +248,28 @@ printf("DB Init complete..\n"); } +sqlite3* evfs_metadata_db_connect() +{ + sqlite3* db; + int ret; + + evfs_metadata_db_location_init(); + + ret = sqlite3_open(metadata_db, &db); + if( ret ){ + fprintf(stderr, "Can't open metadata database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + exit(1); + } + + return db; +} + +sqlite3* evfs_metadata_db_close(sqlite3* db) +{ + sqlite3_close(db); +} + int evfs_metadata_db_upgrade_check(sqlite3* db, int startmode) { char query[1024]; @@ -317,6 +367,7 @@ printf("id_for_file: sqlite error (%s)\n", file_path); file = 0; } + free(file_path); return file; } @@ -380,3 +431,72 @@ if (errMsg) printf("ERROR: %s\n", errMsg); } + +int evfs_metadata_db_vfolder_search_create(sqlite3* db, char* name) +{ + char query[PATH_MAX]; + int ret; + int vfo = 0; + sqlite3_stmt *pStmt; + + snprintf(query, sizeof(query), "select id from VFolderSearch where name = ?"); + ret = sqlite3_prepare(db, query, -1, &pStmt, 0); + + if (ret == SQLITE_OK) { + sqlite3_bind_text(pStmt, 1, name, strlen(name), SQLITE_STATIC); + + ret = sqlite3_step(pStmt); + if (ret == SQLITE_ROW) { + vfo = sqlite3_column_int(pStmt,0); + + sqlite3_reset(pStmt); + sqlite3_finalize(pStmt); + } else { + sqlite3_reset(pStmt); + sqlite3_finalize(pStmt); + + snprintf(query, sizeof(query), "insert into VFolderSearch (name) values(?);"); + ret = sqlite3_prepare(db, query, -1, &pStmt, 0); + sqlite3_bind_text(pStmt, 1, name, strlen(name), SQLITE_STATIC); + + if (sqlite3_step(pStmt) == SQLITE_DONE) { + vfo = (int)sqlite3_last_insert_rowid(db); + } else { + vfo = 0; + } + + sqlite3_reset(pStmt); + sqlite3_finalize(pStmt); + } + } else { + sqlite3_reset(pStmt); + sqlite3_finalize(pStmt); + + printf("id_for_file: sqlite error (%s)\n", name); + vfo = 0; + } + + return vfo; +} + +void evfs_metadata_db_vfolder_search_entry_add(sqlite3* db, int id, EvfsVfolderEntry* entry) +{ + char query[PATH_MAX]; + int ret; + sqlite3_stmt *pStmt; + + snprintf(query, sizeof(query), + "insert into VfolderSearchComponent (vfolderSearch, rtype, rkey, rvalue) values (%d, '%c', ?, ?);", id, entry->type); + ret = sqlite3_prepare(db, query, -1, &pStmt, 0); + + if (ret == SQLITE_OK) { + sqlite3_bind_text(pStmt, 1, entry->name, strlen(entry->name), SQLITE_STATIC); + sqlite3_bind_text(pStmt, 2, entry->value, strlen(entry->value), SQLITE_STATIC); + + if (sqlite3_step(pStmt) != SQLITE_DONE) { + printf("evfs_metadata_db_vfolder_search_entry_add: sqlite3 error\n"); + } + sqlite3_reset(pStmt); + sqlite3_finalize(pStmt); + } +} =================================================================== RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_server_handle.c,v retrieving revision 1.85 retrieving revision 1.86 diff -u -3 -r1.85 -r1.86 --- evfs_server_handle.c 22 Aug 2007 09:52:47 -0000 1.85 +++ evfs_server_handle.c 26 Aug 2007 13:08:36 -0000 1.86 @@ -13,6 +13,8 @@ #include <Ecore_Desktop.h> #include <Efreet.h> #include <Efreet_Mime.h> +#include <sqlite3.h> +#include "evfs_metadata_db.h" /*---------------------------------------------------*/ /*Move these functions somewhere*/ @@ -766,8 +768,27 @@ printf("EVFS: Mime not currently handled for plugin != file\n"); /*TODO: Transfer file local, then mime? Ugh*/ } else { - char* mime = efreet_mime_type_get(evfs_command_first_file_get(command)->path); + const char* mime = efreet_mime_type_get(evfs_command_first_file_get(command)->path); printf("%s\n", mime); } } +void evfs_handle_vfolder_create(evfs_client* client, evfs_command* command) +{ + int id; + sqlite3* db; + Evas_List* l; + EvfsVfolderEntry* e; + printf("Creating a vfolder called '%s'\n", command->file_command->ref); + + db = evfs_metadata_db_connect(); + id = evfs_metadata_db_vfolder_search_create(db, command->file_command->ref); + + for (l=command->entries;l;) { + e=l->data; + evfs_metadata_db_vfolder_search_entry_add(db, id, e); + l=l->next; + } + + evfs_metadata_db_close(db); +} =================================================================== RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_worker.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- evfs_worker.c 22 Aug 2007 10:23:16 -0000 1.8 +++ evfs_worker.c 26 Aug 2007 13:08:36 -0000 1.9 @@ -47,9 +47,12 @@ #include <signal.h> #include <errno.h> #include <dirent.h> +#include <sqlite3.h> +#include "evfs_metadata_db.h" static evfs_client* worker_client; static evfs_server* server; +static sqlite3* worker_db = NULL; Ecore_Event_Handler* server_data; Ecore_Ipc_Server* iserver; @@ -59,6 +62,12 @@ int evfs_handle_command(evfs_client * client, evfs_command * command); void evfs_load_plugins(); + +sqlite3* evfs_worker_db_get() +{ + return worker_db; +} + int ecore_timer_enterer(__UNUSED__ void *data) { incoming_command_cb(NULL); @@ -168,6 +177,10 @@ evfs_handle_mime_request(client,command); break; + case EVFS_CMD_VFOLDER_CREATE: + evfs_handle_vfolder_create(client,command); + break; + default: printf("Warning - unhandled command %d\n", command->type); break; @@ -514,6 +527,7 @@ evfs_trash_initialise(); evfs_operation_initialise(); evfs_metadata_initialise_worker(); + worker_db = evfs_metadata_db_connect(); /*Add a timer, to make sure our event loop keeps going. Kinda hacky */ server->tmr = ecore_timer_add(0.01, ecore_timer_enterer, NULL); ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs