delphi+FPC一个纯key-value二进制存储

delphi+FPC一个纯key-value二进制存储

适用于DELPHI和FPC。

众所周知,JSON就是典型的key-value存储。

{

 "name":"咏南" ,

"url":"www.咏南中间件.com"

}

笔者弄了一个DELPHIkey-value二进制存储。

可用于数据序列/还原、缓存数据,方法参数传递。。。

  TSerialize = class
  private
    fValue: TBytes;
    fKey: rawbytestring;
    fList: tlist;
  private
    procedure setInt(const keyName: rawbytestring; const Value: integer);
    procedure setStr(const keyName: rawbytestring; const Value: rawbytestring);
    procedure setVariant(const keyName: rawbytestring; const Value: variant);
    procedure setBytes(const keyName: rawbytestring; const Value: TBytes);
    procedure setDateTime(const keyName: rawbytestring; const Value: TDateTime);
    procedure setBool(const keyName: rawbytestring; const Value: boolean);
    procedure setSingle(const keyName: rawbytestring; const Value: single);
    procedure setDouble(const keyName: rawbytestring; const Value: double);
    procedure setByte(const keyName: rawbytestring; const Value: byte);
    procedure setInt64(const keyName: rawbytestring; const Value: int64);
    procedure setCurrency(const keyName: rawbytestring; const Value: Currency);
    procedure setStream(const keyName: rawbytestring; const Value: tstream);
    procedure setWord(const keyName: rawbytestring; const Value: word);
    procedure setExtended(const keyName: rawbytestring; const Value: Extended);
    procedure setLongWord(const keyName: rawbytestring; const Value: LongWord);
    procedure setShortint(const keyName: rawbytestring; const Value: Shortint);
    procedure setSmallint(const keyName: rawbytestring; const Value: Smallint);
    procedure setBCD(const keyName: rawbytestring; const Value: tbcd);
  private
    function getInt(const keyName: rawbytestring): integer;
    function getStr(const keyName: rawbytestring): rawbytestring;
    function getVariant(const keyName: rawbytestring): variant;
    function getBytes(const keyName: rawbytestring): TBytes;
    function getDateTime(const keyName: rawbytestring): TDateTime;
    function getBool(const keyName: rawbytestring): boolean;
    function getSingle(const keyName: rawbytestring): single;
    function getDouble(const keyName: rawbytestring): double;
    function getByte(const keyName: rawbytestring): byte;
    function getInt64(const keyName: rawbytestring): int64;
    function getCurrency(const keyName: rawbytestring): Currency;
    function getStream(const keyName: rawbytestring): tstream;
    function getWord(const keyName: rawbytestring): word;
    function getExtended(const keyName: rawbytestring): Extended;
    function getLongWord(const keyName: rawbytestring): LongWord;
    function getShortint(const keyName: rawbytestring): Shortint;
    function getSmallint(const keyName: rawbytestring): Smallint;
    function getBCD(const keyName: rawbytestring): tbcd;
  private
    function getCount: integer;
  public
    constructor Create;
    destructor Destroy; override;
  public
    function key(const keyName: rawbytestring): TSerialize;
    procedure Clear;
    function Delete(const keyName: rawbytestring): boolean;
  public
    procedure marshal(stream: TStream);
    function marshal2: TBytes;
    function marshal3: RawByteString;
    function marshal5: OleVariant;
  public
    procedure unMarshal(stream: TStream); overload;
    procedure unMarshal(bytes: TBytes); overload;
    procedure unMarshal(raw: RawByteString); overload;
    procedure unMarshal(ole: OleVariant); overload;
  public
    property asInt[const keyName: rawbytestring]: integer read getInt write setInt;
    property asStr[const keyName: rawbytestring]: rawbytestring read getStr write setStr;
    property AsVariant[const keyName: rawbytestring]: variant read getVariant write setVariant;
    property asBytes[const keyName: rawbytestring]: TBytes read getBytes write setBytes;
    property AsDateTime[const keyName: rawbytestring]: TDateTime read getDateTime write setDateTime;
    property asBool[const keyName: rawbytestring]: boolean read getBool write setBool;
    property asSingle[const keyName: rawbytestring]: single read getSingle write setSingle;
    property asDouble[const keyName: rawbytestring]: double read getDouble write setDouble;
    property asByte[const keyName: rawbytestring]: byte read getByte write setByte;
    property asInt64[const keyName: rawbytestring]: int64 read getInt64 write setInt64;
    property asCurrency[const keyName: rawbytestring]: Currency read getCurrency write setCurrency;
    property asStream[const keyName: rawbytestring]: tstream read getStream write setStream;
    property asWord[const keyName: rawbytestring]: word read getword write setword;
    property asExtended[const keyName: rawbytestring]: Extended read getExtended write setExtended;
    property asLongWord[const keyName: rawbytestring]: LongWord read getLongWord write setLongWord;
    property asShortint[const keyName: rawbytestring]: Shortint read getShortint write setShortint;
    property asSmallint[const keyName: rawbytestring]: Smallint read getSmallint write setSmallint;
    property asBCD[const keyName: rawbytestring]: tbcd read getBCD write setBCD;
    property asFloat[const keyName: rawbytestring]: double read getDouble write setDouble;
    property asCardinal[const keyName: rawbytestring]: LongWord read getLongWord write setLongWord;
  public
    property Count: integer read getCount;
  end;

例子:

procedure TFuncBin.snowflakeID(req, res: TSerialize);
var
  sf: tsnowflakeID;
begin
  sf := tsnowflakeID.Create;
  try
    try
      sf.DatacenterId := req.asByte['datacenterid'];
      sf.WorkerID := req.asByte['workerid'];
      res.asInt['status'] := 200;
      res.asStr['message'] := 'success';
      res.asInt64['snowflakeid'] := sf.NextId;
    except
      on E: Exception do
      begin
        res.asInt['status'] := 500;
        res.asStr['message'] := 'fail';
        res.asStr['exception'] := 'bin.func.snowflakeID()' + e.Message;
        WriteLog('bin.func.snowflakeID()' + e.Message);
      end;
    end;
  finally
    sf.Free;
  end;
end;
procedure TFuncBin.select(req, res: TSerialize);
var
  db: tdb;
  pool: tdbpool;
  i: Integer;
begin
  try
    try
      pool := GetDBPool(req.asStr['dbid']);
      db := pool.Lock;
      db.dsp.DataSet := db.qry;
      for i := 1 to req.asByte['cnt'] do
      begin
        db.qry.Close;
        db.qry.SQL.Clear;
        db.qry.SQL.Text := req.asStr['sql' + i.tostring];
        res.AsVariant['ds' + i.ToString] := db.dsp.Data;
      end;
      res.asInt['status'] := 200;
      res.asStr['message'] := 'success';
    except
      on E: Exception do
      begin
        res.asInt['status'] := 500;
        res.asStr['message'] := 'fail';
        res.asStr['exception'] := 'bin.func.select()' + e.Message
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

 

posted @ 2023-02-03 11:44  delphi中间件  阅读(334)  评论(1编辑  收藏  举报