Recent

Author Topic: mORMot again (HttpServer/sqlite3/REST/SOA -- without ORM)  (Read 1036 times)

BSaidus

  • Hero Member
  • *****
  • Posts: 662
  • lazarus 1.8.4 Win8.1 / cross FreeBSD
mORMot again (HttpServer/sqlite3/REST/SOA -- without ORM)
« on: March 15, 2026, 07:53:24 pm »
Hello people.
I do not know what wrong but I think I'm ...
I have a problem understading mORMot
All I want is to write a client/server(Http(s) application without ORM and using SQLite3 db with SOA approach using mORMot1 (not 2).

(In the samples given with mORMot, there is no a SIMPLE exemple explaining this 'JUST simple')
So here is a  code

Code: Pascal  [Select][+][-]
  1. unit serviceintf;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   SynCommons,
  9.   mORMot,
  10.   SynSQLite3
  11. ;
  12.  
  13. type
  14.  
  15.   { IMatPrem }
  16.  
  17.   IMatPrem = interface(IInvokable)
  18.     ['{9A60C8ED-CEB2-4E09-87D4-4A16F496E5FE}']
  19.     function MatPrems_get(): RawUTF8;
  20.     function MatPrems_add(const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  21.     function MatPrems_del(const Aid: Integer): Boolean;
  22.     function MatPrems_upd(const Aid: Integer; const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  23.   end;
  24.  
  25.    { TMatPrem }
  26.  
  27.   TMatPrem = class(TInterfacedObject, IMatPrem)
  28.   private
  29.     fdb: TSQLDataBase;
  30.   public
  31.     constructor Create(Adb: TSQLDataBase);
  32.  
  33.     function MatPrems_get(): RawUTF8;
  34.     function MatPrems_add(const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  35.     function MatPrems_del(const Aid: Integer): Boolean;
  36.     function MatPrems_upd(const Aid: Integer; const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  37.   end;
  38.  
  39. implementation
  40.  
  41. { TMatPrem }
  42.  
  43. constructor TMatPrem.Create(Adb: TSQLDataBase);
  44. begin
  45.   inherited Create;
  46.   Self.fdb := Adb;
  47. end;
  48.  
  49. function TMatPrem.MatPrems_get(): RawUTF8;
  50. var
  51.   Lreq: TSQLRequest;
  52. begin
  53.   Result := Self.fdb.ExecuteJSON('select * from MTRPR');
  54. end;
  55.  
  56. function TMatPrem.MatPrems_add(const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  57. begin
  58.   Result := True;
  59. end;
  60.  
  61. function TMatPrem.MatPrems_del(const Aid: Integer): Boolean;
  62. begin
  63.   Result := True;
  64. end;
  65.  
  66. function TMatPrem.MatPrems_upd(const Aid: Integer; const Adesig: RawUTF8; const AuMes: Integer): Boolean;
  67. begin
  68.   Result := True;
  69. end;
  70.  
  71. initialization
  72.   TInterfaceFactory.RegisterInterfaces([TypeInfo(IMatPrem)]);
  73.  
  74. end.
  75.  
  76.  


// Client & Server

Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, DB, BufDataset, Forms, Controls, Graphics, Dialogs,
  9.   ComCtrls, StdCtrls, DBGrids, DBCtrls,
  10.  
  11.   SynCommons,
  12.   SynDB,
  13.   mORMot,
  14.   mORMotDB,
  15.   mORMotSQLite3,
  16.   mORMotHttpServer,
  17.   SynDBSQLite3, SynSQLite3Static,
  18.   serviceintf,
  19.  
  20.   mORMotHttpClient,
  21.   mORMotUI
  22.   ;
  23.  
  24. type
  25.  
  26.   { TForm1 }
  27.  
  28.   TForm1 = class(TForm)
  29.     BtnStart_server: TButton;
  30.     BtnStop_server: TButton;
  31.     BufDataset1: TBufDataset;
  32.     BtnGetList: TButton;
  33.     DataSource1: TDataSource;
  34.     DBGrid1: TDBGrid;
  35.     DBNavigator1: TDBNavigator;
  36.     Memo1: TMemo;
  37.     Memo2: TMemo;
  38.     PageControl1: TPageControl;
  39.     TabSheet1: TTabSheet;
  40.     TabSheet2: TTabSheet;
  41.     procedure BtnGetListClick(Sender: TObject);
  42.     procedure BtnStart_serverClick(Sender: TObject);
  43.     procedure FormDestroy(Sender: TObject);
  44.   private
  45.  
  46.   public
  47.     fModel: TSQLModel;
  48.     fServer: TSQLRestServer;
  49.     fHTTPServer: TSQLHttpServer;
  50.   public
  51.     fModelCli: TSQLModel;
  52.     fClient: TSQLHttpClient;
  53.     fService: IMatPrem;
  54.  
  55.  
  56.  
  57.   end;
  58.  
  59. var
  60.   Form1: TForm1;
  61.  
  62. implementation
  63.  
  64.  
  65.  
  66. {$R *.lfm}
  67.  
  68. { TForm1 }
  69.  
  70. procedure TForm1.BtnStart_serverClick(Sender: TObject);
  71. begin
  72.   // create a Data Model
  73.   Self.fModel := TSQLModel.Create([],'root');
  74.   // initialize a TObjectList-based database engine
  75.   Self.fServer := TSQLRestServerFullMemory.Create(Self.fModel,'txnprod.db3',false,true);
  76.  
  77.   // register our IRemoteSQL service on the server side
  78.   Self.fServer.ServiceRegister(TMatPrem,[TypeInfo(IMatPrem)],sicClientDriven).
  79.   // fProps should better be executed/released in the one main thread
  80.   SetOptions([],[optExecInMainThread,optFreeInMainThread]);
  81.   // launch the HTTP server
  82.   Self.fHTTPServer := TSQLHttpServer.Create('8888',[Self.fServer],'+',useHttpApiRegisteringURI);
  83.   Self.fHTTPServer.AccessControlAllowOrigin := '*'; // for AJAX requests to work
  84.  
  85. end;
  86.  
  87. procedure TForm1.FormDestroy(Sender: TObject);
  88. begin
  89.   Self.fModel.Free;
  90.   self.fClient.Free;
  91.   Self.fModelCli.Free;
  92.   Self.fServer.Free;
  93.   Self.fHTTPServer.Free;
  94. end;
  95.  
  96. procedure TForm1.BtnGetListClick(Sender: TObject);
  97. begin
  98.  
  99.   fModelCli := TSQLModel.Create([],'root');
  100.   fClient := TSQLHttpClient.Create('localhost','8888',fModelCli);
  101.  
  102.   if fClient.ServiceRegisterClientDriven(TypeInfo(IMatPrem),fService) then
  103.   begin
  104.     Self.Memo2.Append(Self.fService.MatPrems_get());
  105.   end
  106.   else
  107.   begin
  108.     Memo2.Append('Error');
  109.   end;
  110.  
  111.  
  112. end;
  113.  
  114.  
  115.  
  116. end.
  117.  
  118.  

So, Any help ?
Can someone help with a working exemple ?
Thank you.
lazarus 1.8.4 Win8.1 / cross FreeBSD
dhukmucmur vernadh!

DonAlfredo

  • Hero Member
  • *****
  • Posts: 1875
Re: mORMot again (HttpServer/sqlite3/REST/SOA -- without ORM)
« Reply #1 on: March 16, 2026, 08:47:54 am »
As you use authentication, you need to add:
Code: Pascal  [Select][+][-]
  1. fClient.SetUser('User','synopse');

And remove:
Code: Pascal  [Select][+][-]
  1. SetOptions([],[optExecInMainThread,optFreeInMainThread]);

ttomas

  • Sr. Member
  • ****
  • Posts: 250
Re: mORMot again (HttpServer/sqlite3/REST/SOA -- without ORM)
« Reply #2 on: March 16, 2026, 12:45:49 pm »
I see another problem in your code!
Code: [Select]
Self.fServer.ServiceRegister(TMatPrem,[TypeInfo(IMatPrem)],sicClientDriven)....and constructor of your interface
Code: [Select]
constructor TMatPrem.Create(Adb: TSQLDataBase);You never create object with this constructor and parameter Adb!
You need to create instance of this interface and register instance. See Sample 37-FishShop
Code: [Select]
procedure TFishShopDaemon.Start;
var
  instance: TFishShopService;
begin
  fFishData := TFishDataLegacyDB.Create;
  fServer := TSQLRestServerFullMemory.CreateWithOwnModel([], False, FISHSHOP_ROOT);
  instance := TFishShopService.Create;
  instance.fFishData := fFishData;
  fServer.ServiceDefine(instance, [IFishShop], FISHSHOP_CONTRACT);
  fHttpServer := TSQLHttpServer.Create(FISHSHOP_PORT, fServer);
end;
or override Create without params and in constructor code find and assign fdb from Server.

BSaidus

  • Hero Member
  • *****
  • Posts: 662
  • lazarus 1.8.4 Win8.1 / cross FreeBSD
Re: mORMot again (HttpServer/sqlite3/REST/SOA -- without ORM)
« Reply #3 on: March 25, 2026, 08:12:55 pm »
@DonAlfredo, @ttomas.
Thank you for your enlightements.

Stay progressing.... .
lazarus 1.8.4 Win8.1 / cross FreeBSD
dhukmucmur vernadh!

 

TinyPortal © 2005-2018