Trabalho 1 Bd2
本活动旨在通过读取元数据文件和数据文件,模拟执行“select * from table”操作。 为此,将提供三个文件:一个包含表的元数据(table.dic),另一个包含属性的元数据(att.dic),还有一个包含table.dic中某张表的数据(11.dat)。
T1 - 数据文件读取
本任务涉及读取元数据和数据文件,以模拟 SELECT * FROM table 操作。 为此将提供三个文件:一个包含表元数据(table.dic),另一个包含属性元数据(att.dic),第三个则包含 table.dic 中列出的某张表的实际数据(例如 11.dat)。
+-----------+ idtable +---------+
| table.dic |---------------<| att.dic |
+-----------+ +---------+
编写一个 C 应用程序,实现以下功能:
- 程序执行时,必须接收一个参数(字符串),该参数对应数据库中的逻辑名称(表)。例如,如果程序名为
select,则(在 Linux 系统上)命令行输入应为./select table。 执行结果应等同于SELECT * FROM table这一 SQL 查询。 - 应用程序将在
table.dic中搜索作为参数传递的表名;若找到,则必须以读取模式打开对应于该表物理名的文件。table.dic的结构如下:
struct ttable {
int idtable; // 表的 ID
char ctname[20]; // 概念表名
char ptname[20]; // 物理表名
}
- 如果在
table.dic中找到了逻辑名称,则必须打开att.dic文件以获取文件模式。其组织结构如下:
struct tatt {
int idtable; // 表的 ID
char atname[20]; // 属性的名称
char attype; // S(字符串) I(整数) F(浮点数)(C 字符)
char isKey; // 1 表示为主键
char atopt; // 必填(0) 可选(1)
int atlen; // 长度
}
请提交一个包含生成的源代码的 ZIP 文件(建议使用单独的 .h 和 .c 文件),或者如果所有内容都包含在一个文件中,则只需提交该源文件。ZIP 文件或源文件的名称必须是您的学号。示例:
假设有一个 table.dic 实例,其中包含
<1, "car", "xyz.dat">, <2, "owner", "d001.dat">,以及
一个 att.dic 实例,其中包含
<1, "model", 'S', 1, 0, 30>, <1, "year", 'I', 0, 0, 4>,
<2, "issn", 'S', 1,0, 12>, <2, "name", 'S', 0, 0, 30>
如果应用程序名称为 selectDB,则在 Linux 上的执行命令为 ./selectDB owner(其中“owner”对应于表名——即逻辑名)。
文件 d001.dat 将包含符合 att.dic 文件中表 ID 2(“owner”)对应模式的数据:具体来说, “issn”(12个字符的字符串,必填且为主键)和“name”(30个字符的字符串,必填,非主键)。
最后,必须列出物理文件(d001.dat)的内容。 为简化处理,您无需处理可选属性,因为所有属性都将被视为必填项。建议的输出格式:
issn name
002322 约翰·韦恩
230011 安东尼·霍普金斯
450001 葛丽泰·嘉宝
对于本次任务,table.dic 和 att.dic 存储了“student”、“course”和“enrollment”这三个表的元数据。 目前仅提供了“student”表的物理文件。请使用该表进行测试。在评分过程中,除“student”表外,我们还将使用“course”和“enrollment”表。
