Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 [ 160 ] 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

Особенности

NDBM

SDBM

GDBM

Программное обеспечение для связи

поставляется с Perl

Исходные тексты поставляются с Perl

Возможность распространения

исходных текстов

Доступность через FTP

Легкость построения

Нормально

Частое применение в UNIX

Нормальное построение в UNIX

Нормальное построение в Windows

Размер кода

Малый

Большой

Большой

Использование диска

Малое

Большое

Нормальное

Скорость

Низкая

Нормальная

Высокая

Ограничение размера блока

Шб"

Произвольный порядок байтов

Порядок сортировки, определяемый

пользователем

Поиск по неполному ключу

Применение кода с общей лицензией GPL в программах должно удовлетворять некоторым условиям.

За дополнительной информацией обращайтесь на jcweignu.og. См. библиотечный метод DB File. Требует символических ссылок. На некоторых компьютерах может входить в библиотеку совместимости с BSD.

* Кроме бесплатных версий UNIX - Linux, FreeBSD, OpenBSD и NetBSD. При наличии ANSI-компилятора С.

* До выхода единой версии 5.005 существовало несколько разных версий Perl для Windows-систем, включая стандартный порт, построенный по обычной поставке Perl, и ряд специализированных портов. DB, как и большинство модулей CPAN, строится только в стандартной версии.

Зависит от поставщика.

* Уменьшается при компиляции для одного метода доступа. " Зависит от поставщика.

По умолчанию, но может переопределяться (с потерей совместимости для старых файлов).

проблемы быстродействия, неактуальные для хешей в памяти. Рецепты 14.2 и 14.4 разъясняют суть этих проблем и показывают, как справиться с ними. С файлами DBM также можно выполнять операции, недоступные для обычных хешей. Два примера таких операций рассматриваются в рецептах 14.6 и 14.7.

Разные реализации DBM обладают разными возможностями. Старая функция dbmopen позволяла использовать лишь ту библиотеку DBM, с которой был построен Perl. Если вы хотели использовать dbmopen для чтения базы данных одного типа и записи в другой тип - считайте, что вам не повезло. Положение было исправлено в Perl версии 5, где появилась возможность связать хеш с произвольным классом объекта - см. главу 13 «Классы, объекты и связи».

В следующей таблице перечислены некоторые доступные библиотеки DBM.



14.1. Создание и использование DBM-файла

проблема

Вы хотите создать, заполнить, просмотреть или удалить значения из базы данных DBM.

NDBM присутствует в большинстве систем семейства BSD. GTDBM представляет собой GNU-реализацию DBM. SDBM входит в поставку XII и в стандартную поставку Perl. DB означает библиотеку Berkeley DB. Хотя остальные библиотеки фактически реализуют заново исходную библиотеку DB, код Berkeley DB позволяет работать с тремя разными типами баз данных и старается устранить многие недостатки, присущие другим реализациям (затраты дискового пространства, скорость и размер).

Строка «Размер кода» относится к размеру откомпилированной библиотеки, а строка «Использование диска» - к размеру создаваемых ей файлов баз данных. Размер блока определяет максимальный размер ключа или значения в базе. Строка «Произвольный порядок байтов» говорит о том, использует ли система баз данных аппаратный порядок следования байтов или создает переносимые файлы. Сортировка в пользовательском порядке позволяет сообщить библиотеке, в каком порядке должны возвращаться списки ключей, а поиск по неполному ключу позволяет выполнять приблизительный поиск в базе.

Большинство программистов Perl предпочитает берклиевские реализации. На многих системах эта библиотека уже установлена, и Perl может ей пользоваться. Другим мы рекомендуем найти эту библиотеку в CPAN и установить ее. Это заметно упростит вашу жизнь.

DBM-файлы содержат пары «ключ/значение». В терминологии реляционных баз данных вы получаете базу данных, которая содержит всего одну таблицу с двумя полями. В Рецепте 14.8 показано, как использовать модуль MLDBM с CPAN для хранения сложных структур данных в DBM-файлах.

При всех своих достоинствах модуль MLDBM не может преодолеть главное ограничение: критерием для извлечения записи является содержимое лишь одного столбца, ключа хеша. Если вам понадобится сложный запрос, могут возникнуть непреодолимые трудности. В таких случаях подумайте о специализированной системе управления базами данных (СУБД). Проект DBI содержит модули для работы с Oracle, Sybase, mSQL, MySCJL, Ingres и другими системами.

По адресам http: www.hermetica.com/technologia/perl/DBI/index.htmlvihttp: www.perl/com/CPAN/modules/by-category/07 Database Interfaces/BHa.croRmeeBpe-мя имеются следующие модули:

AcsiiDB DBIDb MLDBM OLE Pg Sybase

CDB File DBZ File Fame Msql ObjStore Postgres

DBD DB File Ingperl MySQL Oraperl Sprite XBase



14.1. Создание и использование DBM-файла 499

Решение

Воспользуйтесь функцией dbmopen или tie, чтобы открыть базу и сделать ее доступной через хэш. Затем работайте с хэшем, как обычно. После завершения работы вызовите dbmclose или untie.

dbmopen

use DB File; # необязательно; переопределяет

# стандартный вариант dbmopen %HASH, FILENAME, 0666 # открыть базу данных через %HASH or die "Cant open FILENAME; $!\n";

$V = $HASH{KEY}; # Получить данные из базы

$HASH{KEY} = VALUE; # Занести данные в базу

if (exists $HASH{KEY}) { # Проверить наличие данных в базе # ...

delete $HASH{KEY}; п Удалить данные из базы

dbmclose %HASH; # Закрыть базу данных

use DB File; # Загрузить модуль баз данных

tie %HASH, "DB File", FILENAME П Открыть базу даийых

or die "Cant open FILENAME: $!\n"; tt через %HASH

$V = $HASH{KEY}; tt Получить данные из базы

$HASH{KEY} = VALUE; tt Занести данные в базу

if (exists $HASH{KEY}) { tt Проверить наличие данных в базе «...

delete $HASH{KEY}; tt Удалить данные из базы

untie %hash; # Закрыть базу данных

Комментарий

Работа с базой данных через хэш отличается широкими возможностями и простотой. В вашем распоряжении оказывается хэш, состояние которого сохраняется и после завершения программы. Кроме того, он работает намного быстрее, чем хэш, полностью загружаемый при каждом запуске; даже если хэш состоит из миллиона элементов, ваша программа запустится практически мгновенно.

Программа из примера 14.1 работает с базой данных так, словно она является обычным хэшем. Для нее даже можно вызывать keys или each. Кроме того, для связанных DBM-хэшей реализованы функции exists и defined. В отличие от обычного хэша, для DBM-хеша эти функции идентичны.

Пример 14.1. userstats

#!/usr/bin/perl -w

tt userstats - вывод статистики о зарегистрированных пользователях. # При вызове с аргументом выводит данные по конкретным пользователям.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 [ 160 ] 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242