848 lines
22 KiB
ObjectPascal
848 lines
22 KiB
ObjectPascal
unit uSvc_Base;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.Generics.Collections,
|
|
System.SysUtils,
|
|
WinApi.ActiveX,
|
|
JsonDataObjects,
|
|
uCommons,
|
|
uDataMod,
|
|
uHeoObj_Base;
|
|
|
|
|
|
const
|
|
{$I globalConsts.inc}
|
|
tblPrijataJsonData = '[dbo].[_hdc_ph_PrijataJsonData]';
|
|
|
|
type
|
|
|
|
// Typ funkce pro kopírování jednoho objektu
|
|
TCopyFunction<T: class> = reference to function(const Source: T): T;
|
|
|
|
TServiceBase = class abstract
|
|
strict protected
|
|
FDM: TdatMod;
|
|
public
|
|
constructor Create (AdmMain: TdatMod); virtual;
|
|
destructor Destroy; virtual;
|
|
function GetTabCols (schema: string='dbo'; tabName: string=''; tabAlias: string=''; vratPocitane: Boolean=true; exceptCols: string='';
|
|
limitColCount: Integer=0; inclVarbinMax: boolean=false): string;
|
|
function GetTabColsArray (schema: string='dbo'; tabName: string = ''; tabAlias: string=''; vratPocitane: Boolean=true): TArray<string>;
|
|
function TabColsArrayRemove (inArray: TArray<string>; const delColName: string): boolean;
|
|
function GetTabExtCols (schema: string='dbo'; tabName: string=''; tabAlias: string=''; vratPocitane: Boolean=true): string;
|
|
|
|
function sanitizeSQLString (s: string): string;
|
|
procedure DeepCopyList<T: class>(SourceList, DestList: TObjectList<T>; CopyFunc: TCopyFunction<T>);
|
|
function SQLTableExists (schema: string=''; tabName: string=''): boolean;
|
|
function SQLColumnExists (schema: string=''; tabName: string=''; colName: string=''): boolean;
|
|
function SQLGeneralTest (sqlText: string): boolean;
|
|
function NewUUID32: string;
|
|
|
|
procedure Commit;
|
|
procedure Rollback;
|
|
procedure StartTransaction;
|
|
end;
|
|
|
|
TObecnyService = class(TServiceBase)
|
|
public
|
|
function DoTesty: TJSONObject;
|
|
procedure ZapisJsonDoHeliosu (jsonData: string; var respString: string);
|
|
procedure ImportTaskuDZ; virtual;
|
|
end;
|
|
|
|
|
|
|
|
var
|
|
verText, verText2: string;
|
|
verMoje: Int64;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.StrUtils,
|
|
System.Classes,
|
|
System.RegularExpressions,
|
|
FireDAC.Stan.Option,
|
|
FireDAC.Comp.Client,
|
|
FireDAC.Stan.Param,
|
|
MVCFramework.FireDAC.Utils,
|
|
MVCFramework.DataSet.Utils,
|
|
MVCFramework.Serializer.Commons,
|
|
FireDAC.Stan.Consts,
|
|
System.JSON.Builders,
|
|
System.JSON.Writers,
|
|
System.JSON.Types,
|
|
Winapi.Windows,
|
|
helTabsBIDs;
|
|
|
|
|
|
|
|
|
|
|
|
function GetFileVersion2 (sFileName:string): string;
|
|
var VerInfoSize: DWORD;
|
|
VerInfo: Pointer;
|
|
VerValueSize: DWORD;
|
|
VerValue: PVSFixedFileInfo;
|
|
Dummy: DWORD;
|
|
begin
|
|
VerInfoSize := GetFileVersionInfoSize (PChar(sFileName), Dummy);
|
|
GetMem(VerInfo, VerInfoSize);
|
|
GetFileVersionInfo (PChar(sFileName), 0, VerInfoSize, VerInfo);
|
|
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
|
|
with VerValue^ do
|
|
begin
|
|
Result := IntToStr(dwFileVersionMS shr 16);
|
|
Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
|
|
Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
|
|
Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
|
|
end;
|
|
FreeMem(VerInfo, VerInfoSize);
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{ TServiceBase }
|
|
procedure TServiceBase.Commit;
|
|
begin
|
|
// FDM.sqlConn.Commit;
|
|
end;
|
|
|
|
|
|
|
|
destructor TServiceBase.Destroy;
|
|
begin
|
|
if (FDM<>nil) then
|
|
FreeAndNil (FDM);
|
|
inherited;
|
|
end;
|
|
|
|
|
|
|
|
constructor TServiceBase.Create (AdmMain: TdatMod);
|
|
// var s: string;
|
|
begin
|
|
inherited Create;
|
|
FDM:= AdmMain;
|
|
{
|
|
|
|
with FDM do
|
|
try
|
|
sqlConn.Params.Clear;
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_DriverID + '=MSSQL');
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_Server + '=' + datMod.dbServer);
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_Port + '=' + datMod.dbPort.ToString);
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_Database + '=' + datMod.dbName);
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_UserName + '=' + datMod.dbUser);
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_Password + '=' + datMod.dbPwd);
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_OSAuthent + '=No');
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_MetaDefSchema + '=dbo');
|
|
sqlConn.Params.Add(S_FD_ConnParam_Common_ApplicationName + '=hdcAPIsvc');
|
|
// sqlConn.Open;
|
|
except on E:Exception do
|
|
end;
|
|
}
|
|
|
|
// s:= FDM.sqlConn.Params.DelimitedText;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.NewUUID32: string;
|
|
var GUID: TGUID;
|
|
begin
|
|
CoCreateGuid(GUID);
|
|
SetLength(Result, 32);
|
|
StrLFmt(PChar(Result), 32,'%.8x%.4x%.4x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x',
|
|
[Guid.D1, Guid.D2, Guid.D3, Guid.D4[0], Guid.D4[1], Guid.D4[2], Guid.D4[3],
|
|
Guid.D4[4], Guid.D4[5], Guid.D4[6], Guid.D4[7]]);
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServiceBase.DeepCopyList<T>(SourceList, DestList: TObjectList<T>; CopyFunc: TCopyFunction<T>);
|
|
var i: Integer;
|
|
begin
|
|
for i := 0 to SourceList.Count - 1 do
|
|
begin
|
|
// Pro každý objekt v seznamu zavoláme funkci, která vrátí jeho kopii
|
|
DestList.Add(CopyFunc(SourceList[i]));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
function TServiceBase.sanitizeSQLString (s: string): string;
|
|
begin
|
|
result:= s.Replace(' ', '').Replace(';', '').Replace('--', '').Replace(' OR', '').Trim;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.SQLGeneralTest (sqlText: string): Boolean;
|
|
var lSQL: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
begin
|
|
result:= false;
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open(sqlText);
|
|
if (lQry.RecordCount>0) then
|
|
result:= true;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.SQLColumnExists (schema: string=''; tabName: string=''; colName: string=''): boolean;
|
|
var lSQL: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
begin
|
|
result:= false;
|
|
|
|
if (colName='') or (schema.Contains('.')) then
|
|
begin
|
|
colName:= tabName;
|
|
tabName:= schema;
|
|
schema:= '';
|
|
end;
|
|
|
|
tabName:= tabName.Trim;
|
|
if (ContainsText(tabName, '[dbo].')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('[dbo].', '');
|
|
end;
|
|
if (ContainsText(tabName, 'dbo.')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('dbo.', '');
|
|
end;
|
|
if (schema='') then
|
|
schema:= 'dbo';
|
|
schema:= schema.Replace('[', '').Replace(']', '');
|
|
tabName:= tabName.Replace('[', '').Replace(']', '');
|
|
|
|
lSQL:= 'SELECT 1 FROM (SELECT 1 AS A) X WHERE COL_LENGTH(N' + (schema + '.' + tabName).QuotedString + ', N' + colName.QuotedString + ') IS NOT NULL';
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount=1) then
|
|
result:= true;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.SQLTableExists (schema: string=''; tabName: string=''): boolean;
|
|
var lSQL: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
begin
|
|
result:= false;
|
|
tabName:= tabName.Trim;
|
|
if (ContainsText(tabName, '[dbo].')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('[dbo].', '');
|
|
end;
|
|
if (ContainsText(tabName, 'dbo.')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('dbo.', '');
|
|
end;
|
|
if (schema='') then
|
|
schema:= 'dbo';
|
|
schema:= schema.Replace('[', '').Replace(']', '');
|
|
tabName:= tabName.Replace('[', '').Replace(']', '');
|
|
|
|
lSQL:= 'SELECT t.[name] FROM sys.tables t INNER JOIN sys.schemas s ON (s.schema_id=t.schema_id) WHERE s.name=N' + schema.QuotedString;
|
|
lSQL:= lSQL + ' AND t.[name]=N' + tabName.QuotedString;
|
|
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount=1) then
|
|
result:= true;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.TabColsArrayRemove (inArray: TArray<string>; const delColName: string): boolean;
|
|
var i: integer;
|
|
begin
|
|
result:= false;
|
|
for i:=0 to Length(inArray) do
|
|
if (inArray[i]=delColName) then
|
|
begin
|
|
Delete(inArray, i, 1);
|
|
result:= true;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.GetTabColsArray (schema: string='dbo'; tabName: string = ''; tabAlias: string=''; vratPocitane: Boolean=true): TArray<string>;
|
|
var lSQL, cols: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
sqlVer: smallint;
|
|
a: TArray<string>;
|
|
begin
|
|
SetLength(a, 0);
|
|
cols:= '';
|
|
|
|
tabName:= tabName.Trim;
|
|
if (ContainsText(tabName, '[dbo].')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('[dbo].', '');
|
|
end;
|
|
if (ContainsText(tabName, 'dbo.')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('dbo.', '');
|
|
end;
|
|
if (schema='') then
|
|
schema:= 'dbo';
|
|
schema:= schema.Replace('[', '').Replace(']', '');
|
|
tabName:= tabName.Replace('[', '').Replace(']', '');
|
|
|
|
|
|
if (SQLTableExists(schema, tabName)) then
|
|
begin
|
|
|
|
lSQL:= 'SELECT SERVERPROPERTY(''ProductMajorVersion'') AS SQLVer';
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
begin
|
|
sqlVer:= lQry.FieldByName('SQLVer').AsInteger;
|
|
if (sqlVer<=13) then
|
|
lSQL:= 'STUFF((SELECT ' + IfThen(tabAlias='', '', 'N''' + tabAlias + '.''') + ' + [name]+N'','''
|
|
else
|
|
lSQL:= 'STRING_AGG(' + IfThen(tabAlias='', '', 'N''' + tabAlias + '.''') + ' + [name], N'','') AS Cols';
|
|
lSQL:= 'SELECT ' + lSQL + ' FROM sys.columns WHERE OBJECT_ID=OBJECT_ID(N' + QuotedStr(schema + '.' + tabname) + ', N''U'')';
|
|
if not(vratPocitane) then
|
|
lSQL:= lSQL + ' AND is_computed=0';
|
|
if (sqlVer<=13) then
|
|
lSQL:= lSQL + ' FOR XML PATH(''''),TYPE).value(''.'',''varchar(MAX)''),1,0,'''') AS Cols';
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
begin
|
|
cols:= lQry.FieldByName('Cols').AsString;
|
|
if (RightStr(cols,1)=',') then
|
|
cols:= LeftStr(cols, Length(cols)-1);
|
|
end;
|
|
|
|
a:= SplitString(cols, ',');
|
|
|
|
end;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
result:= a;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TServiceBase.GetTabCols (schema: string='dbo'; tabName: string = ''; tabAlias: string=''; vratPocitane: Boolean=true; exceptCols: string='';
|
|
limitColCount: Integer=0; inclVarbinMax: boolean=false): string;
|
|
var lSQL: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
sqlVer: smallint;
|
|
colExt: TStringList;
|
|
i: Integer;
|
|
begin
|
|
result:= '';
|
|
|
|
tabName:= tabName.Trim;
|
|
if (ContainsText(tabName, '[dbo].')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('[dbo].', '');
|
|
end;
|
|
if (ContainsText(tabName, 'dbo.')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('dbo.', '');
|
|
end;
|
|
if (schema='') then
|
|
schema:= 'dbo';
|
|
schema:= schema.Replace('[', '').Replace(']', '');
|
|
tabName:= tabName.Replace('[', '').Replace(']', '');
|
|
|
|
|
|
|
|
exceptCols:= 'SystemRowVersionExt,' + exceptCols;
|
|
if (RightStr(exceptCols,1)=',') then
|
|
exceptCols:= LeftStr(exceptCols, Length(exceptCols)-1);
|
|
|
|
if (SQLTableExists (schema, tabName)) then
|
|
begin
|
|
|
|
exceptCols:= exceptCols.Replace(' ','');
|
|
colExt:= TStringList.Create;
|
|
if (exceptCols<>'') then
|
|
begin
|
|
while (exceptCols.Contains(',')) do
|
|
begin
|
|
colExt.Add(LeftStr(exceptCols, exceptCols.IndexOf(',')));
|
|
exceptCols:= MidStr(exceptCols, exceptCols.IndexOf(',')+2, Length(exceptCols));
|
|
end;
|
|
if not(exceptCols.Contains(',')) then
|
|
colExt.Add(exceptCols);
|
|
end;
|
|
|
|
|
|
|
|
lSQL:= 'SELECT SERVERPROPERTY(''ProductMajorVersion'') AS SQLVer';
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
try
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
begin
|
|
sqlVer:= lQry.FieldByName('SQLVer').AsInteger;
|
|
|
|
lSQL:= 'SELECT [name] FROM sys.columns WHERE OBJECT_ID=OBJECT_ID(N' + QuotedStr(schema + '.' + tabname) + ', N''U'')';
|
|
|
|
if not(inclVarbinMax) then
|
|
lSQL:= lSQL + ' AND [system_type_id]<>165 AND [max_length]<>-1'; // varbinary(max)
|
|
|
|
if (colExt.Count>0) then
|
|
begin
|
|
lSQL:= lSQL + ' AND [name] NOT IN (';
|
|
for i:=0 to (colExt.Count-1) do
|
|
lSQL:= lSQL + 'N' + colExt.Strings[i].QuotedString + ',';
|
|
lSQL:= LeftStr(lSQL, Length(lSQL)-1) + ')';
|
|
end;
|
|
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
begin
|
|
lQry.First;
|
|
|
|
if (limitColCount=0) then
|
|
limitColCount:= 999;
|
|
i:= 1;
|
|
while not(lQry.Eof) and (limitColCount>=i) do
|
|
begin
|
|
result:= result + IfThen(tabAlias='', '', tabAlias + '.') + lQry.FieldByName('name').AsString + ',';
|
|
Inc(i);
|
|
lQry.Next;
|
|
end;
|
|
end;
|
|
if (RightStr(result,1)=',') then
|
|
result:= LeftStr(result, Length(result)-1);
|
|
|
|
|
|
{
|
|
if (sqlVer<=13) then
|
|
lSQL:= 'STUFF((SELECT ' + IfThen(tabAlias='', '', 'N''' + tabAlias + '.''') + ' + [name]+N'','''
|
|
else
|
|
lSQL:= 'STRING_AGG(' + IfThen(tabAlias='', '', 'N''' + tabAlias + '.''') + ' + [name], N'','') AS Cols';
|
|
|
|
|
|
lSQL:= 'SELECT ' + lSQL + ' FROM sys.columns WHERE OBJECT_ID=OBJECT_ID(N' + QuotedStr(schema + '.' + tabname) + ', N''U'')';
|
|
if not(vratPocitane) then
|
|
lSQL:= lSQL + ' AND is_computed=0';
|
|
|
|
if (colExt.Count>0) then
|
|
begin
|
|
lSQL:= lSQL + ' AND [name] NOT IN (';
|
|
for i:=0 to (colExt.Count-1) do
|
|
lSQL:= lSQL + 'N' + colExt.Strings[i].QuotedString + ',';
|
|
lSQL:= LeftStr(lSQL, Length(lSQL)-1) + ')';
|
|
end;
|
|
|
|
if (sqlVer<=13) then
|
|
lSQL:= lSQL + ' FOR XML PATH(''''),TYPE).value(''.'',''varchar(MAX)''),1,0,'''') AS Cols';
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
begin
|
|
result:= lQry.FieldByName('Cols').AsString;
|
|
if (RightStr(result,1)=',') then
|
|
result:= LeftStr(result, Length(result)-1);
|
|
end;
|
|
}
|
|
|
|
|
|
end;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
colExt.Free;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
if (result='') or (tabName='') then
|
|
result:= '1 AS X';
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TServiceBase.GetTabExtCols (schema: string='dbo'; tabName: string = ''; tabAlias: string=''; vratPocitane: Boolean=true): string;
|
|
var lSQL: string;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
begin
|
|
result:= '';
|
|
|
|
tabName:= tabName.Trim;
|
|
if (ContainsText(tabName, '[dbo].')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('[dbo].', '');
|
|
end;
|
|
if (ContainsText(tabName, 'dbo.')) then
|
|
begin
|
|
schema:= 'dbo';
|
|
tabName:= tabName.Replace('dbo.', '');
|
|
end;
|
|
if (schema='') then
|
|
schema:= 'dbo';
|
|
schema:= schema.Replace('[', '').Replace(']', '');
|
|
tabName:= tabName.Replace('[', '').Replace(']', '');
|
|
|
|
if (RightStr(tabName,4)<>'_EXT') then
|
|
tabName:= tabName + '_EXT';
|
|
|
|
|
|
if (SQLTableExists(schema, tabName)) then
|
|
begin
|
|
lSQL:= 'SELECT STRING_AGG(' + IfThen(tabAlias='', '', 'N''' + tabAlias + '.''') + ' + [name], N'','') AS Cols FROM sys.columns WHERE OBJECT_ID=OBJECT_ID(N'
|
|
+ QuotedStr(schema + '.' + tabname) + ')';
|
|
if not(vratPocitane) then
|
|
lSQL:= lSQL + ' AND is_computed=0';
|
|
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount>0) then
|
|
result:= lQry.FieldByName('Cols').AsString;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
end;
|
|
|
|
if (result='') or (tabName='') then
|
|
result:= '1 AS X';
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TServiceBase.Rollback;
|
|
begin
|
|
// FDM.sqlConn.Rollback;
|
|
end;
|
|
|
|
|
|
procedure TServiceBase.StartTransaction;
|
|
begin
|
|
// FDM.sqlConn.StartTransaction;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ TObecnyService}
|
|
|
|
procedure TObecnyService.ImportTaskuDZ;
|
|
begin
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TObecnyService.DoTesty: TJSONObject;
|
|
var status, server, dbname, org: string;
|
|
i: integer;
|
|
b: TJSONObjectBuilder;
|
|
w: TJsonTextWriter;
|
|
sB: TStringBuilder;
|
|
sW: TStringWriter;
|
|
p: TJSONCollectionBuilder.TPairs;
|
|
sqlConnX: TFDConnection;
|
|
lQry: TFDQuery;
|
|
begin
|
|
result:= TJSONObject.Create;
|
|
status:= 'NOT OK';
|
|
|
|
|
|
// kontrola verze pluginu
|
|
verText:= GetFileVersion2 (GetModuleName(HInstance));
|
|
if Length(verText)=12 then
|
|
verText:= LeftStr(verText,9) + '0' + RightStr(verText,3);
|
|
verText2:= verText.Replace('.', '');
|
|
if (Length(verText2)=10) then
|
|
verText2:= '0' + LeftStr(verText2,1) + '0' + RightStr(verText2, 9);
|
|
verMoje:= verText2.ToInt64;
|
|
|
|
|
|
dbname:= FDM.sqlConn.Params.Database;
|
|
server:= '';
|
|
i:= FDM.sqlConn.Params.IndexOf(S_FD_ConnParam_Common_Server);
|
|
if (i>-1) then
|
|
server:= FDM.sqlConn.Params.Strings[i];
|
|
|
|
try
|
|
try
|
|
if not(FDM.sqlConn.Connected) then
|
|
FDM.sqlConn.Open;
|
|
status:= 'OK';
|
|
except
|
|
end;
|
|
finally
|
|
end;
|
|
|
|
|
|
org:= '';
|
|
sqlConnX:= TFDConnection.Create(nil);
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
try
|
|
sqlConnX.ConnectionDefName:= sqlPoolName;
|
|
lQry.Connection:= sqlConnX;
|
|
lQry.Open('SELECT Nazev FROM ' + tblCOrg + ' WHERE CisloOrg=0');
|
|
org:= lQry.FieldByName('Nazev').AsString;
|
|
except
|
|
end;
|
|
finally
|
|
lQry.Free;
|
|
end;
|
|
sqlConnX.Close;
|
|
sqlConnX.Free;
|
|
|
|
|
|
sB:= TStringBuilder.Create;
|
|
sW:= TStringWriter.Create(sB);
|
|
w:= TJsonTextWriter.Create(sW);
|
|
w.Formatting:= TJsonFormatting.Indented;
|
|
b:= TJSONObjectBuilder.Create(w);
|
|
// b.BeginObject.BeginArray('status').BeginObject.Add('status', status).EndObject.EndArray.EndObject;
|
|
p:= b.BeginObject.Add('status', status);
|
|
if (server<>'') then
|
|
p.Add('server', server);
|
|
p.Add('db', dbname);
|
|
p.Add('ver', verMoje.ToString);
|
|
p.Add('nazevOrg', org);
|
|
p.EndObject;
|
|
result.FromJSON(sB.ToString);
|
|
// result.S['out']:= status;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TObecnyService.ZapisJsonDoHeliosu (jsonData: string; var respString: string);
|
|
var lSQL, taskStr, strTmp, strTmp2, code, rs, guidIdent: string;
|
|
guid: TGUID;
|
|
objekt, akce: string;
|
|
j, t, a, v: JsonDataObjects.TJSONObject;
|
|
i, ii, taskDZId, taskId, intTemp, idJSON: integer;
|
|
jeOld: boolean;
|
|
lQry: TFDQuery;
|
|
sqlConnX: TFDConnection;
|
|
lSQL2, srcNazev, errMsg: string;
|
|
rsrc: TResourceStream;
|
|
ms: TMemoryStream;
|
|
arrDefs: TStringList;
|
|
function LoadStringFromStream (const AStream: TStream): String;
|
|
var lenX: Integer;
|
|
begin
|
|
AStream.Seek(0,0);
|
|
lenX:= AStream.Size - AStream.Position;
|
|
SetLength(Result, lenX);
|
|
if (lenX>0) then
|
|
AStream.ReadBuffer(Result[1], lenX);
|
|
end;
|
|
function MemoryStreamToAnsiString (const M: TMemoryStream): AnsiString;
|
|
begin
|
|
SetString(Result, PAnsiChar(M.Memory), M.Size);
|
|
end;
|
|
|
|
begin
|
|
idJSON:= 0;
|
|
respString:= '[';
|
|
|
|
jsonData:= jsonData.Trim;
|
|
if (jsonData<>'') then
|
|
begin
|
|
lQry:= TFDQuery.Create(nil);
|
|
try
|
|
lQry.Connection:= FDM.sqlConn;
|
|
try
|
|
CoCreateGuid(guid);
|
|
if (System.SysUtils.CreateGUID(guid)=S_OK) then
|
|
guidIdent:= System.SysUtils.GUIDToString(guid)
|
|
else
|
|
guidIdent:= self.NewUUID32;
|
|
lSQL:= 'INSERT ' + tblPrijataJsonData + ' (IdPHIdent, GUIDIdent, JSONData) SELECT 0, CONVERT(uniqueidentifier, N' + guidIdent.QuotedString + '), N' + jsonData.QuotedString;
|
|
FDM.sqlConn.ExecSQL(lSQL);
|
|
lSQL:= 'SELECT ID FROM ' + tblPrijataJsonData + ' WHERE GUIDIdent=CONVERT(uniqueidentifier, N' + guidIdent.QuotedString + ')';
|
|
lQry.Open(lSQL);
|
|
if (lQry.RecordCount=1) then
|
|
begin
|
|
idJSON:= lQry.FieldByName('ID').AsInteger;
|
|
respString:= 'OK';
|
|
end;
|
|
except on E:Exception do
|
|
begin
|
|
respString:= 'NOT OK';
|
|
raise EServiceException.Create('Chyba zápisu JSON dat: ' + E.Message);
|
|
end;
|
|
end;
|
|
finally
|
|
FreeAndNil(lQry);
|
|
end;
|
|
|
|
|
|
j:= TJsonObject.Parse(jsonData) as JsonDataObjects.TJsonObject;
|
|
try
|
|
if (j<>nil) then
|
|
begin
|
|
if (j.Contains('akce')) then
|
|
begin
|
|
akce:= j.S['akce'].Trim;
|
|
if (idJSON>0) and (akce<>'') then
|
|
FDM.sqlConn.ExecSQL('UPDATE ' + tblPrijataJsonData + ' SET Akce=N' + akce.QuotedString + ' WHERE ID=' + idJSON.ToString);
|
|
{
|
|
for i:=0 to j['tasks'].Count-1 do
|
|
begin
|
|
try
|
|
t:= j['tasks'].Items[i];
|
|
taskDZId:= t.I['id']; // j['tasks'].Items[i].I['id'];
|
|
taskStr:= j['tasks'].Items[i].ObjectValue.ToString;
|
|
except on E:Exception do
|
|
end;
|
|
end;
|
|
}
|
|
end;
|
|
|
|
if (j.Contains('action')) then
|
|
begin
|
|
akce:= j.S['action'].Trim;
|
|
if (idJSON>0) and (akce<>'') then
|
|
FDM.sqlConn.ExecSQL('UPDATE ' + tblPrijataJsonData + ' SET Akce=N' + akce.QuotedString + ' WHERE ID=' + idJSON.ToString);
|
|
end;
|
|
|
|
if (j.Contains('object')) then
|
|
begin
|
|
objekt:= j.S['object'].Trim;
|
|
if (idJSON>0) and (objekt<>'') then
|
|
FDM.sqlConn.ExecSQL('UPDATE ' + tblPrijataJsonData + ' SET Objekt=N' + objekt.QuotedString + ' WHERE ID=' + idJSON.ToString);
|
|
end;
|
|
|
|
end;
|
|
finally
|
|
j.Free;
|
|
end;
|
|
|
|
end
|
|
else
|
|
respString:= 'NOT OK - nemám data';
|
|
|
|
respString:= '[' +respString + ']';
|
|
|
|
end;
|
|
|
|
|
|
|
|
end.
|