fdmemtable server.api.pas

fdmemtable server.api.pas

复制代码
unit server.api;
/// <author>cxg 2024-12-6</author>
/// This unit only surport Tfdmemtable in client, firedac in server
interface

uses
  IniFiles,
  SysUtils, FireDAC.Stan.StorageBin, FireDAC.Stan.Intf, DB, keyValue.serialize, classes, Dialogs,
  FireDAC.Comp.Client, IdHTTP;

var
  url: string; // = 'http://127.0.0.1:1234';      //http server ip:port

//查询
//dbid: 数据库帐套号
procedure qry(const dbid: string; const sqls: array of string; const dss: array of TDataSet);
//保存
//noSaveFields: 不要保存的字段列表,逗号分隔
procedure save(const dbid: string; const tblNames, noSaveFlds: array of string; const dss: array of TDataSet);
//存储过程查询
procedure spopen(const dbid, spname, params: string; ds: tdataset);
//上传
procedure upload(const filename: string);
//执行事务性SQL: insert,update,delete
procedure execsql(const dbid, sql: string);
//下载
procedure download(const filename: string);
//验证码
procedure verifyCode(var code: string; image: tstream);
//雪花id
//datacenterid: 数据中心id
//workerid: 机器id
procedure snowflakeID(var id: int64; const datacenterid, workerid: byte);

implementation

procedure snowflakeID(var id: int64; const datacenterid, workerid: byte);
var
  s: tserialize;
  req, res: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  s.asbyte['datacenterid'] := datacenterid;
  s.asbyte['workerid'] := workerid;
  s.marshal(req);
  http.Post(url + '/bin/snowflakeid', req, res);
  s.Clear;
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('fail ' + s.asStr['exception'])
  else
  begin
    id := s.asInt64['snowflakeid'];
  end;
  s.Free;
  req.Free;
  res.Free;
  http.Free;
end;

procedure verifyCode(var code: string; image: tstream);
var
  s: tserialize;
  req, res: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  http.Post(url + '/bin/verifycode', req, res);
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('fail ' + s.asStr['exception'])
  else
  begin
    code := s.asStr['code'];
    image.CopyFrom(s.asStream['image']);
  end;
  req.Free;
  res.Free;
  http.Free;
end;

procedure execsql(const dbid, sql: string);
var
  s: tserialize;
  req, res: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  s.asStr['dbid'] := dbid;
  s.asStr['sql'] := sql;
  s.marshal(req);
  http.Post(url + '/bin/execsql', req, res);
  s.Clear;
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('fail ' + s.asStr['exception'])
  else
    ShowMessage('ok');
  s.Free;
  req.Free;
  res.Free;
  http.Free;
end;

procedure download(const filename: string);
var
  s: tserialize;
  req, res, ms: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  s.asByte['cnt'] := 1;
  s.asStr['filename1'] := filename;
  http.Post(url + '/bin/upload', req, res);
  s.Clear;
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('fail ' + s.asStr['exception'])
  else
  begin
    ms := s.asStream['file1'];
    //处理下载的文件
  end;
  s.Free;
  req.Free;
  res.Free;
  ms.Free;
  http.Free;
end;

procedure upload(const filename: string);
var
  s: tserialize;
  req, res, ms: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  ms := TFileStream.Create(filename, fmOpenRead);
  http := TIdHTTP.Create(nil);
  s.asByte['cnt'] := 1;
  s.asStr['filename1'] := extractfilename(filename);
  s.asStream['file1'] := ms;
  s.marshal(req);
  http.Post(url + '/bin/upload', req, res);
  s.Clear;
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('upload fail ' + s.asStr['exception'])
  else
    ShowMessage('upload ok');
  s.Free;
  req.Free;
  res.Free;
  ms.Free;
  http.Free;
end;

procedure spopen(const dbid, spname, params: string; ds: tdataset);
var
  s: tserialize;
  req, res, ms: tstream;
  http: tidhttp;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  s.asStr['dbid'] := dbid;
  s.asStr['spname'] := spname;
  s.asStr['params'] := params;
  s.marshal(req);
  http.Post(url + '/bin/spopen', req, res);
  s.Clear;
  s.unMarshal(res);
  if s.asInt['status'] <> 200 then
    ShowMessage('fail ' + s.asStr['exception'])
  else
  begin
    ms := s.asStream['ds'];
    ds.DisableControls;
    TFDMemTable(ds).LoadFromStream(ms, sfBinary);
    ds.EnableControls;
  end;
  s.Free;
  req.Free;
  res.Free;
  ms.Free;
  http.Free;
end;

procedure save(const dbid: string; const tblNames, noSaveFlds: array of string; const dss: array of TDataSet);
var
  s: tserialize;
  req, res, ms: tstream;
  http: tidhttp;
  i: Integer;
begin
  for i := Low(dss) to High(dss) do
  begin
    if dss[i].State in dsEditModes then
      dss[i].Post;
    if TFDMemTable(dss[i]).ChangeCount = 0 then
      Exit;
    TFDMemTable(dss[i]).CachedUpdates := True;  //This property must be set.
    TFDMemTable(dss[i]).ResourceOptions.StoreItems := TFDMemTable(dss[i]).ResourceOptions.StoreItems - [siData, siVisible];
  end;
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  ms := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  s.asStr['dbid'] := dbid;
  s.asbyte['count'] := High(tblNames) + 1;
  for i := 0 to High(tblNames) do
  begin
    s.asStr['tablename' + IntToStr(i + 1)] := tblNames[i];
    TMemoryStream(ms).Clear;
    TFDMemTable(dss[i]).SaveToStream(ms, sfBinary);   
    s.asStream ['delta' + IntToStr(i + 1)] := ms;
    s.asStr['nonfields' + IntToStr(i + 1)] := noSaveFlds[i];
  end;
  s.marshal(req);
  http.Post(url + '/fdm/save', req, res);
  s.Clear;
  s.unMarshal(res);
  if not s.asbool['ok'] then
  begin
    for i := 0 to High(tblNames) do
    begin
      TFDMemTable(dss[i]).CancelUpdates;
      TFDMemTable(dss[i]).ResourceOptions.StoreItems := TFDMemTable(dss[i]).ResourceOptions.StoreItems + [siData, siVisible];
    end;
    ShowMessage('Save fail ' + s.asStr['message']);
  end
  else
  begin
    for i := 0 to High(tblNames) do
    begin
      TFDMemTable(dss[i]).MergeChangeLog;
      TFDMemTable(dss[i]).ResourceOptions.StoreItems := TFDMemTable(dss[i]).ResourceOptions.StoreItems + [siData, siVisible];
    end;
    ShowMessage('Save ok');
  end;
  s.Free;
  req.free;
  res.Free;
  ms.free;
  http.free;
end;

procedure qry(const dbid: string; const sqls: array of string; const dss: array of TDataSet);
//
var
  s: tserialize;
  req, res, ms: tstream;
  http: tidhttp;
  i: Integer;
begin
  s := tserialize.Create;
  req := TMemoryStream.Create;
  res := TMemoryStream.Create;
  http := tidhttp.Create(nil);
  s.asbyte['count'] := High(sqls) + 1;
  s.asStr['dbid'] := dbid;
  for i := 0 to High(sqls) do
    s.asStr['sql' + IntToStr(i + 1)] := sqls[i];
  s.marshal(req);
  http.Post(url + '/fdm/select', req, res);
  s.Clear;
  s.unMarshal(res);
  if not s.asBool['ok'] then
  begin
    ShowMessage('Query fail ' + s.asStr['exception']);
    exit;
  end;
  for i := Low(dss) to High(dss) do
  begin
    dss[i].DisableControls;
    ms := s.asStream['ds' + IntToStr(i + 1)];
    TFDMemTable(dss[i]).LoadFromStream(ms, sfBinary);
    ms.Free;
    dss[i].EnableControls;
  end;
  s.Free;
  req.Free;
  res.Free;
  http.Free;
end;

procedure ReadConf;
begin
  var
    ini: TIniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) +
      'client.ini');
  url := ini.ReadString('config', 'url', '');
  ini.Free;
end;

initialization

ReadConf;

end.
复制代码

 

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