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

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

#include <ndbm.h>

#include <string.h>

#define TEST_DB_FILE "/tmp/dbm2_test"

#define ITEMS_USED 3

2. Теперь вам нужно внести изменения только в секцию извлечения:

 /* теперь попытайтесь удалить некоторые данные */

 sprintf(key_to_use, "bu%d", 13);

 key_datum.dptr = key_to_use;

 key_datum.dsize = strlen(key_to_use);

 if (dbm_delete(dbm_ptr, key_datum) == 0) {

printf("Data with key %s deleted\n", key_to_use);

 } else {

printf("Nothing deleted for key %s\n", key_to_use);

 }

 for (key_datum = dbm_firstkey(dbm_ptr);

key_datum.dptr;

key_datum = dbm_nextkey(dbm_ptr)) {

data_datum = dbm_fetch(dbm_ptr, key_datum);

if (data_datum.dptr) {

printf("Data retrieved\n");

memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);

printf("Retrieved item - %s %d %s\n",

item_retrieved.misc_chars, item_retrieved.any_integer,

item_retrieved.more_chars);

} else {

printf("No data found for key %s\n", key_to_use);

}

 }

}

Далее приведен вывод:

$ ./dbm2

Data with key bu13 deleted

Data retrieved

Retrieved item — Third 3 baz

Data retrieved

Retrieved item - First! 47 foo

Как это работает

Первая часть программы, идентичная предыдущему примеру, просто сохраняет данные в базе данных. Затем вы формируете ключ, соответствующий второму элементу, и удаляете этот элемент из базы данных.

Далее программа применяет функции

dbm_firstkey
и
dbm_nextkey
для обращения к каждому значению ключа по очереди и для извлечения соответствующих ключу данных. Обратите внимание на то, что данные извлекаются не по порядку. Перебор ключей по очереди не определяет никакого порядка извлечения данных, это просто способ просмотра всех элементов в базе данных;

Приложение для работы с коллекцией компакт-дисков

Теперь, когда вы узнали об окружении и управлении данными, самое время обновить приложение. Кажется, что база данных dbm хорошо подходит для хранения информации о компакт-дисках, поэтому воспользуйтесь ею как основой новой реализации.

Обновление проектного решения

Поскольку обновление предполагает значительную корректировку, сейчас самое время взглянуть на проектные решения, чтобы выяснить, не нуждаются ли они в пересмотре. Использование файлов с запятыми в качестве разделителей полей для хранения информации, хотя и обеспечивает легкую реализацию средствами командной оболочки, оказывается связанным со многими ограничениями. Во множестве заголовков компакт-дисков и дорожек встречаются запятые. Вы можете полностью отказаться от этого метода разделения, применив dbm, таким образом, у нас появился один компонент проектного решения, который придется менять.

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

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

Несмотря на то, что вы могли бы сохранить реализацию пользовательского интерфейса средствами библиотеки curses, вы вернетесь к построчной системе. Такой подход позволит сохранить часть приложения, связанную с пользовательским интерфейсом, маленькой и простой и сосредоточиться на других аспектах реализации.

С базой данных dbm вы не сможете применять язык SQL, но опишите новую базу данных с помощью более формальных терминов, используя терминологию языка SQL. Не волнуйтесь, если вы не знакомы с этим языком, мы поясним все определения, а в главе 8 вы узнаете о нем больше. В программном коде таблица может быть описана следующим образом:

CREATE TABLE cdc_entry (

 catalog CHAR(30) PRIMARY KEY REFERENCES cdt_entry(catalog),

 title CHAR(70),

 type CHAR(30),

 artist CHAR(70)

);

CREATE TABLE cdt_entry (

 catalog CHAR(30) REFERENCES cdc_entry(catalog),

 track_no INTEGER,

 track_txt CHAR(70),

 PRIMARY KEY(catalog, track_no)

);

Это очень краткое описание сообщает имена и размеры полей. В таблице

cdc_entry
у каждого элемента есть уникальный столбец каталога
catalog
. В таблице
cdt_entry
номер дорожки не может быть нулевым и комбинация столбцов
catalog
и
track_no
уникальна. Вы увидите их определение в виде структур
typedef struct
в следующем разделе программного кода.

Приложение управления базой данных компакт-дисков, использующее dbm

Поделиться:
Популярные книги

Пламенев. Книга IX

Карелин Сергей Витальевич
9. Пламенев
Фантастика:
аниме
уся
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Пламенев. Книга IX

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.50
рейтинг книги
Шайтан Иван 5

Я снова князь. Книга XXIII

Дрейк Сириус
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова князь. Книга XXIII

Лоенгрин, рыцарь Лебедя

Никитин Юрий Александрович
Фантастика:
фэнтези
боевая фантастика
5.50
рейтинг книги
Лоенгрин, рыцарь Лебедя

Бессонница (др.перевод)

Кинг Стивен
17. Темная Башня
Фантастика:
ужасы и мистика
8.33
рейтинг книги
Бессонница (др.перевод)

Облава на волка

Серегин Михаил Георгиевич
Детективы:
боевики
5.00
рейтинг книги
Облава на волка

Девятимечье. Тетралогия

Эльтеррус Иар
Фантастика:
фэнтези
6.80
рейтинг книги
Девятимечье. Тетралогия

Барон Бранд Берс. Том 1

Limonad
1. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 1

Я до сих пор не бог. Книга XXXVII

Дрейк Сириус
37. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор не бог. Книга XXXVII

Простолюдин

Рокотов Алексей
1. Путь князя
Фантастика:
боевая фантастика
рпг
5.25
рейтинг книги
Простолюдин

Избранное

Хоакин Ник
Мастера современной прозы
Проза:
современная проза
5.00
рейтинг книги
Избранное

Сумерки божков

Амфитеатров Александр Валентинович
1. Романы
Проза:
русская классическая проза
5.00
рейтинг книги
Сумерки божков

Дети немилости

Онойко Ольга
Фантастика:
фэнтези
7.00
рейтинг книги
Дети немилости

Тигриный лог

Чеснокова Юлия Олеговна
Детективы:
прочие детективы
7.00
рейтинг книги
Тигриный лог