Esempio n. 1
0
        //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");
        }
        //------------------------------------------------------------
        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);
        }