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.
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18591779
分类:
delphi中间件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-12-07 mormot事务控制
2017-12-07 非正常情况下的移动加权平均算法
2017-12-07 unigui在阿里云服务器上部署