Пример #1
0
        public static void PrepareSave(DBConnector DataBase, string dir) //prépare la sauvegarde sur les clients : liste les fichiers à copier et à supprimer
        {
            
            Console.WriteLine("Creation de la liste des fichiers a copier et supprimer pour : " + DataBase.GetBaseName());

            DataTable ListMot;
            string BaseName = DataBase.GetBaseName();

            ListMot = DataBase.Query(ReqMotCalystene); 

            /*TRAITEMENT DES MOTS DE SUITE*/
            foreach (DataRow Row in ListMot.Rows)
            {
                
                int num_mot = int.Parse(Row[field_nummot].ToString());
                string ipp_adm = Row[field_ippcegi].ToString();
                string nom_patient = Row[field_nom].ToString();
                string prenom_patient = Row[field_prenom].ToString();
                string type_mot = Row[field_typemot].ToString();
                string resume_mot = Row[field_resumemot].ToString();
                string nom_auteur = Row[field_nomauteur].ToString();
                DateTime DateLastModif = DateTime.Parse(Row[field_datemodif].ToString());
                string sDateLastModif = DateLastModif.ToString().Split(new string[] { " " }, StringSplitOptions.None)[0];

                //Parce que Calystene c'est de la mer... c'est pas bien, il faut découper le champ mot_dbhandle pour trouver le texte complet du mot. 
                //Ce texte ce trouve dans la table mot_suite_strings.
                string FullText = "";
                int StringID;

                if (!String.IsNullOrEmpty(Row[field_motdbhandle].ToString()))
                {
                    string sStringID = Row[field_motdbhandle].ToString().Split(new string[] { ":" }, StringSplitOptions.None)[1];
                    if (!int.TryParse(sStringID, out StringID))       //Si le numéro contient des lettres, on ignore.
                        continue;

                    DataTable ListText;
                    ListText = DataBase.Query(string.Format(ReqGetTextMot, StringID));
                    foreach (DataRow Text in ListText.Rows)
                    {
                        FullText += Text[0].ToString();
                    }
                }
                else
                {
                    FullText += "--Aucun Texte--";
                }
                
                /* On doubles les quotes pour éviter les erreurs SQL */
                string NomPatient = nom_patient.Replace("'", "''");
                string PrenomPatient = prenom_patient.Replace("'", "''");
                string NomAuteur = nom_auteur.Replace("'", "''");
                string ResumeMot = resume_mot.Replace("'", "''");
                string FinalFullText = FullText.Replace("'", "''");
                string IppAdm = ipp_adm.Replace("'", "''");
                string MotFileName = MakeNewName(nom_patient, prenom_patient, ipp_adm, ".txt").Replace("'", "''");

                string Req = string.Format("SELECT file_last_modif FROM {0} WHERE num_mot = '{1}'", BaseName + "_mots", num_mot);
                DataTable Query = Program.DbFile.Query(Req);
                if (Query.Rows.Count == 0 || (long)Query.Rows[0][0] < Tools.DateToTimestamp(DateLastModif))      //On sauvegarde si le mot n'existe pas ou si il a été modifié
                {
                    string ReqSaveMot = string.Format(ReqPrepareMotSave, BaseName + "_mots", num_mot, IppAdm, NomPatient, PrenomPatient, type_mot, ResumeMot, Row[field_datemodif].ToString(), NomAuteur, FinalFullText, MotFileName, Tools.DateToTimestamp(DateTime.Now));
                    Program.DbFile.ExecuteQuery(ReqSaveMot);
                }
                else if (Query.Rows.Count > 0)      //Si le mot existe et qu'il n'a pas été modifié, on indique qu'il ne faut pas le supprimer
                {
                    string ReqUpdated = string.Format("UPDATE {0} SET updated = 2 WHERE num_mot = '{1}'", BaseName + "_mots", num_mot);
                    Program.DbFile.ExecuteQuery(ReqUpdated);
                }
            }

            /* TRAITEMENT DES FICHES EXCEL*/
            ListMot = DataBase.Query(ReqCalystene); 
            foreach (string FileName in Directory.GetFiles(dir))    //Boucle sur les fichiers sur le serveur Calystene
            {
                FileInfo fInfo = new FileInfo(FileName);
                if ((fInfo.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)    //On ignore les fichiers cachés
                    continue;

                string fName = Path.GetFileName(FileName);
                if (fName.ToLower().Contains("copie") || !fName.Contains("-IN"))      //On ignore les fichiers non liés aux mots de suite
                    continue;

                string sNumFile = fName.Split(new string[] {"IN"}, StringSplitOptions.None)[1].Split(new string[] {".xls"}, StringSplitOptions.None)[0];
                int NumFile;

                if (!int.TryParse(sNumFile, out NumFile))       //Si la le numéro contient des lettres, on ignore
                    continue;

                foreach (DataRow Row in ListMot.Rows)  //Boucle sur les mots de suite dans Calystene (Resultat requête SQL)
                {
                    string sNumMot = Row[field_nummot].ToString();
                    int NumMot;
                    if (!int.TryParse(sNumMot, out NumMot))
                        continue;

                    if (NumMot != NumFile)      //On sauvegarde le fichier si son numéro est dans le resultat de la requête
                        continue;

                    //sauvegarde du fichier
                    //On regarde si il y a les mots "pansement", "diabete" ou "glycemie" dans le type de mot ou dans le resumé du mot. On converti tout en miniscule et on supprime les accents pour minimiser les erreurs.
                    FicheType MotType;
                    string TypeMot = Tools.RemoveDiacritics(Row[field_typemot].ToString().ToLower());
                    string ResumeMot = Tools.RemoveDiacritics(Row[field_resumemot].ToString().ToLower());
                    if (TypeMot.Contains("pansement") || ResumeMot.Contains("pansement"))
                        MotType = FicheType.PANSEMENT;
                    else if (TypeMot.Contains("diab") || ResumeMot.Contains("diab") || TypeMot.Contains("glyc") || ResumeMot.Contains("glyc"))
                        MotType = FicheType.GLYCEMIE;
                    else
                        continue;

                    long LastModifDate = Tools.DateToTimestamp(fInfo.LastWriteTime);
                    string PatientName = Row[field_nom].ToString().Replace("'", "''");      // On doubles les quotes pour éviter les erreurs SQL
                    string PatientSubName = Row[field_prenom].ToString().Replace("'", "''");

                    string Req = string.Format("SELECT last_modif FROM {0} WHERE name = '{1}'", BaseName, fName);
                    DataTable Query = Program.DbFile.Query(Req);
                    if (Query.Rows.Count == 0 || (long)Query.Rows[0][0] < Tools.DateToTimestamp(fInfo.LastWriteTime))      //On sauvegarde si le fichier n'existe pas ou si il a été modifié
                    {
                        string ReqSave = string.Format(ReqPrepareSave, BaseName, fName, MakeNewName(PatientName, PatientSubName, Row[field_ippcegi].ToString(), NumMot, ".xls"), (int)MotType, LastModifDate, dir);
                        Program.DbFile.ExecuteQuery(ReqSave);
                    }
                    else if (Query.Rows.Count > 0)      //Si le fichier existe et qu'il n'a pas été modifié, on indique qu'il ne faut pas le supprimer
                    {
                        string ReqUpdated = string.Format("UPDATE {0} SET updated = 2 WHERE name = '{1}'", BaseName, fName);
                        Program.DbFile.ExecuteQuery(ReqUpdated);
                    }
                }
            }
            
            /* Lorsque le champ "updated" est à 1, le fichier ou le mot a été modifié
             Lorsqu'il est à 2, le fichier ou le mot n'a pas été modifié mais existe toujours (patient en cours etc...)
             Donc, lorsqu'il est à 0, c'est que le fichier ou le mot peut être supprimé. 
             
            On supprime toutes les lignes où ce champ est à 0, puis on le remet à cette valeur pour la prochaine execution du programme. */
            Program.DbFile.ExecuteQuery("DELETE FROM " + BaseName + "_mots WHERE updated = 0");
            Program.DbFile.ExecuteQuery("UPDATE " + BaseName + "_mots SET updated = 0");

            Program.DbFile.ExecuteQuery("DELETE FROM " + BaseName + " WHERE updated = 0");
            Program.DbFile.ExecuteQuery("UPDATE " + BaseName + " SET updated = 0");
        }
Пример #2
0
        private static List<Client> ClientsList;    //Contient la liste des PC clients ainsi que leurs infos (IP, nom d'utilisateur...)

        static void Main(string[] args)
        {
            Console.WriteLine("Demarrage de la sauvegarde...");

            Logger.Initialize(); //On initialise la classe permettant de logger les erreurs dans un fichiers textes

            ClientsList = new List<Client>();

            if (!Directory.Exists(BaFilesDir))
            {
                Logger.Out("Repertoire introuvable : " + BaFilesDir);
                return;
            }
            if (!Directory.Exists(FlFilesDir))
            {
                Logger.Out("Repertoire introuvable : " + FlFilesDir);
                return;
            }


            //On initialise les connections aux bases de données (Y compris le fichier .db)
            DbBainville = new DBConnector(DnsBainville, DbUser, DbPassword);
            DbFlavigny = new DBConnector(DnsFlavigny, DbUser, DbPassword);
            DbFile = new DBConnector("CalyDegrade.db");

            //On vérifie que les connexions aux DB sont bien ouvertes
            if (!DbBainville.IsOpen() || !DbFlavigny.IsOpen())
            {
                Logger.Out("Connection impossible a la BD.");
                return;
            }

            Console.WriteLine("Connections aux BDD reussies.");

            if (!DbFile.IsOpen())
            {
                Logger.Out("Connection impossible au fichier .db");
                return;
            }

            Console.WriteLine("Connection au fichier .db reussie...");

            //On lit le fichier de conf (la liste des PC)
            if (!ReadListFile())
            {
                Logger.Out("Impossible de lire le fichier liste");
                return;
            }

            if (!Conf.Init(CONF_FILE_NAME))
            {
                return;
            }
            LoadConfig();

            Console.WriteLine("Lecture du fichier liste terminee.");

            //Save.CleanSaveClientsTable();
            Save.PrepareSave(DbBainville, BaFilesDir);
            Save.PrepareSave(DbFlavigny, FlFilesDir);
            Save.ProcessSaveToClient();

            if (SaveError)
            {
                DbFile.ExecuteQuery("UPDATE mail SET send = 1");
            }

            //Envoi d'un mail trois fois par jour
            DataTable Result = DbFile.Query("SELECT send FROM mail");
            if (Result.Rows.Count == 0)
                Logger.Out("Fichier .DB corrompu.", true);
            else
            {
                int send;
                int.TryParse(Result.Rows[0]["send"].ToString(), out send);
                if (send == 1)
                {
                    if ((DateTime.Now.Hour >= 8 && DateTime.Now.Hour < 9 && DateTime.Now.Minute <= 14) || (DateTime.Now.Hour >= 13 && DateTime.Now.Hour < 14 && DateTime.Now.Minute <= 14) || (DateTime.Now.Hour >= 16 && DateTime.Now.Hour < 17 && DateTime.Now.Minute <= 14))
                    {
                        SendMail();
                        DbFile.ExecuteQuery("UPDATE mail SET send = 0");
                    }
                }
            }

            DbBainville.Close();
            DbFlavigny.Close();
            DbFile.Close();
        }