sample_duckdb.hsp

sample\iron\sample_duckdb.hsp » Plain Format

;============================================================
;   sample_duckdb.hsp — hspduckdb.dll / iron_duckdb.hsp サンプル
;
;   DuckDB の in-memory DB を open して CRUD と CSV 直読みを試す。
;============================================================

#include "hsp3_net_64.as"
#include "iron_duckdb.hsp"

    title "hspduckdb sample"
    screen 0, 800, 600
    font "MS Gothic", 14
    pos 8, 8

    mes "hspduckdb sample"
    mes "================"
    mes ""

; ------------------------------------------------------------
; 1) in-memory DB を open
; ------------------------------------------------------------
    db_open ":memory:"
    db = stat
    if db < 0 {
        mes "open failed: " + db
        mes "(duckdb amalgamation 未配置なら -100 が返る)"
        stop
    }
    mes "db opened: handle=" + db
    mes ""

; ------------------------------------------------------------
; 2) テーブル作成 + INSERT
; ------------------------------------------------------------
    db_exec db, "CREATE TABLE users (id INT, name TEXT, score DOUBLE)"
    db_exec db, "INSERT INTO users VALUES (1, 'Alice', 95.5), (2, 'Bob', 82.0), (3, 'Carol', 77.25)"
    mes "[1] inserted 3 rows"
    mes ""

; ------------------------------------------------------------
; 3) SELECT
; ------------------------------------------------------------
    db_query db, "SELECT * FROM users ORDER BY score DESC", rh
    nrows = db_rows(rh)
    ncols = db_cols(rh)
    mes "[2] query: " + nrows + " rows, " + ncols + " cols"
    ; ヘッダ
    hdr = ""
    repeat ncols
        hdr += db_col_name(rh, cnt) + "\t"
    loop
    mes "  " + hdr
    ; ボディ
    repeat nrows
        r = cnt
        line = ""
        repeat ncols
            line += db_fetch_str(rh, r, cnt) + "\t"
        loop
        mes "  " + line
    loop
    db_free rh
    mes ""

; ------------------------------------------------------------
; 4) 集約
; ------------------------------------------------------------
    db_query db, "SELECT AVG(score) FROM users", rh
    avg = db_fetch_dbl(rh, 0, 0)
    mes "[3] AVG(score) = " + avg
    db_free rh
    mes ""

; ------------------------------------------------------------
; 5) CSV 直読み (SELECT * FROM 'data.csv')
;    data.csv があれば動く
; ------------------------------------------------------------
    mes "[4] SELECT * FROM 'data.csv' (data.csv があれば)"
    exist "data.csv"
    if strsize > 0 {
        db_query db, "SELECT * FROM 'data.csv' LIMIT 5", rh
        nrows = db_rows(rh)
        ncols = db_cols(rh)
        mes "  " + nrows + " rows, " + ncols + " cols"
        repeat nrows
            r = cnt
            line = ""
            repeat ncols
                line += db_fetch_str(rh, r, cnt) + "\t"
            loop
            mes "  " + line
        loop
        db_free rh
    } else {
        mes "  data.csv なし (skip)"
    }

    db_close db
    stop