api.clientdataset.pas

api.clientdataset.pas

复制代码
unit api.clientdataset;
// clientdataset CRUD
// cxg 2024-12-6

interface

uses
  // mormot------
  mormot.core.variants,
  // system---------
  Classes, SysUtils,
  // my--------
  db.firedac, db.firedacpool,
  keyValue.serialize, sys.global;

type
  Tcds = record
    // 查询
    function select(ctxt: Tcontext): cardinal;
    // 保存
    function save(ctxt: Tcontext): cardinal;
    function execsql(ctxt: Tcontext): cardinal;
  end;

implementation

function Tcds.execsql(ctxt: Tcontext): cardinal;
var
  ser, ser2: TSerialize;
  pool: TDBPool;
  db: TDB;
begin
  ser := TSerialize.Create;
  ser2 := TSerialize.Create;
  try
    try
      ser.unMarshal(ctxt.InContent);
      pool := GetDBPool(ser.asStr['dbid']);
      db := pool.Lock;
      db.execsql(ser.asStr['sql']);
      ser2.asBool['ok'] := true;
      ctxt.OutContent := ser2.marshal3;
    except
      on E: Exception do
      begin
        ser2.asBool['ok'] := false;
        ser2.asStr['message'] := E.Message;
        ctxt.OutContent := ser2.marshal3;
        writelog('api.clientdataset.execsql()' + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
    ser.free;
    ser2.free;
  end;
end;

function Tcds.save(ctxt: Tcontext): cardinal;
var
  ser, ser2: TSerialize;
  pool: TDBPool;
  db: TDB;
  i, err: Integer;
  needFlds: string;
begin
  ser := TSerialize.Create;
  ser2 := TSerialize.Create;
  try
    try
      ser.unMarshal(ctxt.InContent);
      pool := GetDBPool(ser.asStr['dbid']);
      db := pool.Lock;
      db.startTrans;
      for i := 1 to ser.asByte['count'] do
      begin
        db.qry.Close;
        db.qry.SQL.Clear;
        //有的字段不要保存
        needFlds := db.getNeedFields(ser.asStr['tablename' + i.ToString], ser.asStr['nonfields' + i.ToString]);
        db.qry.SQL.Text := 'select ' + needFlds + ' from ' + ser.asStr['tablename' + i.ToString] + ' where 1=2';
        db.dsp.ApplyUpdates(ser.asVariant['delta' + i.ToString], 0, err);
        if err > 0 then
        begin
          db.rollbackTrans;
          ser2.asBool['ok'] := false;
          ctxt.OutContent := ser2.marshal3;
        end;
      end;
      db.commitTrans;
      ctxt.OutContent := ser2.marshal3;
      Result := 200;
    except
      on E: Exception do
      begin
        db.rollbackTrans;
        ser2.asBool['ok'] := false;
        ser2.asStr['message'] := E.Message;
        ctxt.OutContent := ser2.marshal3;
        writelog('api.clientdataset.save()' + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
    ser.free;
    ser2.free;
  end;
end;

function Tcds.select(ctxt: Tcontext): cardinal;
var
  ser, ser2: TSerialize;
  pool: TDBPool;
  db: TDB;
  i: Integer;
begin
  ser := TSerialize.Create;
  ser2 := TSerialize.Create;
  try
    try
      ser.unMarshal(ctxt.InContent);
      pool := GetDBPool(ser.asStr['dbid']);
      db := pool.Lock;
      for i := 1 to ser.asByte['count'] do
        ser2.asVariant['ds' + i.ToString] := db.select2(ser.asStr['sql' + i.ToString]);
      ser2.asBool['ok'] := True;
      ctxt.OutContent := ser2.marshal3;
      Result := 200;
    except
      on E: Exception do
      begin
        ser2.asBool['ok'] := false;
        ser2.asStr['message'] := E.Message;
        ctxt.OutContent := ser2.marshal3;
        writelog('api.clientdataset.select()' + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
    ser.free;
    ser2.free;
  end;
end;

var
  _: Tcds;

initialization

_router.Post('/cds/select', _.select);
_router.Post('/cds/save', _.save);
_router.Post('/cds/execsql', _.execsql);

end.
复制代码

 

posted @   delphi中间件  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-12-07 mormot事务控制
2017-12-07 非正常情况下的移动加权平均算法
2017-12-07 unigui在阿里云服务器上部署
点击右上角即可分享
微信分享提示