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.
Online
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.![]()
Online
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.
Online
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.
Online
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