2015-10-13

Tclunqlite v0.2.1

檔案放置網頁


Tclunqlite

一些說明


在 Tclunqlite v0.2.1 主要實作下面二個 command,主要用來測試。

DBNAME jx9_eval Jx9_script_string
DBNAME jx9_eval_file Jx9_script_file

用途就是用來執行 UnQLite 提供的 Jx9 script。二個執行的順序很像,大致是這樣的流程:
  • unqlite_compile or unqlite_compile_file
  • unqlite_vm_exec
  • unqlite_vm_release
  • 運用 unqlite_vm_config 所提供的功能,將 output buffer 的內容傳回來
然後考慮下面的 Jx9 測試 script:

if( !db_exists('users') ) { print db_create('users'); }

$zRec = [
{
   name : 'james',
   age  : 27,
   mail : 'dude@example.com'
},
{
   name : 'robert',
   age  : 35,
   mail : 'rob@example.com'
},
{
   name : 'monji',
   age  : 47,
   mail : 'monji@example.com'
},
{
  name : 'barzini',
  age  : 52,
  mail : 'barz@mobster.com'
}
];

print db_store('users',$zRec);

print db_fetch('users');
print db_fetch('users');

就可以發現,DBNAME jx9_eval_file ( 呼叫 unqlite_compile_file)執行完整個的 Jx9 script 以後,db_fetch 的結果是正常的,也就是可以正確的移往下一筆資料。

但是如果使用 DBNAME jx9_eval ( 呼叫 unqlite_compile)執行,那麼 db_fetch 就只會拿到第一筆資料,而且不會正確的移往下一筆。

經過思考,雖然沒有去 trace 這一段 code,但是我大致上認為原因是因為我在寫 jx9_eval command 的時候,都會經歷 compile, execute and release 的流程,所以原本用來記錄目前 id 的資料就被設為初始值。但是要求經歷這個流程以後還能夠記住好像也有點奇怪(因為 VM 都被我 release 了)。

如果要硬解的話,那麼就是設定一個 global variable,初始值一樣為 0。然後在 db_fetch 操作之前,覆寫回目前的 record id,並且在執行動作以後紀錄目前的值。同樣的,db_reset_record_cursor 追蹤到最源頭,在對 record id 動作的地方也做一樣的事情(將這個 global variable 設為 0),這樣就可以解決問題。但是因為使用了 global variable,所以可能會有其它的麻煩,以及可能會造成記錄不一致的問題。

不過我最後沒有放上去我硬解的做法,只有將 jx9_eval 與 jx9_eval_file 二個 command 放到套件裡。

沒有留言: