From 7306372aa6dd91e9c53b510701dfc0e9df470d05 Mon Sep 17 00:00:00 2001 From: dailyccc <963922242@qq.com> Date: Tue, 21 Feb 2023 20:25:57 +0800 Subject: [PATCH] =?UTF-8?q?-=E5=A2=9E=E5=8A=A0RestAPI=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Curd/QuestDbInsert.cs | 103 +++++++++++++++--- 1 file changed, 87 insertions(+), 16 deletions(-) diff --git a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs index e95508c7..d47224c0 100644 --- a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs +++ b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs @@ -1,6 +1,9 @@ using FreeSql.Internal; using FreeSql.Internal.Model; +using NetTopologySuite.Mathematics; +using Newtonsoft.Json; using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; @@ -11,7 +14,6 @@ using System.Threading.Tasks; namespace FreeSql.QuestDb.Curd { - class QuestDbInsert : Internal.CommonProvider.InsertProvider where T1 : class { public QuestDbInsert(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) @@ -30,9 +32,42 @@ namespace FreeSql.QuestDb.Curd internal Dictionary InternalIgnore => _ignore; internal void InternalClearData() => ClearData(); - public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); - public override long ExecuteIdentity() => base.SplitExecuteIdentity(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); - public override List ExecuteInserted() => base.SplitExecuteInserted(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); + private int InternelExecuteAffrows() + { + //如果设置了RestAPI的Url则走HTTP + var sql = ToSql(); + var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult(); + var resultHash = new Hashtable(); + try + { + resultHash = JsonConvert.DeserializeObject(execAsync); + } + catch + { + if (execAsync.Contains("401")) + { + throw new Exception("请确认QuestDb设置的RestAPI账号是否正确."); + } + } + var ddl = resultHash["ddl"]?.ToString(); + return ddl?.ToLower() == "ok" ? 1 : 0; + } + + public override int ExecuteAffrows() + { + if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + { + return base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, + _batchParameterLimit > 0 ? _batchParameterLimit : 3000); + } + return InternelExecuteAffrows(); + } + + public override long ExecuteIdentity() => base.SplitExecuteIdentity( + _batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); + + public override List ExecuteInserted() => base.SplitExecuteInserted( + _batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); protected override long RawExecuteIdentity() { @@ -50,7 +85,8 @@ namespace FreeSql.QuestDb.Curd _orm.Aop.CurdBeforeHandler?.Invoke(this, before); try { - ret = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _commandTimeout, _params); + ret = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _commandTimeout, + _params); } catch (Exception ex) { @@ -62,14 +98,18 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return 0; } + sql = string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)); before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); try { - long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, _commandTimeout, _params)), out ret); + long.TryParse( + string.Concat(_orm.Ado.ExecuteScalar(_connection, _transaction, CommandType.Text, sql, + _commandTimeout, _params)), out ret); } catch (Exception ex) { @@ -81,6 +121,7 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return ret; } @@ -96,9 +137,11 @@ namespace FreeSql.QuestDb.Curd foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ") + .Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } + sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -106,7 +149,8 @@ namespace FreeSql.QuestDb.Curd Exception exception = null; try { - ret = _orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params); + ret = _orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, + sql, _commandTimeout, _params); } catch (Exception ex) { @@ -118,15 +162,31 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return ret; } #if net40 #else - public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); - public override Task ExecuteIdentityAsync(CancellationToken cancellationToken = default) => base.SplitExecuteIdentityAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); - public override Task> ExecuteInsertedAsync(CancellationToken cancellationToken = default) => base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); + public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + { + return base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, + _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); + } + return Task.FromResult(InternelExecuteAffrows()); + } + + public override Task ExecuteIdentityAsync(CancellationToken cancellationToken = default) => + base.SplitExecuteIdentityAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, + _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); + + public override Task> ExecuteInsertedAsync(CancellationToken cancellationToken = default) => + base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, + _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); + async protected override Task RawExecuteIdentityAsync(CancellationToken cancellationToken = default) { var sql = this.ToSql(); @@ -143,7 +203,8 @@ namespace FreeSql.QuestDb.Curd _orm.Aop.CurdBeforeHandler?.Invoke(this, before); try { - ret = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken); + ret = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, + _commandTimeout, _params, cancellationToken); } catch (Exception ex) { @@ -155,14 +216,18 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return 0; } + sql = string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(identCols.First().Value.Attribute.Name)); before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); try { - long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken)), out ret); + long.TryParse( + string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, + _commandTimeout, _params, cancellationToken)), out ret); } catch (Exception ex) { @@ -174,8 +239,10 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return ret; } + async protected override Task> RawExecuteInsertedAsync(CancellationToken cancellationToken = default) { var sql = this.ToSql(); @@ -188,9 +255,11 @@ namespace FreeSql.QuestDb.Curd foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ") + .Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } + sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -198,7 +267,8 @@ namespace FreeSql.QuestDb.Curd Exception exception = null; try { - ret = await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken); + ret = await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, + CommandType.Text, sql, _commandTimeout, _params, cancellationToken); } catch (Exception ex) { @@ -210,8 +280,9 @@ namespace FreeSql.QuestDb.Curd var after = new Aop.CurdAfterEventArgs(before, exception, ret); _orm.Aop.CurdAfterHandler?.Invoke(this, after); } + return ret; } #endif } -} +} \ No newline at end of file