da.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2018 by Michael Van Canneyt, member of the
  4. Free Pascal development team
  5. Remobjects Data Abstract external classes.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit DA;
  13. {$mode objfpc}
  14. {$modeswitch externalclass}
  15. interface
  16. uses Sysutils, Types, JS, DASDK;
  17. Type
  18. TDADataType = ( datUnknown, datString, datDateTime, datFloat, datCurrency,
  19. datAutoInc, datInteger, datLargeInt, datBoolean, datMemo,
  20. datBlob, datWideString, datWideMemo, datLargeAutoInc, datByte,
  21. datShortInt, datWord, datSmallInt, datCardinal, datLargeUInt,
  22. datGuid, datXml, datDecimal, datSingleFloat, datFixedChar, datFixedWideChar, datCursor);
  23. // Forward classes
  24. TDADataTable = class;
  25. TDABIN2DataStreamer = class;
  26. TDAJSONDataStreamer = class;
  27. TDARemoteDataAdapter = Class;
  28. TDAChange = class;
  29. TDADelta = class;
  30. TDADeltas = class;
  31. TDAField = class;
  32. TDALookupField = class;
  33. TDADataTableRow = class;
  34. TDAExpression = class;
  35. TDADynamicWhere = class;
  36. TDAConstantExpression = class;
  37. TDAParameterExpression = class;
  38. TDANullExpression = class;
  39. TDAFieldExpression = class;
  40. TDAMacroExpression = class;
  41. TDAUnaryExpression = class;
  42. TDABinaryExpression = class;
  43. TDABetweenExpression = class;
  44. TDAListExpression = class;
  45. TDAUtil = Class;
  46. TDARemoteDataAdaptor = Class;
  47. TDAStream = String;
  48. TDADataStreamer = class external name 'RemObjects.DataAbstract.DataStreamer' (TJSObject)
  49. Public
  50. procedure initializeRead;
  51. procedure initializeWrite;
  52. procedure finalizeWrite;
  53. function getStream : TDAStream;
  54. procedure setStream(aStream : TDAStream);
  55. procedure readDataset(aDataset : TDADataTable);
  56. function readDelta : TDADeltas;
  57. procedure writeDelta(aDelta : TDADeltas);
  58. Property Stream : TDAStream Read getStream write setStream;
  59. end;
  60. TDADataStreamerClass = Class of TDADataStreamer;
  61. TDABIN2DataStreamer = class external name 'RemObjects.DataAbstract.Bin2DataStreamer' (TDADataStreamer)
  62. function readByte : Byte;
  63. function readInteger : NativeInt;
  64. function readAnsiStringWithLength : String;
  65. function readUtf8StringWithLength : string;
  66. function read (aType : string) : TJSObject;
  67. function readParam (acount : Integer) : TDADataParameter;
  68. function readField(acount : Integer) : TDAField;
  69. Procedure writeByte(aValue : Byte);
  70. Procedure writeInteger(aValue : NativeInt);
  71. Procedure writeAnsiStringWithLength(aValue : String);
  72. Procedure write(aType : string; aValue : TJSObject);
  73. end;
  74. TDAJSONDataStreamer = class external name 'RemObjects.DataAbstract.JSONDataStreamer' (TDADataStreamer)
  75. end;
  76. TDARemoteDataAdapter = Class external name 'RemObjects.DataAbstract.RemoteDataAdapter' (TJSObject)
  77. Public
  78. Constructor New(Const aURL, aDataServiceName, aLoginServiceName : String;
  79. aStreamerClass : TDADataStreamerClass);
  80. end;
  81. TDAChange = class external name 'RemObjects.DataAbstract.Change' (TJSObject)
  82. recid : Nativeint;
  83. changetype : string;
  84. status : string;
  85. message : string;
  86. old : TJSValueDynArray;
  87. new_ : TJSValueDynArray; external name 'new';
  88. end;
  89. TDAChangeArray = array of TDAChange;
  90. TLogField = record
  91. name : string;
  92. datatype : string; external name 'type';
  93. end;
  94. TLogFieldArray = array of TLogfield;
  95. TDADelta = class external name 'RemObjects.DataAbstract.Delta' (TJSObject)
  96. Private
  97. FData : TDAChangeArray; external name 'data';
  98. FKeyFields : TStringDynArray; external name 'keyfields';
  99. FLoggedFields : TLogFieldArray; external name 'loggedfields';
  100. FName : string; external name 'name';
  101. Public
  102. Function intFindId(anId : Integer) : TDAChange;
  103. Property data : TDAChangeArray Read FData;
  104. Property keyFields : TStringDynArray Read FKeyFields Write FKeyFields;
  105. Property LoggedFields : TLogFieldArray Read FLoggedFields Write FLoggedFields;
  106. Property Name : String Read FName Write FName;
  107. end;
  108. TDADeltaArray = Array of TDADelta;
  109. TDADeltas = class external name 'RemObjects.DataAbstract.Deltas' (TJSObject)
  110. Public
  111. deltas : TDADeltaArray;
  112. Function FindByName (Const aName : String) : TDADelta;
  113. end;
  114. TDATableRowNotifyEvent = reference to procedure(row : TDADataTableRow);
  115. TDADataTableRowArray = array of TDADataTableRow;
  116. TDAFieldArray = Array of TDAField;
  117. TDADataTable = class external name 'RemObjects.DataAbstract.DataTable' (TJSObject)
  118. Public
  119. name : string;
  120. rows : TDADataTableRowArray;
  121. fields : TDAFieldArray;
  122. deletedrows : TDADataTableRowArray;
  123. frecordbuffer : TJSArray;
  124. fNextRecID : Integer;
  125. fIndex : Integer;
  126. bofFlag : Boolean;
  127. eofFlag : Boolean;
  128. dynamicWhere : TJSObject;
  129. onNewRecord : TDATableRowNotifyEvent;
  130. onBeforeDelete: TDATableRowNotifyEvent;
  131. onAfterDelete: TDATableRowNotifyEvent;
  132. onBeforeScroll: TDATableRowNotifyEvent;
  133. onAfterScroll: TDATableRowNotifyEvent;
  134. Procedure checkRequired;
  135. Procedure locate(aName : String; aValue : JSValue);
  136. procedure addLookupField(const aName,aSourceField : String; aLookupTable : TDADataTable;
  137. const aLookupKeyField, aLookupResultField : String);
  138. procedure getNextId;
  139. function appendRow : TDADataTableRow;
  140. procedure deleteRow;
  141. procedure markDeleted;
  142. function fieldNumByName(Const aName : string) : Integer;
  143. function fieldByName(Const aName : string) : TDAField;
  144. procedure setFieldValue(Const aName : string; aValue : JSValue);
  145. function getFieldValue(Const aName : string) : JSValue;
  146. procedure setFieldAsString(Const aName, aValue : String);
  147. function getFieldAsString(Const aName : string) : String;
  148. function currentRow : TDADataTableRow;
  149. procedure first;
  150. procedure last;
  151. procedure next;
  152. procedure prev;
  153. Function findId(anID: Integer) : TDADataTableRow;
  154. function eof : boolean;
  155. function bof : boolean;
  156. procedure post;
  157. procedure cancel;
  158. end;
  159. TDAField = class external name 'RemObjects.DataAbstract.Field' (TJSObject)
  160. Public
  161. alignment : string;
  162. blobtype: string;
  163. businessClassID : String;
  164. calculated : string;
  165. customAttributes : string;
  166. dataType : string;
  167. name: string;
  168. type_ : string external name 'type';
  169. logChanges : boolean;
  170. readOnly : boolean;
  171. serverAutoRefresh : Boolean;
  172. serverCalculated : Boolean;
  173. description : string;
  174. decimalPrecision : Integer;
  175. decimalScale : integer;
  176. defaultValue : string;
  177. dictionaryEntry : String;
  178. displayLabel : String;
  179. displayWidth : integer;
  180. inPrimaryKey : string;
  181. visible : boolean;
  182. required : boolean;
  183. size : integer;
  184. Procedure checkReadOnly;
  185. end;
  186. TDALookupField = class external name 'RemObjects.DataAbstract.LookupField' (TJSObject)
  187. Public
  188. sourceField : string;
  189. lookupTable : TDADataTable;
  190. lookupKeyField: String;
  191. lookupResultField : string;
  192. end;
  193. TDADataTableRow = class external name 'RemObjects.DataAbstract.DataTableRow' (TJSObject)
  194. Public
  195. recID : Integer;
  196. state : string;
  197. __oldValues : array of JSValue;
  198. __newValues : array of JSValue;
  199. end;
  200. TDAExpression = class external name 'RemObjects.DataAbstract.Expression' (TJSObject)
  201. function toXML : String;
  202. end;
  203. TDADynamicWhere = class external name 'RemObjects.DataAbstract.DynamicWhere' (TJSObject)
  204. Public
  205. constructor New(anExpression : TDAExpression);
  206. function toXML : String;
  207. end;
  208. TDAConstantExpression = class external name 'RemObjects.DataAbstract.ConstantExpression' (TDAExpression)
  209. Public
  210. constructor new (aType : String; aValue : JSValue; ANull : Byte);
  211. end;
  212. TDAParameterExpression = class external name 'RemObjects.DataAbstract.ParameterExpression' (TDAExpression)
  213. Public
  214. constructor new (const aName, aType : String; aSize : Integer);
  215. end;
  216. TDANullExpression = class external name 'RemObjects.DataAbstract.NullExpression' (TDAExpression)
  217. public
  218. constructor new;
  219. end;
  220. TDAFieldExpression = class external name 'RemObjects.DataAbstract.FieldExpression' (TDAExpression)
  221. public
  222. constructor new(aName : string);
  223. end;
  224. TDAMacroExpression = class external name 'RemObjects.DataAbstract.MacroExpression' (TDAExpression)
  225. public
  226. constructor new(aName : string);
  227. end;
  228. TDAUnaryExpression = class external name 'RemObjects.DataAbstract.UnaryExpression' (TDAExpression)
  229. public
  230. constructor new(aNode : TDAExpression; aOperator : string);
  231. end;
  232. TDABinaryExpression = class external name 'RemObjects.DataAbstract.BinaryExpression' (TDAExpression)
  233. public
  234. constructor new(aNode1,aNode2 : TDAExpression; aOperator : string);
  235. end;
  236. TDABetweenExpression = class external name 'RemObjects.DataAbstract.BetweenExpression' (TDAExpression)
  237. public
  238. constructor new(aNode1,aNode2,aNode3 : TDAExpression);
  239. end;
  240. TDAListExpression = class external name 'RemObjects.DataAbstract.ListExpression' (TDAExpression)
  241. public
  242. constructor new(aList : array of TDAExpression);
  243. end;
  244. TDABinaryOperator = (dboAnd, dboOr, dboXor, dboLess, dboLessOrEqual, dboGreater,
  245. dboGreaterOrEqual, dboNotEqual, dboEqual, dboLike, dboIn, dboAddition, dboSubtraction,
  246. dboMultiply, dboDivide, dboNotIn);
  247. TDAUnaryOperator = (duoNot, duoMinus);
  248. TDAUtil = Class external name 'RemObjects.DataAbstract.Util' (TJSObject)
  249. Public
  250. function createDataParameter(aName : String;aValue : JSValue) : TJSObject;
  251. function createRequestInfo(IncludeSchema : Boolean; MaxRecords : Integer; UserFilter : String; Parameters : Array of JSValue) : TJSObject;
  252. function createRequestInfoV5(IncludeSchema : Boolean; MaxRecords : Integer; UserFilter : String; Parameters : Array of JSValue) : TJSOBject;
  253. function createRequestInfoV6(SQL : String; MaxRecords : Integer; UserFilter : String; Parameters : Array of JSValue) : TJSObject;
  254. procedure setupScriptingCallBacks;
  255. end;
  256. TDACallBack = procedure;
  257. TDALoginNeededCallBack = reference to procedure(aCallBack : TDACallBack);
  258. TDAChangeFailHandler = reference to procedure (aData : TDAChange);
  259. TDARemoteDataAdaptor = Class external name 'RemObjects.DataAbstract.RemoteDataAdapter' (TJSObject)
  260. Private
  261. FSendReducedDelta : boolean; external name 'sendReducedDelta';
  262. Public
  263. onLoginNeeded : TDALoginNeededCallBack;
  264. onChangeFail : TDAChangeFailHandler;
  265. function getDataService() : TDADataAbstractService;
  266. function getLoginService() : TDASimpleLoginService;
  267. procedure login(aUserID,aPassword,aConnectionName : String; OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  268. procedure logout(OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  269. function createStreaer: TDAJSONDatastreamer;
  270. procedure setSendReducedDelta (aValue : Boolean);
  271. procedure getSchema(aFilter : String;OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  272. function buildDelta(aTable : TDADataTable) : TDADelta;
  273. procedure createTableFromSchema(const aTableName : String; aTable : TDADataTable; CallBack: TDACallBack);
  274. procedure executeCommand(const aName : String; Parameters: TDADataParameterArray; OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  275. function getAutoGetScripts : Boolean;
  276. procedure setAutoGetScripts(aValue : boolean);
  277. Procedure getSQLData(aTable : TDADataTable; const SQL : String;OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  278. Procedure getData(aTable : TDADataTable; aRequest : TDATableRequestInfo;OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  279. procedure applyUpdates(aTable : TDADataTable; OnSuccess : TDASuccessEvent; OnFailed : TDAFailedEvent);
  280. property sendReducedDelta : Boolean Read FSendReducedDelta Write setSendReducedDelta;
  281. property AutoGetScripts : boolean Read getAutoGetScripts write setAutoGetScripts;
  282. end;
  283. TDAHTMLTableView = class external name 'RemObjects.DataAbstract.Views.HtmlTableView'
  284. Public
  285. constructor new(aTable : TDADataTable; aHTMLTableID : String);
  286. end;
  287. TDAVerticalHTMLTableView = class external name 'RemObjects.DataAbstract.Views.VerticalHtmlTableView'
  288. Public
  289. constructor new(aTable : TDADataTable; aHTMLTableID : String);
  290. end;
  291. Const
  292. BinaryOperatorNames : Array[TDABinaryOperator] of string =
  293. ('And', 'Or', 'Xor', 'Less', 'LessOrEqual', 'Greater',
  294. 'GreaterOrEqual', 'NotEqual', 'Equal', 'Like', 'In', 'Addition', 'Subtraction',
  295. 'Multiply', 'Divide', 'NotIn');
  296. UnaryOperatorNames: Array[TDAUnaryOperator] of string = ('Not', 'Minus');
  297. DataTypeNames : Array[TDADataType] of string = ('Unknown', 'String', 'DateTime', 'Float', 'Currency',
  298. 'AutoInc', 'Integer', 'LargeInt', 'Boolean', 'Memo',
  299. 'Blob', 'WideString', 'WideMemo', 'LargeAutoInc', 'Byte',
  300. 'ShortInt', 'Word', 'SmallInt', 'Cardinal', 'LargeUInt',
  301. 'Guid', 'Xml', 'Decimal', 'SingleFloat', 'FixedChar', 'FixedWideChar', 'Cursor');
  302. Function JSValueToDataType(aValue : JSValue) : TDADataType;
  303. Function JSValueToDataTypeName(aValue : JSValue) : String;
  304. Implementation
  305. Function JSValueToDataType(aValue : JSValue) : TDADataType;
  306. begin
  307. if isNull(aValue) then
  308. Result:=datUnknown
  309. else if isString(aValue) then
  310. Result:=datWideString
  311. else if isBoolean(aValue) then
  312. Result:=datBoolean
  313. else if isNumber(aValue) then
  314. begin
  315. if isInteger(aValue) then
  316. Result:=datLargeInt
  317. else
  318. Result:=datFloat
  319. end
  320. else if isDate(aValue) then
  321. Result:=datDateTime
  322. else
  323. Raise EConvertError.Create('Cannot convert JSValue to DADataType: Unknown/Unsupported type');
  324. end;
  325. Function JSValueToDataTypeName(aValue : JSValue) : String;
  326. begin
  327. Result:=DataTypeNames[JSValueToDataType(aValue)];
  328. end;
  329. end.