Чтение онлайн

ЖАНРЫ

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:
DP_DCAT
Новые данные добавляются в конец данных, которые уже находятся в базе данных.
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, база данных открывается только для чтения. */

 26: DEPOT * openDatabase(int writeable) {

 27: DEPOT * dp;

 28: char * filename;

 29: int flags;

 30:

 31: /* Установить режим открытия */

 32: if (writeable) {

 33: flags = DP_OWRITER | DP_OCREAT;

 34: } else {

 35: flags = DP_OREADER;

 36: }

 37:

 38: filename = alloca(strlen(getenv("HOME")) + 20);

 39: strcpy(filename, getenv("HOME"));

 40: strcat(filename, "/.phonedb");

 41:

 42: dp = dpopen(filename, flags, 0);

 43: if (!dp) {

 44: fprintf(stderr, "сбой при открытии %s: %s\n", filename,

 45: dperrmsg(dpecode));

 46: return NULL;

 47: }

 48:

 49: return dp;

 50: }

 51:

 52: /* добавить новую запись в базу данных; произвести

 53: прямой разбор аргументов командной строки */

 54: int addRecord(int argc, char ** argv) {

 55: DEPOT * dp;

 56: char * name, * phone;

 57: int rc = 0;

 58: int overwrite = 0;

 59: int flag;

Поделиться с друзьями: