Литмир - Электронная Библиотека
Содержание  
A
A

<i>  printf(&quot;Data with key %s deleted\n&quot;, key_to_use);</i>

<i> } else {</i>

<i>  printf(&quot;Nothing deleted for key %s\n&quot;, key_to_use);</i>

<i> }</i>

<i> for (key_datum = dbm_firstkey(dbm_ptr);</i>

<i>  key_datum.dptr;</i>

<i>  key_datum = dbm_nextkey(dbm_ptr)) {</i>

  data_datum = dbm_fetch(dbm_ptr, key_datum);

  if (data_datum.dptr) {

   printf(&quot;Data retrieved\n&quot;);

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

   printf(&quot;Retrieved item - %s %d %s\n&quot;,

    item_retrieved.misc_chars, item_retrieved.any_integer,

    item_retrieved.more_chars);

  } else {

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

  }

 }

<i>}</i>

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

$ <b>./dbm2</b>

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

Сейчас заново вы создадите приложение, использующее базу данных dbm для хранения нужной вам информации, в виде файлов cd_data.h, app_ui.c и cd_access.c (упражнения 7.14–7.16).

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

Примечание

В последующих главах вы не раз встретитесь с заголовочным файлом базы данных cd_data.h и функциями из файла cd_access.c. Помните о том, что некоторые дистрибутивы Linux требуют немного отличающихся формирующих опций, например, применения в вашем файле на языке С заголовочного файла gdbm-ndbm.h вместо файла ndbm.h и опций

-lgdbm_compat -lgdbm
вместо просто опции
-lgdbm
. Если в вашем дистрибутиве Linux дело обстоит именно так, вы должны внести соответствующие изменения в файлы access.с и Makefile.

127
{"b":"285844","o":1}