Ejemplo n.º 1
0
        public CResultAErreur ExecuteScalar(string strStatement)
        {
            IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeof(CSpvSiteServeur));

            return(connexion.ExecuteScalar(strStatement));
        }
        //--------------------------------------------------------------------------------------------------------------------
        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;*/
        }
Ejemplo n.º 3
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;
                }
            }
        }