You are not logged in.
Pages: 1
Hi,
I am not aware of another way of proposing changes, so please don't flame me. This is a minor thing anyway, so I'll put it here because it's easy to explain.
Reason: allow passing an extra parameter to the mORMotClient.GetClient function - the root of the server. This would allow the client exe to connect to any server
// Modified file: CrossPlatform\templates\CrossPlatform.pas.mustache
interface
function GetModel(aServerRoot: String): TSQLModel;
function GetClient(const aServerAddress{{#authClass}}, aUserName,aPassword{{/authClass}}: string;
aServerPort: integer=SERVER_PORT; aServerRoot: String = '{{root}}'): TSQLRestClientHTTP;
implementation
function GetModel(aServerRoot: String): TSQLModel;
begin
result := TSQLModel.Create([{{#orm}}{{className}}{{comma}}{{/orm}}],aServerRoot);
end;
function GetClient(const aServerAddress{{#authClass}}, aUserName,aPassword{{/authClass}}: string;
aServerPort: integer; aServerRoot: String): TSQLRestClientHTTP;
begin
result := TSQLRestClientHTTP.Create(aServerAddress,aServerPort,GetModel(aServerRoot),true); // aOwnModel=true
try
if (not result.Connect) or (result.ServerTimeStamp=0) then
raise ERestException.CreateFmt('Impossible to connect to %s:%d/%s server',
[aServerAddress,aServerPort,aServerRoot]);
{{#authClass}}
if not result.SetUser({{.}},aUserName,aPassword) then
raise ERestException.CreateFmt('%s:%d/%s server rejected "%s" credentials',
[aServerAddress,aServerPort,aServerRoot,aUserName]);
{{/authClass}}
except
result.Free;
raise;
end;
end;
Cheers,
Albert
Offline
Good idea.
Should be implemented - for both Delphi CrossPlatform and SmartMobileStudio - by http://synopse.info/fossil/info/8adc764592
Thanks for the feedback.
Offline
I'm happy to hear, thank you Arnaud.
Is this the correct way to propose this kind of minor changes?
I am sure there will be more to come ...
Offline
Either you can fork the project on http://github.com/synopse/mORMot
and notify any pending pull request by email, so that I would not miss it.
Or you can just email me the modified files as .zip, since you have my email address.
Offline
This minor change will affect SmartMobileStudio, it will generate the following syntax error:
const parameter cannot have a default value
// This works in SMS
procedure test;
const aRoot: string=SERVER_ROOT;
begin
end;
// This does not work
procedure test(const aRoot: string=SERVER_ROOT);
begin
end;
Offline
I guess http://synopse.info/fossil/info/ca1bad49bd would fix it.
Thanks for the feedback.
Offline
Thanks, this fix worked out for me.
It seems that there's an issue when you use the type source Wrapper: "TServiceCustomAnswer";
for instance:
function TServ.MyMethod1: TServiceCustomAnswer;
function TServ.MyMethod2: TServiceCustomAnswer;
SMS wrapper will generate an incomplete record type.
a) Syntax Error: Name expected [line: 30, column: 4, file: mORMotClient]
type // define some record types, used as properties below
= record
end;
= record
end;
b) Syntax Error: Unknown name "TServiceCustomAnswer" [line: 83, column: 36, file: mORMotClient]
procedure MyMethod1(
onSuccess: procedure(Result: TServiceCustomAnswer); onError: TSQLRestEvent);
function _MyMethod1(): TServiceCustomAnswer;
c) Syntax Error: Type expected [line: 115, column: 42, file: mORMotClient]
// publish some low-level helpers for variant conversion
// - used internally: you should not need those functions in your end-user code
function Variant2(const Value: variant): ;
function 2Variant(const Value: ): variant;
function Variant2(const Value: variant): ;
function 2Variant(const Value: ): variant;
{ Some helpers for record types:
due to potential obfuscation of generated JavaScript, we can't assume
that the JSON used for transmission would match record fields naming }
function Variant2(const Value: variant): ;
begin
end;
function 2Variant(const Value: ): variant;
begin
result := new JObject;
end;
function Variant2(const Value: variant): ;
begin
end;
function 2Variant(const Value: ): variant;
begin
result := new JObject;
end;
d) Syntax Error: Number, point or exponent expected (found "V") [line: 116, column: 11, file: mORMotClient]
function 2Variant(const Value: ): variant;
Offline
Could you try http://synopse.info/fossil/info/6f133748a8 ?
Now those methods would expect a THttpBody type as return value, containing the raw content from the server.
Thanks for the feedback.
Offline
The new SmartMobileStudio release 2.2.03985 will affect proj. 27 & 29:
27 - CrossPlatform Clients\SmartMobileStudio
Syntax Error: Incompatible types: "TSQLFieldBit" and "Integer" [line: 1270, column: 32, file: SynCrossPlatformREST]
Syntax Error: Incompatible types: Cannot assign "Integer" to "TSQLFieldBit" [line: 1525, column: 21, file: SynCrossPlatformREST]
Syntax Error: There is no accessible member with name "AsDateTime" [line: 778, column: 8, file: SynCrossPlatformSpecific]
const
/// the first field in TSQLFieldBits is always ID/RowID
ID_SQLFIELD: TSQLFieldBit = 0;
//ID_SQLFIELD: TSQLFieldBit = TSQLFieldBit(0);
29 - SmartMobileStudio Client
Compilation failed [Failed to build project: Internal error. Code-generator threw exception EVariantInvalidOpError with message Invalid variant operation] error
Tip: To open project at SmartMS2.2, firstly, open project 29 (with SMS old version 2.1), and "Make Project as Internal".
------
[INFO] Building project 'WebForm'...
[INFO] Compiling...
[ERROR] Compilation failed! Error(s): 2
Syntax Error: Argument 0 expects type "TTextAlign" instead of "Integer" [line: 5, column: 10, file: LoginForm:impl]
Syntax Error: There is no accessible member with name "AsDateTime" [line: 37, column: 7, file: SmartTests]
[INFO] Generating JavaScript successful []
------
JDateHelper was removed from unit W3C.Date:
JDateHelper = helper for JDate
private
function GetAsDateTime : TDateTime;
function GetAsLocalDateTime : TDateTime;
procedure SetAsDateTime(dt : TDateTime);
procedure SetAsLocalDateTime(dt : TDateTime);
public
property AsDateTime : TDateTime read GetAsDateTime write SetAsDateTime;
property AsLocalDateTime : TDateTime read GetAsLocalDateTime write SetAsLocalDateTime;
end;
implementation
function JDateHelper.GetAsDateTime : TDateTime;
begin
Result := Self.getTime / 864e5 + 25569;
end;
procedure JDateHelper.SetAsDateTime(dt : TDateTime);
begin
Self.setTime((dt - 25569) * 864e5);
end;
function JDateHelper.GetAsLocalDateTime: TDateTime;
begin
Result := (Self.getTime - 60000 * Self.getTimezoneOffset) / 864e5 + 25569;
end;
procedure JDateHelper.SetAsLocalDateTime(dt: TDateTime);
begin
Self.setTime((dt - 25569) * 864e5 + 60000 * Self.getTimezoneOffset);
end;
Offline
Would you mind commiting a minor change at the "SynCrossPlatformSpecific" and "SynCrossPlatformREST" units.
SmartMS has released a final stable version 2.2.0.4508 and they added an extra "utc" parameter of DateTimeZone type on many DateTime functions, for instance, the function Iso8601ToDateTime requires a implicit parameter to work as expected. I've downloaded the crossplatform units today and made some minor changes, it seems to be working as expected for me.
SynCrossPlatformSpecific.pas
----------------------------
LINE 350
// function TryEncodeDate(Y,M,D: integer; var Value: TDateTime): boolean;
function TryEncodeDate(Y,M,D: integer; UTC: DateTimeZone; var Value: TDateTime): boolean;
LINE 897
function TryEncodeDate(Y,M,D: integer; UTC: DateTimeZone; var Value: TDateTime): boolean;
LINE 900
Value := EncodeDate(Y,M,D,UTC);
LINE 949
function DateTimeToIso8601(Value: TDateTime): string;
begin // e.g. YYYY-MM-DD Thh:mm:ss or YYYY-MM-DDThh:mm:ss
if Value<=0 then
result := '' else
if frac(Value)=0 then
result := FormatDateTime('yyyy-mm-dd',Value,DateTimeZone.UTC) else
if trunc(Value)=0 then
result := FormatDateTime('Thh:nn:ss',Value,DateTimeZone.UTC) else
result := FormatDateTime('yyyy-mm-ddThh:nn:ss',Value,DateTimeZone.UTC);
end;
LINE 977
// TryEncodeDate(Y,M,D,result);
TryEncodeDate(Y,M,D,DateTimeZone.UTC,result);
LINE 990
//result := EncodeDate(Y,M,D)+EncodeTime(HH,MI,SS,0);
result := EncodeDate(Y,M,D,DateTimeZone.UTC)+EncodeTime(HH,MI,SS,0);
SynCrossPlatformREST.pas
------------------------
LINE 1361
// if (Y=0) or not TryEncodeDate(Y,1+(Value shr (6+6+5+5)) and 15,
1+(Value shr (6+6+5)) and 31,result) then
if (Y=0) or not TryEncodeDate(Y,1+(Value shr (6+6+5+5)) and 15,
1+(Value shr (6+6+5)) and 31,DateTimeZone.UTC,result) then
Offline
Pages: 1