中文偽春菜後援會論壇  

打印

[分享] 簡易資料庫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, 下載次數: 2059

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

惰性是大敵。

TOP

( ゚∀゚)o彡゜專業版!專業版!

[公告] 請不要來這裡求檔案,看到類似討論串內文不問一律刪除
-----------------------------------
啊哈哈   佐祐理不清楚
-----------------------------------
初心者有問題的話請先入內觀看
初心者常見問題區
-----------------------------------
注音文   求檔文   禁止

-----------------------------------
手書Blog~

TOP

好东西,收回去研究一下
moe moe ⑨~~~

TOP

重寫キタ━━(゚∀゚)━━!!
主頁更新啦:cat-fish.net

TOP

謝謝研發, 打包回家研究去QQ

TOP

Unicode build希望。
db名經SAORI API設定希望。


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

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

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

惰性是大敵。

TOP

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

開啟資料庫的連線。若不指定filepath時,預設資料庫檔名為sqlori.db。
src中是"sqlori._db"啊?

不理了,我通通改了。
1.1.10+版更動:
複製內容到剪貼板
代碼:
+ 補回SQLite 3.6.16的源碼,SQLite是Public Domain的關係一起包進來也沒關係。
! 修正:不指定filepath時,預設資料庫檔名為sqlori.db
! 修正沒有設定 SAORI return status的問題
! 有關 CSAORI 執行實體自csaori.cpp/caori.h中抽出成csaori_interface.cpp,使 CSAORI 可以獨立更新
! 更新 CSAORI 至 svn rev 88
下載:
源碼+SAORI本體程式: sqlori v1.1.10+.7z (1.04 MB)
test suite(SAORI本體+yaya+tama程式): sqloritest.7z (562.65 KB)

P.S.:對了,要推到 CSAORI svn中嗎? XD


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

Orz...

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

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

惰性是大敵。

TOP

引用:
原帖由 時原砂 於 2009-7-23 19:01 發表
Orz...

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

至於sqlite源碼是因為太重了所以才刪掉的XD
svn rev 92 投入確定。w

P.S.: #1的文成了 readme.txt 的內容,r93英譯完成。


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

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

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

惰性是大敵。

TOP

引用:
原帖由 時原砂 於 2009-7-24 12:00 發表
不過Royさん的dll是怎麼壓縮的啊?
我的VS release版都在400K以上

Compiler設置這邊我還是新手...(滾滾)
複製內容到剪貼板
代碼:
UPX --best --lzama sqlori.dll


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

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

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

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

惰性是大敵。

TOP

引用:
原帖由 時原砂 於 2009-7-24 13:41 發表
原來是加殼啊...(汗)

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

另外我也搞不懂為啥CSAORI要強制設定locale為Japaness
整個CSAORI專案似乎也 ...
現時是這樣:

先把csaori checkout到本機
http://code.google.com/p/csaori/source/checkout

在本機改好後把sqlori目錄打包上傳上來吧。
但是Debug/Release目錄中就得把*.obj/*.lib/*.exp/*.pch/*.pdb等刪除,剩下sqlori.dll
然後我再推到svn中。
之後就可以svn update了。

聯絡ぽなさん或ukiyaさん加你帳號後你就可以直接svn commit了。


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

謝~ 好東西收下
"企圖製造不可能"ing



......逆天果然是我的本性(茶)

TOP

重寫敗了……
複製內容到剪貼板
代碼:
OnRead
{
        _res = '';
        SQLori('OPEN', 'sqliori.db');
        _res = SQLori('EXEC', "SELECT 本子名,性質,優先級,死線,官方網站,天窗ID,備注 FROM iCalendar;");
        for _i = 0; _i < SQLori_row; _i++ {
                for _j = 0; _j < SQLori_col; _j++ {
                _res += SQLori.value(_i, _j) + ' ';
                }
        _res += '\n\n';
        }
        _res = SPLIT(_res,' ');
        _txt += "\b[2]\_q\f[bold,true]行事歷 - 列表\f[default]\n\n[150]/
                        \f[bold,true]稿件名:%(_res[0])\f[default] (性質:%(_res[1])) 優先級:%(_res[2])\n/
                        死線:%(_res[3])\n/
                        備注:%(_res[6])\n/
                        \_q";
        SQLori('CLOSE');
        _txt;
}
這樣寫出來只能讀取到第一條信息,第二條就會消失。
這個寫法肯定是錯的,但我不知道正確的該怎麼寫@@
分頁和列表讀取我一直不明白要怎麼做@@;;;
(看了很久瑪琳的代碼依然不明白OTZ)
求教了>_<;;
主頁更新啦:cat-fish.net

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

呃…照著做了,
但變成了這樣@@
複製內容到剪貼板
代碼:
SSP script 記錄:
\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
直接被顯示出來了|||
哪里寫的不對嗎?|||
另外“把0的部份改用變數來實作”也不太明白,
我知道_i是行數,但如何讓行數自動的列出來?@@
抱歉,這方面完全是外行,看得有點暈暈的OTZ|||

[ 本帖最後由 貓魚 於 2009-7-26 00:32 編輯 ]
主頁更新啦:cat-fish.net

TOP

複製內容到剪貼板
代碼:
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]"
        for _i = 0; _i < SQLori_row; _i++ {
                                _txt += "\f[bold,true]稿件名:"+SQLori.value(_i, 0)+"\f[default] (性質:"+SQLori.value(_i, 1)+" 優先級:"+SQLori.value(_i, 2)+"\n/
                                死線:"+SQLori.value(_i, 3)+"\n/
                                備注:"+SQLori.value(_i, 6)+"\n";
        }
        _txt+= '\_q';

        _txt;
}


正在聽着:
水人的格言:
有仇不報非君子!
有水不灌非魔人!

萬事皆可萌,唯有情無價

TOP

喔喔!!感謝!成功了!
不過 SQLori('CLOSE'); 應該要放到后頭去XD;;;;
不然無論如何都讀不出資料XDD

[ 本帖最後由 貓魚 於 2009-7-26 00:50 編輯 ]
主頁更新啦:cat-fish.net

TOP



當前時區 GMT+8, 現在時間是 2018-11-18 15:49

Processed in 0.027369 second(s), 9 queries, Gzip enabled.

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