среда, 3 февраля 2010 г.

sqlite3-poisk: листинг директории

Дополнил пакет sqlite3-poisk утилитой poisk-ls для построения листинга директории. Сделано это в целях получения списка файлов вместе с метаинформацией - mime-тип и заголовок, размер файла и проч., т.к. получение этих данных непосредственно из самого файла требует, во-первых, множества операций, во-вторых, достаточно ресурсоемко. Разумеется, для нагруженной системы при каждом обращении вызывать и указанную внешнюю утилиту построения листинга слишком расточительно, но кэш с временем жизни, скажем, 5 минут, спасет отца русской демократии (в качестве ключа кэша напрашивается имя директории - "dir" или имя директории,limit,offset -"dir,limit,offset").


$ poisk-ls
Usage: poisk-ls DATABASE LIMIT OFFSET DIR


$ time poisk-ls test.db 2 1 /
poisk_count = 3
poisk_counter = 2
rowid = 2
mtime = 2006-06-22
size = 20179
uri = /test.htm
dirname = /
filename = test.htm
mimetype = text/html
title = Тестовая страница

poisk_count = 3
poisk_counter = 3
rowid = 1
mtime = 2004-04-09
size = 446976
uri = /Эра Фанка.doc
dirname = /
filename = Эра Фанка.doc
mimetype = application/msword
title = Эра Фанка


real 0m0.012s
user 0m0.008s
sys 0m0.004s


$ time poisk-ls test.db 1 0 /humor
poisk_count = 8
poisk_counter = 1
rowid = 78
mtime = 2006-05-11
size = 3991
uri = /humor/Info.aspx.htm
dirname = /humor
filename = Info.aspx.htm
mimetype = text/html
title = ... Hо я писал на С++. - RSDN


real 0m0.012s
user 0m0.012s
sys 0m0.000s


Теперь мы можем показывать в листинге не просто имя файла, а его заголовок (существует для html, doc и многих других форматов файлов). Постраничная разбивка также предусмотрена.

Время выполнения измерено на ноутбуке, на десктопном железе получается примерно втрое быстрее.

$ ls -lh test.db |awk '{print $5}'
20M

Тестовая база небольшая, но особой роли размер базы не играет, т.к. значительное время занимает загрузка libsqlite+libICU. Собственно, для именно этой утилиты libICU совсем не нужна, так что можно слинковать статически с libsqlite без лишних довесков, в разы ускорив работу утилиты для директорий, содержащих немного файлов. Впрочем, кэширование на стороне клиента все равно эффективнее.

2 комментария:

verslamer комментирует...

Извините за оффтопик, но возник вопрос. Не знаете ли каким простейшим образом внести с помощью Tcl API blob(фотографию к примеру) в sqlite3 базу? И как потом считать? Искал везде, но так и не нашел простого примера как это можно сделать. Спасибо.

Печников Алексей комментирует...

Где-то не там искали. См. http://sqlite.org/tclsqlite.html


(C) Alexey Pechnikov aka MBG, mobigroup.ru