2016-01-31

tcl-lmdb v0.3.1

檔案放置網頁


tcl-lmdb - Tcl interface to the Lightning Memory-Mapped Database

About


This is the Lightning Memory-Mapped Database (LMDB) extension for Tcl using the Tcl Extension Architecture (TEA).

LMDB is a Btree-based database management library with an API similar to BerkeleyDB. The library is thread-aware and supports concurrent read/write access from multiple processes and threads. The DB structure is multi-versioned, and data pages use a copy-on-write strategy, which also provides resistance to corruption and eliminates the need for any recovery procedures. The database is exposed in a memory map, requiring no page cache layer of its own. This extension provides an easy to use interface for accessing LMDB database files from Tcl.

Main Change

  • Update source code to LMDB 0.9.70 with extra fixes from github.
  • lmdb open command add option: -dupfixed
  • Update README.md

一些說明


多增加一個 lmdb open command 的選項 -dupfixed,以及更新附帶 LMDB 的 source code。

2016-01-30

Convert Feedly.opml to MonetDB database

這只是用來測試我最近寫的 tclmonetdb extension。

首先是讀出資料,然後寫入 MonetDB database 的 mylist table:

#!/usr/bin/tclsh
package require tdom
package require monetdb

monetdb db -host localhost -port 50000 -user monetdb -passwd monetdb -dbname demo

# MonetDB does not support drop table if exists syntax, use the alternative method
set stmt [db query "select name from tables where name = 'mylist'"]
set count [$stmt get_row_count]
$stmt close
if {$count > 0} {
    set stmt [db query "drop table mylist"]
    $stmt close
}

set stmt [db query {create table mylist (title TEXT, xmlUrl TEXT, \
          htmlUrl TEXT, PRIMARY KEY (title))}]
$stmt close

# setup feedly opml file path
set filename "c:/feedly.opml"
# parse XML data
set doc [dom parse [tDOM::xmlReadFile $filename "UTF-8"]]
set root [$doc documentElement]
set nodeList [$root selectNodes /opml/body/outline/outline]

set title ""
set xmlUrl ""
set htmlUrl ""

foreach node $nodeList { 
    if {[catch {set title [$node getAttribute title]}] != 0} {
        set title ""
    }
    
    if {[catch {set xmlUrl [$node getAttribute xmlUrl]}] != 0} {
        set xmlUrl ""
    }
    
    if {[catch {set htmlUrl [$node getAttribute htmlUrl]}] != 0} {
        set htmlUrl ""
    }    
    
    set sql_string "insert into mylist values('$title', '$xmlUrl', '$htmlUrl')"    
    set stmt [db query $sql_string]
    $stmt close
}

db close

再來是讀出來,確定我們有正確寫入:

#!/usr/bin/tclsh
package require monetdb

monetdb db -host localhost -port 50000 -user monetdb -passwd monetdb -dbname demo

set stmt [db query {SELECT * FROM mylist}]

set count [$stmt get_row_count]
for {set i 0} { $i < $count} {incr i 1} {
    set mydict [$stmt fetch_row_dict]
    puts "RSS title: [dict get $mydict title]"
    puts "RSS xmlUrl:  [dict get $mydict xmlurl]"
    puts "RSS htmlUrl:  [dict get $mydict htmlurl]"    
}

$stmt close
db close

在 tclmonetdb v0.6 版 redesign 了 API,所以更新這裡的 code。

2016-01-21

TDBC-ODBC 與 MonetDB ODBC driver

測試版本:MonetDB Jul 2015-SP2


建立新的資料庫的方法:修改 M5server.bat

rem prepare the arguments to mserver5 to tell it where to put the dbfarm

if "%APPDATA%" == "" goto usevar
rem if the APPDATA variable does exist, put the database there
set MONETDBDIR=%APPDATA%\MonetDB5
set MONETDBFARM="--dbpath=%MONETDBDIR%\dbfarm\danilo"

而後建立新的 ODBC DSN:


接下來就是測試的 Tcl script:

package require tdbc::odbc

set connStr "DSN=MonetDB DSN; UID=monetdb; PWD=monetdb;"
tdbc::odbc::connection create db $connStr

set statement [db prepare {create table person (id integer, name varchar(40))}]
$statement execute
$statement close

set statement [db prepare {insert into person values(1, 'leo')}]
$statement execute
$statement close

set statement [db prepare {insert into person values(2, 'yui')}]
$statement execute
$statement close

set statement [db prepare {SELECT * FROM person}]

$statement foreach row {
    puts [dict get $row id]
    puts [dict get $row name]
}

$statement close

set statement [db prepare {drop table person}]
$statement execute
$statement close

db close

2016-01-18

The site is back

Danilo Chang's Home Page


今天測試,發現可以改回來,所以回復原來的位址了。

我也同步更新了訊息在 comp.lang.tcl 上。

2016-01-12

總之,被我弄到掛掉了

Danilo Chang's Home Page


受到 Google Sites 的影響,我目前無法編輯 tcl-lmdb 網頁,原因不明。我在實驗的過程中沒注意到 Google Sites 的刪除與複製網站功能有次數限制, 所以目前無法還原,就先目前這個網頁吧,如果可以改回來我再還原。


我在 comp.lang.tcl 也發了一篇文章 (Tcl-lmdb v0.3, Tclunqlite and Tcljsonnet),所以暫時就這樣了。


PS.
基本上我還是很介意,因為一個 Google Sites 的網站管理者無法編輯修改自己的網頁是一件很瞎的事情,到底是哪裡出問題了?

PS.
原來的 tcl-lmdb 無法修改內容,只能夠使用附件管理的方式來增加與刪除附件。 經過思考,我找到了一個解法。首先建立一個 test 網頁,而後將舊的 tcl-lmdb 網頁放在 test 網頁下,複製內容到新的 tcl-lmdb 網頁,於是就可以有一個可以修改的 tcl-lmdb 網頁。 我不確定這是不是 Google Sites 的 bug,但是看來 Google 的雲端服務可能沒那麼可靠。

不過我已經在 Github 也放了相關的 source code 內容,接下來如果 domain name 可以恢復,應該就可以解決這件事情了,只是日常使用就會遇到使用障礙,如果連 Google 都是如此,我會對整個雲端產業抱持著質疑的態度。

2016-01-11

Convert Feedly.opml to SQLite3 database

目標是把 export 出來的 feedly.opml 檔案的資料放到 SQLite3 database 檔案。我寫完以後,才覺得…… 我好像多此一舉了。

#!/usr/bin/tclsh
package require tdom
package require tdbc::sqlite3

# prepare our sqlite database
tdbc::sqlite3::connection create db "feedly.db" 

set statement [db prepare {drop table if exists mylist}]
$statement execute
$statement close

set statement [db prepare {create table mylist (title TEXT, xmlUrl TEXT, htmlUrl TEXT, PRIMARY KEY (title))}]
$statement execute
$statement close

# setup feedly opml file path
set filename "/home/danilo/Personal/feedly.opml"
# parse XML data
set doc [dom parse [tDOM::xmlReadFile $filename "UTF-8"]]
set root [$doc documentElement]
set nodeList [$root selectNodes /opml/body/outline/outline]

set title ""
set xmlUrl ""
set htmlUrl ""
set statement [db prepare {insert into mylist values(:title, :xmlUrl, :htmlUrl)}]

foreach node $nodeList { 
    if {[catch {set title [$node getAttribute title]}] != 0} {
        set title ""
    }
    
    if {[catch {set xmlUrl [$node getAttribute xmlUrl]}] != 0} {
        set xmlUrl ""
    }
    
    if {[catch {set htmlUrl [$node getAttribute htmlUrl]}] != 0} {
        set htmlUrl ""
    }    
    
    $statement execute    
}

$statement close
db close

第二個則是讀出來確定有轉存成功:

#!/usr/bin/tclsh
package require tdbc::sqlite3

tdbc::sqlite3::connection create db "feedly.db" 

set statement [db prepare {SELECT * FROM mylist}]

$statement foreach row {
    puts "RSS title: [dict get $row title]"
    puts "RSS xmlUrl:  [dict get $row xmlUrl]"
    puts "RSS htmlUrl:  [dict get $row htmlUrl]"
}

$statement close
db close

2016-01-08

SQLite 與 PostgreSQL 釋出新版本

昨天我發現 SQLite 釋出了新的版本,3.10.0,所以已經下載了新的版本並且 build 出來使用簡單的 Tcl Script 測試。

然後接下來我就發現 PostgreSQL 也釋出了新版,9.5.0 版。我下載並且安裝以後,也使用一些簡單的 Tcl Script 進行測試,接下來需要閱讀文件來對 PostgreSQL 改版的項目進行更多的理解。

也就是新年一開始,open source relational database 三巨頭中的二個就釋出新版本了,很有趣的發展。

2016-01-02

Update couchdbtcl and solr4tcl

couchdbtcl -

在寫 solr4tcl 的時候,我才注意到,我沒有在 couchdbtcl 中處理 http::geturl 連線失敗的情況(其實也只是加 catch,避免直接吐出來錯誤訊息),所以加進來處理的部份。


solr4tcl -

在進行更多測試的時候,我發現 ping method 雖然拿到 ok,但是我填的 URL 不是正確的,所以更新了 URL。然後 ping method 的 method 是 HEAD,看起來不用設定什麼 Accept header,我也更正了這部份。