Новые данные добавляются в конец данных, которые уже находятся в базе данных.
DP_DKEEP
База данных не модифицируется; функция
dpput
возвращает сбой, а параметру
dpecode
присваивается значение
DP_EKEEP
.
DP_DOVER
Вместо существующего значения записывается новое.
Функция
dpput
возвращает нулевое значение в случае возникновения ошибки (или если ключ уже существует, и было определено значение
DP_DKEEP
), и ненулевое значение, если данные для ключа были успешно обновлены.
25.4.2. Удаление записей
Удаление записей из базы данных осуществляется путем вызова функции
dpout
и передачи ей ключа, данные которого необходимо удалить.
int dpout(DEPOT * depot, const char * key, int keySize);
Заданный ключ и связанные с ним данные удаляются из базы, после чего возвращается ненулевое значение. Если для заданного ключа данные не существовали, возвращается нулевое значение. Как и для всех остальных функций, принимающих ключ, если параметр
keySize
равен
– 1
, то функция
dpout
использует
strlen
для определения длины ключа.
25.5. Пример
Для закрепления материала этой главы ниже приводится пример приложения, в котором задействовано большинство функциональных возможностей
qdbm
. Подразумевается, что в результате выполнения этого приложения будет создана простая база данных телефонных номеров, хотя ее можно использовать и для хранения любых простых пар "имя-значение". Приложение хранит базу данных в домашнем каталоге пользователя как
.phonedb
.
Флаг
– а
добавляет запись в базу данных. Если будет указан флаг
– f
, то любой существующий элемент будет заменен новыми данными. Следующий параметр представляет собой значение ключа, которое необходимо использовать, а последний параметр — собственно данные (номер телефона).
Флаг
– q
запрашивает в базе данных определенный ключ, который должен быть представлен другим указанным параметром. Записи удаляются из базы данных с помощью флага
– d
, который принимает значение ключа для удаления в другом параметре.
Если задать флаг
– l
, то будут перечислены все пары "ключ-значение", имеющиеся в базе данных.
Вот как выглядят пример использования
phones
.
$ ./phones -a Erik 374-5876
$ ./phones -a Michael 642-4235
$ ./phones -a Larry 527-7976
$ ./phones -a Barbara 227-2272
$ ./phones -q Larry
Larry 527-7976
$ ./phones -l
Larry 527-7976
Erik 374-5876
Michael 642-4235
Barbara 227-2272
$ ./phones -d Michael
$ ./phones -l
Larry 527-7976
Erik 374-5876
Barbara 227-2272
Эта программа выполняет определенные полезные действия, состоит менее чем из 200 строк исходного кода, и с успехом может применяться для работы с большим количеством пар "ключ-значение", четко раскрывая назначение библиотеки
qdbm
.
1: /* phones.с */
2:
3: /*
Программа реализует очень простую базу данных телефонных номеров.
4: Всю необходимую информацию по ее использованию можно найти в тексте. */
5:
6: #include <alloca.h>
7: #include <depot.h>
8: #include <errno.h>
9: #include <fcntl.h>
10: #include <stdio.h>
11: #include <stdlib.h>
12: #include <string.h>
13: #include <unistd.h>
14:
15: void usage(void) {
16: fprintf(stderr, "использование: phones -a [-f] <имя> <телефон>\n");
17: fprintf(stderr, " -d <имя>\n");
18: fprintf(stderr, " -q <имя>\n");
19: fprintf(stderr, " -l\n");
20: exit(1);
21: }
22:
23: /* Открыть базу данных $НОМЕ/.phonedb. Если writeable имеет ненулевое
24: значение, база данных открывается для обновления. Если writeable
25: равен 0, база данных открывается только для чтения. */