|
@@ -1,13 +1,13 @@
|
|
{ ***************************************************************************
|
|
{ ***************************************************************************
|
|
|
|
|
|
- Copyright (c) 2016-2019 Kike Pérez
|
|
|
|
|
|
+ Copyright (c) 2016-2020 Kike Pérez
|
|
|
|
|
|
Unit : Quick.Data.InfluxDB
|
|
Unit : Quick.Data.InfluxDB
|
|
Description : InfluxDB data provider
|
|
Description : InfluxDB data provider
|
|
Author : Kike Pérez
|
|
Author : Kike Pérez
|
|
Version : 1.0
|
|
Version : 1.0
|
|
Created : 05/04/2019
|
|
Created : 05/04/2019
|
|
- Modified : 10/04/2019
|
|
|
|
|
|
+ Modified : 21/04/2020
|
|
|
|
|
|
This file is part of QuickLogger: https://github.com/exilon/QuickLogger
|
|
This file is part of QuickLogger: https://github.com/exilon/QuickLogger
|
|
|
|
|
|
@@ -37,6 +37,7 @@ uses
|
|
Classes,
|
|
Classes,
|
|
SysUtils,
|
|
SysUtils,
|
|
DateUtils,
|
|
DateUtils,
|
|
|
|
+ Quick.Collections,
|
|
Quick.HttpClient,
|
|
Quick.HttpClient,
|
|
Quick.Commons,
|
|
Quick.Commons,
|
|
Quick.Value,
|
|
Quick.Value,
|
|
@@ -57,7 +58,7 @@ type
|
|
fTags : TPairArray;
|
|
fTags : TPairArray;
|
|
fCreateDataBaseIfNotExists : Boolean;
|
|
fCreateDataBaseIfNotExists : Boolean;
|
|
procedure CreateDataBase;
|
|
procedure CreateDataBase;
|
|
- function GenerateWriteQuery(const aMeasurement : string; aTagPairs : TPairArray; aFieldPairs : TFlexPairArray; aTime : TDateTime): string;
|
|
|
|
|
|
+ function GenerateWriteQuery(const aMeasurement : string; aTagPairs : IList<TPair>; aFieldPairs : IList<TFlexPair>; aTime : TDateTime): string;
|
|
procedure SetWriteURL;
|
|
procedure SetWriteURL;
|
|
procedure SetPassword(const Value: string);
|
|
procedure SetPassword(const Value: string);
|
|
procedure SetUserName(const Value: string);
|
|
procedure SetUserName(const Value: string);
|
|
@@ -74,8 +75,9 @@ type
|
|
property Tags : TPairArray read fTags write fTags;
|
|
property Tags : TPairArray read fTags write fTags;
|
|
procedure Init; override;
|
|
procedure Init; override;
|
|
procedure Restart; override;
|
|
procedure Restart; override;
|
|
- procedure Write(const aMeasurement : string; aFieldPairs : TFlexPairArray; aTime : TDateTime = 0); overload;
|
|
|
|
- procedure Write(const aMeasurement : string; aTagPairs : TPairArray; aFieldPairs : TFlexPairArray; aTime : TDateTime = 0); overload;
|
|
|
|
|
|
+ procedure Stop; override;
|
|
|
|
+ procedure Write(const aMeasurement : string; aFieldPairs : IList<TFlexPair>; aTime : TDateTime = 0); overload;
|
|
|
|
+ procedure Write(const aMeasurement: string; aTagPairs : IList<TPair>; aFieldPairs: IList<TFlexPair>; aTime: TDateTime); overload;
|
|
procedure Write(const aMeasurement: string; const aFieldKey : string; aFieldValue : TFlexValue; aTime: TDateTime); overload;
|
|
procedure Write(const aMeasurement: string; const aFieldKey : string; aFieldValue : TFlexValue; aTime: TDateTime); overload;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -97,15 +99,13 @@ end;
|
|
|
|
|
|
destructor TInfluxDBData.Destroy;
|
|
destructor TInfluxDBData.Destroy;
|
|
begin
|
|
begin
|
|
- if Assigned(fHTTPClient) then FreeAndNil(fHTTPClient);
|
|
|
|
-
|
|
|
|
|
|
+ if Assigned(fHTTPClient) then fHTTPClient.Free;
|
|
inherited;
|
|
inherited;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TInfluxDBData.Init;
|
|
procedure TInfluxDBData.Init;
|
|
begin
|
|
begin
|
|
if fInitiated then Stop;
|
|
if fInitiated then Stop;
|
|
-
|
|
|
|
SetWriteURL;
|
|
SetWriteURL;
|
|
fHTTPClient := TJsonHTTPClient.Create;
|
|
fHTTPClient := TJsonHTTPClient.Create;
|
|
fHTTPClient.ContentType := 'application/json';
|
|
fHTTPClient.ContentType := 'application/json';
|
|
@@ -137,22 +137,28 @@ begin
|
|
else fFullURL := Format('%s/write?db=%s&precision=ms',[fURL,fDataBase]);
|
|
else fFullURL := Format('%s/write?db=%s&precision=ms',[fURL,fDataBase]);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TInfluxDBData.Stop;
|
|
|
|
+begin
|
|
|
|
+ inherited;
|
|
|
|
+ if Assigned(fHTTPClient) then FreeAndNil(fHTTPClient);
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TInfluxDBData.Write(const aMeasurement: string; const aFieldKey : string; aFieldValue : TFlexValue; aTime: TDateTime);
|
|
procedure TInfluxDBData.Write(const aMeasurement: string; const aFieldKey : string; aFieldValue : TFlexValue; aTime: TDateTime);
|
|
var
|
|
var
|
|
- fparray : TFlexPairArray;
|
|
|
|
|
|
+ fields : IList<TFlexPair>;
|
|
begin
|
|
begin
|
|
- fparray.Add(aFieldKey,aFieldValue);
|
|
|
|
- if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,nil,fparray,aTime))
|
|
|
|
- else Write(GenerateWriteQuery(aMeasurement,nil,fparray,Now()));
|
|
|
|
|
|
+ fields.Add(TFlexPair.Create(aFieldKey,aFieldValue));
|
|
|
|
+ if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,nil,fields,aTime))
|
|
|
|
+ else Write(GenerateWriteQuery(aMeasurement,nil,fields,Now()));
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TInfluxDBData.Write(const aMeasurement: string; aTagPairs : TPairArray; aFieldPairs: TFlexPairArray; aTime: TDateTime);
|
|
|
|
|
|
+procedure TInfluxDBData.Write(const aMeasurement: string; aTagPairs : IList<TPair>; aFieldPairs: IList<TFlexPair>; aTime: TDateTime);
|
|
begin
|
|
begin
|
|
if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,aTagPairs,aFieldPairs,aTime))
|
|
if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,aTagPairs,aFieldPairs,aTime))
|
|
else Write(GenerateWriteQuery(aMeasurement,aTagPairs,aFieldPairs,Now()));
|
|
else Write(GenerateWriteQuery(aMeasurement,aTagPairs,aFieldPairs,Now()));
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TInfluxDBData.Write(const aMeasurement: string; aFieldPairs: TFlexPairArray; aTime: TDateTime);
|
|
|
|
|
|
+procedure TInfluxDBData.Write(const aMeasurement: string; aFieldPairs: IList<TFlexPair>; aTime: TDateTime);
|
|
begin
|
|
begin
|
|
if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,nil,aFieldPairs,aTime))
|
|
if atime <> 0 then Write(GenerateWriteQuery(aMeasurement,nil,aFieldPairs,aTime))
|
|
else Write(GenerateWriteQuery(aMeasurement,nil,aFieldPairs,Now()));
|
|
else Write(GenerateWriteQuery(aMeasurement,nil,aFieldPairs,Now()));
|
|
@@ -171,7 +177,6 @@ procedure TInfluxDBData.CreateDataBase;
|
|
var
|
|
var
|
|
resp : IHttpRequestResponse;
|
|
resp : IHttpRequestResponse;
|
|
begin
|
|
begin
|
|
- exit;
|
|
|
|
try
|
|
try
|
|
resp := fHTTPClient.Post(Format('%s/query?q=CREATE DATABASE %s',[fURL,fDatabase]),'');
|
|
resp := fHTTPClient.Post(Format('%s/query?q=CREATE DATABASE %s',[fURL,fDatabase]),'');
|
|
except
|
|
except
|
|
@@ -182,7 +187,7 @@ begin
|
|
raise EInfluxDBData.Create(Format('[TInfluxDBData] : Response %d : %s trying to create database',[resp.StatusCode,resp.StatusText]));
|
|
raise EInfluxDBData.Create(Format('[TInfluxDBData] : Response %d : %s trying to create database',[resp.StatusCode,resp.StatusText]));
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TInfluxDBData.GenerateWriteQuery(const aMeasurement : string; aTagPairs : TPairArray; aFieldPairs : TFlexPairArray; aTime : TDateTime): string;
|
|
|
|
|
|
+function TInfluxDBData.GenerateWriteQuery(const aMeasurement : string; aTagPairs : IList<TPair>; aFieldPairs : IList<TFlexPair>; aTime : TDateTime): string;
|
|
var
|
|
var
|
|
incinfo : TStringList;
|
|
incinfo : TStringList;
|
|
tags : string;
|
|
tags : string;
|
|
@@ -228,6 +233,7 @@ begin
|
|
if not fInitiated then Init;
|
|
if not fInitiated then Init;
|
|
|
|
|
|
stream := TStringStream.Create(aLine);
|
|
stream := TStringStream.Create(aLine);
|
|
|
|
+ var a := aline;
|
|
try
|
|
try
|
|
try
|
|
try
|
|
resp := fHTTPClient.Post(fFullURL,stream);
|
|
resp := fHTTPClient.Post(fFullURL,stream);
|