Пример #1
0
        /// //////////////////////////////////////////////////////////////////
        /// 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
        /*/// /////////////////////////////////////////////////////////////
         * private static void OnNettoyage ( object state )
         * {
         *      lock ( m_cacheFiltres )
         *      {
         *              for ( int nCache = m_cacheFiltres.Count-1; nCache >= 0; nCache-- )
         *              {
         *                      CCacheFiltres cache = (CCacheFiltres)m_cacheFiltres[nCache];
         *                      TimeSpan sp = DateTime.Now - cache.LastDateUse;
         *                      if ( sp.TotalMinutes > 10 )
         *                              m_cacheFiltres.RemoveAt ( nCache );
         *              }
         *      }
         * }
         *
         * /// /////////////////////////////////////////////////////////////
         * private static CCacheFiltres GetCache ( int nIdSession, int nIdUtilisateur, string strTypeSynchro )
         * {
         *      lock ( m_cacheFiltres )
         *      {
         *              foreach ( CCacheFiltres cache in m_cacheFiltres )
         *              {
         *                      if ( cache.IdSession == nIdSession &&
         *                              cache.IdUtilisateur == nIdUtilisateur &&
         *                              cache.TypeSynchro == strTypeSynchro )
         *                      {
         *                              return cache;
         *                      }
         *              }
         *              return null;
         *      }
         * }
         *
         * /// /////////////////////////////////////////////////////////////
         * private static void OnUseFiltre (
         *      int nIdSession,
         *      int nIdUtilisateur,
         *      string strTypeSynchro,
         *      CFiltresSynchronisation filtres )
         * {
         *      CCacheFiltres cache = GetCache ( nIdSession, nIdUtilisateur, strTypeSynchro );
         *      if ( cache != null )
         *              cache.RenouvelleLastUse();
         *      else
         *      {
         *              cache = new CCacheFiltres ( nIdSession, nIdUtilisateur, strTypeSynchro, filtres );
         *              lock ( m_cacheFiltres )
         *              {
         *                      m_cacheFiltres.Add ( cache );
         *              }
         *      }
         * }*/

        /// /////////////////////////////////////////////////////////////
        public CResultAErreur GetFiltresSynchronisation(string strCodeGroupeSynchronisation)
        {
            CResultAErreur result = CResultAErreur.True;

            /*/CCacheFiltres cache = GetCache ( IdSession, nIdUtilisateur, strTypeSynchronisation );
             * if ( cache != null )
             * {
             *      result.Data = cache.Filtres;
             *      return result;
             * }
             */
            using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false))
            {
                //Cherche le groupe de synchronisation
                CGroupeUtilisateursSynchronisation groupe = new CGroupeUtilisateursSynchronisation(contexte);
                if (!groupe.ReadIfExists(new CFiltreData(CGroupeUtilisateursSynchronisation.c_champCode + "=@1 or " +
                                                         CGroupeUtilisateursSynchronisation.c_champIdMachine + "=@1",
                                                         strCodeGroupeSynchronisation)))
                {
                    result.EmpileErreur(I.T("The group '@1' doesn't exist|121", strCodeGroupeSynchronisation));
                    return(result);
                }
                CParametreSynchronisationInDb parametreInDb = groupe.ParametreSynchronisation;
                CParametreSynchronisation     parametre     = parametreInDb.Parametre;
                if (parametre != null)
                {
                    result = parametre.GetFiltresFinaux(IdSession, groupe);
                    if (result)
                    {
                        CFiltresSynchronisation filtres = (CFiltresSynchronisation)result.Data;
                        //OnUseFiltre ( IdSession, nIdUtilisateur, strTypeSynchronisation, filtres );
                        result.Data = filtres;
                        return(result);
                    }
                }
            }
            return(result);
        }
Пример #3
0
 //------------------------------------------------------------------------------------
 public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtresSynchro)
 {
     return(null);
 }
        //--------------------------------------------------------
        public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtresSynchro)
        {
            if (m_filtreDejaCalcule != null)
            {
                return(m_filtreDejaCalcule);
            }
            Type tp = CContexteDonnee.GetTypeForTable(m_strNomTableFille);

            if (tp == null)
            {
                return(null);
            }
            CStructureTable structure = CStructureTable.GetStructure(tp);

            if (structure == null)
            {
                return(null);
            }
            CFiltreData filtre = null;

            foreach (CInfoRelation relationParente in structure.RelationsParentes)
            {
                if (relationParente.Composition &&
                    (relationParente.TableParente == m_strNomTableParenteDeComposition ||
                     m_strNomTableParenteDeComposition.Length == 0))
                {
                    Type            tpParent      = CContexteDonnee.GetTypeForTable(relationParente.TableParente);
                    CStructureTable structParente = CStructureTable.GetStructure(tpParent);
                    if (structParente != null && structParente.NomTable != m_strNomTableFille)
                    {
                        HashSet <int>     lstIdsALire = new HashSet <int>();
                        C2iRequeteAvancee requete     = new C2iRequeteAvancee();
                        requete.TableInterrogee  = relationParente.TableParente;
                        requete.FiltreAAppliquer = filtresSynchro.GetFiltreForTable(nIdSession, relationParente.TableParente);
                        requete.ListeChamps.Add(
                            new C2iChampDeRequete(structParente.ChampsId[0].NomChamp,
                                                  new CSourceDeChampDeRequete(structParente.ChampsId[0].NomChamp),
                                                  typeof(int),
                                                  OperationsAgregation.None,
                                                  true));
                        CResultAErreur result = requete.ExecuteRequete(nIdSession);
                        if (result)
                        {
                            DataTable table = result.Data as DataTable;
                            if (table != null)
                            {
                                foreach (DataRow row in table.Rows)
                                {
                                    int?nVal = row[0] as int?;
                                    if (nVal != null)
                                    {
                                        lstIdsALire.Add(nVal.Value);
                                    }
                                }
                            }
                        }
                        if (lstIdsALire.Count > 0)
                        {
                            StringBuilder bl = new StringBuilder();
                            foreach (int nId in lstIdsALire)
                            {
                                bl.Append(nId.ToString());
                                bl.Append(',');
                            }
                            bl.Remove(bl.Length - 1, 1);
                            filtre = CFiltreData.GetOrFiltre(filtre,
                                                             new CFiltreData(relationParente.ChampsFille[0] + " in (" + bl.ToString() + ")"));
                        }
                    }
                }
            }
            if (filtre == null)
            {
                filtre = new CFiltreDataImpossible();
            }
            m_filtreDejaCalcule = filtre;
            return(m_filtreDejaCalcule);
        }
Пример #5
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);
                }
            }
        }
        ////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Retourne les filtres finaux pour toutes les tables
        //Le data du result contient les filtresdata finaux
        /// </summary>
        /// <param name="nIdSession"></param>
        /// <param name="nIdUtilisateur">Id de l'utilisateur</param>
        /// <param name="listeUsersGroupe">Id des utilisateurs associés à celui ci</param>
        /// <returns></returns>
        public CResultAErreur GetFiltresFinaux(int nIdSession, CGroupeUtilisateursSynchronisation groupe)
        {
            CResultAErreur result = CResultAErreur.True;

            try
            {
                using (CContexteDonnee contexte = new CContexteDonnee(nIdSession, true, false))
                {
                    CFiltresDynamiquesForTables filtresForTables = CalculeFiltresForTables();
                    CFiltresSynchronisation     filtres          = new CFiltresSynchronisation();
                    foreach (string strNomTable in CContexteDonnee.MappeurTableToClass.GetListeTables())
                    {
                        bool             bShouldImporte  = false;
                        CFiltreDynamique filtreDynamique = filtresForTables.GetFiltreDynamiqueForTable(strNomTable, ref bShouldImporte);
                        if (!bShouldImporte)
                        {
                            filtres.AddFiltreForTable(strNomTable, new CFiltreDataImpossible(), true);
                        }
                        else
                        {
                            if (filtreDynamique == null)
                            {
                                filtres.AddFiltreForTable(strNomTable, null, true);
                            }
                            else
                            {
                                //Trouve la variable contenant le groupe
                                CVariableDynamique variable = null;
                                foreach (CVariableDynamique v in filtreDynamique.ListeVariables)
                                {
                                    if (v.Nom == CFiltreSynchronisation.c_nomVariableListeUtilisateurs)
                                    {
                                        variable = v;
                                    }
                                }
                                filtreDynamique.SetValeurChamp(variable, groupe.ListeIdsUtilisateurs);
                                filtreDynamique.ContexteDonnee = contexte;
                                CResultAErreur resultTmp  = filtreDynamique.GetFiltreData();
                                CFiltreData    filtreData = null;
                                if (!result)
                                {
                                    result.Erreur.EmpileErreurs(resultTmp.Erreur);
                                    result.EmpileErreur(I.T("Error in table @1|189", strNomTable));
                                }
                                else
                                {
                                    filtreData = (CFiltreData)resultTmp.Data;
                                    filtres.AddFiltreForTable(strNomTable, filtreData, true);
                                }
                            }
                        }
                    }
                    result.Data = filtres;
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }
            return(result);
        }
Пример #7
0
        /// /////////////////////////////////////////////////////////
        public DataSet GetAddAndUpdateInTableMain(
            string strNomTable,
            int nSessionSyncDebut,
            int nSessionSyncFin,
            string strCodeGroupeSynchronisation)
        {
            Type    tp     = CContexteDonnee.GetTypeForTable(strNomTable);
            DataSet dsDest = null;

            if (tp == null)
            {
                return(null);
            }

            //Récupère les filtres
            CFiltresSynchronisation filtres = GetFiltres(strCodeGroupeSynchronisation);

            using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false))
            {
                CFiltreData filtreSynchro = null;
                if (filtres != null)
                {
                    filtreSynchro = filtres.GetFiltreForTable(m_nIdSession, strNomTable);
                }

                if (filtreSynchro == null)
                {
                    filtreSynchro = new CFiltreData();
                }
                int    nNumParametreIdSync = filtreSynchro.Parametres.Count + 1;
                string strFiltre           = filtreSynchro.Filtre;
                filtreSynchro.Filtre = "(" + CSc2iDataConst.c_champIdSynchro + ">=@" + nNumParametreIdSync.ToString() + " and " +
                                       CSc2iDataConst.c_champIdSynchro + "<=@" + (nNumParametreIdSync + 1).ToString();
                if (nSessionSyncDebut == -1)
                //C'est la première synchro, intègre les éléments modifiés avant prise en charge
                //des synchros
                {
                    if (filtreSynchro is CFiltreDataAvance)
                    {
                        filtreSynchro.Filtre += " or hasno(" + CSc2iDataConst.c_champIdSynchro + ")";
                    }
                    else
                    {
                        filtreSynchro.Filtre += " or " + CSc2iDataConst.c_champIdSynchro + " is null";
                    }
                }
                filtreSynchro.Filtre += ")";
                if (strFiltre != "")
                {
                    filtreSynchro.Filtre += " and (" + strFiltre + ")";
                }
                filtreSynchro.Parametres.Add(nSessionSyncDebut);
                filtreSynchro.Parametres.Add(nSessionSyncFin);
                CListeObjetsDonnees liste = new CListeObjetsDonnees(contexte, tp, false);
                liste.Filtre = filtreSynchro;
                liste.AssureLectureFaite();

                //Charge les données de synchronisation
                CFiltreData filtreDataSync = new CFiltreData(CEntreeLogSynchronisation.c_champTable + "=@1 and " +
                                                             CSc2iDataConst.c_champIdSynchro + ">=@2 and " +
                                                             CSc2iDataConst.c_champIdSynchro + "<=@3",
                                                             strNomTable, nSessionSyncDebut, nSessionSyncFin);
                liste        = new CListeObjetsDonnees(contexte, typeof(CEntreeLogSynchronisation), false);
                liste.Filtre = filtreDataSync;
                liste.AssureLectureFaite();

                //Transforme le contexte en dataset (pour sérialisation web !! )
                dsDest = new DataSet();
                foreach (DataTable table in contexte.Tables)
                {
                    DataTable tableDest = CUtilDataSet.AddTableCopie(table, dsDest);
                    foreach (DataRow row in table.Rows)
                    {
                        tableDest.ImportRow(row);
                    }
                    //Supprime les colonnes blob
                    for (int nCol = tableDest.Columns.Count - 1; nCol >= 0; nCol--)
                    {
                        if (tableDest.Columns[nCol].DataType == typeof(CDonneeBinaireInRow))
                        {
                            tableDest.Columns.RemoveAt(nCol);
                        }
                    }
                }
            }
            return(dsDest);
        }
Пример #8
0
        /// //////////////////////////////////////////////////////////////////
        public CResultAErreur PutMainIntoSecondary(string strConnexionSecondaire, CFiltresSynchronisation filtres, string strCodeGroupeSynchronisation)
        {
            CResultAErreur result = CResultAErreur.True;

            /*
             *          CSc2iDataServer connexionManager = CSc2iDataServer.GetInstance();
             *
             *          string strConnexionMain = connexionManager.GetDatabaseConnexion(IdSession, m_strIdConnexion).ConnexionString;
             *
             *          IDatabaseConnexionSynchronisable connexionSecondaire, connexionMain;
             *
             *
             *          connexionMain = (IDatabaseConnexionSynchronisable)CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, m_strIdConnexion);
             *
             *
             *          //Crée la connexion à la base secondaire
             *          connexionSecondaire = new IDatabaseConnexionSynchronisable(IdSession);
             *          connexionSecondaire.ConnexionString =  strConnexionSecondaire;
             *
             *
             *          try
             *          {
             *                  int nIdLastSyncSecondaire = connexionSecondaire.LastVersionVueDeBasePrincipale;
             *
             *                  int nIdSyncMain = connexionMain.IdSyncSession;
             *
             *                  if ( nIdLastSyncSecondaire > connexionSecondaire.LastSyncIdPutInMain )
             *                  {
             *                          result.EmpileErreur(I.T("The synchronization Secondary -> primary must be done before this operation|209"));
             *                          return result;
             *                  }
             *
             *                  //Remplit le contexte primaire avec les informations à mettre à jour
             *                  using (CContexteDonneesSynchroMain ctxMain = new CContexteDonneesSynchroMain(IdSession, true))
             *                  {
             *                          bool bHasChange = false;
             *                          //Change le numéro de version de la base primaire, ainsi,
             *                                   // s'il y a des modifs après ou pendant la lecture, elles auront bien lieu dans une autre
             *                                   // session de synchronisation
             *                                  //
             *                          while ( connexionMain.IdSyncSession <= connexionSecondaire.IdSyncSession )
             *                                  connexionMain.IncrementeSyncSession();
             *                          ctxMain.FillWithModifsFromVersion(nIdLastSyncSecondaire==-1?-1:nIdLastSyncSecondaire+1, nIdSyncMain, ref bHasChange, filtres, false);
             *                          if ( bHasChange )
             *                          {
             *                                  //Passe sur la base secondaire
             *                                  connexionManager.SetDatabaseConnexion(IdSession, m_strIdConnexion, connexionSecondaire);
             *
             *                                  //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 ( nIdLastSyncSecondaire );
             *
             *                                  //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.LastSyncIdPutInMain == -1 )
             *                                                          connexionSecondaire.LastSyncIdPutInMain = connexionSecondaire.IdSyncSession;
             *
             *                                                  connexionSecondaire.UnlockSyncSessionLocal();
             *                                                  while ( connexionSecondaire.IdSyncSession < connexionMain.IdSyncSession )
             *                                                          connexionSecondaire.IncrementeSyncSession();
             *
             *                                                  connexionSecondaire.LastVersionVueDeBasePrincipale = nIdSyncMain==-1?0:nIdSyncMain;
             *
             *                                                  while ( connexionMain.IdSyncSession <= connexionSecondaire.IdSyncSession )
             *                                                          connexionMain.IncrementeSyncSession();
             *                                                  connexionSecondaire.CommitTrans();
             *                                          }
             *
             *                                          if ( !result )
             *                                          {
             *                                                  connexionSecondaire.RollbackTrans();
             *                                          }
             *                                  }
             *                          }
             *                  }
             *          }
             *          catch ( Exception e )
             *          {
             *                  result.EmpileErreur(new CErreurException(e));
             *                  result.EmpileErreur(I.T("Error while data synchronization|208"));
             *          }
             *          finally
             *          {
             *                  CSc2iDataServer.GetInstance().SetDatabaseConnexion(IdSession, m_strIdConnexion,connexionMain);
             *                  connexionSecondaire.Dispose();
             *          }*/
            return(result);
        }
 //------------------------------------------------
 public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtres)
 {
     return(m_filtre);
 }
        //-----------------------------------------------------------------
        public CFiltreData GetFiltreData(int nIdSession, CFiltresSynchronisation filtresSynchro)
        {
            if (m_filtreDejaCalcule != null)
            {
                return(m_filtreDejaCalcule);
            }
            Type tp = CContexteDonnee.GetTypeForTable(m_strNomTable);

            if (tp == null)
            {
                return(null);
            }
            CStructureTable structure = CStructureTable.GetStructure(tp);

            if (structure == null)
            {
                return(null);
            }
            HashSet <int>        lstIdsALire     = new HashSet <int>();
            List <CInfoRelation> relationsFilles = new List <CInfoRelation>();

            foreach (Type tpTest in CContexteDonnee.GetAllTypes())
            {
                CStructureTable s = CStructureTable.GetStructure(tpTest);
                if (s != null)
                {
                    foreach (CInfoRelation relation in s.RelationsParentes)
                    {
                        if (relation.TableParente == m_strNomTable)
                        {
                            relationsFilles.Add(relation);
                        }
                    }
                }
            }

            //va chercher les dépendances filles qui auront besoin d'éléments de ce type
            foreach (CInfoRelation relation in relationsFilles)
            {
                Type tpFils = CContexteDonnee.GetTypeForTable(relation.TableFille);
                //Vérifie qu'il n'y a pas de filtre FilsDe ou FilsComposition sur la table
                bool bPrendreCetteTable = true;
                foreach (IFiltreSynchronisation filtre in filtresSynchro.GetFiltresSynchroPourTable(relation.TableFille))
                {
                    if (relation.Composition && filtre is CFiltreSynchronisationFilsCompositions)
                    {
                        bPrendreCetteTable = false;
                        break;
                    }
                    CFiltreSynchronisationFilsDe filsDe = filtre as CFiltreSynchronisationFilsDe;
                    if (filsDe != null)
                    {
                        if (filsDe.TablesParentes.Contains(m_strNomTable))
                        {
                            bPrendreCetteTable = false;
                            break;
                        }
                    }
                }
                if (bPrendreCetteTable)
                {
                    C2iRequeteAvancee requete = new C2iRequeteAvancee();
                    requete.TableInterrogee = relation.TableFille;
                    if (relation.TableFille != m_strNomTable)
                    {
                        requete.FiltreAAppliquer = filtresSynchro.GetFiltreForTable(nIdSession, relation.TableFille);
                    }
                    requete.ListeChamps.Add(
                        new C2iChampDeRequete(relation.ChampsFille[0],
                                              new CSourceDeChampDeRequete(relation.ChampsFille[0]),
                                              typeof(int),
                                              OperationsAgregation.None,
                                              true));
                    CResultAErreur result = requete.ExecuteRequete(nIdSession);
                    if (result)
                    {
                        DataTable table = result.Data as DataTable;
                        if (table != null)
                        {
                            foreach (DataRow row in table.Rows)
                            {
                                int?nVal = row[0] as int?;
                                if (nVal != null)
                                {
                                    lstIdsALire.Add(nVal.Value);
                                }
                            }
                        }
                    }
                }
            }
            if (lstIdsALire.Count == 0)
            {
                m_filtreDejaCalcule = new CFiltreDataImpossible();
                return(m_filtreDejaCalcule);
            }
            StringBuilder bl = new StringBuilder();

            foreach (int nId in lstIdsALire)
            {
                bl.Append(nId);
                bl.Append(',');
            }
            bl.Remove(bl.Length - 1, 1);
            m_filtreDejaCalcule = new CFiltreData(structure.ChampsId[0].NomChamp + " in (" + bl.ToString() + ")");
            return(m_filtreDejaCalcule);
        }