起源及理念
有感於舊有的 Log 版和 MySQL 版結構上相近,卻一直不能整合在一起而只能分開維護兩版,開始有了以一個 API Interface 來整合,再針對各個資料來源撰寫其API 函式的想法。最早由 scribe 在2006年3月底、4月初提出,但沒有實作。直至 2006 年7月度再度由 RT 搬出檯面並制訂雛型完成,與 scribe 合作修改開發。
技術細節
名稱
- Pixmicat! I/O Proxy (最早提出的名稱原案)
- Pixmicat! database I/O (RT 完成後之命名)
- Pixmicat! data source I/O (修正命名錯誤後的正式命名)
雖然一波三折,但是最終簡稱都是PIO,而且設計理念都一樣。
版本
PIO共分為兩個版本,其中初版(PIO-v1)與舊有非PIO版本的資料結構相容,而現在的版本(v2)是用新的資料結構。
轉換
使用 PIO 公用程式內的 log2pio.php, mysql2pio.php (Pixmicat!-Log/MySQL -> Pixmicat-PIO 資料格式轉換器) 轉換舊資料格式即可。但不提供逆轉換,因為那沒什麼意義。
另外也提供了 PIO 資料來源互轉的功能,例如 PIO Log 轉 PIO SQLite2,透過 PIO 公用程式的 pio2pio.php 來達成。
匯入/匯出
在 PIO 0.4 版加入了這個功能,可以自由將資料匯出成中介檔案。所謂的中介檔案是一個有固定格式的文字檔,儲存所有記錄資料。而此一中介檔案可以自由匯入各種不同的資料來源。所以說中介檔案不止可以匯出備份儲存外,還可以自由變換成不同資料來源格式。
中介檔案格式類似於 Log 版的記錄檔,詳細的規格如下。
中介檔案
匯出
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
6,2,2007-01-01 00:00:00,a2e1cb8b947b093f2acb804c2de11db0,,1280x1024,,1169178675993,.jpg,1280,1024,483 KB,125,100,9dcc39dd,07/01/19(五)11:51 ID:pCtNqqDU,無名氏,,無標題,無內文,localhost,,
^^^^^^^^^^^^^^^^^^^
root
root : 討論串首篇最後更新時間 (回應最後一篇時間)
- SQL : 原本就有
- Log : 找出最後一篇回應的 strftime('%Y-%m-%d %H:%M:%S', $time + TIME_ZONE * 3600)
匯入
explode(',', $line) -> array();
* SQL-like : 將值塞入 SQL 語法,記得文字要加引號
* Log : 計算 tree.log:由新到舊取 'resno', unshift 'no' 到 array(resno) 內 (無法重現 sage)
time : substr(tim, 0, 10)
運作方式
先讓 pixmicat.php 引入 lib_pio.php ,被稱為 PIO Kernel Switcher 的結構,再藉由設定檔的設定決定要真正引入的API。
/* PIO - Pixmicat! data source I/O PIO Kernel Switcher */ // 分析連線字串 if(preg_match('/^(.*):\/\//i', CONNECTION_STRING, $backend)) define('PIXMICAT_BACKEND', $backend[1]); // 引入必要函式庫 $pio_file = './lib/pio/pio.'.PIXMICAT_BACKEND.'.php'; $PIOEnv = array( // PIO 環境常數 'BOARD' => '.', 'LUTCACHE' => './lutcache.dat', 'NONAME' => DEFAULT_NONAME, 'NOTITLE' => DEFAULT_NOTITLE, 'NOCOMMENT' => DEFAULT_NOCOMMENT, 'LOG_MAX' => LOG_MAX, 'PERIOD.POST' => RENZOKU, 'PERIOD.IMAGEPOST' => RENZOKU2 ); if(is_file($pio_file)) include_once($pio_file); // PIO Kernel Switcher $pioSwitch = 'PIO'.PIXMICAT_BACKEND; $PIO = new $pioSwitch(CONNECTION_STRING, $PIOEnv);
如果設定檔內的 CONNECTION_STRING 設定為 XXX 開頭 ,則再引入 pio 資料夾的 pio.XXX.php ,此為操作特定資料來源的 PIO API,內有一套制定週全的函式,供 Pixmicat! 程式使用。
最後建立物件變數 $PIO 供程式使用,以全域變數方式存取。
API 列表
程式只要運用這套 API ,便不必煩惱各種資料來源的操作,達成一套介面多種功能的效果。
API 規格細節,請參見 PIO API 規格 條目。
config.php 連線字串設定
只有一個 CONNECTION_STRING 需要設定,這個連線字串類似一般 URL,以下簡單說明其組成。
後端://後端設定/
目前支援以下後端:
- Log 文字檔
- log
- logflockp
- MySQL 資料庫
- mysql
- PostgreSQL 資料庫
- pgsql
- SQLite 資料庫
- sqlite
- sqlite3
大致上就是如此。以下針對各後端的設定做細部解說:
Log 文字檔
格式:
log://投稿文字記錄檔:樹狀結構記錄檔/ (一般檔案鎖定方式)
logflockp://投稿文字記錄檔:樹狀結構記錄檔/ (使用替代檔案鎖定方式)範例:
define("CONNECTION_STRING", 'log://img.log:tree.log/');
define("CONNECTION_STRING", 'logflockp://img.log:tree.log/');
MySQL 資料庫
格式:
mysql://帳號:密碼@伺服器位置:埠號(可省略)/資料庫/資料表/範例:
define("CONNECTION_STRING", 'mysql://pixmicat:pass@127.0.0.1/test/imglog/');注意: MySQL 資料庫必須是已存在的,資料表可以不存在會由系統自動生成,如果是程式升級的沿用可直接輸入舊資料表名稱
PostgreSQL 資料庫
格式:
pgsql://帳號:密碼@伺服器位置:埠號(可省略)/資料庫/資料表/範例:
define("CONNECTION_STRING", 'pgsql://pixmicat:1234@127.0.0.1/pixmicat_use/imglog/');注意: 同 MySQL,資料庫必須是已存在的,資料表可以不存在會由系統自動生成,如果是程式升級的沿用可直接輸入舊資料表名稱
SQLite 資料庫
格式:
sqlite://資料庫檔案之位置/資料表/ (SQLite 2)
sqlite3://資料庫檔案之位置/資料表/ (PDO SQLite 3)範例:
define("CONNECTION_STRING", 'sqlite://pixmicat.sqlite/imglog/');
define("CONNECTION_STRING", 'sqlite3://pixmicat.sqlite3/imglog/');
預覽網頁:
關閉預覽