Chapter 3. pgtcl - TCL 綁定庫

Table of Contents
3.1. 介紹
3.2. pgtcl 裝載到你的應用中
3.3. pgtcl 命令參考資訊
pg_connect — 打開一個到後端伺服器的連結
pg_disconnect — 關閉一個與後端伺服器的連結
pg_conndefaults — 獲取關於預設連結參數的資訊
pg_exec — 向伺服器發送一個查詢字串
pg_result — 獲取查詢結果的資訊
pg_select — 逐一處理一個 SELECT 語句的結果
pg_execute — 在結果上發送一個查詢和可選的循環
pg_listen — 設定或者改變一個偵聽異步 NOTIFY 訊息的回調(函數)
pg_on_connection_loss — 為意外的連線丟失設定或者改變一個回調
pg_lo_creat — 建立一個大物件
pg_lo_open — 打開一個大物件
pg_lo_close — 關閉一個大物件
pg_lo_read — 讀取一個大物件
pg_lo_write — 寫入一個大物件
pg_lo_lseek — 在一個大物件裡定位到某個位置
pg_lo_tell — 傳回一個大物件的目前(文件)指針位置
pg_lo_unlink — 刪除一個大物件
pg_lo_import — 從一個文件輸入一個大物件
pg_lo_export — 把一個大物件輸出到一個文件中去.

3.1. 介紹

pgtcl 是一個用於前端和 PostgreSQL 後端交互的 Tcl 包.它把大多數 libpq 庫的函數/功能做成可用於 Tcl 腳本.

這個包最初是 Jolly Chen 寫的.

Table 3-1 給了我們一個在 pgtcl 裡可用命令的概述. 這些命令在後面更多的內容裡詳細介紹.

Table 3-1. pgtcl 命令

命令描述
pg_connect打開一個與後端伺服器的連結
pg_disconnect關閉一個連結
pg_conndefaults獲取連結選項和其他預設值
pg_exec向後端發送一個查詢
pg_result操作查詢的結果
pg_select在一個 SELECT 語句的結果上循環(處理)
pg_execute在結果上發送一個查詢和可選的循環
pg_listen建立一個用於 NOTIFY 訊息的回叫
pg_on_connection_loss為以外的連線丟失建立一個回叫
pg_lo_creat建立一個大物件
pg_lo_open打開一個大物件
pg_lo_close關閉一個大物件
pg_lo_read讀取一個大物件
pg_lo_write寫一個大物件
pg_lo_lseek在一個大物件裡搜尋一個位置
pg_lo_tell傳回一個大物件的目前搜尋位置
pg_lo_unlink刪除一個大物件
pg_lo_import把一個 Unix 文件輸入到一個大物件裡
pg_lo_export把一個大物件輸出到一個 Unix 文件裡

pg_lo_*過程都是與 PostgreSQL 大物件特性交互的接口. 這些函數是仿照標準 Unix 文件系統接口的做法設計的. pg_lo_*過程應該用於一個 BEGIN/COMMIT事務塊裡頭, 因為pg_lo_open傳回的文件描述符只是在目前事務中有效. pg_lo_importpg_lo_export 必須在一個BEGIN/END 事務塊裡面使用.

Example 3-1 演示了一個如何使用這些過程的一個 小範例.

Example 3-1. pgtcl 範例程式

# getDBs :
#   get the names of all the databases at a given host and port number
#   with the defaults being the localhost and port 5432
#   return them in alphabetical order
#
#  獲取給定主機和連接埠號上的所有資料庫,預設是 localhost 和連接埠 5432
#  並且按照字母順序傳回它們
#
proc getDBs { {host "localhost"} {port "5432"} } {
    # datnames is the list to be result
    set conn [pg_connect template1 -host $host -port $port]
    set res [pg_exec $conn "SELECT datname FROM pg_database ORDER BY datname"]
    set ntups [pg_result $res -numTuples]
    for {set i 0} {$i < $ntups} {incr i} {
	lappend datnames [pg_result $res -getTuple $i]
    }
    pg_result $res -clear
    pg_disconnect $conn
    return $datnames
}