PIO : Pixmicat! data source I/O

起源及理念

有感於舊有的 Log 版和 MySQL 版結構上相近,卻一直不能整合在一起而只能分開維護兩版,開始有了以一個 API Interface 來整合,再針對各個資料來源撰寫其API 函式的想法。最早由 scribe 在2006年3月底、4月初提出,但沒有實作。直至 2006 年7月度再度由 RT 搬出檯面並制訂雛型完成,與 scribe 合作修改開發。

技術細節

名稱

  1. Pixmicat! I/O Proxy (最早提出的名稱原案)
  2. Pixmicat! database I/O (RT 完成後之命名)
  3. 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。

<?php
/*
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/');

參見

討論

新增一則回應
登入為 Wikidot 使用者
(將不會發佈)
- +
除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-Noncommercial-Share Alike 2.5 License.