/// <summary> /// Cette fonction permet de récupérer les informations d'acces à la base de données tel que /// préciser dans les attributs d'une classe Persistable. /// </summary> /// <param name="persistableObjectType">Type dont on souhaite récupérer les infos</param> /// <param name="pdsa">contient l'instance de l'attribut PersistsDataSource de la classe</param> /// <param name="pcs">contient l'instance de l'attribut PersistsConnexionString de la classe</param> private void GetDatabaseInformation(Type persistableObjectType,out PersistDataSourceAttribute pdsa, out PersistConnectionStringAttribute pcs) { pdsa=null; // contient les requetes utile pour l'acces au données pcs=null; // contient l'attribut de la chaine de connexion #region Gestion du cache pour PCS et PDSA PersistCacheItem ci=null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci=(PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.pcs!=null && ci.pdsa!=null) { pdsa=ci.pdsa; pcs=ci.pcs; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci=new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName,ci); } } #endregion MemberInfo objInfo=persistableObjectType; /* recherche des informations de persistance lié à la classe : recherche de l'attribut [PersistDataSource] */ object[] tabAttrs=objInfo.GetCustomAttributes(true); foreach(object obj in tabAttrs) { if (obj is PersistDALAttribute) { if (pdsa==null) pdsa=obj as PersistDataSourceAttribute; // si obj est un [PersistDataSource] on stocke sa référence if (pcs==null) pcs=obj as PersistConnectionStringAttribute; // on stocke la ref a l'attribut si c'est une [PersistConnectionString] // pour recupérer la chaine de connection a utiliser } } if (pdsa==null) // si pas de [PersistDataSource] sur la classe ==> Erreur : pas persistable throw new PersistException("Not a persistable class, or class without PersistDataSourceAttribute inherited attribute"); if (pcs==null) // si pas de [PersistConnectionString] sur la classe ==> Erreur pas d'info de connexion à la base throw new PersistException("No ConnectionString information for accessing DataBase"); #region Gestion du cache pour PCS et PDSA // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci!=null) { ci.pdsa=pdsa; ci.pcs=pcs; } #endregion }
/// <summary> /// Cette fonction scan le l'objet a persister pour extraire les informations de persistance. /// Ces informations sont agrégé dans 2 collection en utilisant des instance de PersistFieldInfo afin /// d'optimiser l'utilisation de la reflexion. /// </summary> /// <param name="persistableObject">reférence sur l'objet a persiter. Doit etre marque avec un attribut [PersisDataSource]</param> /// <param name="alPrimaryKeys">renvoi un ArrayList contenant la liste des clé primaire déclaré dans l'obj a persister </param> /// <param name="slFieldsValue">renvoi une SortedList contenant l'ensemble des informations necessaire pour effectué les 4 opération de persistance.</param> /// <param name="alAggregatedObject">renvoi la liste des objets aggrégé</param> private void CreateFieldAndPKeyList(Type persistableObjectType, out ArrayList alPrimaryKeys, out SortedList slFieldsValue) { alPrimaryKeys = new ArrayList(); // contient la liste des clés primaire slFieldsValue = new SortedList(); // contient la liste des champs et leur valeurs #region Gestion du cache pour alPrimaryKey,slFieldsValue et alAggregatedObject PersistCacheItem ci = null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci = (PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.alPrimaryKeys != null && ci.slFieldsValue != null) { alPrimaryKeys = ci.alPrimaryKeys; slFieldsValue = ci.slFieldsValue; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci = new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName, ci); } } #endregion //====================================================================== pour les FIELDs FieldInfo[] tabFields = persistableObjectType.GetFields(); foreach (FieldInfo fi in tabFields) // on parcours chaque champ de la classe { object[] tabAttrsField = fi.GetCustomAttributes(true); // pour le champ en cours, on recupere ses attributs foreach (object obj in tabAttrsField) { if (obj is DBFieldAttribute) // si le champ est un [PersistField] { DBFieldAttribute dbfa = obj as DBFieldAttribute; FieldInfo fi_IsNull = null; if (dbfa.IsNullable) // si X is nullable on recherche le FieldInfo pour la var XIsNull { fi_IsNull = persistableObjectType.GetField(dbfa.NullFieldName); if (fi_IsNull == null) { throw new PersistException("boolean field [" + dbfa.NullFieldName + "] is missing in the [" + persistableObjectType.Name + "] persistable type.\r\nManaging NULL requires this boolean field. Please add it."); } } slFieldsValue.Add( dbfa.DBFieldName, new PersistFieldInfo( dbfa.DBFieldName, dbfa.DBFieldType, dbfa.Identity, fi, fi_IsNull ) ); // on ajoute le nom du parametreADO et les infos associé if (((DBFieldAttribute)obj).PrimaryKey) // si le flag clé primaire de l'attribut est vrai, // on ajoute le nom du parametre ADO dans la liste des clés 1aire { alPrimaryKeys.Add((obj as DBFieldAttribute).DBFieldName); } } } } //====================================================================== pour les PROPERTIES PropertyInfo[] tabProperties = persistableObjectType.GetProperties(); foreach (PropertyInfo pi in tabProperties) // on parcours chaque propriété de la classe { object[] tabAttrsField = pi.GetCustomAttributes(true); // pour la propriété en cours, on recupere ses attributs foreach (object obj in tabAttrsField) { if (obj is DBFieldAttribute) // si c'est un [DBField] { DBFieldAttribute dbfa = obj as DBFieldAttribute; FieldInfo fi_IsNull = null; if (dbfa.IsNullable) // si X is nullable on recherche le FieldInfo pour la var XIsNull { fi_IsNull = persistableObjectType.GetField(dbfa.NullFieldName); } slFieldsValue.Add(dbfa.DBFieldName, new PersistFieldInfo( dbfa.DBFieldName, dbfa.DBFieldType, dbfa.Identity, pi, fi_IsNull )); if (((DBFieldAttribute)obj).PrimaryKey) // si le flag clé primaire de l'attribut est vrai, // on ajoute le nom du parametre ADO dans la liste des clés 1aire { alPrimaryKeys.Add((obj as DBFieldAttribute).DBFieldName); } } } } #region Gestion du cache pour alPrimaryKey,slFieldsValue et alAggregatedObject // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci != null) { ci.alPrimaryKeys = alPrimaryKeys; ci.slFieldsValue = slFieldsValue; } #endregion }
/// <summary> /// Cette fonction scan le l'objet a persister pour extraire les informations de persistance. /// Ces informations sont agrégé dans 2 collection en utilisant des instance de PersistFieldInfo afin /// d'optimiser l'utilisation de la reflexion. /// </summary> /// <param name="persistableObject">reférence sur l'objet a persiter. Doit etre marque avec un attribut [PersisDataSource]</param> /// <param name="alPrimaryKeys">renvoi un ArrayList contenant la liste des clé primaire déclaré dans l'obj a persister </param> /// <param name="slFieldsValue">renvoi une SortedList contenant l'ensemble des informations necessaire pour effectué les 4 opération de persistance.</param> /// <param name="alAggregatedObject">renvoi la liste des objets aggrégé</param> private void CreateFieldAndPKeyList(Type persistableObjectType, out ArrayList alPrimaryKeys, out SortedList slFieldsValue) { alPrimaryKeys=new ArrayList(); // contient la liste des clés primaire slFieldsValue=new SortedList();// contient la liste des champs et leur valeurs #region Gestion du cache pour alPrimaryKey,slFieldsValue et alAggregatedObject PersistCacheItem ci=null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci=(PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.alPrimaryKeys!=null && ci.slFieldsValue!=null) { alPrimaryKeys=ci.alPrimaryKeys; slFieldsValue=ci.slFieldsValue; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci=new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName,ci); } } #endregion //====================================================================== pour les FIELDs FieldInfo[] tabFields=persistableObjectType.GetFields(); foreach(FieldInfo fi in tabFields) // on parcours chaque champ de la classe { object[] tabAttrsField=fi.GetCustomAttributes(true); // pour le champ en cours, on recupere ses attributs foreach(object obj in tabAttrsField) { if (obj is DBFieldAttribute) // si le champ est un [PersistField] { DBFieldAttribute dbfa=obj as DBFieldAttribute; FieldInfo fi_IsNull=null; if (dbfa.IsNullable) // si X is nullable on recherche le FieldInfo pour la var XIsNull { fi_IsNull=persistableObjectType.GetField(dbfa.NullFieldName); if (fi_IsNull==null) throw new PersistException("boolean field [" + dbfa.NullFieldName +"] is missing in the [" + persistableObjectType.Name + "] persistable type.\r\nManaging NULL requires this boolean field. Please add it."); } slFieldsValue.Add( dbfa.DBFieldName, new PersistFieldInfo( dbfa.DBFieldName, dbfa.DBFieldType, dbfa.Identity,fi, fi_IsNull ) ); // on ajoute le nom du parametreADO et les infos associé if (((DBFieldAttribute)obj).PrimaryKey) // si le flag clé primaire de l'attribut est vrai, // on ajoute le nom du parametre ADO dans la liste des clés 1aire { alPrimaryKeys.Add((obj as DBFieldAttribute).DBFieldName); } } } } //====================================================================== pour les PROPERTIES PropertyInfo[] tabProperties=persistableObjectType.GetProperties(); foreach(PropertyInfo pi in tabProperties) // on parcours chaque propriété de la classe { object[] tabAttrsField=pi.GetCustomAttributes(true); // pour la propriété en cours, on recupere ses attributs foreach(object obj in tabAttrsField) { if (obj is DBFieldAttribute) // si c'est un [DBField] { DBFieldAttribute dbfa=obj as DBFieldAttribute; FieldInfo fi_IsNull=null; if (dbfa.IsNullable) // si X is nullable on recherche le FieldInfo pour la var XIsNull { fi_IsNull=persistableObjectType.GetField(dbfa.NullFieldName); } slFieldsValue.Add(dbfa.DBFieldName, new PersistFieldInfo( dbfa.DBFieldName, dbfa.DBFieldType, dbfa.Identity,pi, fi_IsNull ) ); if (((DBFieldAttribute)obj).PrimaryKey) // si le flag clé primaire de l'attribut est vrai, // on ajoute le nom du parametre ADO dans la liste des clés 1aire { alPrimaryKeys.Add((obj as DBFieldAttribute).DBFieldName); } } } } #region Gestion du cache pour alPrimaryKey,slFieldsValue et alAggregatedObject // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci!=null) { ci.alPrimaryKeys=alPrimaryKeys; ci.slFieldsValue=slFieldsValue; } #endregion }
/// <summary> /// Cette fonction permet de récupérer les informations d'acces à la base de données tel que /// préciser dans les attributs d'une classe Persistable. /// </summary> /// <param name="persistableObjectType">Type dont on souhaite récupérer les infos</param> /// <param name="pdsa">contient l'instance de l'attribut PersistsDataSource de la classe</param> /// <param name="pcs">contient l'instance de l'attribut PersistsConnexionString de la classe</param> private void GetDatabaseInformation(Type persistableObjectType, out PersistDataSourceAttribute pdsa, out PersistConnectionStringAttribute pcs) { pdsa = null; // contient les requetes utile pour l'acces au données pcs = null; // contient l'attribut de la chaine de connexion #region Gestion du cache pour PCS et PDSA PersistCacheItem ci = null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci = (PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.pcs != null && ci.pdsa != null) { pdsa = ci.pdsa; pcs = ci.pcs; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci = new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName, ci); } } #endregion MemberInfo objInfo = persistableObjectType; /* recherche des informations de persistance lié à la classe : recherche de l'attribut [PersistDataSource] */ object[] tabAttrs = objInfo.GetCustomAttributes(true); foreach (object obj in tabAttrs) { if (obj is PersistDALAttribute) { if (pdsa == null) { pdsa = obj as PersistDataSourceAttribute; // si obj est un [PersistDataSource] on stocke sa référence } if (pcs == null) { pcs = obj as PersistConnectionStringAttribute; // on stocke la ref a l'attribut si c'est une [PersistConnectionString] } // pour recupérer la chaine de connection a utiliser } } if (pdsa == null) // si pas de [PersistDataSource] sur la classe ==> Erreur : pas persistable { throw new PersistException("Not a persistable class, or class without PersistDataSourceAttribute inherited attribute"); } if (pcs == null) // si pas de [PersistConnectionString] sur la classe ==> Erreur pas d'info de connexion à la base { throw new PersistException("No ConnectionString information for accessing DataBase"); } #region Gestion du cache pour PCS et PDSA // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci != null) { ci.pdsa = pdsa; ci.pcs = pcs; } #endregion }