中文偽春菜後援會論壇  

打印

[分享] 簡易資料庫SAORI - sqlori

簡易資料庫SAORI - sqlori

SQLori v1.1.10
作者:時原砂
授權:這個SAORI純為測試與教學之用,其他人可隨意使用或修改此原始碼

1. 更新
複製內容到剪貼板
代碼:
Date     Version  Log
20090723 1.1.10   ! 刪除GET_TABLE指令,其功能整合至EXEC之中
                  ! 追加OPEN、CLOSE指令,允許讀取指定的資料庫檔案
                  * 修正範例程式碼
                  * 支援UTF-8
20090720 1.0.0    # 初版發佈
2. 說明

簡單的說就是sqlite + csaori = sqlori (炸)

SQLori在功能上極為陽春
不過絕對比debeso.dll這個N年前的SAORI好的多...XD
使用sqlite版本為3.6.16
為求簡便,只返回單一返值而不使用Value[n]格式

3. 指令

(1) OPEN
argument[0]: OPEN
argument[1]: [%(filepath)]

開啟資料庫的連線。若不指定filepath時,預設資料庫檔名為sqlori.db。

(2) EXEC
argument[0]: EXEC
argument[1]: %(SQL_request)

執行資料庫指令的核心函式。

(3) CLOSE
argument[0]: CLOSE

關閉資料庫連線。

3. 應用

由於格式較為複雜,需要在人格端進行一些處理
這裡提供一個AYA版的處理函式及基本的單元測試範例
複製內容到剪貼板
代碼:
// sqlori.dll的位置若有不同的話請另行更改
#define SQLORI_PATH 'saori\sqlori.dll'
#define SQLITE_OK 0
#define SQLITE_ERROR 1

SQLori
{
    SQLori_result = SQLITE_OK;
    SQLori_fields = IARRAY;
    SQLori_values = IARRAY;
    SQLori_col = 0;
    SQLori_row = 0;
   
    _ret =  FUNCTIONEX(SQLORI_PATH, _argv[0], _argv[1]);

    _data = SPLIT(_ret[0], CHR(0x1));
    SQLori_result = TOINT(_data[0]);
   
    if SQLori_result != SQLITE_OK {
        SQLori_fields[0] = 'Error';
        SQLori_values[0] = _data[1];
        SQLori_col = 1;
        SQLori_row = 1;
    }
    else {
        if (ARRAYSIZE(_data) >= 3) {
            SQLori_fields = SPLIT(_data[1], CHR(0x2));
            SQLori_values = SPLIT(_data[2], CHR(0x2));
            SQLori_col = ARRAYSIZE(SQLori_fields);
            if SQLori_col != 0
                SQLori_row = ARRAYSIZE(SQLori_values) / SQLori_col;
        }
    }
}

SQLori.value
{
    _ret = '';
    if SQLori_col < 1 {
        return;
    }
    elseif SQLori_col == 1 {
        _ret = SQLori_values[_argv[0]];
    }
    else {
        _ret = SQLori_values[_argv[0] * SQLori_col + _argv[1]];
    }
   
    _ret;
}

// 單元測試
UnitTest
{
    _res = '';
    SQLori('OPEN', 'sqliori.db');

    SQLori('EXEC', "CREATE TABLE data (ID integer primary key, 姓名, 年齡);");
    _res += SQLori_result + '\n';
    SQLori('EXEC', "INSERT INTO data VALUES(null, '張三', '20');");
    _res += SQLori_result + '\n';
    SQLori('EXEC', "INSERT INTO data VALUES(null, '李四', '18'); INSERT INTO data VALUES(null, '王五', '25'); INSERT INTO data VALUES(null, '許功蓋', '90');");
    _res += SQLori_result + '\n';
    SQLori('EXEC', "UPDATE data SET 年齡 = '23' WHERE 姓名 == '張三';");
    _res += SQLori_result + '\n';
    SQLori('EXEC', "SELECT * FROM data;");
    _res += SQLori_result + '\n';
    for _i = 0; _i < SQLori_col; _i++ {
        _res += SQLori_fields[_i] + ' ';
    }
    _res += '\n';
    for _i = 0; _i < SQLori_row; _i++ {
        for _j = 0; _j < SQLori_col; _j++ {
            _res += SQLori.value(_i, _j) + ' ';
        }
        _res += '\n';
    }
    SQLori('EXEC', "DELETE FROM data WHERE ID < 3;");
    _res += SQLori_result + '\n';
    SQLori('EXEC', "SELECT count(*) FROM data;");
    _res += SQLori_fields[0] + ' = ' + SQLori_values[0] + '\n';
    SQLori('EXEC', "DROP TABLE data;");
    _res += SQLori_result + '\n';

    SQLori('CLOSE');

    _res;
}
注意:
由於1.1.10有整體結構上的大改動
請更新範例程式碼部份

補注:請下載Royさん的版本

[ 本帖最後由 時原砂 於 2009-8-9 23:35 編輯 ]

附件

sqlori _v1.1.10_src.zip (6.98 KB)

2009-7-23 14:01, 下載次數: 2205

末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

更新版本至1.1.10
(版本號無意義XD)

順便推薦一個免費的SQLite工具:
SQLiteSpy
http://www.wikitaxi.org/delphi/doku.php/products/sqlitespy/index
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

Orz...

要不要推進CSAORI svn這個我倒無所謂
如果Royさん覺得有價值的話就加吧w

至於sqlite源碼是因為太重了所以才刪掉的XD
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

不過Royさん的dll是怎麼壓縮的啊?
我的VS release版都在400K以上

Compiler設置這邊我還是新手...(滾滾)
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

原來是加殼啊...(汗)

話說我要更新Sqlori的話要怎麼做呢?
現階段的Sqlori在OO上還不夠獨立
還有改進的空間...
(一開始寫得太隨便了...)

另外我也搞不懂為啥CSAORI要強制設定locale為Japaness
整個CSAORI專案似乎也沒有與之關聯的地方...
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

呃...其實只要記住SQLori.value(_i, _j)就夠了
代表的意思是第_i + 1筆第_j欄的資料
複製內容到剪貼板
代碼:
OnRead
{
        _res = '';
        SQLori('OPEN', 'sqliori.db');
        SQLori('EXEC', "SELECT 本子名,性質,優先級,死線,官方網站,天窗ID,備注 FROM iCalendar;");
        SQLori('CLOSE');
        _txt += "\b[2]\_q\f[bold,true]行事歷 - 列表\f[default]\n\n[150]/
                        \f[bold,true]稿件名:%(SQLori.value(0, 0))\f[default] (性質:%(SQLori.value(0, 1)) 優先級:%(SQLori.value(0, 2))\n/
                        死線:%(SQLori.value(0, 3))\n/
                        備注:%(SQLori.value(0, 6))\n/
                        \_q";

        _txt;
}
接下來只要把0的部份改用變數來實作即可
另外就是連線不必常常開開關關的
反正也只有你一個人在用...XD

[ 本帖最後由 時原砂 於 2009-7-25 21:46 編輯 ]
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

嗯嗯...忘記%()的原意也只是變數取代
不能把它當eval用...XD

SQLori裡面的資料一旦再次呼叫後就會被重設
這確實是個盲點...
至於分頁的問題的話
其實也只是把迴圈的起始跟終止範圍再做一層變數而已
這部份倒是可以參考野菜園的語法查詢部份

總之請加油XD
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

基本上還是得養成全部用ID來處理的習慣
進行刪修時第一個動作就是取得那筆資料的ID並記下它
這樣才能保證唯一性
要指定時也只要加個 WHERE ID == %(_id) 就ok了
否則等資料的處理量變大之後
出了問題就很難找bug了
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

我的意思應該跟你的意思是一樣的啊...XD
寫成程式碼就是
_id = SQLori.value(_selected, 0);

另外STARRING是什麼東西?
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP

最近電腦爆掉加上回老家搞得忙不過來
暫時可能不會更新了...(汗)

另外關於分頁及SQLori腳本部份
我寫了很久都覺得很不順心
龜毛的毛病一發作
又開始好高騖遠(Lua、Javascript V8)起來
結果目前仍一事無成...orz
末月返想 - 創意的存放處
二次元斷層 - 成果展現之所在

惰性是大敵。

TOP



當前時區 GMT+8, 現在時間是 2020-2-27 09:23

Processed in 0.017908 second(s), 10 queries, Gzip enabled.

清除 Cookies - 聯繫我們 - 中文偽春菜後援會 - Archiver - WAP - TOP - 界面風格