データベースを使用する目途も付いたので、培養臼 エクストラバージョン(培養臼Ex)の作成に取り掛かることにした。
まずは、ハイスコアランキングの作成からスタート。
データベース周りは、SQLiteのテストのエントリーで書いた通り。
coro3.hatenablog.jp
coro3.hatenablog.jp
少し変更したのは、デフォルトのランキングをInsertする部分。
たった10レコードをInsertするだけなので、トランザクション処理は不要と思っていたが、異様に遅いw
ということで、トランザクション処理することにした。
トランザクションとは、データベースに変更を加える命令、Insert、Update、Deleteをまとめて実行して、確定(もしくは破棄)する処理のこと。
本来は、複数テーブルのレコードの整合性を保つためだったり、処理をキャンセルしたときに、不要なデータを登録しないようにするためのもの。
データベース、プログラム言語によって、書き方や実行の仕方が違うが、スクレレでは、Insert文をループで実行する前後に、おまじないのSQLをsql_q命令で実行するだけ。
こんな感じ。
;初期ランキングデータ作成 sql_q "BEGIN TRANSACTION" repeat 10 sqlstr="INSERT INTO scorelist (score,score_name,stage,rec_date) VALUES ("+str(10000*(cnt+1))+",'CR3','"+str(cnt+1)+"',datetime('now','localtime'))" sql_q sqlstr loop ;コンフィグ初期値 sql_q "INSERT INTO config (clearstage,fullscr,bgmvol,sevol) VALUES (0,0,50,50)" sql_q "COMMIT TRANSACTION"
BEGIN TRANSACTIONは、ここからひとまとまりの処理が始まるよという宣言。
Insert文などを実行したら、最後に、COMMIT TRANSACTIONを実行する。
COMMIT(コミット)が、データベースに行った処理を、確定させること。問題があったり、キャンセルしたければ、ロールバックという命令があり、実行するとそれまでのデータベースへの変更をなかったことにできる。
このコミット処理が時間かかるのね。トランザクションをやらなければ、1つのSQL文を実行するたびに自動的にコミットされている。
だから、処理するレコード数が多くなると、いちいちコミットしているから遅くなる。
ただ、自分の過去の経験では、10レコードぐらいの連続Insertぐらいでは、そんなに差がなかったので要らないと思っていたけど、そんなに処理が速くないということが分かったのも収穫かな。
初期設定は以上。次は、実際のランキング作成に移る。