上篇介紹了怎麼加乙個常規引數,同時也留下了乙個問題,如何加乙個奇葩引數設定功能,使任意乙個session設定引數值,全域性所有連線立即生效。
如何實現呢?我們來分析下。
如果要使當前session生效,直接設定即可,它能直接讀寫當前程序的引數值。那其它的session呢?首先我們明確乙個問題,資料庫一旦正常執行起來後,所有的動作都是在事務中進行的,如果乙個連線session在等待任務中,其它連線session的一些語句動作是無法直接影響到處於等待連線的session的。但是不同連線session肯定是有相互影響的,比方說a session建個表,b session讀寫這個表,肯定是可以的,任何session中事務只要提交那麼就對全域性都可見,這是資料庫的基礎,比方說是在starttransaction()函式中的atstart_cache()函式會根據主程序的訊息判斷本地cache是否需要更新。也就是說可以延遲點間接的更新到當前資料庫的最新狀態。一開始也是想以這樣的方式去實現引數生效功能,後來看了下pg_reload_conf()函式恍然大悟,何必這麼麻煩,直接用postgres程序間訊號即可,因為postgres已經有通知所有session重新讀引數功能了,要做的就只要把引數寫進去通知大家重讀引數檔案就可以了。
那麼現在的問題就轉化成了如何寫引數了,遺憾的是沒有發現核心有對postgresql.conf檔案引數的寫相關功能,postgresql.conf 檔案是從 postgresql.conf.sample copy過來的,並不是動態生成的。不過postgresql.conf有include_if_exists 用法,如果存在某個引數檔案就追加到後面,那麼我們就可以增加乙個新的引數檔案,裡面就寫我們在設定的引數值。
以函式方式實現,在date.c的增加相關**:
extern
char *configfilename;
extern
bool oracle_style;
extern file * allocatefile(const
char *name, const
char *mode);
datum swap_oracle_mode(pg_function_args)
; int pos = 0;
int count = 1;
char *tmpfile = configfilename;
file *fp;
if (null == configfilename)
while ('\0' != *tmpfile) //找到引數檔案路徑
count++;
tmpfile++;
}if (pos + strlen("oracle.conf") > sizeof(conf_path))
memcpy(conf_path, configfilename, pos);
memcpy(conf_path + pos, "oracle.conf", strlen("oracle.conf")); //生成新路徑名字
fp = allocatefile(conf_path, "w+");
if (null == fp)
else
else
if (freefile(fp))
if (kill(postmasterpid, sighup)) /*****通知其它程序重讀引數****/
}pg_return_bool(true);
}
在pg_proc.h中增加函式註冊
data(insert oid = 9995 (swap_oracle_mode pgnsp pguid 1210
00 f f f f t f s r 0016
"" _null_ _null_ _null_ _null_ _null_ swap_oracle_mode _null_ _null_ _null_));
執行swap_oracle_mode()函式剛修改oracle_style 引數值,覆寫到新引數檔案 oracle.conf,通知其它連線重讀引數,當然別忘了在postgresql.conf中加上一句:
include_if_exists = 'oracle.conf'
小功告成,看看效果,session 1執行引數修改函式,session 2在session 1修改函式前後分別查oracle_style引數值。
postgres=# ---session 1;
postgres=# show oracle_style;
oracle_style
--------------
on(1 row)
postgres=# select swap_oracle_mode();
swap_oracle_mode
------------------
t(1 row)
postgres=# show oracle_style;
oracle_style
--------------
off(1 row)
postgres=# ---session 2;
postgres=# show oracle_style;
oracle_style
--------------
on(1 row)
postgres=# show oracle_style;
--session 1 swap_oracle_mode()執行前
oracle_style
--------------
on(1 row)
postgres=# show oracle_style;
--session 2 swap_oracle_mode()執行後
oracle_style
--------------
off(1 row)
PostgreSQL的核心架構
注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。1.訪問介面總體圖 1.程序和記憶體結構圖 2.主程序 postmaster 是整個資料庫例項的總控程序,負責啟動和關閉該資料庫例項。3.syslogger 系統日誌 程序 需要在postgres.conf中logging colle...
Linux核心開發之Kset
1 kset 是具有相同型別的kobject的集合 在sysfs 中體現成乙個目錄,在核心中用 kset 資料結構表示,定義為 struct kset 2 kset操作 int kset register struct kset kset 在核心中註冊乙個 kset void kset unregi...
PostgreSQL雲上開發實踐
功能 通過postgis外掛程式,可以輕鬆支援2d 3d位址資訊模型,更支援地球不規則球體的偏移量,實現達到國際opengis標準的精確定位。基於sql支援json xml key value等非結構化資料型別,實現另類的not only sql nosql 解決方案 通過全文搜尋,應用將不再需要額...