//Récuperation du type de connection public static void Autoexec() { CSc2iDataServer.AddDefinitionConnexion( new CDefinitionConnexionDataSource( c_spvConnection, typeof(COracleDatabaseConnexion), CSpvServeurRegistre.DatabaseConnexionString, CSpvServeurRegistre.PrefixeTablesSPV)); CSc2iDataServer.SetIdConnexionForAssembly("spv.data.serveur", c_spvConnection); COracleDatabaseConnexion cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(0, c_spvConnection) as COracleDatabaseConnexion; ((COracleDatabaseConnexion)cnx).NomTableSpaceIndex = CSpvServeurRegistre.NomTableSpaceIndexOracle; cnx.RunStatement("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"); }
private CResultAErreur VideTable(int nIdTypeDonnee, DataTable table) { ArrayList lstRows = new ArrayList(table.Rows); CDonneeNotificationModificationContexteDonnee donnee = new CDonneeNotificationModificationContexteDonnee(IdSession); foreach (DataRow row in lstRows) { donnee.AddModifiedRecord(table.TableName, true, new object[] { row[table.PrimaryKey[0]] }); } CResultAErreur result = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, "").RunStatement( "delete from " + CDonneeCumulee.c_nomTable + " where " + CTypeDonneeCumulee.c_champId + "=" + nIdTypeDonnee.ToString()); if (!result) { return(result); } table.Rows.Clear(); CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { donnee }); return(result); }
//------------------------------------------------------------------------ private static bool IsTransactionTerminee(int nIdSession) { //S'assure que la transaction est terminée pour cette session CSessionClient session = CSessionClient.GetSessionForIdSession(nIdSession); IDatabaseConnexion cnx = null; if (session != null && session.IsConnected) { try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(nIdSession, typeof(CEtapeWorkflow)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } } else { cnx = null; } return(cnx == null || !cnx.IsInTrans()); }
/// ////////////////////////////////////////////////////// private CResultAErreur OnCommitTrans() { CResultAErreur result = CResultAErreur.True; try { ArrayList lstToDelete = null; ArrayList lstToValidate = null; ArrayList lstNotToDelete = null; GetListesPourValidation(ref lstToDelete, ref lstToValidate, ref lstNotToDelete); foreach (CReferenceDocument refDoc in lstToDelete) { DeleteDocument(refDoc); } foreach (CReferenceDocument refDoc in lstToValidate) { ValideDocument(refDoc); } lstToDelete.Clear(); lstToValidate.Clear(); lstNotToDelete.Clear(); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); result.EmpileErreur(I.T("Error while deleting/validating of EDM Documents|30001")); } finally { IDatabaseConnexion con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, GetType()); if (con != null) { con.OnCommitTrans -= m_commitEventHandlerNote; } } return(result); }
//-------------------------------------------------------------------- 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 CResultAErreur Execute(int nIdSession, System.Collections.Hashtable valeursParametres) { CResultAErreur result = CResultAErreur.True; using (CContexteDonnee contexte = new CContexteDonnee(nIdSession, true, false)) { CSessionClient session = CSessionClient.GetSessionForIdSession(nIdSession); session.BeginTrans(); try { CHandlerEvenementServeur.SuspendGestionnaire(true); IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(nIdSession, typeof(CVersionDonneesObjetServeur)); //Supprime les versions string strRequete = "delete from " + CVersionDonneesObjetOperation.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } strRequete = "delete from " + CVersionDonneesObjet.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(CVersionDonnees.c_nomTable)) { if (info.TableParente == CVersionDonnees.c_nomTable) { strRequete = "update " + info.TableFille + " set " + info.ChampsFille[0] + "=null where " + info.ChampsFille[0] + " is not null"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } strRequete = "delete from " + CVersionDonnees.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } contexte.SetVersionDeTravail(-1, false); //Charge toutes les tables List <Type> typesAChamps = new List <Type>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { contexte.GetTableSafe(CContexteDonnee.GetNomTableForType(tp)); if (typeof(IObjetDonneeAChamps).IsAssignableFrom(tp)) { typesAChamps.Add(tp); } } /*Problème sur les champs custom : parfois (c'est rare, mais ça arrive * les valeurs de champs ne sont pas supprimées alors que l'entité est bien * supprimée. On ne sait pas pourquoi, mais les lignes suivantes * règlent le problème*/ foreach (Type tp in typesAChamps) { string strNomTable = CContexteDonnee.GetNomTableForType(tp); IObjetDonneeAChamps elt = (IObjetDonneeAChamps)Activator.CreateInstance(tp, new object[] { contexte }); string strTableValeurs = elt.GetNomTableRelationToChamps(); strRequete = "Update " + strTableValeurs + " set " + CSc2iDataConst.c_champIsDeleted + "=1 where " + elt.GetChampId() + " in (select " + elt.GetChampId() + " from " + strNomTable + " where " + CSc2iDataConst.c_champIsDeleted + "=1)"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } ArrayList lstTables = CContexteDonnee.GetTableOrderDelete(contexte); DataTable tableChampsCustomEnDernier = null; foreach (DataTable table in lstTables) { /* J'ai un problème avec la table Champs Custom * La requête suivante ne passe pas même directement dans SQL Server * DELETE FROM CUSTOM_FIELD WHERE (SC2I_VERSION IS NOT NULL) OR (SC2I_DELETED = 1) * Si je ne traite pas cette table, la purge se passe bien * */ if (table.TableName == CChampCustom.c_nomTable) { tableChampsCustomEnDernier = table; continue; } if (table.Columns.Contains(CSc2iDataConst.c_champIdVersion)) { strRequete = "delete from " + table.TableName + " where " + CSc2iDataConst.c_champIdVersion + " is not null or " + CSc2iDataConst.c_champIsDeleted + "=1"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } //if (tableChampsCustomEnDernier != null) //{ // if (tableChampsCustomEnDernier.Columns.Contains(CSc2iDataConst.c_champIdVersion)) // { // strRequete = "delete from " + tableChampsCustomEnDernier.TableName + " where " + // CSc2iDataConst.c_champIdVersion + " is not null or " + // CSc2iDataConst.c_champIsDeleted + "=1"; // result = connexion.RunStatement(strRequete); // if (!result) // return result; // } //} } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { CHandlerEvenementServeur.SuspendGestionnaire(false); if (!result) { session.RollbackTrans(); } else { result = session.CommitTrans(); } } } return(result); }
private IDatabaseConnexionSynchronisable GetDbSynchronisable() { IDatabaseConnexionSynchronisable db = (IDatabaseConnexionSynchronisable)CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, "") as IDatabaseConnexionSynchronisable; return(db); }
/// ////////////////////////////////////////////////// ///Démarre une étape. ///Attention, un étape ne peut démarrer que si elle n'est pas déjà démarrée public void RunEtape(int nIdSessionMain, int nIdEtape) { CResultAErreur result = CResultAErreur.True; CDbKey keyUser = null; //Attend la fin des transactions en cours pour la session principale IDatabaseConnexion cnx = null; do { CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); if (session != null && session.IsConnected) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYTODO if (info != null) { keyUser = info.KeyUtilisateur; } try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeof(CEtapeWorkflow)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } System.Threading.Thread.Sleep(50); } else { cnx = null; } }while (cnx != null && cnx.IsInTrans()); lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps ! { List <CDonneeNotificationWorkflow> lstNotifications = new List <CDonneeNotificationWorkflow>(); CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess(); using (CSessionClient sousSession = CSessionClient.CreateInstance()) { try { Console.WriteLine("Thread : " + System.Diagnostics.Process.GetCurrentProcess().Threads.Count); sousSession.OpenSession(auth, "Workflow step " + nIdEtape, ETypeApplicationCliente.Process); //TESTDBKEYTODO if (keyUser != null) { sousSession.ChangeUtilisateur(keyUser); } using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true)) { CEtapeWorkflow etape = new CEtapeWorkflow(ctx); int nWaiter = 10; while (!etape.ReadIfExists(nIdEtape) && nWaiter > 0) { //On ne trouve pas l'étape, c'est peut être que l'écriture en base n'est pas completement terminée //On va retenter toutes les 2 secondes pendant 20 secondes, si elle n'existe jamais, //c'est qu'il y a eu suppression (ou au moins non commit). nWaiter--; Thread.Sleep(2000); } if (etape.ReadIfExists(nIdEtape)) { result = etape.InternalSetInfosDemarrageInCurrentContext(); etape.EtatCode = (int)EEtatEtapeWorkflow.Démarrée; result = ctx.SaveAll(true); if (result) { result = etape.InternalRunAndSaveifOk(); } if (result && etape.CodeAffectations.Length > 0 && etape.DateFin == null) { CDonneeNotificationWorkflow donneeWorkflow = new CDonneeNotificationWorkflow( nIdSessionMain, etape.Id, etape.Libelle, etape.CodeAffectations, etape.TypeEtape.ExecutionAutomatique); lstNotifications.Add(donneeWorkflow); // Déclenche l'evenement spécifique au démarrage de l'étape result = etape.EnregistreEvenement(CEtapeWorkflow.c_codeEvenementOnRunStep, true); } if (!result) { NoteErreurSurEtape(etape, result.Erreur.ToString()); return; } } } } catch (Exception e) { } finally { sousSession.CloseSession(); } } if (lstNotifications != null) { CEnvoyeurNotification.EnvoieNotifications(lstNotifications.ToArray()); } } }
/// //////////////////////////////// public CResultAErreur ExecuteRequete(C2iRequeteAvancee requete) { CResultAErreur result = CResultAErreur.True; string strTable = requete.TableInterrogee; //S'il y a un filtre sur la requête avancée, //On prépare d'abord la sous requête de sélection des ids qui nous //Interessent Type typeReference = CContexteDonnee.GetTypeForTable(strTable); if (typeReference == null) { result.EmpileErreur(I.T("Impossible to define the associated type with @1|121", strTable)); return(result); } IDatabaseConnexion con; if (typeReference == null) { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, ""); } else { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeReference); } CFiltreData filtre = requete.FiltreAAppliquer; CArbreTable arbre = null; bool bHasVersionSurTablePrincipale = false; Type tpObjet = CContexteDonnee.GetTypeForTable(requete.TableInterrogee); if (tpObjet != null && !typeof(IObjetSansVersion).IsAssignableFrom(tpObjet) && typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpObjet)) { bHasVersionSurTablePrincipale = true; } if (bHasVersionSurTablePrincipale) { CFiltreDataAvance filtreVersion = new CFiltreDataAvance(strTable, ""); //Lecture dans le référentiel if (requete.IdVersionDeTravail == null && (filtre == null || !filtre.IgnorerVersionDeContexte)) { filtreVersion.Filtre = "HasNo(" + CSc2iDataConst.c_champIdVersion + ")"; } //Ignorer les suppressions if (filtre != null && !filtre.IntegrerLesElementsSupprimes) { if (filtreVersion.Filtre != "") { filtreVersion.Filtre += " and "; } filtreVersion.Filtre += CSc2iDataConst.c_champIsDeleted + "=0"; } //Lecture dans une version if (requete.IdVersionDeTravail != null && (filtre == null || !filtre.IgnorerVersionDeContexte) && requete.IdVersionDeTravail >= 0) { if (filtre == null) { filtre = new CFiltreData(); } filtre.IdsDeVersionsALire = CVersionDonnees.GetVersionsToRead(IdSession, (int)requete.IdVersionDeTravail); } if (filtreVersion.Filtre != "") { filtre = CFiltreData.GetAndFiltre(filtre, filtreVersion); } } if (filtre != null && filtre is CFiltreDataAvance) { result = ((CFiltreDataAvance)filtre).GetArbreTables(); if (!result) { return(result); } arbre = (CArbreTable)result.Data; } result = requete.CalculeArbre(arbre); if (!result) { return(result); } arbre = (CArbreTable)result.Data; int nOldTimeOut = con.CommandTimeOut; con.CommandTimeOut = 60 * 2; result = con.ExecuteRequeteComplexe(requete.Champs, arbre, filtre); con.CommandTimeOut = nOldTimeOut; return(result); }
public static CResultAErreur Init( string strEventJournalName, string strEventJournalTexte, IIndicateurProgression indicateurProgress) { CResultAErreur result = CResultAErreur.True; try { int nValeurIndicateur = 0; C2iEventLog.Init(strEventJournalName, strEventJournalTexte, NiveauBavardage.VraiPiplette); CConteneurIndicateurProgression indicateur = CConteneurIndicateurProgression.GetConteneur(indicateurProgress); if (indicateur != null) { indicateur.PushSegment(0, 13); } CTraducteur.ReadFichier(""); #region Configuration du remoting indicateur.SetValue(nValeurIndicateur++); AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); C2iSponsor.EnableSecurite(); #endregion #region Configuration de l'allocateur d'objets Dictionary <string, MarshalByRefObject> dicLocalSingleton = new Dictionary <string, MarshalByRefObject>(); dicLocalSingleton["sc2i.multitiers.client.IGestionnaireSessions"] = new CGestionnaireSessionSagexProSolo(); C2iFactory.InitEnLocal(new C2iObjetServeurFactory(), dicLocalSingleton); indicateur.SetValue(nValeurIndicateur++); CSessionClient session = CSessionClient.CreateInstance(); result = session.OpenSession(new CAuthentificationSessionServer(), "SagexProSolo", ETypeApplicationCliente.Service); if (!result) { result.EmpileErreur(I.T("Opening session error|30010")); return(result); } CSc2iDataServer.AddDefinitionConnexion( new CDefinitionConnexionDataSource( c_droitsDataSource, typeof(CGestionnaireDroitsUtilisateurs), "")); CSc2iDataServer.SetIdConnexionForClasse(typeof(CDroitUtilisateurServeur), c_droitsDataSource); #endregion #region Configuration de la base de données indicateur.SetValue(nValeurIndicateur++); Type typeConnexion = typeof(CAccess97DatabaseConnexion); //Récuperation du type de connection CSc2iDataServer.Init( new CDefinitionConnexionDataSource( c_mainDataSource, typeConnexion, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Documents and Settings\\GENERIC\\Mes documents\\BASEVIDE2000.MDB\"", "")); #endregion #region Ajout des références DLL indicateur.SetValue(nValeurIndicateur++); AppDomain.CurrentDomain.Load("sc2i.data.client"); AppDomain.CurrentDomain.Load("sc2i.data.serveur"); AppDomain.CurrentDomain.Load("sc2i.data.dynamic"); AppDomain.CurrentDomain.Load("sc2i.data.dynamic.loader"); AppDomain.CurrentDomain.Load("sc2i.process"); AppDomain.CurrentDomain.Load("sc2i.process.serveur"); AppDomain.CurrentDomain.Load("sc2i.expression"); AppDomain.CurrentDomain.Load("sc2i.Formulaire"); AppDomain.CurrentDomain.Load("futurocom.vectordb.data"); AppDomain.CurrentDomain.Load("futurocom.vectordb.data.server"); AppDomain.CurrentDomain.Load("futurocomapp.data"); AppDomain.CurrentDomain.Load("futurocomapp.data.server"); AppDomain.CurrentDomain.Load("sagexpro.data"); AppDomain.CurrentDomain.Load("sagexpro.data.serveur"); foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies()) { CContexteDonnee.AddAssembly(ass); } #endregion #region Teste la connexion indicateur.SetValue(nValeurIndicateur++); IDatabaseConnexion cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(session.IdSession, c_mainDataSource); //Attend la connexion pendant au max 5 minutes pour que ça démarre DateTime dtStartAttente = DateTime.Now; TimeSpan delaiAttente = DateTime.Now - dtStartAttente; result = cnx.IsConnexionValide(); while (!result && delaiAttente.TotalSeconds < 5 * 60) { C2iEventLog.WriteErreur(result.MessageErreur); delaiAttente = DateTime.Now - dtStartAttente; C2iEventLog.WriteErreur(I.T("Connection not availiable(@1)|30014", delaiAttente.TotalSeconds.ToString() + " s)") + Environment.NewLine); string messageErreur = I.T("The connection with the database could not have been established. Verify the connection string and check if the database has been started|30015"); C2iEventLog.WriteErreur(messageErreur); result.EmpileErreur(messageErreur); return(result); } if (typeof(CSqlDatabaseConnexion).IsAssignableFrom(typeConnexion)) { cnx.RunStatement("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); } #endregion //Initialisation des classes autoexecutables CAutoexecuteurClasses.RunAutoexecs(); //Initialisation du serveur de documents GED //Initialise les restrictions standards #region Vérifie que les champs des tables font bien moins de 25 cars indicateur.SetValue(nValeurIndicateur++); DateTime dt = DateTime.Now; foreach (Type tp in CContexteDonnee.GetAllTypes()) { CStructureTable structure = CStructureTable.GetStructure(tp); if (structure.NomTable.Length > 25) { result.EmpileErreur("Table " + structure.NomTable + " (" + tp.ToString() + ")=" + structure.NomTable.Length + "cars"); } if (structure.NomTable.ToUpper() != structure.NomTable) { result.EmpileErreur(I.T("Table name @1 must be uppercase|30018", structure.NomTable)); } foreach (CInfoChampTable champ in structure.Champs) { if (champ.NomChamp.Length > 25) { result.EmpileErreur("Table " + structure.NomTable + " (" + tp.ToString() + ")\t champ " + champ.NomChamp + "=" + champ.NomChamp.Length + "cars"); } if (champ.NomChamp.ToUpper() != champ.NomChamp) { result.EmpileErreur(I.T("The name of the field '@1' of the field '@2' must be uppercase|30019", champ.NomChamp, structure.NomTable)); } } } TimeSpan sp = DateTime.Now - dt; Console.WriteLine(I.T("Table name verification |30020") + sp.TotalMilliseconds); if (!result) { return(result); } #endregion #region Mise à jour de la structure de la base indicateur.SetValue(nValeurIndicateur++); CUpdaterDataBase updaterDataBase = CUpdaterDataBase.GetInstance(cnx, new CSagexproStructureBase()); //S'assure que la gestion des éléments est initialisé dans les licences //CLicenceCheckElementNb.GetInstance(); result = updaterDataBase.UpdateStructureBase(indicateur); if (!result) { return(result); } #endregion //Restrictions sur applications //Initialisation du serveur de documents GED //Initialisation de la base d'utilisateurs AD //CAdBase.Init(CfuturocomappServeurRegistre.RacineAd,"",""); //Initialise les fournisseurs de services //CSessionClientSurServeur.RegisterFournisseur( new CFournisseurFiltresForSynchronisation() ); CGestionnaireEvenements.Init(); if (!result) { return(result); } //CGestionnaireObjetsAttachesASession.OnAttacheObjet += new LinkObjectEventHandler(CGestionnaireObjetsAttachesASession_OnAttacheObjet); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } return(result); }
/// //////////////////////////////// public CResultAErreur ExecuteRequete(C2iRequete requete, IElementAVariablesDynamiquesAvecContexteDonnee elementAVariables, bool bStructureOnly) { CResultAErreur result = CResultAErreur.True; Type typeReference = requete.TypeReferencePourConnexion; if (typeReference != null) { ///TODO ///Problème VersionObjet object objServeur = CContexteDonnee.GetTableLoader(CContexteDonnee.GetNomTableForType(typeReference), null, IdSession); if (objServeur != null) { typeReference = objServeur.GetType(); } else { typeReference = null; } } IDatabaseConnexion con; if (typeReference == null) { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, ""); } else { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeReference); } object[] lstParams = null; string strRequete = GetTexteRequeteFinaleSql(requete, elementAVariables, ref lstParams, con); int nOldTimeOut = con.CommandTimeOut; con.CommandTimeOut = 60 * 10; IDataAdapter adapter = con.GetAdapterForRequete(strRequete, lstParams); DataSet ds = new DataSet(); try { lock (con) { if (bStructureOnly) { adapter.FillSchema(ds, SchemaType.Source); } else { adapter.Fill(ds); } } if (ds.Tables.Count > 0) { DataTable table = ds.Tables[0]; if (requete.TableauCroise != null) { result = requete.TableauCroise.CreateTableCroisee(table); if (result) { table = (DataTable)result.Data; } } table.TableName = "DONNEES_REQUETE"; result.Data = table; } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); result.EmpileErreur(I.T("Error in the request '@1'|102", strRequete)); } finally { con.CommandTimeOut = nOldTimeOut; CUtilDataAdapter.DisposeAdapter(adapter); } return(result); }
public CResultAErreur ExecuteScalar(string strStatement) { IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeof(CSpvSiteServeur)); return(connexion.ExecuteScalar(strStatement)); }
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 static void MonitorAlarmes() { int nCptWatchDogAlSyst = 0; Thread.Sleep(50000); CSessionClient session = CSessionClient.CreateInstance(); session.OpenSession(new CAuthentificationSessionServer()); while (true) { //Thread.Sleep(200); // inhibition pour faciliter debug des autres objets //continue; nCptWatchDogAlSyst++; using (CContexteDonnee ctx = new CContexteDonnee(session.IdSession, true, true)) { CListeObjetsDonnees lst = new CListeObjetsDonnees(ctx, typeof(CSpvMessalrm)); if (lst.Count > 0) { List <CEvenementAlarm> lstAlarm = new List <CEvenementAlarm>(); StringBuilder bl = new StringBuilder(); foreach (CSpvMessalrm message in lst) { try { CEvenementAlarm eventAlarm = message.GetNewEvenementAlarm(); if (eventAlarm != null) { lstAlarm.Add(eventAlarm); } } catch (Exception e) { C2iEventLog.WriteErreur(e.Message); } bl.Append(message.Id); bl.Append(','); } bl.Remove(bl.Length - 1, 1); if (lstAlarm.Count > 0) { CDonneeNotificationAlarmes notif = new CDonneeNotificationAlarmes(session.IdSession, lstAlarm); CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { notif }); } SendMailsDelegate sndMail = new SendMailsDelegate(SendMails); sndMail.BeginInvoke(lstAlarm, ctx, null, null); IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(session.IdSession, CSpvServeur.c_spvConnection); connexion.RunStatement("Delete from " + CSpvMessalrm.c_nomTableInDb + " where " + CSpvMessalrm.c_champMESSALRM_ID + " in (" + bl.ToString() + ")"); /* TimeSpan sp = DateTime.Now - dt; * double fTime = sp.TotalMilliseconds;*/ }//if (lst.Count > 0) if (nCptWatchDogAlSyst >= 200) // vérification toutes les 20 secondes { nCptWatchDogAlSyst = 0; IDatabaseConnexion cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(session.IdSession, CSpvServeur.c_spvConnection); cnx.RunStatement("begin WatchDog; end;"); } } if (C2iStopApp.AppStopper.WaitOne(100, false)) { break; } } }
//------------------------------------------------------------ public CResultAErreur PurgeEntites( Type typeObjets, int[] nIdsElementsTotal, CDonneeNotificationModificationContexteDonnee dataModifs) { CResultAErreur result = TestTypePurgeable(typeObjets); if (!result) { return(result); } //travaille par paquets de 100; for (int nPaquet = 0; nPaquet < nIdsElementsTotal.Length; nPaquet += 100) { List <int> lstTmp = new List <int>(); int nMin = Math.Min(nPaquet + 100, nIdsElementsTotal.Length); for (int n = nPaquet; n < nMin; n++) { lstTmp.Add(nIdsElementsTotal[n]); } int[] nIdsElements = lstTmp.ToArray(); if (nIdsElements.Count() == 0) { return(result); } string strNomTable = CContexteDonnee.GetNomTableForType(typeObjets); if (strNomTable == null) { result.EmpileErreur(I.T("Can not find table for type '@1'|20011"), DynamicClassAttribute.GetNomConvivial(typeObjets)); return(result); } CStructureTable structure = CStructureTable.GetStructure(typeObjets); StringBuilder blIds = new StringBuilder(); foreach (int nId in nIdsElements) { blIds.Append(nId); blIds.Append(','); } if (blIds.Length == 0) { return(result); } blIds.Remove(blIds.Length - 1, 1); //Si autoref, va tout chercher d'un coup if (typeof(IObjetDonneeAutoReference).IsAssignableFrom(typeObjets)) { HashSet <int> setIds = new HashSet <int>(); foreach (int nId in nIdsElements) { setIds.Add(nId); } //Va cherche toutes les dépendances int nNbLast = setIds.Count(); while (true) { foreach (CInfoRelation rel in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (rel.TableFille == rel.TableParente) { int[] idsFilles = null; CFiltreData filtre = new CFiltreData(rel.ChampsFille[0] + " in (" + blIds.ToString() + ")"); result = GetIdsFilles( typeObjets, filtre, out idsFilles); if (!result) { return(result); } foreach (int nId in idsFilles) { setIds.Add(nId); } } } nIdsElements = setIds.ToArray(); if (nNbLast == setIds.Count) { break; } blIds = new StringBuilder(); foreach (int nId in setIds) { blIds.Append(nId); blIds.Append(','); } blIds.Remove(blIds.Length - 1, 1); nNbLast = setIds.Count; } } //Suppression des relations filles foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (info.TableParente == strNomTable && info.TableFille != strNomTable) { Type typeFils = CContexteDonnee.GetTypeForTable(info.TableFille); int[] lstIdsFils = null; CFiltreData filtre = new CFiltreData( info.ChampsFille[0] + " in (" + blIds.ToString() + ")"); result = GetIdsFilles(typeFils, filtre, out lstIdsFils); if (!result) { return(result); } if (lstIdsFils.Count() > 0) { result = PurgeEntites(typeFils, lstIdsFils, dataModifs); } if (!result) { return(result); } } } //Suppression des relations TypeId if (typeObjets.GetCustomAttributes(typeof(NoRelationTypeIdAttribute), true).Length == 0) { foreach (RelationTypeIdAttribute rel in CContexteDonnee.RelationsTypeIds) { if (rel.IsAppliqueToType(typeObjets)) { Type typeFils = CContexteDonnee.GetTypeForTable(rel.TableFille); result = TestTypePurgeable(typeFils); if (!result) { return(result); } CFiltreData filtre = new CFiltreData( rel.ChampId + " in (" + blIds + ") and " + rel.ChampType + "=@1", typeObjets.ToString()); int[] lstIdsFils = null; result = GetIdsFilles( typeFils, filtre, out lstIdsFils); if (!result) { return(result); } if (lstIdsFils.Count() > 0) { result = PurgeEntites(typeFils, lstIdsFils, dataModifs); } if (!result) { return(result); } } } } //Suppression des valeurs de champs if (m_listeTypesValeursChamps == null) { m_listeTypesValeursChamps = new List <Type>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { if (typeof(CRelationElementAChamp_ChampCustom).IsAssignableFrom(tp)) { m_listeTypesValeursChamps.Add(tp); } } } foreach (Type tp in m_listeTypesValeursChamps) { CFiltreData filtre = new CFiltreData( CRelationElementAChamp_ChampCustom.c_champValeurInt + " in (" + blIds.ToString() + ") and " + CRelationElementAChamp_ChampCustom.c_champValeurString + "=@1", typeObjets.ToString()); int[] idsFils = null; result = GetIdsFilles(tp, filtre, out idsFils); if (!result) { return(result); } if (idsFils.Length > 0) { result = PurgeEntites(tp, idsFils, dataModifs); } if (!result) { return(result); } } //Prépare les notifications foreach (int nId in nIdsElements) { dataModifs.AddModifiedRecord(strNomTable, true, new object[] { nId }); } //supprime les éléments //Et c'est parti pour la requete de suppression IDatabaseConnexion con; con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeObjets); string strWhere = structure.ChampsId[0].NomChamp + " in (" + blIds + ")"; strWhere = COracleDatabaseConnexion.PasseLaLimiteDesMilleIn(strWhere); string strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable); result = con.ExecuteScalar("delete from " + strNomTableInDb + " where " + strWhere); if (!result) { return(result); } } return(result); }
public override CResultAErreur SaveAll(CContexteSauvegardeObjetsDonnees contexteSauvegarde, System.Data.DataRowState etatsAPrendreEnCompte) { ArrayList listeFichiersToDelete = null; ArrayList listeFichiersToValide = null; ArrayList listeFichiersANePasSupprimer = null; GetListesPourValidation(ref listeFichiersToDelete, ref listeFichiersToValide, ref listeFichiersANePasSupprimer); CResultAErreur result = CResultAErreur.True; m_commitEventHandlerNote = new OnCommitTransEventHandler(OnCommitTrans); DataTable table = contexteSauvegarde.ContexteDonnee.Tables[GetNomTable()]; if (table != null) { foreach (DataRow row in table.Rows) { if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added) { if (!CDocumentGED.IsControleDocumentsALaSauvegardeDesactive(contexteSauvegarde.ContexteDonnee)) //si désactivation des ids auto, on est dans un processus //de synchronisation, donc , pas de contrôle de document { CDocumentGED doc = new CDocumentGED(row); CReferenceDocument newReference = doc.ReferenceDoc; bool bRefAsChange = true; if (row.RowState == DataRowState.Modified) { doc.VersionToReturn = DataRowVersion.Original; CReferenceDocument oldRef = doc.ReferenceDoc; bRefAsChange = false; if ((newReference == null) != (oldRef == null)) { bRefAsChange = true; } if (oldRef != null && !oldRef.Equals(newReference)) { listeFichiersToDelete.Add(oldRef); bRefAsChange = true; } doc.VersionToReturn = DataRowVersion.Current; } if (bRefAsChange) { result = PreValideDocument(newReference); } if (!result) { return(result); } if (bRefAsChange) { listeFichiersToValide.Add(doc.ReferenceDoc); } listeFichiersANePasSupprimer.Add(doc.ReferenceDoc); listeFichiersToDelete.Remove(doc.ReferenceDoc);//Il ne faut pas le supprimer ! } } if (row.RowState == DataRowState.Deleted) { CDocumentGED doc = new CDocumentGED(row); doc.VersionToReturn = DataRowVersion.Original; string strRefString = doc.ReferenceString; if (!listeFichiersToValide.Contains(doc.ReferenceDoc) && !listeFichiersANePasSupprimer.Contains(doc.ReferenceDoc)) { listeFichiersToDelete.Add(doc.ReferenceDoc); } doc.VersionToReturn = DataRowVersion.Current; } } } IDatabaseConnexion con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, GetType()); if (con != null) { con.OnCommitTrans += m_commitEventHandlerNote; } result = base.SaveAll(contexteSauvegarde, etatsAPrendreEnCompte); return(result); }
/////////////////////////////////////////////////////////////// public CResultAErreur Compile(int nIdMibModule) { CResultAErreur result = CResultAErreur.True; using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false)) { CSpvMibmodule mibModule = new CSpvMibmodule(contexte); if (!mibModule.ReadIfExists(nIdMibModule)) { result.EmpileErreur(I.T("Mib module @1 doesn't exists|20000", nIdMibModule.ToString())); return(result); } CDocumentGED doc = mibModule.DocumentGEDModuleMib; if (doc == null) { result.EmpileErreur(I.T("Mib module @1 should be associated to a mib file|20001", mibModule.NomModuleOfficiel)); return(result); } using (CProxyGED proxy = new CProxyGED(m_nIdSession, doc.ReferenceDoc)) { result = proxy.CopieFichierEnLocal(); if (!result) { return(result); } CMibModuleWrapper mibModuleWrapper = new CMibModuleWrapper(); IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(m_nIdSession, GetType()); string strConnexion = connexion.ConnexionString; string strDatabase = ""; string strUser = ""; string strPassword = ""; string[] strRubriques = strConnexion.Split(';'); foreach (string strRubrique in strRubriques) { string[] strData = strRubrique.Split('='); if (strData.Length == 2) { string strCle = strData[0].ToUpper().Trim(); if (strCle == "DATA SOURCE") { strDatabase = strData[1].Trim(); } if (strCle == "USER ID") { strUser = strData[1].Trim(); } if (strCle == "PASSWORD") { strPassword = strData[1].Trim(); } } } if (strDatabase == "" || strUser == "" || strPassword == "") { result.EmpileErreur(I.T("Can not parse connexion string|20002")); return(result); } string strConnexionOracle = strUser + "/" + strPassword + "@" + strDatabase; mibModuleWrapper.Init(strConnexionOracle, proxy.NomFichierLocal, mibModule.NomModuleUtilisateur, Convert.ToInt32(mibModule.Id)); int nResult = mibModuleWrapper.Compile(); if (nResult < 0) { result.EmpileErreur(I.T("Failed to compile mib module @1|20003", mibModule.NomModuleOfficiel)); string strMess; while ((strMess = mibModuleWrapper.GetNextErrMess()) != "") { result.EmpileErreur(strMess); } if (mibModuleWrapper.AreCompileErrors()) { result.EmpileErreur(mibModuleWrapper.GetCompileErrors()); } if (mibModuleWrapper.AreCompileLogs()) { result.EmpileErreur(mibModuleWrapper.GetCompileLogs()); } return(result); } else { List <IDonneeNotification> notifs = new List <IDonneeNotification>(); notifs.Add(new CDonneeNotificationAjoutEnregistrement(m_nIdSession, CSpvMibmodule.c_nomTable)); notifs.Add(new CDonneeNotificationAjoutEnregistrement(m_nIdSession, CSpvMibobj.c_nomTable)); CEnvoyeurNotification.EnvoieNotifications(notifs.ToArray()); } } } return(result); }
//---------------------------------------------------------------------------------------------------- public IDonneeSynchronisationMediation GetUpdatesForProxy(int nIdProxy, int nIdLastSyncSession) { using (CSessionClient session = CSessionClient.CreateInstance()) { CResultAErreur result = session.OpenSession(new CAuthentificationSessionProcess()); if (!result) { return(null); } using (CContexteDonneesSynchro ctx = new CContexteDonneesSynchro(session.IdSession, true)) { CSc2iDataServer connexionManager = CSc2iDataServer.GetInstance(); IDatabaseConnexionSynchronisable cnxSync = connexionManager.GetDatabaseConnexion(session.IdSession, typeof(CTypeAgentSnmpServeur)) as IDatabaseConnexionSynchronisable; if (cnxSync == null) { return(null); } cnxSync.IncrementeSyncSession(); int nIdSyncMax = cnxSync.IdSyncSession - 1; CFiltresSynchronisation filtres = new CFiltresSynchronisation(); filtres.AddFiltreForTable(CTypeAlarme.c_nomTable, null, false); filtres.AddFiltreForTable(CSeveriteAlarme.c_nomTable, null, false); filtres.AddFiltreForTable(CTypeAgentSnmp.c_nomTable, null, false); filtres.AddFiltreForTable(CAgentSnmp.c_nomTable, new CFiltreData(CSnmpProxyInDb.c_champId + "=@1", nIdProxy) , false); filtres.AddFiltreForTable(CTypeEntiteSnmp.c_nomTable, null, false); filtres.AddFiltreForTable(CEntiteSnmp.c_nomTable, new CFiltreDataAvance( CEntiteSnmp.c_nomTable, CAgentSnmp.c_nomTable + "." + CSnmpProxyInDb.c_champId + "=@1", nIdProxy), false); filtres.AddFiltreForTable(CRelationTypeEntiteSnmp_ChampCustom.c_nomTable, null, false); filtres.AddFiltreForTable(CRelationEntiteSnmp_ChampCustom.c_nomTable, new CFiltreDataAvance(CRelationEntiteSnmp_ChampCustom.c_nomTable, CEntiteSnmp.c_nomTable + "." + CAgentSnmp.c_nomTable + "." + CSnmpProxyInDb.c_champId + "=@1", nIdProxy), false); // Prend uniquement les Filtrages d'alarme compris entre les dates de validité et marqués Enabled filtres.AddFiltreForTable(CParametrageFiltrageAlarmes.c_nomTable, new CFiltreData( CParametrageFiltrageAlarmes.c_champIsActif + " = @1 AND " + CParametrageFiltrageAlarmes.c_champDateDebutValidite + " <= @2 AND " + CParametrageFiltrageAlarmes.c_champDateFinValidite + " > @2", true, DateTime.Now.Date), false); filtres.AddFiltreForTable(CCategorieMasquageAlarme.c_nomTable, null, false); DateTime dt = DateTime.Now; // Créer le MemoryDB bool bHasData = false; result = ctx.FillWithModifsFromVersion(nIdLastSyncSession, nIdSyncMax, ref bHasData, filtres, true); if (!result) { return(null); } TimeSpan sp = DateTime.Now - dt; Console.WriteLine("Lecture modifs médiation : " + sp.TotalMilliseconds); dt = DateTime.Now; CDonneesSynchronisationMediation donneesSynchro = new CDonneesSynchronisationMediation( CMemoryDbPourSupervision.GetMemoryDb(ctx), nIdSyncMax); CListeObjetsDonnees lstObjets = new CListeObjetsDonnees(ctx, typeof(CSeveriteAlarme)); lstObjets.InterditLectureInDB = true; foreach (CSeveriteAlarme severite in lstObjets) { severite.GetTypeForSupervision(donneesSynchro.Database); } lstObjets = new CListeObjetsDonnees(ctx, typeof(CTypeAlarme)); lstObjets.InterditLectureInDB = true; foreach (CTypeAlarme type in lstObjets) { type.GetTypeForSupervision(donneesSynchro.Database, true); } lstObjets = new CListeObjetsDonnees(ctx, typeof(CTypeAgentSnmp)); lstObjets.InterditLectureInDB = true; lstObjets.ReadDependances("TypesEntites"); foreach (CTypeAgentSnmp type in lstObjets) { type.GetTypeAgentPourSupervision(donneesSynchro.Database); } lstObjets = new CListeObjetsDonnees(ctx, typeof(CAgentSnmp)); lstObjets.InterditLectureInDB = true; lstObjets.ReadDependances("EntitesSnmp", "EntitesSnmp.RelationsChampsCustom", "EntitesSnmp.SiteSupervise", "EntitesSnmp.EquipementLogiqueSupervise", "EntitesSnmp.EquipementLogiqueSupervise.Site", "EntitesSnmp.LienReseauSupervise"); foreach (CAgentSnmp agent in lstObjets) { agent.GetAgentPourSupervision(donneesSynchro.Database, true); } lstObjets = new CListeObjetsDonnees(ctx, typeof(CParametrageFiltrageAlarmes)); lstObjets.InterditLectureInDB = true; foreach (CParametrageFiltrageAlarmes parametreFiltre in lstObjets) { parametreFiltre.GetLocalParametrageForSupervision(donneesSynchro.Database); } lstObjets = new CListeObjetsDonnees(ctx, typeof(CCategorieMasquageAlarme)); lstObjets.InterditLectureInDB = true; foreach (CCategorieMasquageAlarme categorie in lstObjets) { categorie.GetLocalCategorieForSupervision(donneesSynchro.Database); } //S'assure que les entités des valeurs de champ entité sont chargés lstObjets = new CListeObjetsDonnees(ctx, typeof(CRelationEntiteSnmp_ChampCustom)); lstObjets.InterditLectureInDB = true; foreach (CRelationEntiteSnmp_ChampCustom rel in lstObjets) { if (rel != null && rel.ElementAChamps != null) { ((CObjetDonnee)rel.ElementAChamps).AssureData(); } } lstObjets = new CListeObjetsDonnees(ctx, typeof(CEntiteSnmp)); lstObjets.InterditLectureInDB = true; foreach (CEntiteSnmp entite in lstObjets) { CTypeEntiteSnmp typeEntite = entite.TypeEntiteSnmp; futurocom.snmp.entitesnmp.CTypeEntiteSnmpPourSupervision te = typeEntite.GetTypeEntitePourSupervision(donneesSynchro.Database, true); entite.GetEntitePourSupervision(te); } sp = DateTime.Now - dt; Console.WriteLine("Intégration modifs médiation : " + sp.TotalMilliseconds); return(donneesSynchro); } } }
/// ////////////////////////////////////////////////// ///Lance le calcul public static void DoCalc(CElementsProjetARecalculer lstElements) { CResultAErreur result = CResultAErreur.True; CDbKey keyUser = null; //Attend la fin des transactions en cours pour la session principale IDatabaseConnexion cnx = null; do { CSessionClient session = CSessionClient.GetSessionForIdSession(lstElements.IdSession); if (session != null && session.IsConnected) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYOK if (info != null) { keyUser = info.KeyUtilisateur; } try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(lstElements.IdSession, typeof(CProjet)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } System.Threading.Thread.Sleep(50); } else { cnx = null; } }while (cnx != null && cnx.IsInTrans()); lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps ! { CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess(); using (CSessionClient sousSession = CSessionClient.CreateInstance()) { try { sousSession.OpenSession(auth, "Projet asynchronous calc ", ETypeApplicationCliente.Process); if (keyUser != null) { sousSession.ChangeUtilisateur(keyUser); } using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true)) { SetModeCalculProjet(ctx); foreach (int nIdProjet in lstElements.IdsProjets) { CProjet projet = new CProjet(ctx); if (projet.ReadIfExists(nIdProjet)) { projet.RecalculateDates(false); } } foreach (int nIdMetaProjet in lstElements.IdsMetaProjets) { CMetaProjet meta = new CMetaProjet(ctx); if (meta.ReadIfExists(nIdMetaProjet)) { meta.UpdateDateDebutPlanifieeFromChilds(false); meta.UpdateDateFinPlanifieeFromChilds(false); meta.UpdateDateDebutReelleFromChilds(false); meta.UpdateDateFinReelleFromChilds(false); meta.CalcProgress(false); } } result = ctx.SaveAll(false); } } catch (Exception e) { } finally { sousSession.CloseSession(); } } } }