1. 程式人生 > >PostgreSQL程式版本號的作用

PostgreSQL程式版本號的作用

​很多人檢視過程式的版本號:

quanzl-mac:bin quanzl$ ./postgres -V
postgres (PostgreSQL) 11beta2
quanzl-mac:bin quanzl$ ./initdb -V
initdb (PostgreSQL) 11beta2
quanzl-mac:bin quanzl$

似乎這些也就是給我們看看,沒有其他用處,其實並非如此。

 

1、把initdb 放到其他版本bin目錄下試試看(別忘記備份,嘗試完之後別忘記恢復原狀):

quanzl-mac:bin quanzl$ ./initdb -D ../data
The program "postgres" was found by "/Users/quanzl/build/flyingdb-v10bin/bin/initdb"
but was not the same version as initdb.
Check your installation.
quanzl-mac:bin quanzl$

很清楚的錯誤提示,initdb和postgres版本不一致。

 

2、如何根據錯誤提示定位程式碼位置

遇到錯誤資訊時,如果對程式碼不夠熟悉,怎麼知道哪段程式碼在報錯呢?就像上邊的例子,可以在程式碼中搜索“but was not the same version”,或者 “The program \"postgres\" was found by”,可以很快定位。如果不明白後者為什麼這麼搜,需要補一下C語言基礎,這種格式的字串如果搜不到那麼應該試試搜尋 “The program \"%s\" was found by”。

搜後者可以看到還有其他幾個程式在做同樣的檢查:pg_ctl、pg_dumpall、pg_rewind。


3、initdb

來看initdb的報錯部分

if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
   backend_exec)) < 0)
{

當返回值小於0時進入錯誤處理。

find_other_exec 的幾個引數:變數 argv0 的值是 "initdb"、常量 "postgres"、常量 PG_BACKEND_VERSIONSTR定義是:

#define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"

而最後一個引數 backend_exec 將在 find_other_exec 函式內賦值。

 

4、函式 find_other_exec

int
find_other_exec(const char *argv0, const char *target,
const char *versionstr, char *retpath)

在上邊的例子裡,它接收到的前三個字串引數分別是:"initdb"、"postgres"、"postgres (PostgreSQL)  11beta2\n"

首先找initdb所在目錄,確認 target 也就是 postgres 是否存在,許可權夠不夠,一切正常就執行 postgres[.exe] -V

snprintf(cmd, sizeof(cmd), "\"%s\" -V", retpath);

if (!pipe_read_line(cmd, line, sizeof(line)))
return -1;

比較其輸出是不是與 "postgres (PostgreSQL)  11beta2\n" 相同:

if (strcmp(line, versionstr) != 0)
return -2;

 

5、其他程式

像 pg_ctl,過程類似,有興趣自己讀一讀。

如果想學習怎樣改PG程式碼,不妨動手試一下,只看別人怎麼改是很難有提高的。

 

歡迎關注我的公眾號,同步釋出

相關推薦

PostgreSQL程式版本作用

​很多人檢視過程式的版本號: quanzl-mac:bin quanzl$ ./postgres -V postgres (P

Delphi中取得程式版本

Delphi做的程式,如果想包含版本資訊, 必須在Delphi的整合編輯環境的選單“Project/Options/Version Info”裡面新增版本資訊。即在Version Info 選項卡中選中“Include version information in project”項,並在“Module ve

c#獲取程式版本

Content.Text = "程式集版本:" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() +"\n";Content.Text +

maven:讀取程式版本的三種方案

方案1 在應用專案中,如果應用程式需要獲取當前程式的版本號,可以讀取”/META-INF/maven/${groupId}/${artifactId}/pom.properties“,獲取maven生成的版本資訊。 當然前提用應用程式在執行時得知道自己的gr

NSIS 檢測程式版本、登錄檔的寫入與讀取例項 (學習二)

 !define PRODUCT_NAME "pkpm" !define PRODUCT_VERSION "1.0" !define PRODUCT_PUBLISHER "My company, Inc." !define PRODUCT_UNINST_KEY "Sof

Qt程式版本之rc檔案

釋出出去的win32 應用程式,可以設定版本號,滑鼠右鍵exe檔案,屬性中檢視,像這樣: 那麼問題來了,怎麼做到的? 因為只有win32平臺才有這個東西,所以qt沒有提供相關的介面。只有用其他辦

vc設定程式版本, 獲取程式版本

最近正在學vc,很多不會的,真是寸步難行,好在這個世界有網路這個好東西,遇到問題百度一下或是GOOGLE總能找到看來很有道理的答案,為了方便以後自己的學習,就總結了一下放在這裡,也歡迎大家發表真知灼見。 //很好,很方便,無需修改,可作為程式模組直接呼叫。 //獲取軟體當前的版本 //該版本號是在資原始檔

.Net程式版本的含義和版本控制機制

.net程式版本號的格式是4端十進位制數字 比如 2.5.729.2 他們依次是 Major Number:主版本號 Minor Number:副版本號 這兩個號碼是對外的版本號,也就是說上面這個程式是2.5版的 Building Number:編譯版本號 比如如果一天編譯

C#--應用程式版本釋出配置

程式的版本號設定 主程式引入名稱空間 App.config配置檔案新增配置程式碼 “` 主程式初始化 新增— this.lblVer

在Makefile動態生成程式版本的方法

一,動態生成svn版本號的方法: GET_SVN_VERSION_CMD = LANG=C;LC_ALL=C;export LC_ALL;svn info | grep "Last Changed Rev: " | sed -e "s/Last Changed Rev:

linux 程式、動態庫、靜態庫內部新增版本和編譯時間

給程式和庫新增版本號和庫,有利於維護和升級。 當然你可以在檔名上體現,比如有個程式叫 yun,檔名寫為 yun_1.0.2,但這個需要每次手動維護,而且不能100%確保當前程式就是那個版本。所以,把版本號體現在程式內部,是一個不錯的選擇。 --------------------------

Android獲取APP的應用程式名稱、包名、圖示,版本基本資訊

在開發過程中  我們經常需要獲取程式名稱, 包名 版本號等相關資訊,只需要用到下面這個工具類,即可: /跟App相關的輔助類 public class AppUtils { /** * 獲取應用程式名稱 */ public stati

Qt軟體開發文件16---軟體更新:寫入程式版本資訊並讀取程式版本

實現軟體更新,需要寫入本地軟體的版本號,並讀取出來,與伺服器版本號相比較,決定是否進行軟體的更新。 1.寫入版本資訊: 寫入一個rc檔案,並將其匯入到Qt工程中。  在Qt工程中,利用RC_FILE+=version.rc 匯入工程  QT+VS編譯時,利用cmake匯入

將 svn 版本修訂寫入程式版本資訊

tsvn 帶有一個命令列程式 subwcrev.exe. 可以對一個指定檔案進行一些巨集替換, 比如: 將 $WCREV$ 替換成當前版本號. 這個是最有用的. 詳細幫助見   http://tortoisesvn.net/docs/nightly/TortoiseSVN_z

Ranorex獲取被測程式(.exe)的版本並輸出到報告

       Ranorex是一款自動化測試工具,集移動端、web、桌面程式為一體的,很強大及使用靈活。具體可網上下載學習。但目前使用的使用者不多,是收費版的,但網上有破解版可使用。       上一遍我寫了怎麼獲取SVN的版

JAVA版開源微信管家—JeeWx捷微3.1小程式版本釋出,支援微信公眾,微信企業,支付窗

支援小程式,JeeWx捷微3.1小程式版本釋出^_^JeeWx捷微V3.1——多觸點小程式版本管理平臺(支援微信公眾號,微信企業號,支付窗)JeeWx捷微V3.1.0版本緊跟微信小程式更新,在原有多觸點

C#如何設定程式名稱/版本和圖示

在開啟的【屬性】視窗中,修改【程式集名稱】為需要的程式名稱【Listview示例程式】, 修改【預設名稱空間】名稱為本程式對應的標題名稱。 【程式集名稱】就是生成的程式檔案的名稱。 到這一步,程式的名稱修改完成,需要繼續修改圖示。

VC獲得程式自身的版本

作業系統: Windows7 64位 執行環境: Visual Studio 10 檔案編碼: Unicode char* GetLocalPogramVersion() { TCHAR pFi

如何獲取應用程式版本和版本名

實現獲取應用程式的版本號和阪本名,通過獲取包管理器開始;步驟如下: 程式如下 public class MainActivity extends AppCompatActivity { Co

程式中讀取ANDROID應用的程式名稱和版本

在ANDROID應用中,我們經常會需要在應用的介紹和說明中顯示程式名稱和版本號。當然,我們可以用硬編碼的方式在程式碼中直接寫進去,但這樣每一次版本升級的時候都需要去更改,勢必不是很方便。那麼,怎麼讀取ANDROID應用的程式名稱和版本號呢? 其實很簡單,ANDROID系統