Example #1
0
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        /// <returns></returns>
        internal override unsafe ReturnType Update <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
        {
            if (query.MemberMap == null)
            {
                query.MemberMap = sqlTool.GetSelectMemberMap(memberMap);
            }
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(default(AutoCSer.Memory.Pointer));
            }
            AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer);
            try
            {
                buffer = UnmanagedPool.Default.GetPointer();
                sqlStream.Reset(ref buffer);
                if (DataModel.Model <modelType> .Identity != null)
                {
                    long identity = DataModel.Model <modelType> .GetIdentity(value);

                    if (query.NotQuery)
                    {
                        sqlStream.Write(@"update ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.SimpleWrite(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                        sqlStream.Write(" where ");
                        constantConverter.ConvertNameToSqlStream(sqlStream, DataModel.Model <modelType> .Identity.FieldInfo.Name);
                        sqlStream.Write('=');
                        AutoCSer.Extensions.NumberExtension.ToString(identity, sqlStream);
                    }
                    else
                    {
                        sqlStream.SimpleWrite("select ");
                        DataModel.Model <modelType> .Inserter.GetColumnNames(sqlStream, query.MemberMap, constantConverter);

                        sqlStream.SimpleWrite(" from ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.Write(" where ");
                        constantConverter.ConvertNameToSqlStream(sqlStream, DataModel.Model <modelType> .Identity.FieldInfo.Name);
                        sqlStream.Write('=');
                        AutoCSer.Extensions.NumberExtension.ToString(identity, sqlStream);
                        int size = sqlStream.Data.CurrentIndex >> 1;
                        sqlStream.Write(@";
if sql%rowcount<>0 begin
 update ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.SimpleWrite(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                        sqlStream.Write(" where ");
                        constantConverter.ConvertNameToSqlStream(sqlStream, DataModel.Model <modelType> .Identity.FieldInfo.Name);
                        sqlStream.Write('=');
                        AutoCSer.Extensions.NumberExtension.ToString(identity, sqlStream);
                        sqlStream.SimpleWrite(@"
 ");
                        sqlStream.Write(sqlStream.Char, size);
                        sqlStream.SimpleWrite(@";
end");
                    }
                    query.Sql = sqlStream.ToString();
                    return(ReturnType.Success);
                }
                if (DataModel.Model <modelType> .PrimaryKeys.Length != 0)
                {
                    if (query.NotQuery)
                    {
                        sqlStream.Write(@"update ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.SimpleWrite(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                        sqlStream.Write(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, constantConverter);
                    }
                    else
                    {
                        sqlStream.SimpleWrite("select ");
                        DataModel.Model <modelType> .Inserter.GetColumnNames(sqlStream, query.MemberMap, constantConverter);

                        sqlStream.SimpleWrite(" from ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.Write(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, constantConverter);

                        int size = sqlStream.Data.CurrentIndex >> 1;
                        sqlStream.Write(@";
if sql%rowcount<>0 begin
 update ");
                        sqlStream.SimpleWrite(sqlTool.TableName);
                        sqlStream.SimpleWrite(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                        sqlStream.Write(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, constantConverter);

                        sqlStream.SimpleWrite(@"
 ");
                        sqlStream.Write(sqlStream.Char, size);
                        sqlStream.SimpleWrite(@";
end");
                    }
                    query.Sql = sqlStream.ToString();
                    return(ReturnType.Success);
                }
            }
            finally
            {
                UnmanagedPool.Default.Push(ref buffer);
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
            return(ReturnType.NotFoundPrimaryKey);
        }
Example #2
0
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        /// <returns></returns>
        internal override bool Update <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
        {
            if (query.MemberMap == null)
            {
                query.MemberMap = sqlTool.GetSelectMemberMap(memberMap);
            }
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                if (DataModel.Model <modelType> .Identity != null)
                {
                    if (!query.NotQuery)
                    {
                        getByIdentity(sqlStream, sqlTool.TableName, value, query.MemberMap);
                        query.Sql          = sqlStream.ToString();
                        sqlStream.ByteSize = 0;
                    }
                    sqlStream.SimpleWriteNotNull(" update `");
                    sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                    sqlStream.SimpleWriteNotNull("` set ");
                    DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                    sqlStream.SimpleWriteNotNull(" where ");
                    constantConverter.ConvertNameToSqlStream(sqlStream, DataModel.Model <modelType> .Identity.FieldInfo.Name);
                    sqlStream.Write('=');
                    AutoCSer.Extension.Number.ToString(DataModel.Model <modelType> .GetIdentity(value), sqlStream);
                    sqlStream.Write(';');
                    query.UpdateSql = sqlStream.ToString();
                    return(true);
                }
                if (DataModel.Model <modelType> .PrimaryKeys.Length != 0)
                {
                    if (!query.NotQuery)
                    {
                        getByPrimaryKey(sqlStream, sqlTool.TableName, value, query.MemberMap);
                        query.Sql          = sqlStream.ToString();
                        sqlStream.ByteSize = 0;
                    }
                    sqlStream.WriteNotNull(" update `");
                    sqlStream.WriteNotNull(sqlTool.TableName);
                    sqlStream.WriteNotNull("` set ");
                    DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, constantConverter, sqlTool);

                    sqlStream.WriteNotNull(" where ");
                    DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, constantConverter);

                    sqlStream.Write(';');
                    query.UpdateSql = sqlStream.ToString();
                    return(true);
                }
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
            return(false);
        }
Example #3
0
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        /// <returns></returns>
        internal override bool Update <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
        {
            if (query.MemberMap == null)
            {
                query.MemberMap = sqlTool.GetSelectMemberMap(memberMap);
            }
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                if (DataModel.Model <modelType> .Identity != null)
                {
                    long identity = DataModel.Model <modelType> .GetIdentity(value);

                    if (query.NotQuery)
                    {
                        sqlStream.WriteNotNull(@"update ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.SimpleWriteNotNull(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, ConstantConverter.Default, sqlTool);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        sqlStream.SimpleWriteNotNull(DataModel.Model <modelType> .IdentitySqlName);
                        sqlStream.Write('=');
                        AutoCSer.Extension.Number.ToString(identity, sqlStream);
                    }
                    else
                    {
                        sqlStream.SimpleWriteNotNull("select top 1 ");
                        DataModel.Model <modelType> .Inserter.GetColumnNames(sqlStream, query.MemberMap);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        sqlStream.SimpleWriteNotNull(DataModel.Model <modelType> .IdentitySqlName);
                        sqlStream.Write('=');
                        AutoCSer.Extension.Number.ToString(identity, sqlStream);
                        int size = sqlStream.ByteSize >> 1;
                        sqlStream.WriteNotNull(@"
if sql%rowcount<>0 begin
 update ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.SimpleWriteNotNull(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, ConstantConverter.Default, sqlTool);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        sqlStream.SimpleWriteNotNull(DataModel.Model <modelType> .IdentitySqlName);
                        sqlStream.Write('=');
                        AutoCSer.Extension.Number.ToString(identity, sqlStream);
                        sqlStream.SimpleWriteNotNull(@"
 ");
                        sqlStream.WriteNotNull(sqlStream.Char, size);
                        sqlStream.SimpleWriteNotNull(@"
end");
                    }
                    query.Sql = sqlStream.ToString();
                    return(true);
                }
                if (DataModel.Model <modelType> .PrimaryKeys.Length != 0)
                {
                    if (query.NotQuery)
                    {
                        sqlStream.WriteNotNull(@"update ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.SimpleWriteNotNull(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, ConstantConverter.Default, sqlTool);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, ConstantConverter.Default);
                    }
                    else
                    {
                        sqlStream.SimpleWriteNotNull("select top 1 ");
                        DataModel.Model <modelType> .Inserter.GetColumnNames(sqlStream, query.MemberMap);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, ConstantConverter.Default);

                        int size = sqlStream.ByteSize >> 1;
                        sqlStream.WriteNotNull(@"
if sql%rowcount<>0 begin
 update ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.SimpleWriteNotNull(" set ");
                        DataModel.Model <modelType> .Updater.Update(sqlStream, memberMap, value, ConstantConverter.Default, sqlTool);

                        sqlStream.SimpleWriteNotNull(" from ");
                        sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                        sqlStream.WriteNotNull(" where ");
                        DataModel.Model <modelType> .PrimaryKeyWhere.Write(sqlStream, value, ConstantConverter.Default);

                        sqlStream.SimpleWriteNotNull(@"
 ");
                        sqlStream.WriteNotNull(sqlStream.Char, size);
                        sqlStream.SimpleWriteNotNull(@"
end");
                    }
                    query.Sql = sqlStream.ToString();
                    return(true);
                }
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
            return(false);
        }