#1 mORMot 1 » Very Strange problem in BatchSend » 2014-12-06 20:17:20

Almadrav
Replies: 1

Hello AB,

I have a very strange problem, when I try to use batchSend and send 7 records, BatchSend resturns error 400, If I try to send 6 or 8 records then Works Ok!!!
I Have the particulary that the SQLRecord has 82 Fields, so I have to change the MAX_SQLFIELDS to 128.

The Problem is in Delphi 7 and also in Delphi XE7U1

This is the sample code to reproduce the problem

// SQL Model

  TPerson = class(TSQLRecord)
  private
    fField39: RawUTF8;
    fField81: RawUTF8;
    fField80: RawUTF8;
    fField38: RawUTF8;
    fField29: RawUTF8;
    fField18: RawUTF8;
    fField78: RawUTF8;
    fField19: RawUTF8;
    fField68: RawUTF8;
    fField7: RawUTF8;
    fField4: RawUTF8;
    fField55: RawUTF8;
    fField45: RawUTF8;
    fField6: RawUTF8;
    fField5: RawUTF8;
    fField28: RawUTF8;
    fField82: RawUTF8;
    fField21: RawUTF8;
    fField12: RawUTF8;
    fField30: RawUTF8;
    fField33: RawUTF8;
    fField20: RawUTF8;
    fField8: RawUTF8;
    fField13: RawUTF8;
    fField9: RawUTF8;
    fField26: RawUTF8;
    fField62: RawUTF8;
    fField31: RawUTF8;
    fField48: RawUTF8;
    fField22: RawUTF8;
    fField79: RawUTF8;
    fField69: RawUTF8;
    fField23: RawUTF8;
    fField59: RawUTF8;
    fField32: RawUTF8;
    fField58: RawUTF8;
    fField49: RawUTF8;
    fField54: RawUTF8;
    fField43: RawUTF8;
    fField34: RawUTF8;
    fField52: RawUTF8;
    fField70: RawUTF8;
    fField61: RawUTF8;
    fField25: RawUTF8;
    fField53: RawUTF8;
    fField40: RawUTF8;
    fField66: RawUTF8;
    fField16: RawUTF8;
    fField71: RawUTF8;
    fField27: RawUTF8;
    fField10: RawUTF8;
    fField36: RawUTF8;
    fField72: RawUTF8;
    fField63: RawUTF8;
    fField73: RawUTF8;
    fField24: RawUTF8;
    fField11: RawUTF8;
    fField37: RawUTF8;
    fField60: RawUTF8;
    fField42: RawUTF8;
    fField74: RawUTF8;
    fField65: RawUTF8;
    fField3: RawUTF8;
    fField46: RawUTF8;
    fField15: RawUTF8;
    fField56: RawUTF8;
    fField44: RawUTF8;
    fField1: RawUTF8;
    fField57: RawUTF8;
    fField47: RawUTF8;
    fField75: RawUTF8;
    fField67: RawUTF8;
    fField50: RawUTF8;
    fField76: RawUTF8;
    fField35: RawUTF8;
    fField17: RawUTF8;
    fField41: RawUTF8;
    fField64: RawUTF8;
    fField51: RawUTF8;
    fField77: RawUTF8;
    fField14: RawUTF8;
    fField2: RawUTF8;
  published
    property Field1: RawUTF8 read fField1 write fField1;
    property Field2: RawUTF8 read fField2 write fField1;
    property Field3: RawUTF8 read fField3 write fField1;
    property Field4: RawUTF8 read fField4 write fField1;
    property Field5: RawUTF8 read fField5 write fField1;
    property Field6: RawUTF8 read fField6 write fField1;
    property Field7: RawUTF8 read fField7 write fField1;
    property Field8: RawUTF8 read fField8 write fField1;
    property Field9: RawUTF8 read fField9 write fField1;

    property Field10: RawUTF8 read fField10 write fField10;
    property Field11: RawUTF8 read fField11 write fField11;
    property Field12: RawUTF8 read fField12 write fField12;
    property Field13: RawUTF8 read fField13 write fField13;
    property Field14: RawUTF8 read fField14 write fField14;
    property Field15: RawUTF8 read fField15 write fField15;
    property Field16: RawUTF8 read fField16 write fField16;
    property Field17: RawUTF8 read fField17 write fField17;
    property Field18: RawUTF8 read fField18 write fField18;
    property Field19: RawUTF8 read fField19 write fField19;

    property Field20: RawUTF8 read fField20 write fField20;
    property Field21: RawUTF8 read fField21 write fField21;
    property Field22: RawUTF8 read fField22 write fField22;
    property Field23: RawUTF8 read fField23 write fField23;
    property Field24: RawUTF8 read fField24 write fField24;
    property Field25: RawUTF8 read fField25 write fField25;
    property Field26: RawUTF8 read fField26 write fField26;
    property Field27: RawUTF8 read fField27 write fField27;
    property Field28: RawUTF8 read fField28 write fField28;
    property Field29: RawUTF8 read fField29 write fField29;

    property Field30: RawUTF8 read fField30 write fField30;
    property Field31: RawUTF8 read fField31 write fField31;
    property Field32: RawUTF8 read fField32 write fField32;
    property Field33: RawUTF8 read fField33 write fField33;
    property Field34: RawUTF8 read fField34 write fField34;
    property Field35: RawUTF8 read fField35 write fField35;
    property Field36: RawUTF8 read fField36 write fField36;
    property Field37: RawUTF8 read fField37 write fField37;
    property Field38: RawUTF8 read fField38 write fField38;
    property Field39: RawUTF8 read fField39 write fField39;

    property Field40: RawUTF8 read fField40 write fField40;
    property Field41: RawUTF8 read fField41 write fField41;
    property Field42: RawUTF8 read fField42 write fField42;
    property Field43: RawUTF8 read fField43 write fField43;
    property Field44: RawUTF8 read fField44 write fField44;
    property Field45: RawUTF8 read fField45 write fField45;
    property Field46: RawUTF8 read fField46 write fField46;
    property Field47: RawUTF8 read fField47 write fField47;
    property Field48: RawUTF8 read fField48 write fField48;
    property Field49: RawUTF8 read fField49 write fField49;

    property Field50: RawUTF8 read fField50 write fField50;
    property Field51: RawUTF8 read fField51 write fField51;
    property Field52: RawUTF8 read fField52 write fField52;
    property Field53: RawUTF8 read fField53 write fField53;
    property Field54: RawUTF8 read fField54 write fField54;
    property Field55: RawUTF8 read fField55 write fField55;
    property Field56: RawUTF8 read fField56 write fField56;
    property Field57: RawUTF8 read fField57 write fField57;
    property Field58: RawUTF8 read fField58 write fField58;
    property Field59: RawUTF8 read fField59 write fField59;

    property Field60: RawUTF8 read fField60 write fField60;
    property Field61: RawUTF8 read fField61 write fField61;
    property Field62: RawUTF8 read fField62 write fField62;
    property Field63: RawUTF8 read fField63 write fField63;
    property Field64: RawUTF8 read fField64 write fField64;
    property Field65: RawUTF8 read fField65 write fField65;
    property Field66: RawUTF8 read fField66 write fField66;
    property Field67: RawUTF8 read fField67 write fField67;
    property Field68: RawUTF8 read fField68 write fField68;
    property Field69: RawUTF8 read fField69 write fField69;

    property Field70: RawUTF8 read fField70 write fField70;
    property Field71: RawUTF8 read fField71 write fField71;
    property Field72: RawUTF8 read fField72 write fField72;
    property Field73: RawUTF8 read fField73 write fField73;
    property Field74: RawUTF8 read fField74 write fField74;
    property Field75: RawUTF8 read fField75 write fField75;
    property Field76: RawUTF8 read fField76 write fField76;
    property Field77: RawUTF8 read fField77 write fField77;
    property Field78: RawUTF8 read fField78 write fField78;
    property Field79: RawUTF8 read fField79 write fField79;

    property Field80: RawUTF8 read fField80 write fField80;
    property Field81: RawUTF8 read fField81 write fField81;
    property Field82: RawUTF8 read fField82 write fField82;
  end;
// Server

program RESTserver;

{$APPTYPE CONSOLE}

uses
  SynCommons,
  mORMot,
  mORMotSQLite3,
  SynSQLite3Static,
  mORMotHttpServer,
  SysUtils,
  RESTModel;
var
  aModel: TSQLModel;
  aRestServer: TSQLRestServerDB;
  aHttpServer: TSQLHttpServer;
begin
  aModel := DataModel;
  try
    aRestServer := TSQLRestServerDB.Create(aModel, ChangeFileExt(paramstr(0),'.db3') ,false); 
    try
      aRestServer.CreateMissingTables;
      aHttpServer := TSQLHttpServer.Create('888', aRestServer);
      try
        writeln('Background server is running.'#10);
        write('Press [Enter] to close the server.');
        readln;
      finally
        aHttpServer.Free;
      end;
    finally
      aRestServer.Free;
    end;
  finally
    aModel.Free;
  end;
end.
// Client

program RESTclient;

{$APPTYPE CONSOLE}

uses
    SynCommons,          // framework core
    mORMot,              // RESTful server & ORM
    mORMotHttpClient,    // HTTP client to a mORMot RESTful server
    RESTModel;           // data model unit, shared between server and client

var aModel: TSQLModel;
    aClient: TSQLHttpClient;
    aPerson: TPerson;
    R: TIDDynArray;
    I: Integer;
    RV: Integer;
begin
  aModel := DataModel;
  try
    aClient := TSQLHttpClientWinHTTP.Create('localhost', '888', aModel);
    try
      aPerson := TPerson.Create;
      try
        aClient.BatchStart(TPerson);
        try
          for I  := 1 to 7 do
            aClient.BatchAdd(aPerson, True);
        finally
          RV := aClient.BatchSend(R);
          if RV <> HTML_SUCCESS then
            write(#10'Error in BatchAdd: ', RV)
          else
            write(#10'HTML_SUCCESS in BatchAdd')
        end
      finally
        aPerson.Free;
      end;
    finally
      aClient.Free;
    end;
    write(#10'Press [Enter] to quit');
    readln;
  finally
    aModel.Free;
  end;
end.

#2 Re: mORMot 1 » Adding in Batch Mode in Crossplattform Mobile Client » 2014-09-10 15:25:45

Hello ab,

I'm so sorry but when I Inspected the "Ctxt.Call.InBody" in server procedure TSQLRestServer.Batch I had used the Delphi "Evaluate/Modify" window (The Server is in Delphi 7)
and the trash after Position 4098 is a problem of that window.  Because If Evaluate the expressions:

Length(Ctxt.Call.InBody)
the Result is 8555 (is ok)

and

Copy(Ctxt.Call.InBody, Length(Ctxt.Call.InBody) - 100, 8000) 
the Result is ok:
 'ipmentDate":"","UnitWeight":0,"UnitVolume":0,"Batch":"","BatchExpireDate":"","FromLocationCode":""}]}'

but if I evaluate the expression
Ctxt.Call.InBody 
the result after position 4098 is trash

Sorry about that!

But the problem of adding a lot of records in batch mode persist. In server I have this error:

ESQLite3Exception ("Error SQLITE_ERROR (1) - \"near \",\": syntax error\"") at 00476ED2  stack trace API 0043C18C 004047F0
20140910 17044501 EXC           EORMException ("TSQLRestServerDB.InternalBatchStop: BatchMethod=0") at 0047A1B7  stack trace API 0043C18C 004047F0

Let me more time to find where the problem is.

Thank you for your time.

#3 mORMot 1 » Adding in Batch Mode in Crossplattform Mobile Client » 2014-09-10 12:13:48

Almadrav
Replies: 3

Hi,

I am adding records in batch mode from a FireMonkey client (Windows and Android) but when I send many records the server receives the data incorrectly.

when I Inspect "Ctxt.Call.InBody" in server procedure TSQLRestServer.Batch

procedure TSQLRestServer.Batch(Ctxt: TSQLRestServerURIContext);
var Results: TIntegerDynArray;
    i: integer;
begin 
  if not (Ctxt.Method in [mPUT,mPOST]) then begin
    Ctxt.Error('PUT/POST only');
    exit;
  end;
  try
    EngineBatchSend(Ctxt.Table,Ctxt.Call.InBody,Results);
...

the content from 4098 character is junk.
For example:

Ctxt.Call.InBody:
     ..,"PromotionCode":"","ReturnReason"'#0#0#0#0'K'#0#0#4#1#0#0#0'¯c*E^ñ˜'#0#0...
                                         ^Position 4098

If I send a set of records that do not exceed this size (4098) then the server receives the data correctly.

Any clue what could be doing wrong?

Thank you.

Board footer

Powered by FluxBB