/* Import a standard unix base folder into personal SQL folder */ #include #include #include #include #include "tlmpmail.h" #include "tlmpmail.m" static int foldercopy_create_if (const char *new_folder, bool create) { int ret = 0; if (strncmp(new_folder,"SQL/",4)==0){ const char *folder = new_folder + 4; ret = folder_sql_getid (folder); if (ret == -1){ if (create){ ret = folder_sql_create(folder); if (ret == -1){ fprintf (stderr,MSG_U(E_CANTCREATEFOLDER,"Can't create %s folder %s\n") ,"SQL",folder); } }else{ fprintf (stderr,MSG_U(E_NOSQLFOLDER,"%s folder %s does not exist\n") ,"SQL",folder); } } }else if (strncmp(new_folder,"BXO/",4)==0){ const char *folder = new_folder + 4; if (!folder_bxo_exist (folder)){ if (create){ ret = folder_bxo_create(folder); if (ret == -1){ fprintf (stderr,MSG_R(E_CANTCREATEFOLDER) ,"BXO",folder); } }else{ fprintf (stderr,MSG_R(E_NOSQLFOLDER),"BXO",folder); ret = -1; } }else{ ret = 0; } } return ret; } int foldercopy (int argc, char *argv[]) { glocal bool create = false; glocal bool delet = false; glocal const char *folder = NULL; glocal const char *lfolder = NULL; glocal bool chkdup = false; glocal bool test = false; glocal bool classify = false; static const char *tbdic[]={"tlmpwork","tlmpsql","bolixo",NULL}; int ret = (argc,argv,tbdic); setproginfo ("foldercopy",TLMPWORK_VERSION,TLMPWORK_RELEASE ,MSG_U(T_FOLDER2USQL ,"Append mail folders to another.\n" "SQL mail folders start with SQL/\n" "Bolixo mail folders starts with BXO/\n" "\n" "foldercopy [ option ] -f dest-folder source-folder\n") ); setdbconfname ("tlmpmail"); setarg ('c',"create",MSG_U(I_CREATE,"Create the SQL folder if missing"),glocal.create,false); setarg ('d',"delete",MSG_U(I_DELETE,"Delete messages from the source folder"),glocal.delet,false); setarg ('k',"chkdup",MSG_U(I_CHKDUP,"Check for duplicates in folder"),glocal.chkdup,false); setarg ('f',"folder",MSG_U(I_FOLDER,"Target folder"),glocal.folder,true); setarg ('l',"link",MSG_U(I_LINK,"Extra folder (linking)"),glocal.lfolder,false); setarg ('t',"test",MSG_U(I_TEST,"Test mode, do not update the folder"),glocal.test,false); setarg ('q',"classify",MSG_U(I_CLASSIFY,"Classify messages"),glocal.classify,false); int ret = -1; if (argc < 1){ usage(); }else{ query_setdefaultdb ("localhost","usermail"); if (foldercopy_create_if (glocal.folder,glocal.create)!=-1 && (glocal.lfolder == NULL || foldercopy_create_if (glocal.lfolder,glocal.create)!=-1)){ FOLDER_VIEW *fl_out = folders_alloc(glocal.folder); fl_out->incrusage(); FOLDER_VIEW *fl_link = NULL; if (glocal.lfolder != NULL){ fl_link = folders_alloc (glocal.lfolder); fl_link->incrusage(); } for (int i=0; iincrusage(); if (glocal.classify) fl_in->classify(); int revision = -1; MAIL_MESSAGES msgs; fl_in->loadindex (msgs,revision); for (int i=0; isubject,tmp); printf ("sub: %s\n",tmp.get()); if (glocal.chkdup && fl_out->msgexist(*m)){ fprintf (stderr,MSG_U(E_DUPMSG ,"*** Message %s already in target folder, rejected\n") ,m->id.get()); if (glocal.delet) m->set_deleted(true); }else{ MAIL_MESSAGE_FULL full; if (fl_in->loadmsg(*m,full)!=-1){ if (!glocal.test){ if (glocal.classify) full.updateheader(); fl_out->appendmsg (full); if (fl_link != NULL){ fl_link->appendmsg(full); } if (glocal.delet) m->set_deleted(true); } } } } if (glocal.delet && !glocal.test) fl_in->update (true); fl_in->decrusage(); folders_free (); } fl_out->decrusage(); if (fl_link != NULL) fl_link->decrusage(); } } return ret; return ret; }