Synopse mORMot框架樣例學習03 - NamedPipe Client-Server
前邊的例01和例02分別展示了靜態服務器及嵌入式SQLite3服務器的實現方法,例03是命名管道客戶端-服務器,例01中用JSON文件存儲數據(按我的理解,每一個SQLRecord就是一個表格,在存儲的時候多個表格應該需要多個JSON文件取存儲),例02中使用SQLite3數據庫存儲,只需要一個.db3數據庫文件就能存放所有的SQLRecord(表格),例03中實現了客戶端-服務器的通訊,客戶端的數據需要傳遞到服務器去處理.
先看看服務器是怎么運行的,例03主單元Unit2.pas實現了命名管道服務器,在代碼中看比較方便,省略了部分代碼,只看主要的部分:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
// 下方是mORMot單元
SynCommons, mORMot, mORMotSQLite3, SynSQLite3Static, StdCtrls, SampleData;
type
TForm1 = class(TForm)
{ ...(省略) }
public
Model: TSQLModel; { 聲明SQL操作模型 }
Server: TSQLRestServerDB; { 服務器的聲明 }
end;
{ ...(省略) }
implementation
{$R *.dfm}
{ ...(省略) }
procedure TForm1.FormCreate(Sender: TObject);
begin
Model := CreateSampleModel; { 窗口創建的時候初始化數據庫操作模型 }
Server := TSQLRestServerDB.Create(Model, ChangeFileExt(ExeVersion.ProgramFileName, '.db3')); { 初始化一個Rest服務器,這里和樣例2是一樣的 }
Server.CreateMissingTables; { 根據模型Model創建必須的表格(也就是SampleData單元定義的類) }
Server.ExportServerNamedPipe('03'); { 創建命名管道,名字為03,客戶端初始化的時候必須和此名稱一致才能進行進程間通訊 }
end;
{ ...(省略) }
end.
然后是客戶端部分,這一次我想把SampleData單元進行簡單的改造下,添加一個用戶信息類,用于存儲用戶名和密碼,這樣我們在初始化數據庫的時候會有2個表格SampleRecord和UserInfo,還是看代碼的注釋進行說明:
unit SampleData;
interface
uses
SynCommons, mORMot;
type
TSQLSampleRecord = class(TSQLRecord)
{ ...省略 }
end;
{ 我們再添加一個類,用于記錄用戶名和密碼 }
TSQLUserInfo = class(TSQLRecord)
private
fUserName: RawUTF8;
fPassWord: RawUTF8;
fRemark: TSQLSampleRecord;
published
property UserName: RawUTF8 read fUserName write fUserName;
property PassWord: RawUTF8 read fPassWord write fPassWord;
property Remark: TSQLSampleRecord read fRemark write fRemark;
end;
function CreateSampleModel: TSQLModel;
implementation
function CreateSampleModel: TSQLModel;
begin
result := TSQLModel.Create([TSQLSampleRecord, TSQLUserInfo{ 創建模型的時候要加上我們新定義的類 }]);
end;
end.
客戶端同樣需要進行一些改造,我們需要輸入用戶名和密碼信息,然后一同添加到數據庫中,改造后是這個樣子的:
在這里,客戶端的工程單元必須創建客戶端命名管道,并且管道的名字要與服務端保持一致:
{ 創建與服務端一致的客戶端命名管道,以便與服務端通信 }
Form1.Database := TSQLRestClientURINamedPipe.Create(Form1.Model, '03');
主單元Unit1.pas實現代碼如下:
unit Unit1;
interface
uses
{$ifdef MSWINDOWS}
Windows, Messages, Graphics,
{$endif}
Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, SynCommons, SynTable,
mORMot, SampleData;
type
{ ...省略 }
implementation
{$ifdef FPC}
{$R *.lfm}
{$else}
{$R *.dfm}
{$endif}
procedure TForm1.FormCreate(Sender: TObject);
begin
Model := CreateSampleModel; { 調用后SampleRecord和UserInfo同時對數據庫中對應的2個表進行映射 }
end;
procedure TForm1.AddButtonClick(Sender: TObject);
var
Rec: TSQLSampleRecord;
UserRec: TSQLUserInfo; { 聲明用戶信息類 }
begin
Rec := TSQLSampleRecord.Create;
UserRec := TSQLUserInfo.Create; { 創建實例 }
try
Rec.Name := StringToUTF8(NameEdit.Text);
Rec.Question := StringToUTF8(QuestionMemo.Text);
Rec.Log := StringToUTF8('added ' + NameEdit.Text + ' ' + QuestionMemo.Text);
if Database.Add(Rec, true) = 0 then
ShowMessage('Error adding the data')
else
begin
MemoLog.Lines.Add('Name: ' + NameEdit.Text + ';' + 'Question: ' + QuestionMemo.Text + ';');
NameEdit.Text := '';
QuestionMemo.Text := '';
NameEdit.SetFocus;
end;
{ 把用戶名和密碼寫進數據庫 }
UserRec.UserName := StringToUTF8(UserNameEdit.Text);
UserRec.PassWord := StringToUTF8(PassWordEdit.Text);
if DataBase.Add(UserRec, true) = 0 then
ShowMessage('Error adding the data')
else
begin
UserNameEdit.Clear;
PassWordEdit.Clear;
end;
finally
Rec.Free;
UserRec.Free;
end;
end;
{ ...省略 }
end.
需要先啟動服務端,然后再啟動客戶端,同樣寫入3組記錄,然后用sqliteadmin看看數據庫的情況:
數據庫存儲情況如下:
可以看到,和預想的情況一樣,例02和例03不管是在嵌入式數據庫還是客戶端-服務器的設計,除了DataBase初始化的部分有少許不同,其他代碼可以原封不動,感覺很是方便.到這里基本上摸清了例01-例03樣例的目的,就是最基礎的ORM操作,和不同數據存儲的方式使用,對照文檔看一下,確實如文檔所說,作者并沒有夸大框架的功能,但是總感覺不太習慣作者的英語表達方式,不動手實踐,有的東西光看文檔的確能讓人感到迷糊,繼續努力學習.
智能推薦
前端學習——HTML的各種標簽(以及代碼樣例)
html標題head標簽:快捷鍵h+8(快捷鍵中的數字鍵是大鍵盤上的數字鍵,不是小鍵盤的) 1:打開網頁出現亂碼時,在head標簽中加<meta charset="utf-8" /> 快捷鍵m+6 htnl的body標簽 1:h1到h6,會將其中的數據加粗加黑顯示,并且顯示以此減弱,標題標簽自帶換行功能 2:標簽居中 <h1 align="...
機器學習(python+numpy+tensorflow)實戰樣例
步驟: 1. 生成人工數據集及可視化(matplotlib) 2. 構建線性模型 3. 定義損失函數 4. 定義優化器,最小化損失函數 5. 訓練結果的可視化 6. 利用學習到的模型進行預測...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
猜你喜歡
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...