/// //////////////////////////////////////////////////////////////////
        /// le data du result contient le dataset à appliquer à la base distante
        public CResultAErreur GetModifsInMain(
            int nIdSyncSessionFrom,
            int nIdSyncSessionSecondaireCourant,
            string strCodeGroupeSynchronisation)
        {
            CResultAErreur                   result        = CResultAErreur.True;
            CFiltresSynchronisation          filtres       = GetFiltres(strCodeGroupeSynchronisation);
            IDatabaseConnexionSynchronisable connexionMain = (IDatabaseConnexionSynchronisable)CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, m_strIdConnexion);
            int nIdSyncMain = connexionMain.IdSyncSession;

            while (connexionMain.IdSyncSession <= nIdSyncSessionSecondaireCourant)
            {
                connexionMain.IncrementeSyncSession();
            }

            CContexteDonneesSynchro ctxMain = new CContexteDonneesSynchro(IdSession, true);
            bool bHasChange = false;

            ctxMain.FillWithModifsFromVersion(nIdSyncSessionFrom == -1?-1:nIdSyncSessionFrom + 1, nIdSyncMain, ref bHasChange, filtres, false);
            if (bHasChange)
            {
                DataSet dsRetour = new DataSet();
                foreach (DataTable table in ctxMain.Tables)
                {
                    if (table.Rows.Count != 0)
                    {
                        DataTable tableCopie = CUtilDataSet.AddTableCopie(table, dsRetour);
                        ArrayList lst        = new ArrayList();
                        foreach (DataColumn col in tableCopie.Columns)
                        {
                            if (col.DataType == typeof(CDonneeBinaireInRow))
                            {
                                lst.Add(col);
                            }
                        }
                        foreach (DataColumn col in lst)
                        {
                            tableCopie.Columns.Remove(col);
                        }

                        foreach (DataRow row in table.Rows)
                        {
                            tableCopie.ImportRow(row);
                        }
                    }
                }
                dsRetour.ExtendedProperties[c_cleIdSynchro] = nIdSyncMain;
                result.Data = dsRetour;
            }
            return(result);
        }
示例#2
0
        //----------------------------------------------------------------------------------------------------
        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);
                }
            }
        }
        /// //////////////////////////////////////////////////////////////////
        public CResultAErreur PutMainIntoSecondary(CContexteDonneesSynchro ctxMain)
        {
            CResultAErreur result = CResultAErreur.True;
            IDatabaseConnexionSynchronisable connexionSecondaire = (IDatabaseConnexionSynchronisable)CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, m_strIdConnexion);

            //Toutes les modifs apportées sur la base secondaire doivent porter l'id de synchro
            //Initial de la base secondaire, sinon les modifs font du
            //ping pong entre secondaire et main,
            //Ces modifs ne doivent surtout pas apparaitre
            //lors d'une synchro de sec->main !
            connexionSecondaire.LockSyncSessionLocalTo(connexionSecondaire.LastSyncIdPutInBasePrincipale);

            //Répercute les modifs de la base secondaire sur la base primaire
            using (CContexteDonneesSynchroSecondaire donneeSec = new CContexteDonneesSynchroSecondaire(IdSession, true))
            {
                result = donneeSec.ChargeDonneesAMettreAJour(ctxMain);

                donneeSec.EnforceConstraints = false;
                if (result)
                {
                    result = donneeSec.AjouteNouveaux(ctxMain);
                }
                if (result)
                {
                    result = donneeSec.Update(ctxMain);
                }
                if (result)
                {
                    result = donneeSec.Delete(ctxMain);
                }
                donneeSec.EnforceConstraints = true;
                try
                {
                    connexionSecondaire.BeginTrans();
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                    result.EmpileErreur(I.T("Error while data synchronization|208"));
                    return(result);
                }

                if (result)
                {
                    result = donneeSec.WriteChanges(ctxMain);
                }


                if (result)
                {
                    if (connexionSecondaire.LastSyncIdPutInBasePrincipale == -1)
                    {
                        connexionSecondaire.LastSyncIdPutInBasePrincipale = connexionSecondaire.IdSyncSession;
                    }

                    connexionSecondaire.UnlockSyncSessionLocal();
                    while (connexionSecondaire.IdSyncSession < ctxMain.IdSynchro)
                    {
                        connexionSecondaire.IncrementeSyncSession();
                    }

                    connexionSecondaire.LastSyncIdVueDeBasePrincipale = ctxMain.IdSynchro == -1?0:ctxMain.IdSynchro;

                    connexionSecondaire.CommitTrans();
                }

                if (!result)
                {
                    connexionSecondaire.RollbackTrans();
                }
            }
            return(result);
        }