1、EDBS 简介基于 TRIP 数据库系统的电子文档的建库操作Introduction to Creation of E-files DataBase System in TRIP 2009-12-04文本数据的大批量装入 TRIP 数据库问题, TRIP 系统已经提供有现成的 TDBS(Text DataBase System)解决方案,只要把待装入的数据生成 tform 格式的文本文件,然后,或则调用、运行load/loadix 程序,或则进入 TRIP 系统通过后台菜单操作,即可将大批的数据倒入进 TRIP 系统。对于电子格式文档(E-formatted Files) ,如 Word、PD
2、F 、PPT , TRIP 亦提供现成的开发平台TRIPview,据此用户可以开发出自己的电子文档数据库系统(EDBS) ,在把电子文档装入数据库的一个string 字段的同时,还将文档中的文字内容抽取出来放在一个文本 text 字段,进行倒排处理,以实现对全文内容的快速查找,并显示出原有的文件格式。利用 TRIPview 来建立用户自己的 EDBS 系统需要一定的开发量。若对原文的内容需要进行查找的应用,TRIPview 是最好的选择,目前它可以处理多达 220 多种格式的电子文档。如果对原文内容不需要进行查找(例如是 jpg、 gif 等无文字内容的电子文件) ,亦即不需对原文件抽取文字内
3、容的情况,则不必用 TRIPview 而是利用 TRIPtoolkit 提供开发工具开发简单的应用程序,就可以将它们写进 TRIP记录中的 string 字段。下面介绍两种如何把电子文件写入 TRIP 数据库的方法,一种属于 B/S 方式,通过浏览器将一个或多个图片文件,一次一个记录的装进本地或远程的 TRIP 数据库,另一种是在 TRIP 服务器端(Server-side )批量的将文件写入 TRIP 数据库。前者通过 CGI(公共网关接口)程序调用TRIPtoolkit,后者直接访问 TRIP 底层,两者均用标准 C 语言开发,效率相当高。最后介绍如何利用CGI 程序对已有的记录,添加新的
4、电子文件或者替换旧有的的文件。数据库的字段约定(Conventions)与文字数据不同,一个电子文件存放在 TRIP 数据库记录中时,少则需两个字段多则需四个字段来描述。少则者一:存放文件名的词组 phrase 字段,二:存放全部文件内容信息的 string 字段。多则者第三:存文件大小的数值 int 字段,第四:存放从原格式文件抽取出来的文字内容的文本 text 字段。鉴于程序访问 TRIP 时往往是通过字段号来定位的, 本文介绍的程序对上述的文件名字段、文件大小字段以及 string 字段的段号安排均作了如下约定:如果文件名字段号取 n 的话,文件大小字段号则为 n+1,string 字段
5、号则为 n+2。因此用户在利用本程序进行数据库字段设计时务必遵循这一约定,否则程序不能正常运行。对于已经有内容的数据库,如果字段顺序不符合本约定,必须预先把数据库设计改变过来,才能使用此处介绍的程序继续给 TRIP 数据库追加电子文档。至于原先的数据(假定还没有string 字段的数据) ,需要编写一个输出格式把它生成 tform 文件,然后再装入结构已经更新的数据库。一、 B/S 模式的 EDBS 建库方法通过浏览器的上传表单和 Web 服务器上的 cgi 程序 upload,将本地数据(包括文字及二进制文件)装入 Web 服务器所在的 TRIP 数据库。每次只能上传、建成一个记录。要做的准
6、备工作是:制作上传表单;修改上传配置文件 upload.cfg;设置权限。1、制作上传表单上传表单是一个 HTML 文件 ,它可以从现用的上传文件复制、修改而成。它不仅用作录入数据的界面,即工作单,还用来控制上传的数据的走向,包括存入到库里的哪些字段,以及上传文件将存放在什么地方:是直接进入字段?还是存放在哪一个目录下。上传表单中有几行是专作上传控制用的,再有若干行作录入数据 用。命名 表单名最好与库名相同,这样给不同的数据库上传可采用不同的表单,实现各个库各自独特的设置要求。如上传的数据要写入 TRIP 的 bch 库,则上传表单名可定为 bch.html。该表单放在 web 服务器的文件根
7、目录下(在 Linux Apach 服务器情况下,/www/html/ 往往被设置成 web 文件的根目录) 。如下以 bch.html 为例对上传表单作一简要说明。控制行 带有“hidden”标签的 value 值,是控制上传行为用的:Base 值指定给哪个数据库上传,没有它则不知装给哪个数据库。DocRoot 定义上传文件将存放的目录,后面一定要用斜线结尾,否则文件将放在上一个目录,而上传文件名字也将改变。如无 DocRoot 的内容,上传文件将放在 upload.cfg 设定的目录。WriteStr 这行设置上传的文件要写进 TRIP 数据库的 STRING 字段,其 value 可不设
8、定,只要有name=WriteStr 的这一行,上传来的文件就会写入 STRING 字段中。若无此行,文件将存放在前述(DocRoot 或 upload.cfg 中 root)指定的目录中,并不写入 TRIP 数据库。如果需要记录上传的时间,则需加上如下一行:其中,name=date 表示要把上传的时间记录在数据库中编号为 n 的字段,当然设计数据库时要设立这字段,其字段名可随意定,程序会自动把上传的时间写入 n 字段中。数据录入行数据录入行将决定用户录入的数据将存到哪一个字段。录入的数据包括两种,一种是通过屏幕直接录入到 TRIP 字段中的文字数据,这包括文本字段、词组字段、数字、日期、时间
9、等,第二种是录入想要上传文件的文件名。文字数据字段录入行按照如下配置:字段的 name 必须是nf。此处 n 为数据库结构中该“字段名”的编号。注意这里并不用库中的字段名,而用字段号。在 TRIP 库中,一旦库结构被设计好后,字段名还是可以改变的,字段号就不能改。所以这里用字段号作 name。上传文件名字段的配置是:上述配置用于输写上传文件的文件名。上传文件在本地的路径及文件名将被上传到 TRIP 服务器,并存放在字段编号为 m 的 phrase 字段中。注意,上传表单的类型 file 和 TRIP 数据库的字段类型不是一回事,前者,是告诉 HTTP 要用 file 传输协议,后者是 TRIP
10、 数据库中存放上传来的文件名的字段。上传表单上的字段号 m 一旦被设定,将涉及到另外两个 TRIP 字段的设计。第一个是紧接着字段号 m 之后的 m+1字段,它用于存放文件的大小,字段数据类型需为数值 num 型。再下一个编号是 m+2 的字段,将存放上传文件的真正内容,类型为 STRING。在设计 TRIP 数据库结构时,上述三个字段的字段名可以随意设定,但字段的编号必须按照上述 m, m+1, m+2 的规则,这种约定是由上传程序 upload 规定的。上传表单(工作单)样例假定制作的表单要给 BCH 数据库的文字字段 1、2、3、4、5、6、9 写数据,还要上传原格式文件(文件名字段是
11、15), 那么设计成如下布局的表单即可:上述布局工作单的 html 代码如下:上传工作单 字段 1 字段 2 字段 3 字段 4 字段 5 中文名称 简介 图片说明 图片文件 2、修改上传配置文件 upload.cfg该文件放在 cgi-bin 的目录下,其名称必须和上传程序 upload 同名。亦即上传程序 upload 和配置文件 upload.cfg 是一一对应的,否则将出错。上传配置文件主要用来控制谁允许上传,上传数据放在什么地方,要不要把上传文件写入 TRIP 数据库。内容如下:Config = DefaultRoot = /data/FileMask = *IgnoreSubdir
12、s = YESOverWrite = yesWriteStrField = noOkPage = OkPage.htmlBadPage = BadPage.htmlDebug = 0IP = 168.160.111.111 中信所IP = 168.160.222.222 化工信息IP =此处也有 root 行和 WriteStrField 行。但它们只是上传表单的备用设置行,上传表单的设置优先。即上传表单已经设置过了的话,此处的设置则不起作用;上传表单上没有设置,则用此处的值。Upload 程序要调用的 OkPage.html 和 BadPage.html 文件放在 cgi-bin 目录下。I
13、P 行是控制上传工作站用的。只有此处列有的 IP 地址工作站才允许上传数据。如果从 cgi-bin 目录下的 upload 中考贝生成另外一个名为 upl 的程序,同样放在 cgi-bin 目录下,用来上传文件给 mybase 数据库,那么配置文件名应该取名 upl.cfg。上传表单的文件名改动与否均可,但其中的 程序名 upload 必须取名 upl,以便调用 upl 程序, 同时在中的 base 值应改为mybase,这是告诉 upl 要与数据库 mybase 打交道。3、权限设置此处涉及三个地方的权限设置。3.1 目录 上传程序首先将上传的文件存放在由上传表单中的 DocRoot 指定的
14、磁盘目录下,或者是由 upload.cfg 配置文件中 root 指定的目录下,因此该目录必须对 web 程序执行者赋予写的权限,否则文件将存不下来。web 程序的执行者是谁,要有 httpd.conf 文件中的定义而定,例如httpd, nobody, apache 或者是对 web 程序的执行者所在的小组。3.2 数据库 上传程序用了名叫 tripnet 的 TRIP 用户去访存 TRIP 系统。因此用户要上传的目标数据库必须给 tripnet 授予写的权限,否则上传的数据不会被 TRIP 系统接受。3.3 数据库文件 数据写入 TRIP 数据库是由 web 程序通过 TRIP 的授权用户
15、 tripnet 进行的。web 程序执行者(如 httpd)或者它所属的小组必须能够对该数据库的三个文件有写的权限。否则由于 Unix 的写保护,录入的数据将写不进 TRIP 数据库中。上传 C 程序 upload.c 的关键语句上传的数据分两部分,一是文字的、能用 ASCII 字符表示的,如各个字段的文字信息,包括上传文件名,文件大小等等,这些数据要形成 tform 格式,因为文字信息进入 TRIP 数据库最后都得通过 tform 文件的格式。另一部分是上传的文件,它将在服务器端临时存成一个文件。Tform 格式的文字信息要么用通过 TRIP 的菜单、要么通过系统命令 loadix 装入
16、TRIP 系统,或者通过程序写入。用 C 程序 upload.c 写入时,关键语句如下:TdbSetBase (rec_ctl, BaseName, 2); / 将数据库设置成可以写入TdbSetCursor ( / 把写指针指向整个记录TdbPutRecordBuffer (Cursor, TformBuf, BufLen, / 上面这一句将待写入的记录与将待写入的 tform 数据关联起来TdbSetCursor ( / 把写指针指向记录特定的 string 字段TdbImportBlob(Cursor, Path); / 把指针和待写入的文件(地址+文件名)关联起来TdbPutRecor
17、d (rec_ctl, 最后这一语句才是真正执行把 tform 格式的文字信息和上传的文件写入数据库。Rid 返回的是被写入的记录号。二、 批量 EDBS 数据处理在记录中已经有文字内容,但 string 字段还是空的,或者是 string 字段虽有内容但需补充或修改的情况下,就要利用程序 loadef (Loading E-files)来批量地给现有的记录装入电子文件。loadef 程序放在cgi-bin 目录下,要用时可以把它拷贝到工作目录中。程序要求的参数loadef 是用 C 语言编写的 TRIP 应用程序,运行时必须附带 3 个参数,用法是:loadef base_name TF_f
18、ilename Y|N2.1 第一参数: base_name 数据库名,指要往哪一个数据库追加电子文件。2.2 第二参数:TF_filename批次处理文件名。该文件包含一行行如下所示的 tform 格式的内容:5R16F/粮食作物/水稻病害/水稻恶苗病/ 水稻恶苗病1.JPG5R23F/粮食作物/水稻病害/水稻恶苗病/ 水稻恶苗病2.JPG5R30F/粮食作物/水稻病害/水稻恶苗病/ 水稻恶苗病3.JPG5R37F/粮食作物/水稻病害/水稻恶苗病/ 水稻恶苗病4.JPG上述每一行标识装入一个电子文件,第一行是把“水稻恶苗病 1.JPG”作为文件名写入记录 5 的16 字段,第二行是把“水稻恶
19、苗病 2.JPG” 作为文件名写入记录 5 的 23 字段,如此类推。Loadef会自动把电子文件名前面的目录名丢弃,只取文件名本身。同时,程序 loadef 在对每一行执行操作时会把二进制文件的大小和内容分别写进相对应的数值型字段(17、24、31、38)及 string 型字段(18、25、32、39) 。注意,TF_filename 文件以及文件中每行所标示的电子文件必须与 loadef 程序处于同一目录,否则将出现找不着文件的错误。2.3 第三参数:Y|N 原有的名可能带有一系列的目录名称,选此参数为 Y 表示用现有的文件名去替换原有的数据;选N 时表示不覆盖原有数据,而是将现有的文件
20、名加在原有文件的末尾,彼此用“|”号隔开。TF_filename 的生成为避免编辑引起的错误,loadef 程序所需的 TF_filename 应从 base_name 所指的数据库中通过输出格式生成。以数据库 BCHLL 为例,所需的输出格式列举如下:RFdt1name dt2name dt3name dt4name dt5name dt6name dt7name dt8name dt9name dt10name上面输出格式将每一字段(即每个文件名)输出一行。格式的第一行将形成: 记录号 R字段号 F; 第二行是每个字段结束时写;第三、四行表示输出字段内容(文件名) ,只要所列的字段有文件名
21、存在,便(连同第一、二行)输出数据,如果没有内容,第一、二行也不输出。该格式可拷贝给别的数据库,用于其他数据库时,只需更换第三、四行的电子文件名称即可。Loadef.c 程序的关键语句loadef 是 C 语言程序,除了启动 TRIP,打开数据库等通用的语句外不再赘述外,特列出如何插入新的图片的语句:TdbGetRecordInBase (rec_ctl, rid); /锁定要插入图片的记录TdbCheckField (rec_ctl, fieldname, if (strstr(argv3, “Y“) | (strstr(argv3, “y“) /覆盖原有的图片名和写入图片大小sprintf
22、(TformBuf, “%dF0F%s%dF%s“, FieldNo, filename, FieldNo+1, fsize);else /在原有的图片名后写入新的图片名和写入图片大小sprintf(TformBuf, “%dF|%s%dF%s“, FieldNo, filename, FieldNo+1, fsize); BufLen=strlen(TformBuf); / 量出 tform 数据的长度TdbSetCursor ( / 把写指针指向整个记录,以下面这条命令把 tform 格式数据写入库TdbPutRecordBuffer(Cursor, TformBuf, BufLen, T
23、dbSetCursor ( / 把写指针指向整个 string 字段TdbImportBlob(Cursor, filename); / 将上传来的图形文件与指针联系起来 (尚未写入)TdbPutRecord (rec_ctl, / 正式输入图形数据内容三、 通过浏览器修改已有的记录前面介绍的 B/S 模式的 EDBS 建库方法只能每上传一次便生成一个新的记录,而批量 EDBS 数据处理方法又是针对批量记录的,而且必须登录到服务器去执行命令行程序。假如要对现有个别记录的某些字段添加新的数据,特别是添加图片,则也可以通过浏览器,即采用 B/S 的工作模式调用 CGI 程序来实现。为此目的,要在上
24、传表单上增加如下一行标签,用于人工输入待修改记录的记录号:RecordNo: 上面的标签名 recordid 将告诉上传程序 upload,上传来的数据是属于 recordid 指定的记录,而非去生成新的记录。因此,程序 upload 在遇到有 recordid 值时,在写数据之前,先按照这个记录号去数据库中锁定该记录,然后再把传上来的数据写进去,如果上传表单中没有 recordid 值,程序无法去锁定已存在的记录,便自动当作新记录来处理。但目前程序只能对图片文件实现添加、替换,而对文字字段只能添加,不能替换,亦即新的数据将写入下一个子字段(phrase 字段) ,或追加到数据的末尾(text
25、 字段) 。如果要替换,需要生成的 tform 格式文件必须能够将现有数据先行清除,然后再插入,例如,要对第 20 字段的数据先删后加上“New information”的 tform 格式是: 20f0fNew information。Upload.c 程序相关语句:TdbSetBase (rec_ctl, BaseName, 2); / 将数据库设置成可以写入if (stricmp(FieldName, “recordid“) = 0) Rid=atoi(ContentAsString); /判定若有 recordid,则取出记录号 Ridif (Rid) TdbGetRecordInBase (rec_ctl, Rid); / 按给定记录号锁定记录;若不锁定,下句视为插入新记录TdbSetCursor ( / 把指针指向整个记录TdbPutRecordBuffer (Cursor, TformBuf, BufLen, / 上面这一句将待写入的记录与将待写入的 tform 数据关联起来TdbSetCursor ( / 把写指针指向记录特定的 string 字段TdbImportBlob(Cursor, Path); / 把指针和待写入的文件(地址+文件名)关联起来TdbPutRecord (rec_ctl, / 最后将 ASCII 和电子文件写入 TRIP 数据库