2022年9月17日土曜日

SQLite3 独自アーカイブ(archive)形式について 入門.2

概要

入門.1はこちら

この記事ではアーカイブ内の「sqlar」テーブルについて記載する。

コマンドラインツールで作成したアーカイブにはデフォルトで「sqlar」というテーブルがある。 このテーブルには複数のアーカイブの中身に関する情報が格納されている。 sqlarテーブルの各カラムの意味は以下の通り。

sqlar テーブル
カラム名 意味
name ファイル格納時のファイルパス
mode unixスタイルのアクセス権限
mtime ファイルの修正時刻(1970年1月1日0時0分からの秒数)
sz ファイルの圧縮前のサイズ
data アーカイブされているデータの内容

テキストファイルであれば「data」をSQLで文字列検索出来るし、 アーカイブした日時を確認することが出来る。

アーカイブ前後のデータを確認してみる

環境
  • Windows 10 64bit
  • SQLite3 ver.3.39.2

C:\temp>rem # 1.

C:\temp>dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は 2CE7-FFC0 です

 C:\temp のディレクトリ

2022/09/05  23:35    <DIR>          .
2022/09/05  23:35    <DIR>          ..
2022/08/16  12:12                 9 sample1.txt
2022/08/20  14:42             3,614 sample2.png
               2 個のファイル               x,xxx バイト
               2 個のディレクトリ   x,xxx,xxx,xxx バイトの空き領域

C:\temp>rem # 2.

C:\temp>sqlite3 archive.sqlar -Ac

C:\temp>rem # 3.

C:\temp>sqlite3 archive.sqlar -Ai ./sample1.txt ./sample2.png

C:\temp>rem # 4.
C:\temp>dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は 2CE7-FFC0 です

 C:\temp のディレクトリ

2022/09/06  00:19    <DIR>          .
2022/09/06  00:19    <DIR>          ..
2022/09/06  00:19             1,536 archive.sqlar
2022/08/16  12:12                 9 sample1.txt
2022/08/20  14:42             3,614 sample2.png
               3 個のファイル               5,159 バイト
               2 個のディレクトリ  46,067,060,736 バイトの空き領域


C:\temp>sqlite3 archive.sqlar
SQLite version 3.39.2 2022-07-21 15:24:47
Enter ".help" for usage hints.

sqlite> .tables
sqlar

sqlite> -- # 5.
sqlite> select * from sqlar ;
./sample1.txt|33206|1660619553|9|teststa
./sample2.png|33206|1660974123|3614|x???s???b``???p    b``i```??`??{?E)?? w'?u?d^9,?????$?????b? ????h?fOx/?i~w?     V?@???? ????AA)h? #3C???? _????A@pT??Q??JG??*U:?tT??Q??JG?RY??m?z?????6?c?t?sY??

                
  1. アーカイブ前のデータ
  2. 新規アーカイブの作成
  3. アーカイブにデータを追加
  4. データ追加後のアーカイブサイズ
  5. アーカイブ内容の確認 (./sample2.pngは画像データなのでコンソールでは表示されない)

sqlarファイルと画像ファイルのサイズを比較すると、それなりに圧縮されていることがわかる。

mtimeカラムを日時に直すには

datetime()関数を使えばいい。


sqlite> select datetime('1970-01-01','+' || mtime || ' seconds') as s_datetime from sqlar;
2022-08-16 03:12:33
2022-08-20 05:42:03
                

参考URL