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