Пример #1
0
        /// <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
        }
Пример #2
0
        /// <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
        }
Пример #3
0
        /// <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
        }
Пример #4
0
        /// <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
        }