阅读 80

数据管理(八)--CD程序

CD程序

我们已经了解了环境以及管理数据的相关内容了,现在是更新程序的时候了。dbm数据库看起来对于存储我们的CD信息是十分合适的,所以我们会将dbm数据用作我们的新实现的基础。

更新设计

因为这次更新涉及到一个重要的代码重写,所以现在我们需要看一下我们的设计描述以确定是否需要修改。使用以逗号分隔的可以变化的文件来存储信息,尽管在Shell中很容易实现,但是已经证明是十分严格的了。大量的CD标题以及音轨信息在其中需要大量的逗号。如果我们使用dbm就可以放弃这种分隔方法,所以这是我们的设计需要修改的一个元素。

使用单独的文件来分离标题与音轨之间的信息,看起来是一个好主意,所以我们也会使用这个逻辑安排。

前面的实现看起来在某种程序上将程序的访问部分与用户接口部分相混合,至少是因为他们都在一个单独的文件中实现。在这个实现中,我们使用一个头文件来描述数据访问所需要的数据以及方法,并且将用户接口与数据操作实现在另一个单独的文件中。

尽管我们可以继续保持用户接口的curses实现,但是我们会回归到一个简单的基于命令行的系统。这会使得程序的用户接口部分更为矮小和简单,并且允许我们关注于其他的实现部分。

尽管我们在dbm代码中不能使用SQL,但是我们可以使用SQL术语以及更为通常的方式来表达我们的新数据库。如果我们不熟悉SQL也不要担心;我们会解释这些定义。我们将会在第八章了解更多有关SQL的内容。在代码中,数据表可以用下面的方法来描述:

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表,他告诉我们对于每一个实现记录都有一个唯一的类别。对于cdc_entry表,他告诉我们音轨信息号不可以为0,而且catalog与track_no的组合是唯一的。

使用dbm的CD数据库程序

我们现在将要使用dbm数据来实现我们的程序从而存储我们需要的信息,使用的文件为cd_data.h,app_ui.c以及cd_access.c。

我们同时要将我们的用户界面重写为一个命令行程序。在这本书的后面部分,当我们探讨使用不同的客户/服务器机制来实现在我们的程序,以及最后使用Web浏览器跨越网络来访问程序时,会重用这个程序的数据库接口以及部分用户接口。将接口转换为一个简单的命令行驱动的接口可以很容易的使得我们的关注于程序的重要部分,而不是接口。

下面我们将要探讨的是头文件cd_data.h以及在后面的章节中cd_access.c中几次重用的函数。

试验--cd_data.h

我们会由头文件开始,定义我们数据的结构,以及我们将会用于访问数据的函数。

1 这是为CD数据库而定义的数据结构。他定义了组成数据库的两个数据表的结构以及尺寸。我们将会由定义我们将会用到的数据域的尺寸以及两个结构开始:一个结构用户类别记录,而另一个用于音轨记录。

/* The catalog table */
#define CAT_CAT_LEN       30
#define CAT_TITLE_LEN     70
#define CAT_TYPE_LEN      30
#define CAT_ARTIST_LEN    70
typedef struct {
    char catalog[CAT_CAT_LEN + 1];
    char title[CAT_TITLE_LEN + 1];
    char type[CAT_TYPE_LEN + 1];
    char artist[CAT_ARTIST_LEN + 1];
} cdc_entry;
/* The tracks table, one entry per track */
#define TRACK_CAT_LEN     CAT_CAT_LEN
#define TRACK_TTEXT_LEN   70
typedef struct {
    char catalog[TRACK_CAT_LEN + 1];
    int track_no;
    char track_txt[TRACK_TTEXT_LEN + 1];
} cdt_entry;

2 现在我们有了一些数据结构,我们可以定义我们将会用到的访问函数了。以cdc_开始的函数用于类别记录;而以cdt_开始的函数则用于音轨记录。

/* Initialization and termination functions */
int database_initialize(const int new_database);
void database_close(void);
/* two for simple data retrieval */
cdc_entry get_cdc_entry(const char *cd_catalog_ptr);
cdt_entry get_cdt_entry(const char *cd_catalog_ptr, const int track_no);
       /* two for data addition */
       int add_cdc_entry(const cdc_entry entry_to_add);
       int add_cdt_entry(const cdt_entry entry_to_add);
       /* two for data deletion */
       int del_cdc_entry(const char *cd_catalog_ptr);
       int del_cdt_entry(const char *cd_catalog_ptr, const int track_no);
       /* one search function */
       cdc_entry search_cdc_entry(const char *cd_catalog_ptr, int *first_call_ptr);

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐