Beispiel #1
0
        protected void FillRowWithObject(DataObject dataObject, DataRow row)
        {
            bool relation = false;

            Type myType = dataObject.GetType();

            row[dataObject.TableName + "_ID"] = dataObject.ObjectId;

            MemberInfo[] myMembers = myType.GetMembers();

            for (int i = 0; i < myMembers.Length; i++)
            {
                object[] myAttributes = GetRelationAttributes(myMembers[i]);
                object   val          = null;

                if (myAttributes.Length > 0)
                {
                    relation = true;
                }
                else
                {
                    myAttributes = myMembers[i].GetCustomAttributes(typeof(DataElement), true);
                    object[] keyAttrib = myMembers[i].GetCustomAttributes(typeof(PrimaryKey), true);

                    if (myAttributes.Length > 0 || keyAttrib.Length > 0)
                    {
                        if (myMembers[i] is PropertyInfo)
                        {
                            val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null);
                        }
                        if (myMembers[i] is FieldInfo)
                        {
                            val = ((FieldInfo)myMembers[i]).GetValue(dataObject);
                        }
                        if (val != null)
                        {
                            row[myMembers[i].Name] = val;
                        }
                    }
                }
                //}
            }

            if (relation)
            {
                SaveObjectRelations(dataObject);
            }
        }
Beispiel #2
0
        protected DataRow FindRowByKey(DataObject dataObject)
        {
            DataRow row;

            string tableName = dataObject.TableName;


            System.Data.DataTable table = GetDataSet(tableName).Tables[tableName];

            Type myType = dataObject.GetType();

            string key = table.PrimaryKey[0].ColumnName;

            if (key.Equals(tableName + "_ID"))
            {
                row = table.Rows.Find(dataObject.ObjectId);
            }
            else
            {
                MemberInfo[] keymember = myType.GetMember(key);

                object val = null;

                if (keymember[0] is PropertyInfo)
                {
                    val = ((PropertyInfo)keymember[0]).GetValue(dataObject, null);
                }
                if (keymember[0] is FieldInfo)
                {
                    val = ((FieldInfo)keymember[0]).GetValue(dataObject);
                }

                if (val != null)
                {
                    row = table.Rows.Find(val);
                }
                else
                {
                    return(null);
                }
            }

            return(row);
        }
        // Ajoute un nouvel objet a la DB
        // Adds a new object DB
        protected override bool AddObjectImpl(DataObject dataObject)
        {
            try
            {
                string tableName = dataObject.TableName;

                if (dataObject.ObjectId == null)
                {
                    dataObject.ObjectId = IDGenerator.GenerateID();
                }

                var columns = new StringBuilder();
                var values  = new StringBuilder();

                MemberInfo[] objMembers   = dataObject.GetType().GetMembers();
                bool         hasRelations = false;
                string       dateFormat   = Connection.GetDBDateFormat();

                columns.Append("`" + tableName + "_ID`");
                values.Append("'" + Escape(dataObject.ObjectId) + "'");

                for (int i = 0; i < objMembers.Length; i++)
                {
                    if (!hasRelations)
                    {
                        object[] relAttrib = GetRelationAttributes(objMembers[i]);
                        hasRelations = relAttrib.Length > 0;
                    }
                    object[] keyAttrib = objMembers[i].GetCustomAttributes(typeof(PrimaryKey), true);
                    object[] attrib    = objMembers[i].GetCustomAttributes(typeof(DataElement), true);
                    if (attrib.Length > 0 || keyAttrib.Length > 0)
                    {
                        object val = null;
                        if (objMembers[i] is PropertyInfo)
                        {
                            val = ((PropertyInfo)objMembers[i]).GetValue(dataObject, null);
                        }
                        else if (objMembers[i] is FieldInfo)
                        {
                            val = ((FieldInfo)objMembers[i]).GetValue(dataObject);
                        }

                        columns.Append(", ");
                        values.Append(", ");
                        columns.Append("`" + objMembers[i].Name + "`");

                        if (val is bool)
                        {
                            val = ((bool)val) ? (byte)1 : (byte)0;
                        }
                        else if (val is DateTime)
                        {
                            val = ((DateTime)val).ToString(dateFormat);
                        }
                        else if (val is float)
                        {
                            val = ((float)val).ToString(Nfi);
                        }
                        else if (val is double)
                        {
                            val = ((double)val).ToString(Nfi);
                        }
                        else if (val is string)
                        {
                            val = Escape(val.ToString());
                        }
                        else if (val is List <byte> )
                        {
                            List <byte> bytes  = val as List <byte>;
                            string      Result = "";
                            foreach (byte b in bytes)
                            {
                                Result += b.ToString("X2") + " ";
                            }
                            val = Result;
                        }
                        else if (val is List <UInt32> )
                        {
                            List <UInt32> bytes  = val as List <UInt32>;
                            string        Result = "";
                            foreach (UInt32 b in bytes)
                            {
                                Result += b.ToString("X4") + " ";
                            }
                            val = Result;
                        }
                        else if (val is List <long> )
                        {
                            List <long> bytes  = val as List <long>;
                            string      Result = "";
                            foreach (long b in bytes)
                            {
                                Result += b.ToString("X8") + " ";
                            }
                            val = Result;
                        }

                        values.Append('\'');
                        values.Append(val);
                        values.Append('\'');
                    }
                }

                string sql = "INSERT INTO `" + tableName + "` (" + columns + ") VALUES (" + values + ")";

                Log.Debug("MysqlObject", sql);

                int res = Connection.ExecuteNonQuery(sql);
                if (res == 0)
                {
                    Log.Error("MysqlObject", "Add Error : " + dataObject.TableName + " ID=" + dataObject.ObjectId + "Query = " + sql);
                    return(false);
                }

                if (hasRelations)
                {
                    SaveObjectRelations(dataObject);
                }

                dataObject.Dirty     = false;
                dataObject.IsValid   = true;
                dataObject.IsDeleted = false;

                return(true);
            }
            catch (Exception e)
            {
                Log.Error("MysqlObject", "Add Error : " + dataObject.TableName + " " + dataObject.ObjectId + e.ToString());
            }

            return(false);
        }
        // Persiste l'objet dans la DB
        // Persists the object in the DB
        protected override void SaveObjectImpl(DataObject dataObject)
        {
            try
            {
                string tableName = dataObject.TableName;

                var sb = new StringBuilder("UPDATE `" + tableName + "` SET ");

                BindingInfo[] bindingInfo  = GetBindingInfo(dataObject.GetType());
                bool          hasRelations = false;
                bool          first        = true;
                string        dateFormat   = Connection.GetDBDateFormat();

                for (int i = 0; i < bindingInfo.Length; i++)
                {
                    BindingInfo bind = bindingInfo[i];

                    if (bind.ReadOnly)
                    {
                        continue;
                    }

                    if (!hasRelations)
                    {
                        hasRelations = bind.HasRelation;
                    }
                    if (!bind.HasRelation)
                    {
                        object val = null;
                        if (bind.Member is PropertyInfo)
                        {
                            val = ((PropertyInfo)bind.Member).GetValue(dataObject, null);
                        }
                        else if (bind.Member is FieldInfo)
                        {
                            val = ((FieldInfo)bind.Member).GetValue(dataObject);
                        }
                        else
                        {
                            continue;
                        }

                        if (!first)
                        {
                            sb.Append(", ");
                        }
                        else
                        {
                            first = false;
                        }

                        if (val is bool)
                        {
                            val = ((bool)val) ? (byte)1 : (byte)0;
                        }
                        else if (val is DateTime)
                        {
                            val = ((DateTime)val).ToString(dateFormat);
                        }
                        else if (val is float)
                        {
                            val = ((float)val).ToString(Nfi);
                        }
                        else if (val is double)
                        {
                            val = ((double)val).ToString(Nfi);
                        }
                        else if (val is string)
                        {
                            val = Escape(val.ToString());
                        }
                        else if (val is List <byte> )
                        {
                            List <byte> bytes  = val as List <byte>;
                            string      Result = "";
                            foreach (byte b in bytes)
                            {
                                Result += b.ToString("X2") + " ";
                            }
                            val = Result;
                        }
                        else if (val is List <UInt32> )
                        {
                            List <UInt32> bytes  = val as List <UInt32>;
                            string        Result = "";
                            foreach (UInt32 b in bytes)
                            {
                                Result += b.ToString("X4") + " ";
                            }
                            val = Result;
                        }
                        else if (val is List <long> )
                        {
                            List <long> bytes  = val as List <long>;
                            string      Result = "";
                            foreach (long b in bytes)
                            {
                                Result += b.ToString("X8") + " ";
                            }
                            val = Result;
                        }

                        sb.Append("`" + bind.Member.Name + "` = ");
                        sb.Append('\'');
                        sb.Append(val);
                        sb.Append('\'');
                    }
                }

                sb.Append(" WHERE `" + tableName + "_ID` = '" + Escape(dataObject.ObjectId) + "'");

                string sql = sb.ToString();
                Log.Debug("MysqlObject", sql);

                int res = Connection.ExecuteNonQuery(sql);
                if (res == 0)
                {
                    Log.Error("MysqlObject", "Modify error : " + dataObject.TableName + " ID=" + dataObject.ObjectId + " --- keyvalue changed? " + sql + " " + Environment.StackTrace);
                    return;
                }

                if (hasRelations)
                {
                    SaveObjectRelations(dataObject);
                }

                dataObject.Dirty   = false;
                dataObject.IsValid = true;
            }
            catch (Exception e)
            {
                Log.Error("MysqlObject", "Modify error : " + dataObject.TableName + " " + dataObject.ObjectId + e.ToString());
            }
        }
Beispiel #5
0
        protected void FillLazyObjectRelations(DataObject dataObject, bool autoload)
        {
            try
            {
                var dataObjectType = dataObject.GetType();

                MemberInfo[] myMembers;
                if (!MemberInfoCache.TryGetValue(dataObjectType, out myMembers))
                {
                    myMembers = dataObjectType.GetMembers();
                    MemberInfoCache[dataObjectType] = myMembers;
                }

                for (int i = 0; i < myMembers.Length; i++)
                {
                    Relation[] myAttributes = GetRelationAttributes(myMembers[i]);

                    if (myAttributes.Length > 0)
                    {
                        Relation rel = myAttributes[0];

                        if ((rel.AutoLoad == false) && autoload)
                        {
                            continue;
                        }

                        bool         isArray = false;
                        Type         remoteType;
                        DataObject[] elements;

                        string local  = rel.LocalField;
                        string remote = rel.RemoteField;

                        if (myMembers[i] is PropertyInfo)
                        {
                            remoteType = ((PropertyInfo)myMembers[i]).PropertyType;
                        }
                        else
                        {
                            remoteType = ((FieldInfo)myMembers[i]).FieldType;
                        }

                        if (remoteType.HasElementType)
                        {
                            remoteType = remoteType.GetElementType();
                            isArray    = true;
                        }

                        PropertyInfo prop  = dataObjectType.GetProperty(local);
                        FieldInfo    field = dataObjectType.GetField(local);

                        object val = 0;

                        if (prop != null)
                        {
                            val = prop.GetValue(dataObject, null);
                        }
                        if (field != null)
                        {
                            val = field.GetValue(dataObject);
                        }

                        if (val != null && val.ToString() != string.Empty)
                        {
                            if (DataObject.GetPreCachedFlag(remoteType))
                            {
                                elements    = new DataObject[1];
                                elements[0] = FindObjectByKeyImpl(remoteType, val);
                            }
                            else
                            {
                                elements = SelectObjectsImpl(remoteType, remote + " = '" + Escape(val.ToString()) + "'", IsolationLevel.DEFAULT);
                            }

                            if ((elements != null) && (elements.Length > 0))
                            {
                                if (isArray)
                                {
                                    if (myMembers[i] is PropertyInfo)
                                    {
                                        ((PropertyInfo)myMembers[i]).SetValue(dataObject, elements, null);
                                    }
                                    if (myMembers[i] is FieldInfo)
                                    {
                                        var             currentField = (FieldInfo)myMembers[i];
                                        ConstructorInfo constructor;
                                        if (!ConstructorByFieldType.TryGetValue(currentField.FieldType, out constructor))
                                        {
                                            constructor = currentField.FieldType.GetConstructor(new[] { typeof(int) });
                                            ConstructorByFieldType[currentField.FieldType] = constructor;
                                        }

                                        object elementHolder = constructor.Invoke(new object[] { elements.Length });
                                        var    elementArray  = (object[])elementHolder;

                                        for (int m = 0; m < elementArray.Length; m++)
                                        {
                                            elementArray[m] = elements[m];
                                        }

                                        currentField.SetValue(dataObject, elementArray);
                                    }
                                }
                                else
                                {
                                    if (myMembers[i] is PropertyInfo)
                                    {
                                        ((PropertyInfo)myMembers[i]).SetValue(dataObject, elements[0], null);
                                    }
                                    if (myMembers[i] is FieldInfo)
                                    {
                                        ((FieldInfo)myMembers[i]).SetValue(dataObject, elements[0]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new DatabaseException("Resolution of relations " + dataObject.TableName + " failed!", e);
            }
        }
Beispiel #6
0
        protected void DeleteObjectRelations(DataObject dataObject)
        {
            try
            {
                object val;

                Type myType = dataObject.GetType();

                MemberInfo[] myMembers = myType.GetMembers();

                for (int i = 0; i < myMembers.Length; i++)
                {
                    Relation[] myAttributes = GetRelationAttributes(myMembers[i]);
                    if (myAttributes.Length > 0)
                    {
                        if (myAttributes[0].AutoDelete == false)
                        {
                            continue;
                        }

                        bool array = false;

                        Type type;

                        if (myMembers[i] is PropertyInfo)
                        {
                            type = ((PropertyInfo)myMembers[i]).PropertyType;
                        }
                        else
                        {
                            type = ((FieldInfo)myMembers[i]).FieldType;
                        }

                        if (type.HasElementType)
                        {
                            type  = type.GetElementType();
                            array = true;
                        }

                        val = null;

                        if (array)
                        {
                            if (myMembers[i] is PropertyInfo)
                            {
                                val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null);
                            }
                            if (myMembers[i] is FieldInfo)
                            {
                                val = ((FieldInfo)myMembers[i]).GetValue(dataObject);
                            }
                            if (val is Array)
                            {
                                var a = val as Array;

                                foreach (object o in a)
                                {
                                    if (o is DataObject)
                                    {
                                        DeleteObject(o as DataObject);
                                    }
                                }
                            }
                            else
                            {
                                if (val is DataObject)
                                {
                                    DeleteObject(val as DataObject);
                                }
                            }
                        }
                        else
                        {
                            if (myMembers[i] is PropertyInfo)
                            {
                                val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null);
                            }
                            if (myMembers[i] is FieldInfo)
                            {
                                val = ((FieldInfo)myMembers[i]).GetValue(dataObject);
                            }
                            if (val != null && val is DataObject)
                            {
                                DeleteObject(val as DataObject);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new DatabaseException("Relations delete failed !", e);
            }
        }