//-------------------------------------------------------------------- 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; }
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;*/ }
//--------------------------------------------------------------------------- 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); }