diff --git a/src/import.c b/src/import.c index 4fc0c02..e21f51b 100644 --- a/src/import.c +++ b/src/import.c @@ -119,15 +119,15 @@ } -unsigned long get_folder_id(struct session_data *sdata, char *foldername){ +unsigned long get_folder_id(struct session_data *sdata, char *foldername, int parent_id){ unsigned long id=0; char s[SMALLBUFSIZE]; MYSQL_STMT *stmt; - MYSQL_BIND bind[1]; - unsigned long len[1]; + MYSQL_BIND bind[2]; + unsigned long len[2]; - snprintf(s, SMALLBUFSIZE-1, "SELECT `id` FROM %s WHERE `name`=?", SQL_FOLDER_TABLE); + snprintf(s, SMALLBUFSIZE-1, "SELECT `id` FROM %s WHERE `name`=? AND `parent_id`=?", SQL_FOLDER_TABLE); if(prepare_a_mysql_statement(sdata, &stmt, s) == ERR) goto ENDE; @@ -138,6 +138,10 @@ bind[0].is_null = 0; len[0] = strlen(foldername); bind[0].length = &len[0]; + bind[1].buffer_type = MYSQL_TYPE_LONG; + bind[1].buffer = (char *)&parent_id; + bind[1].is_null = 0; + bind[1].length = 0; if(mysql_stmt_bind_param(stmt, bind)){ goto CLOSE; @@ -175,7 +179,7 @@ } -unsigned long add_new_folder(struct session_data *sdata, char *foldername){ +unsigned long add_new_folder(struct session_data *sdata, char *foldername, int parent_id){ unsigned long id=0; char s[SMALLBUFSIZE]; MYSQL_STMT *stmt; @@ -183,7 +187,7 @@ unsigned long len[2]; - snprintf(s, sizeof(s)-1, "INSERT INTO %s (`name`) VALUES(?)", SQL_FOLDER_TABLE); + snprintf(s, sizeof(s)-1, "INSERT INTO %s (`name`, `parent_id`) VALUES(?,?)", SQL_FOLDER_TABLE); if(prepare_a_mysql_statement(sdata, &stmt, s) == ERR) goto ENDE; @@ -194,6 +198,11 @@ bind[0].is_null = 0; len[0] = strlen(foldername); bind[0].length = &len[0]; + bind[1].buffer_type = MYSQL_TYPE_LONG; + bind[1].buffer = (char *)&parent_id; + bind[1].is_null = 0; + bind[1].length = 0; + if(mysql_stmt_bind_param(stmt, bind)){ syslog(LOG_PRIORITY, "%s: %s.mysql_stmt_bind_param() error: %s", sdata->ttmpfile, SQL_FOLDER_TABLE, mysql_stmt_error(stmt)); goto CLOSE; diff --git a/src/piler.c b/src/piler.c index 2ef5ef6..e2b8415 100644 --- a/src/piler.c +++ b/src/piler.c @@ -289,6 +289,7 @@ free_rule(data.retention_rules); data.folder = 0; + data.recursive_folder_names = 0; data.archiving_rules = NULL; data.retention_rules = NULL; @@ -343,6 +344,7 @@ (void) openlog(PROGNAME, LOG_PID, LOG_MAIL); data.folder = 0; + data.recursive_folder_names = 0; data.archiving_rules = NULL; data.retention_rules = NULL; diff --git a/src/piler.h b/src/piler.h index d1b1026..1018165 100644 --- a/src/piler.h +++ b/src/piler.h @@ -52,8 +52,8 @@ int prepare_a_mysql_statement(struct session_data *sdata, MYSQL_STMT **stmt, char *s); int import_message(char *filename, struct session_data *sdata, struct __data *data, struct __config *cfg); -unsigned long get_folder_id(struct session_data *sdata, char *foldername); -unsigned long add_new_folder(struct session_data *sdata, char *foldername); +unsigned long get_folder_id(struct session_data *sdata, char *foldername, int parent_id); +unsigned long add_new_folder(struct session_data *sdata, char *foldername, int parent_id); int store_index_data(struct session_data *sdata, struct _state *state, struct __data *data, uint64 id, struct __config *cfg); diff --git a/src/pilerimport.c b/src/pilerimport.c index 10ace8e..8cf13de 100644 --- a/src/pilerimport.c +++ b/src/pilerimport.c @@ -88,7 +88,8 @@ int import_mbox_from_dir(char *directory, struct session_data *sdata, struct __data *data, int *tot_msgs, struct __config *cfg){ DIR *dir; struct dirent *de; - int rc=ERR, ret=OK; + int rc=ERR, ret=OK, i=0; + unsigned long folder; char fname[SMALLBUFSIZE]; struct stat st; @@ -106,16 +107,35 @@ if(stat(fname, &st) == 0){ if(S_ISDIR(st.st_mode)){ + folder = data->folder; rc = import_mbox_from_dir(fname, sdata, data, tot_msgs, cfg); + data->folder = folder; if(rc == ERR) ret = ERR; } else { if(S_ISREG(st.st_mode)){ + if(i == 0 && data->recursive_folder_names == 1){ + folder = get_folder_id(sdata, fname, data->folder); + if(folder == 0){ + folder = add_new_folder(sdata, fname, data->folder); + + if(folder == 0){ + printf("error: cannot get/add folder '%s' to parent id: %d\n", fname, data->folder); + return ERR; + } + else { + data->folder = folder; + } + } + + } + rc = import_from_mailbox(fname, sdata, data, cfg); if(rc == OK) (*tot_msgs)++; else ret = ERR; + i++; } else { printf("%s is not a file\n", fname); @@ -137,8 +157,9 @@ int import_from_maildir(char *directory, struct session_data *sdata, struct __data *data, int *tot_msgs, struct __config *cfg){ DIR *dir; struct dirent *de; - int rc=ERR, ret=OK; - char fname[SMALLBUFSIZE]; + int rc=ERR, ret=OK, i=0; + unsigned long folder; + char *p, fname[SMALLBUFSIZE]; struct stat st; dir = opendir(directory); @@ -155,16 +176,43 @@ if(stat(fname, &st) == 0){ if(S_ISDIR(st.st_mode)){ + folder = data->folder; rc = import_from_maildir(fname, sdata, data, tot_msgs, cfg); + data->folder = folder; if(rc == ERR) ret = ERR; } else { if(S_ISREG(st.st_mode)){ + if(i == 0 && data->recursive_folder_names == 1){ + p = strrchr(directory, '/'); + if(p) p++; + else { + printf("invalid directory name: '%s'\n", directory); + return ERR; + } + + folder = get_folder_id(sdata, p, data->folder); + if(folder == 0){ + folder = add_new_folder(sdata, p, data->folder); + + if(folder == 0){ + printf("error: cannot get/add folder '%s' to parent id: %d\n", p, data->folder); + return ERR; + } + else { + data->folder = folder; + } + } + + } + rc = import_message(fname, sdata, data, cfg); if(rc == OK) (*tot_msgs)++; else ret = ERR; + i++; + if(quiet == 0) printf("processed: %7d\r", *tot_msgs); fflush(stdout); } else { @@ -261,6 +309,7 @@ for(i=0; i