Exemplo n.º 1
0
        //--------------------------------------------------------------------
        static void CTimosServeur_OnMajStructureBaseEvent(object sender, EventArgs e)
        {
            // Mise à jour de la base
            C2iDataBaseUpdateOperationTable opTableCamusatData =
                new C2iDataBaseUpdateOperationTable(typeof(CCamusatQowisioData));
            C2iDataBaseUpdateOperationTable opTableCamusatAlarm =
                new C2iDataBaseUpdateOperationTable(typeof(CCamusatQowisioAlarm));

            IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(0, "");

            if (connexion != null)
            {
                CResultAErreur result = CResultAErreur.True;
                try
                {
                    connexion.BeginTrans();
                    result = opTableCamusatData.ExecuterOperation(connexion, null);
                    if (result)
                    {
                        result = opTableCamusatAlarm.ExecuterOperation(connexion, null);
                    }
                    if (!result)
                    {
                        connexion.RollbackTrans();
                    }
                    else
                    {
                        connexion.CommitTrans();
                    }
                }
                catch (Exception ex)
                {
                    result.EmpileErreur(ex.Message);
                }
            }
            m_bTraitementEnCours = false;
        }
Exemplo n.º 2
0
        public static void Demasque()
        {
            int c_nAttente     = 500;                   // 500 ms d'attente dans la boucle
            int nNbToursBoucle = 1800000 / c_nAttente;  // Nb de tours de boucle pour 1/2h d'attente

            Thread.Sleep(50000);

            CSessionClient session = CSessionClient.CreateInstance();

            session.OpenSession(new CAuthentificationSessionServer(), "Unmask alarms", ETypeApplicationCliente.Service);


            IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(session.IdSession, CSpvServeur.c_spvConnection);
            string             stSQL     = "Begin MaskModified; end;";
            CResultAErreur     result;
            int nErreur1 = 0, nErreur2 = 0;

            while (true)
            {
                // Démasquage
                result = CResultAErreur.True;
                try
                {
                    // Démasquage
                    result += connexion.BeginTrans();
                    if (result)
                    {
                        result += connexion.ExecuteScalar(stSQL);
                    }

                    if (result)
                    {
                        result += connexion.CommitTrans();
                    }
                    else
                    {
                        connexion.RollbackTrans();
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(e.Message);
                }

                if (!result)
                {
                    if (nErreur1 == 0)
                    {
                        C2iEventLog.WriteErreur(I.T("Problem with unmasking alarms automatically|50000"));
                        nErreur1++;
                    }
                }

                // Pour ne pas trop encombrer les événements windows
                if (nErreur1 > 0)
                {
                    nErreur1++;
                }
                else if (nErreur1 > nNbToursBoucle) // Equipvaut à 1/2 heure
                {
                    nErreur1 = 0;
                }

                // Démasquage alarmes filles (traitement déconnecté du précédent)
                try
                {
                    result = connexion.BeginTrans();
                    if (result)
                    {
                        result += connexion.ExecuteScalar("DELETE " + CSpvFinalarm.c_nomTableInDb);
                    }

                    if (result)
                    {
                        result += connexion.CommitTrans();
                    }
                    else
                    {
                        connexion.RollbackTrans();
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(e.Message);
                }

                if (!result)
                {
                    if (nErreur2 == 0)
                    {
                        C2iEventLog.WriteErreur(I.T("Problem with unmasking child alarms automatically|50001"));
                        nErreur2++;
                    }
                }

                // Pour ne pas trop encombrer les événements windows
                if (nErreur2 > 0)
                {
                    nErreur2++;
                }
                else if (nErreur2 > nNbToursBoucle) // Equipvaut à 1/2 heure
                {
                    nErreur2 = 0;
                }

                if (C2iStopApp.AppStopper.WaitOne(c_nAttente, false))
                {
                    break;
                }
            }
        }
        //--------------------------------------------------------------------------------------------------------------------
        public override CResultAErreur ExecuterOperation(IDatabaseConnexion connection, IIndicateurProgression indicateur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (!typeof(IObjetDonneeAIdNumerique).IsAssignableFrom(m_type) || !CObjetDonnee.TypeManageIdUniversel(m_type))
            {
                result.EmpileErreur(m_type.ToString() + " can not have Universal Id");
            }

            string strNomTable = CContexteDonnee.GetNomTableForType(m_type);

            CStructureTable structure  = CStructureTable.GetStructure(m_type);
            string          strChampId = structure.ChampsId[0].NomChamp;

            C2iRequeteAvancee requete = new C2iRequeteAvancee();

            requete.FiltreAAppliquer = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", "");
            requete.TableInterrogee  = CContexteDonnee.GetNomTableForType(m_type);
            requete.ListeChamps.Add(new C2iChampDeRequete(strChampId, new CSourceDeChampDeRequete(strChampId),
                                                          typeof(int),
                                                          OperationsAgregation.None, true));
            Console.WriteLine("Update Universal id on " + strNomTable);
            result = requete.ExecuteRequete(connection.IdSession);
            if (!result)
            {
                return(result);
            }
            string    strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable);
            DataTable table           = result.Data as DataTable;
            int       nNb             = 0;
            bool      bWasInTrans     = connection.IsInTrans();

            if (bWasInTrans)
            {
                connection.CommitTrans();
            }
            DateTime dt = DateTime.Now;

            if (table.Rows.Count > 0)
            {
                if (table.Rows.Count > 10000 && connection is COracleDatabaseConnexion)
                {
                    string strQuery = "Update " + strNomTableInDb + " set " + CObjetDonnee.c_champIdUniversel +
                                      "=CONCAT('" + strNomTableInDb + "'," + strChampId + ")";
                    result = connection.RunStatement(strQuery);
                }
                else
                {
                    foreach (DataRow row in table.Rows)
                    {
                        string strQuery = "Update " + strNomTableInDb + " set " +
                                          CObjetDonnee.c_champIdUniversel + "='" + CUniqueIdentifier.GetNew() + "' where " +
                                          strChampId + "=" + row[0].ToString();
                        result = connection.ExecuteScalar(strQuery);
                        if (!result)
                        {
                            break;
                        }
                        nNb++;
                        if (nNb % 100 == 0)
                        {
                            TimeSpan sp   = DateTime.Now - dt;
                            double   fVal = (double)sp.TotalSeconds / (double)nNb * (double)(table.Rows.Count - nNb);
                            Console.WriteLine(strNomTableInDb + " " + nNb + "/" + table.Rows.Count + " reste " + fVal.ToString("0s"));
                        }
                    }
                }
            }
            if (bWasInTrans)
            {
                connection.BeginTrans();
            }
            return(result);

            /*
             *
             * //Trouve tous les éléments du type qui n'ont pas d'id universel
             * using (CContexteDonnee ctx = new CContexteDonnee(connection.IdSession, true, false))
             * {
             *  CListeObjetsDonnees lst = new CListeObjetsDonnees(ctx, m_type, false);
             *  lst.Filtre = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", "");
             *  lst.Filtre.IgnorerVersionDeContexte = true;
             *  lst.AppliquerFiltreAffichage = false;
             *
             *  foreach (IObjetDonnee objet in lst.ToArrayList())
             *  {
             *      objet.Row[CObjetDonnee.c_champIdUniversel] = CUniqueIdentifier.GetNew();
             *  }
             *  string strNomTable = CContexteDonnee.GetNomTableForType(m_type);
             *  CObjetServeur objetServeur = CContexteDonnee.GetTableLoader(strNomTable, null, connection.IdSession) as CObjetServeur;
             *  int nCount = ctx.Tables[strNomTable].Rows.Count;
             *  DataTable tableSource = ctx.Tables[strNomTable];
             *
             *   List<string> lstChampsExclus = new List<string>();
             *  HashSet<string> lstIDs = new HashSet<string>();
             *  CStructureTable structure = CStructureTable.GetStructure(m_type);
             *  foreach (CInfoChampTable info in structure.ChampsId)
             *      lstIDs.Add(info.NomChamp);
             *
             *  foreach (CInfoChampTable champ in structure.Champs)
             *      if (champ.NomChamp != CObjetDonnee.c_champIdUniversel && !lstIDs.Contains(champ.NomChamp))
             *          lstChampsExclus.Add(champ.NomChamp);
             *
             *  IDataAdapter adapter = objetServeur.GetDataAdapter(DataRowState.Modified, lstChampsExclus.ToArray());
             *
             *  for (int nRow = 0; nRow < nCount; nRow += 5000)
             *  {
             *
             *      using (DataSet dsCopie = new DataSet())
             *      {
             *          dsCopie.EnforceConstraints = false;
             *          DataTable tableCopie = ctx.Tables[strNomTable].Clone();
             *          tableCopie.BeginLoadData();
             *          dsCopie.Tables.Add(tableCopie);
             *          int nMax = Math.Min(nRow + 5000, nCount);
             *          DateTime dt = DateTime.Now;
             *          for (int n = nRow; n < nMax; n++)
             *          {
             *              tableCopie.ImportRow(tableSource.Rows[n]);
             *          }
             *          TimeSpan sp = DateTime.Now - dt;
             *          Console.WriteLine("Write 1" + strNomTable + " " + nRow + "/" + nCount+"  "+sp.TotalSeconds.ToString());
             *          adapter.Update(dsCopie);
             *          sp = DateTime.Now - dt;
             *          Console.WriteLine("Write 2" + strNomTable + " " + nRow + "/" + nCount + "  " + sp.TotalSeconds.ToString());
             *      }
             *  }
             * }
             * return result;*/
        }
Exemplo n.º 4
0
        //---------------------------------------------------------------------------
        public CResultAErreur UpdateStructureBase(IIndicateurProgression indicateurProgress)
        {
            CResultAErreur result = CResultAErreur.True;

            m_indicateurProgress = indicateurProgress;

            int nVersionDB     = (int)new CDatabaseRegistre(Connection).GetValeurLong(c_strCleVersionBDD, -1);
            int nVersionFinale = m_structureDB.GetLastVersion();

            int nOldVersion = nVersionDB;

            if (nVersionDB < 0)
            {
                result = InitialisationBase();
            }

            if (m_bForceMAJ)
            {
                nVersionDB = nVersionDB > 0 ? nVersionDB - 1 : 0;
            }

            if (nVersionDB < 0)
            {
                nVersionDB = 0;
            }

            if (m_indicateurProgress != null)
            {
                m_indicateurProgress.PushLibelle(I.T("Database Update|30005"));
                m_indicateurProgress.SetBornesSegment(nVersionDB, nVersionFinale);
                //m_indicateurProgress.PushSegment(nVersionDB, nVersionFinale);
            }

            result = m_connexion.GetDataBaseCreator().UpdateStructureTableRegistre();

            while (nVersionDB < nVersionFinale && result)
            {
                nVersionDB++;

                result = m_connexion.BeginTrans();

                if (!result)
                {
                    return(result);
                }

                if (m_indicateurProgress != null)
                {
                    m_indicateurProgress.SetInfo("Version " + nVersionDB.ToString());
                    m_indicateurProgress.SetValue(nVersionDB - 1);
                    m_indicateurProgress.PushLibelle("DataBase v" + nVersionDB.ToString());
                    m_indicateurProgress.PushSegment(nVersionDB - 1, nVersionDB);
                }

                result = UpdateToVersion(nVersionDB);

                //Validation ou annulation des modifications si erreur
                if (!result)
                {
                    m_connexion.RollbackTrans();
                    result.EmpileErreur(I.T("Database Update Error|30006"));
                    throw new CExceptionErreur(result.Erreur);
                }
                else
                {
                    result = m_connexion.CommitTrans();
                }


                if (m_indicateurProgress != null)
                {
                    m_indicateurProgress.PopSegment();
                    m_indicateurProgress.PopLibelle();
                }
            }

            /*if (m_indicateurProgress != null)
             *      m_indicateurProgress.PopSegment();*/

            //rafraichit les caches de schéma
            CObjetServeur.ClearCacheSchemas();
            C2iOracleDataAdapter.ClearCacheSchemas();
            CStructureTable.ClearCache();

            return(result);
        }