예제 #1
0
        /// <summary>Creates an object from a database reader.</summary>
        /// <typeparam name="T">Type.</typeparam>
        /// <param name="re">Reader.</param>
        /// <param name="localCache">Local cache.</param>
        /// <returns>Object.</returns>
        internal static object _CreateObject(Type t, IDataReader re, ICollection <object> localCache)
        {
            __Entity ent  = t._GetEntity();
            object   rval = _SearchCache(t, ent.PrimaryKey.ToFieldType(re.GetValue(re.GetOrdinal(ent.PrimaryKey.ColumnName)), localCache), localCache);

            if (rval == null)
            {
                if (localCache == null)
                {
                    localCache = new List <object>();
                }
                localCache.Add(rval = Activator.CreateInstance(t));
            }

            foreach (__Field i in ent.Internals)
            {
                i.SetValue(rval, i.ToFieldType(re.GetValue(re.GetOrdinal(i.ColumnName)), localCache));
            }

            foreach (__Field i in ent.Externals)
            {
                if (typeof(ILazy).IsAssignableFrom(i.Type))
                {
                    i.SetValue(rval, Activator.CreateInstance(i.Type, rval, i.Member.Name));
                }
                else
                {
                    i.SetValue(rval, i.Fill(Activator.CreateInstance(i.Type), rval, localCache));
                }
            }

            return(rval);
        }
예제 #2
0
        /// <summary>Saves an object.</summary>
        /// <param name="obj">Object.</param>
        public static void Save(object obj)
        {
            __Entity ent = obj._GetEntity();
            __Entity bse = obj.GetType().BaseType._GetEntity();

            if (bse.IsMaterial)
            {
                _Save(obj, bse, false, true);
            }
            _Save(obj, ent, bse.IsMaterial, false);
        }
예제 #3
0
        /// <summary>Deletes an object.</summary>
        /// <param name="obj">Object.</param>
        public static void Delete(object obj)
        {
            __Entity ent = obj._GetEntity();
            __Entity bse = obj.GetType().BaseType._GetEntity();

            if (bse.IsMaterial)
            {
                _Delete(obj, ent, false);
                _Delete(obj, bse, true);
            }
            else
            {
                _Delete(obj, ent, true);
            }
        }
예제 #4
0
        /// <summary>Deletes an object.</summary>
        /// <param name="obj">Object.</param>
        /// <param name="ent">Entity.</param>
        /// <param name="isBase">Determines if the entity is a base table.</param>
        private static void _Delete(object obj, __Entity ent, bool isBase)
        {
            IDbCommand cmd = Connection.CreateCommand();

            cmd.CommandText = ("DELETE FROM " + ent.TableName + " WHERE " + (isBase ? ent.PrimaryKey.ColumnName : ent.ChildKey) + " = :pk");
            IDataParameter p = cmd.CreateParameter();

            p.ParameterName = ":pk";
            p.Value         = ent.PrimaryKey.GetValue(obj);
            cmd.Parameters.Add(p);
            cmd.ExecuteNonQuery();
            cmd.Dispose();

            if (Cache != null)
            {
                Cache.Remove(obj);
            }
        }
예제 #5
0
        /// <summary>Creates an instance by its primary keys.</summary>
        /// <param name="t">Type.</param>
        /// <param name="pk">Primary key.</param>
        /// <param name="localCache">Local cache.</param>
        /// <returns>Object.</returns>
        internal static object _CreateObject(Type t, object pk, ICollection <object> localCache)
        {
            object rval = null;
            int    locc = ((localCache != null) ? localCache.Count : 0);

            IDbCommand cmd = Connection.CreateCommand();

            __Entity ent = t._GetEntity();

            cmd.CommandText = ent.GetSQL() + (string.IsNullOrWhiteSpace(ent.SubsetQuery) ? " WHERE " : " AND ") + t._GetEntity().PrimaryKey.ColumnName + " = :pk";

            IDataParameter p = cmd.CreateParameter();

            p.ParameterName = (":pk");
            p.Value         = pk;
            cmd.Parameters.Add(p);

            IDataReader re = cmd.ExecuteReader();

            if (re.Read())
            {
                rval = _CreateObject(t, re, localCache);
            }

            re.Close();
            cmd.Dispose();

            if (Cache != null)
            {
                if ((localCache != null) && (localCache.Count > locc))
                {
                    Cache.Put(rval);
                }
            }

            return(rval);
        }
예제 #6
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // private methods                                                                                                  //
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>Gets class and object key for an object.</summary>
        /// <param name="obj">Object.</param>
        /// <returns>Returns a tuple containing class and object key.</returns>
        private (string ClassKey, string ObjectKey) _GetKeys(object obj)
        {
            __Entity ent = obj._GetEntity();

            return(ent.TableName, ent.PrimaryKey.ToColumnType(ent.PrimaryKey.GetValue(obj)).ToString());
        }
예제 #7
0
        /// <summary>Saves an object.</summary>
        /// <param name="obj">Object.</param>
        /// <param name="ent">Entity.</param>
        /// <param name="hasMaterialBase">Determines if the base class table is material.</param>
        /// <param name="isBase">Determines if the the object is the base class table.</param>
        private static void _Save(object obj, __Entity ent, bool hasMaterialBase, bool isBase)
        {
            if (Cache != null)
            {
                if (!Cache.HasChanged(obj))
                {
                    return;
                }
            }

            IDbCommand cmd    = Connection.CreateCommand();
            string     update = "";
            string     insert = "";

            cmd.CommandText = ("INSERT INTO " + ent.TableName + " (");
            if (hasMaterialBase)
            {
                cmd.CommandText += ent.ChildKey + ", ";
                update           = "ON CONFLICT (" + ent.ChildKey + ") DO UPDATE SET ";
                insert           = (":ck, ");

                IDataParameter k = cmd.CreateParameter();
                k.ParameterName = ":ck";
                k.Value         = ent.PrimaryKey.GetValue(obj);
                cmd.Parameters.Add(k);
            }
            else
            {
                update = "ON CONFLICT (" + ent.PrimaryKey.ColumnName + ") DO UPDATE SET ";
            }


            IDataParameter p;
            bool           first = true;

            for (int i = 0; i < ent.LocalInternals.Length; i++)
            {
                if (i > 0)
                {
                    cmd.CommandText += ", "; insert += ", ";
                }
                cmd.CommandText += ent.LocalInternals[i].ColumnName;

                insert += (":v" + i.ToString());

                p = cmd.CreateParameter();
                p.ParameterName = (":v" + i.ToString());
                p.Value         = ent.LocalInternals[i].ToColumnType(ent.LocalInternals[i].GetValue(obj));
                cmd.Parameters.Add(p);

                if (!ent.LocalInternals[i].IsPrimaryKey)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        update += ", ";
                    }
                    update += (ent.LocalInternals[i].ColumnName + " = " + (":w" + i.ToString()));

                    p = cmd.CreateParameter();
                    p.ParameterName = (":w" + i.ToString());
                    p.Value         = ent.LocalInternals[i].ToColumnType(ent.LocalInternals[i].GetValue(obj));
                    cmd.Parameters.Add(p);
                }
            }
            cmd.CommandText += (") VALUES (" + insert + ") " + update);

            cmd.ExecuteNonQuery();
            cmd.Dispose();

            if (!isBase)
            {
                foreach (__Field i in ent.Externals)
                {
                    i.UpdateReferences(obj);
                }
            }

            if (Cache != null)
            {
                Cache.Put(obj);
            }
        }