You are not logged in.
We have a TSQLRestServerDB instance running, exposed via a TSQLHttpServer instance.
On the RESTServer instance there's an interface registered with some functions and procedures. These can be called without any problem from a VCL mORMot client.
Problem though, is the server generated (Mustache) CrossPlatform client wrapper. This code can't be compiled if it's not adapted.
Extract of the code on the server:
TDTOActivePatient = packed record
Id: Integer;
FullName: String;
Gender: TGender;
end;
TDTOActivePatientDynArray = array of TDTOActivePatient;
IPatientAdministration = interface(IInvokable)
['{80091C16-DBA2-494F-A375-28ED102338D9}']
function GetActivePatients: TDTOActivePatientDynArray;
procedure CreatePatient(var thePatient: TSQLPatient);
end;
Extract of the generated client code:
TServicePatientAdministration = class(TServiceClientAbstract,IPatientAdministration)
public
constructor Create(aClient: TSQLRestClientURI); override;
function GetActivePatients(): TDTOActivePatientDynArray;
procedure CreatePatient(var thePatient: TSQLPatient);
end;
/// map "Patient" table
TSQLPatient = class(TSQLRecord)
protected
fFirstName: string;
fFamilyName: string;
fGender: TGender;
fIsActive: boolean;
published
property FirstName: string index 50 read fFirstName write fFirstName;
property FamilyName: string index 50 read fFamilyName write fFamilyName;
property Gender: TGender read fGender write fGender;
property IsActive: boolean read fIsActive write fIsActive;
end;
function TServicePatientAdministration.GetActivePatients(): TDTOActivePatientDynArray;
var res: TVariantDynArray;
begin
fClient.CallRemoteService(self,'GetActivePatients',1, // raise EServiceException on error
[],res);
Result := res[0];
end;
procedure TServicePatientAdministration.CreatePatient(var thePatient: TSQLPatient);
var res: TVariantDynArray;
begin
fClient.CallRemoteService(self,'CreatePatient',1, // raise EServiceException on error
[thePatient],res);
thePatient := res[0];
end;
To be able to compile the generated code we had to make some changes, f.i. define:
TDTOActivePatientDynArray = Variant;
TSQLPatient = class;
The first, TDTOActivePatientDynArray, a return parameter wasn't defined.
The second one, TSQLPatient was defined, but already used/called before it was declared in the unit. Could also have moved the TSQLPatient definition.
With these changes the 'GetActivePatients' function works. The 'CreatePatient' procedure still does not compile (generated code) as the types don't match.
Any ideas how to take it from here? Is there anyone that can point us to a sample in which SOA services are called from a FMX client (CrossPlatform) and that use f.i. a TSQLRecord instance as a parameter?
Thnx
Offline
Hello Wim,
See http://synopse.info/fossil/info/06c19af441 to ensure ORM classes are defined before SOA interfaces for cross-platform client templates.
I'm still adding support of dynamic arrays DTOs.
In fact dynamic arrays are supported within records, but not directly as dynamic arrays.
There is also in fact a problem with TSQLRecord parameters: they are not handled by the Mustache template yet: they should be converted to/from variants.
Stay tuned!
Offline
I've finished a huge refactoring of the mORMot wrapper generation code.
In practice, code was difficult to follow and let evolve.
So now all generation will take place in mORMotWrappers.pas so would be much easier to maintain.
I've also enhanced dynamic arrays and TSQLRecord support in generated code.
See http://synopse.info/fossil/timeline
Your feedback is welcome!
Offline
Thnx, first test looks very promising.
We'll keep you posted.
Last edited by Wim314 (2014-12-11 10:02:46)
Offline