You are not logged in.
Pages: 1
With MongoDB as a backend, TSQLRestClient.UpdateField() generate bad request and always replace whole document:
{collection:"MyDB.MyColl",opCode:"opUpdate",requestID:41,selector:{_id:1},update:{MyField:1}}
Correct request should use $set keyword:
{collection:"MyDB.MyColl",opCode:"opUpdate",requestID:41,selector:{_id:1},update:{$set:{MyField:true}}}
Please, fix it.
Offline
Shoud be fixed by http://synopse.info/fossil/info/61703a9a3c
Thanks for the report.
Offline
New bug: if we try update text field with "\" symbol it's erase this symbol:
VStr := StringToUTF8('Test string\with slash\with 2 slashes');
VRes := VClientDB.UpdateField(TTestDoc, VDoc.ID, 'Field1', [VStr]);
TSQLRestServerDB(023D6D40).URI(PUT root/TestDoc?setname=Field1&set=%22Test+string%5Cwith+slash%5Cwith+2+slashes%22&wherename=RowID&where=1 inlen=0)
{collection:"test.TestDoc",opCode:"opUpdate",requestID:7,selector:{_id:1},update:{$set:{Field1:"Test stringwith slashwith 2 slashes"}}}
Test code:
uses
mORMot,
mORMotSQLite3,
mORMotMongoDB,
SynMongoDB,
SynSQLite3Static,
SynCommons;
type
TTestDoc = class(TSQLRecord)
private
FField1: RawUTF8;
FField2: Int64;
published
property Field1: RawUTF8 read FField1 write FField1;
property Field2: Int64 read FField2 write FField2;
end;
procedure TestUpdateField;
var
VRes: Boolean;
VStr: RawUTF8;
VDoc: TTestDoc;
VModel: TSQLModel;
VClient: TMongoClient;
VDatabase: TMongoDatabase;
VClientDB: TSQLRestClientDB;
begin
VClient := TMongoClient.Create('127.0.0.1', 27017);
try
VDatabase := VClient.Open('test');
VModel := TSQLModel.Create([TTestDoc]);
try
VClientDB := TSQLRestClientDB.Create(VModel, nil, ':memory:', TSQLRestServerDB);
try
if not StaticMongoDBRegisterAll(VClientDB.Server, VDatabase) then begin
Exit;
end;
VClientDB.Server.CreateMissingTables;
VDoc := TTestDoc.Create;
try
VStr := StringToUTF8('Test string\with slash');
VDoc.FField1 := VStr;
VDoc.FField2 := 123456;
if not (VClientDB.Add(VDoc, True) > 0) then begin
Assert(False);
Exit;
end;
VStr := StringToUTF8('Test string\with slash\with 2 slashes');
VRes := VClientDB.UpdateField(TTestDoc, VDoc.ID, 'Field1', [VStr]);
Assert(VRes);
VRes := VClientDB.Retrieve(VDoc.ID, VDoc);
Assert(VRes);
Assert(VDoc.FField1 = VStr);
Assert(VDoc.FField2 = 123456);
finally
VDoc.Free;
end;
finally
VClientDB.Free;
end;
finally
VModel.Free;
end;
finally
VClient.Free;
end;
end;
In same time, method TSQLRestClient.Update() is save correct text with all slashes.
Last edited by zed (2015-08-03 18:55:24)
Offline
Why I should use different strings in Update() and UpdateField() methods? I think that behaviour in this methods must be the same.
Besides that, with SQLite3 or DBMS, UpdateField() works fine, error only with MongoDB, and if I wish use the same code with SQLite3 and MongoDB, I should use \\ or \ depends on the DB backend? I think that it's bad idea.
In any case, I decided not to use UpdateField() method in my code anymore.
Offline
Pages: 1