データベース

TvmaidのデータベースはSqliteです。
Tvmaidで使用するデータベースについての補足説明です。
データベース定義と合わせて読んでください。

データベース定義
(テキストファイルです)

SQL文になっていますので、このままデータベース作成に利用できます。
最後のlogテーブルだけはlog.db用です。

データベース構造の補足説明

チューナ

Tvmaidでは、チューナに任意の名前を付けることができます。
チューナ名はドライバIDと関連付けしてあります。

ドライバIDは造語で、BonDriverファイル名とドライバインデックスの組み合わせです。
ドライバインデックスは、その何個目のBonDriverなのかを表します。
Tvmaidは、同じ名前のBonDriverを扱えるので、インデックスを付けて管理しています。

チューナ名とドライバIDの関連は、例えば下のような感じになります。

地上デジタル1 = BonDriver_PT-T.dll/0
地上デジタル2 = BonDriver_PT-T.dll/1

サービス

「fsid」(フルサービスID)は造語で、NID、TSID、SIDの組み合わせです。
サイズは6バイト(2バイトx3)です。

サービスはBonDriverごとに登録されています。
例えば、2種類のBonDriverを指定していて、両方に同じサービスがある場合は、そのサービスは2つ登録されます。

番組

番組テーブルには、idとeidというIDがあります。
eidは、番組情報の番組IDです。
idはテーブルのIDで、テーブル結合の際などに使用します。
番組表更新時も、同じeidなら同じidで登録するので、どちらでも使えます。

なぜ2つあるかというと、eidはfsidと組み合わせないとユニークにならないためです。
eidとfsidを1つにするには8バイト必要ですが、SqliteやJavaScriptが符号なし8バイトを扱えないため、1つにできないのでこうなっています。

番組のジャンル

ジャンルは1つ1バイトで、6個まで格納しています(6バイト分)。
「無し」の部分には、0xFFが入っています。
7~8バイト目は、常に0x00です。
ジャンルの割り当ては、default\genre.def(ジャンル文字列設定)を参照してください。

拡張ジャンル

番組のジャンルには、拡張ジャンル情報が付く場合があります。
拡張ジャンルも1バイトのため、ジャンルを表すとき本来は2バイト必要です。
ですが、Tvmaidでは拡張ジャンルの一部を、ジャンルの未使用部分に割り当てて、1バイトで表現しています。

ジャンルのデータ構造について

ジャンル情報は、1つの列に複数格納されているため、検索がしづらいです。
Tvmaidでは、ジャンルを積極的に利用していないため、簡易的な作りになっています。
(検索は、genre_textで一応できる)

将来、ジャンルを利用する機能を作る際は、データ構造を変更するかもしれません。
正当なやり方(正規化)をする場合、番組テーブルと一対多のジャンルテーブルを作り、2バイトで保存するべきです。

録画予約

録画予約は、fsid、eidに関連付けられています。番組のテーブルidではないので注意してください。

自動録画予約

queryフィールドは、どの番組を登録するかを決定するSQL文が入っています。
これはスクリプト側で設定します

本来は、条件だけスクリプトで指定して、SQLは本体側で作成するべきです。
しかし、それだと検索SQLをスクリプト側で自由に作成できなくなるので、こうなっています。
(スクリプトの検索と本体で作ったSQLに違いが発生する可能性があるのを避けるため)

JavaScriptでデータを扱う場合の注意事項

時刻の数値

JavaScriptの整数の限界は2の52乗です。
番組の開始時間など、時刻の数値はこれを超えてしまっています。
なので、何らかの計算を行った場合は、(下の方の桁で)ずれが生じる可能性があります。

Chromeで確認、例として(いいかげんな)3000年1月1日0時を使用 → 60x60x24x365x3000x10000000=946080000000000000

946080000000000000 + 1 → 946080000000000000(間違っている)
946080000000000000 + 1000 → 946080000000001000(あっている)

このため計算する場合は、最初に1000万で除算し秒単位にするか(これは問題ない)、SQLで先に除算しておいてください。
Tvmaidの標準のスクリプトでは、XDateライブラリの時刻(ミリ秒単位)に変換してから使用しています。

表示としては、21桁以上が指数表記になりますが、それ以内ならWebAPIでの受け渡しなどに問題ありません。

946080000000000000 → 946080000000000000(同じ)
9460800000000000000000 → 9.4608e+21(ここで指数表記になる)

なぜ最初から秒単位でないかというと、Tvmaid本体を作成しているプログラミング言語の時刻表現をそのまま使用してしまっているためです。
時刻の表現については、今後のリリースで変更するかもしれません。
(番組の長さは「秒単位」で、そろっていないため分かりにくいということもあります)

fsidとジャンル

JavaScriptは、ビット演算が32ビット(4バイト)でしかできません。
このため、4バイト以上の部分をビット演算で取り出す操作ができません(ANDもビットシフトもできない)。
これで問題になるのが、fsidとジャンルです。

fsid: NIDが5~6バイト目にあります。
ジャンル: 5~6個目のジャンルが5~6バイト目にあります。

標準のスクリプトでは、これらを取り出す操作をしていませんが、取り出したい場合はビット演算以外の方法で行う必要があります。
(SQLで取り出す、大きな数値を扱えるライブラリを利用するなど)