專(zhuān)利名稱(chēng)::用于sql關(guān)系數(shù)據(jù)庫(kù)的仿真器的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種提供SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言)關(guān)系數(shù)據(jù)庫(kù)函數(shù)的子集給現(xiàn)存的應(yīng)用程序的方法。現(xiàn)在仍然存在著大量的商業(yè)上可用的具有SQL界面的關(guān)系數(shù)據(jù)庫(kù),提供了詳盡的函數(shù)集,但是,它們需要非常高的硬件資源消耗。因此,為具有包括商業(yè)的SQL關(guān)系數(shù)據(jù)庫(kù)在內(nèi)的軟件平臺(tái)的某一計(jì)算機(jī)所編寫(xiě)的計(jì)算機(jī)程序,對(duì)于那些具有簡(jiǎn)化的硬件配置的計(jì)算機(jī)來(lái)說(shuō)往往是不適合的。在過(guò)去,許多現(xiàn)存的應(yīng)用程序不得不被重寫(xiě)以使得它們能夠與設(shè)備上存在的專(zhuān)有數(shù)據(jù)庫(kù)相接口。此外,專(zhuān)有數(shù)據(jù)庫(kù)通常與設(shè)備相關(guān),而且在其它設(shè)備上不能用于實(shí)現(xiàn)相同應(yīng)用或其它的應(yīng)用程序。當(dāng)將在不同的硬件和軟件平臺(tái)上開(kāi)發(fā)的現(xiàn)存的應(yīng)用程序移植到,具有簡(jiǎn)化的硬件配置的設(shè)備,例如通信服務(wù)器、其它網(wǎng)絡(luò)設(shè)備等,并使用一個(gè)SQL關(guān)系數(shù)據(jù)庫(kù)的時(shí)候,應(yīng)用程序開(kāi)發(fā)者所面對(duì)的主要問(wèn)題之一是需要重寫(xiě)部分應(yīng)用程序以使得它們能夠與設(shè)備上存在的專(zhuān)有數(shù)據(jù)庫(kù)相接口,否則應(yīng)用程序不能被使用或者必須被完全重寫(xiě)。有時(shí),目的設(shè)備的硬件資源的可用率減小,因?yàn)榘惭b了其它消耗資源的應(yīng)用程序(例如,象ISO/OSI棧協(xié)議,TCP/IP和其它的通訊軟件),并且因?yàn)樯逃肧QL關(guān)系數(shù)據(jù)庫(kù)硬件資源消耗非常大,所以理想的是避免安裝它,例如在向一個(gè)或多個(gè)通訊服務(wù)器移植一個(gè)應(yīng)用程序的情況下。應(yīng)該認(rèn)識(shí)到一個(gè)運(yùn)行在具有任何配置的任何設(shè)備上的SQL數(shù)據(jù)庫(kù)是必要的,以達(dá)到在沒(méi)有安裝一個(gè)商用數(shù)據(jù)庫(kù)的時(shí)候、應(yīng)用程序使用一個(gè)SQL數(shù)據(jù)庫(kù)來(lái)被移植到一個(gè)設(shè)備上并且正確地工作。本發(fā)明的一個(gè)目標(biāo)是提供移植的一種方法和裝置,提供一組SQL數(shù)據(jù)庫(kù)函數(shù)給在任一設(shè)備上的一個(gè)存在的應(yīng)用程序,而硬件資源無(wú)需大的消耗。本目標(biāo)是通過(guò)具有依據(jù)權(quán)利要求1的特性的方法和依據(jù)權(quán)利4的移植裝置來(lái)實(shí)現(xiàn)的。要求保護(hù)的發(fā)明使應(yīng)用一個(gè)SQL數(shù)據(jù)庫(kù)的用戶(hù)軟件應(yīng)用程序能夠僅僅通過(guò)拷貝、再編譯和執(zhí)行應(yīng)用程序文件,而無(wú)需任何源代碼的修改就可移植到任何簡(jiǎn)化的硬件配置上,在該硬件配置上,不能安裝商用的消耗資源的SQL關(guān)系數(shù)據(jù)庫(kù)。通過(guò)使用本發(fā)明,避免了修改已有的源代碼所浪費(fèi)的時(shí)間,在有些時(shí)候,這樣的源代碼是不容易修改的,而且浪費(fèi)很大的精力。此外,有些時(shí)候,節(jié)省硬件資源以用于其它運(yùn)行時(shí)間的應(yīng)用程序更為可取,在這些情況下,本發(fā)明的仿真器目標(biāo)在配置階段就能夠節(jié)省資源。此外,仿真器能夠被定做以用在任何不同的設(shè)備上的不同平臺(tái)上。本發(fā)明的另外的有利的特性被定義在子權(quán)利要求中。有利的是,用戶(hù)數(shù)據(jù)的安全性能夠被保證,在必要時(shí),通過(guò)使用一個(gè)加密/解密模塊來(lái)訪問(wèn)數(shù)據(jù)文件。本發(fā)明將在下面通過(guò)例子,參考附圖被詳細(xì)的描述,其中圖1顯示了在一個(gè)移植階段仿真器的使用;圖2列舉了組成仿真器的軟件體系結(jié)構(gòu)的所有組成部分;圖3顯示了如何將一句SQL語(yǔ)句轉(zhuǎn)化為一個(gè)接口函數(shù),然后再將接口函數(shù)翻譯為一系列訪問(wèn)ASCII文件的仿真庫(kù)函數(shù);圖4顯示了如何實(shí)現(xiàn)將一句SQL語(yǔ)句轉(zhuǎn)化為一個(gè)接口函數(shù),該接口函數(shù)然后被翻譯為一系列訪問(wèn)ASCII文件的仿真庫(kù)函數(shù)的;圖4-B是圖4的一個(gè)特殊例子;圖5顯示了用于管理電話(huà)網(wǎng)絡(luò)的一個(gè)系統(tǒng),該系統(tǒng)使用了包括了能夠?qū)崿F(xiàn)本發(fā)明的簡(jiǎn)化了硬件配置的通信服務(wù)器的LAN網(wǎng)絡(luò)來(lái)實(shí)現(xiàn);并且圖6顯示了增加的網(wǎng)絡(luò)拓?fù)涞囊粋€(gè)例子,該網(wǎng)絡(luò)拓?fù)浒四軌驅(qū)崿F(xiàn)本發(fā)明的簡(jiǎn)化了硬件配置的通信服務(wù)器。本發(fā)明集中在一個(gè)數(shù)據(jù)庫(kù)仿真方法,如圖1所示。在下面,將把注意力特別集中在向需要數(shù)據(jù)庫(kù)的應(yīng)用程序所提供的服務(wù),盡管應(yīng)該理解,仿真器可能實(shí)現(xiàn)一個(gè)不同的函數(shù)集,它將是為了能夠工作應(yīng)用程序所要求的最小的數(shù)量。根據(jù)本發(fā)明,給定了通過(guò)使用仿真器1,以一種不同的方式提供一個(gè)SQL商用數(shù)據(jù)庫(kù)的性能的一種初始的方法。所述的仿真器是一個(gè)模塊數(shù)據(jù)庫(kù)為了減少硬件資源的消耗,特別是內(nèi)存和CPU時(shí)間的消耗,僅僅那些為滿(mǎn)足一個(gè)現(xiàn)存的用戶(hù)應(yīng)用程序An的要求所需要的函數(shù)才被配置和安裝,以實(shí)現(xiàn)最大的靈活性。仿真器通過(guò)使用函數(shù)的模塊庫(kù)和預(yù)定義的數(shù)據(jù)結(jié)構(gòu)來(lái)管理配置和用戶(hù)數(shù)據(jù)ASCII文件F1…Fn。簡(jiǎn)單的模塊結(jié)構(gòu)使配置的升級(jí)和維護(hù)較容易,以達(dá)到在考慮到應(yīng)用程序的要求和設(shè)備的硬件配置后減小仿真器的大小的目的。所述的應(yīng)用程序An例如是在第一個(gè)硬件平臺(tái)HW1上被開(kāi)發(fā)的,HW1通過(guò)軟件配置SW1將應(yīng)用程序An與SQL關(guān)系數(shù)據(jù)庫(kù)相接口,并且該應(yīng)用程序被假定在第二個(gè)硬件平臺(tái)HW2上使用,其中在HW2上不能得到SQL數(shù)據(jù)庫(kù),因此SW1也是不可用的。仿真器1的軟件體系結(jié)構(gòu)如圖2所示。仿真器1包括下面幾個(gè)部分一個(gè)接口模塊M1,向應(yīng)用程序提供SQL接口(它代替SW1平臺(tái))。這個(gè)模塊程序與應(yīng)用相關(guān),并且應(yīng)該依據(jù)所使用的SQL語(yǔ)句的類(lèi)型,特別是具有復(fù)雜語(yǔ)法的查詢(xún)語(yǔ)句,來(lái)定做。它包括一個(gè)函數(shù)集,每一個(gè)函數(shù)對(duì)應(yīng)于應(yīng)用程序An所使用的一個(gè)特定的SQL語(yǔ)句;一個(gè)模塊仿真器庫(kù)M2,是可擴(kuò)展的并且與應(yīng)用程序無(wú)關(guān),它包括一個(gè)函數(shù)集執(zhí)行由M1所調(diào)用的在ASCH文件之上的基本操作,以實(shí)現(xiàn)應(yīng)用An所使用的SQL語(yǔ)句;-一個(gè)錯(cuò)誤管理模塊(圖中未顯示);-一個(gè)加密模塊(不是必須有的);-配置ASCII文件,包括數(shù)據(jù)庫(kù)和表定義F1…Fm-1;和-ASCII用戶(hù)數(shù)據(jù)文件Fm…Fn(它可能被加密),它包括依據(jù)表定義所插入的用戶(hù)數(shù)據(jù)。仿真器管理包括有表定義和用戶(hù)應(yīng)用數(shù)據(jù)的大量的ASCII文件。出于安全性的原因可以選擇將數(shù)據(jù)加密。使用仿真器,與存在的SQL數(shù)據(jù)庫(kù)相比,所指定的CPU時(shí)間、RAM的數(shù)量和所要求的硬盤(pán)的兆字節(jié)數(shù)都將大大的減少。SQL關(guān)系數(shù)據(jù)庫(kù)仿真器向用戶(hù)應(yīng)用程序提供了一個(gè)包含有一個(gè)函數(shù)集的模塊庫(kù)以-生成SQL表和定義字段;-存儲(chǔ)、修改并刪除在已生成的表上的數(shù)據(jù),其中依據(jù)字段定義進(jìn)行類(lèi)型檢查;并且-通過(guò)使用SQL篩選程序檢索這樣的數(shù)據(jù);仿真器以?xún)煞N方式執(zhí)行SQL指令1.定義數(shù)據(jù)庫(kù)結(jié)構(gòu),能夠通過(guò)使用一個(gè)編輯器更新配置文件以實(shí)現(xiàn)下面的表配置指令×生成表×修改表配置×撤消表×描述·插入行以預(yù)先集中表2.使用定義的數(shù)據(jù)庫(kù),通過(guò)使用如圖3所示的模塊接口函數(shù)IFIFn來(lái)實(shí)現(xiàn)表內(nèi)容的運(yùn)行時(shí)間的修改選擇行;插入一個(gè)行;刪除行;更新一個(gè)行。這個(gè)描述將被繼續(xù)作為一個(gè)SQL數(shù)據(jù)庫(kù)的一個(gè)例子來(lái)采用,該數(shù)據(jù)庫(kù)的服務(wù)將被仿真。在繼續(xù)本發(fā)明的詳細(xì)的描述之前,概括出表配置階段的某些相關(guān)方面將是有幫助的。下面將描述以下的SQL語(yǔ)句被處理的方式生成表(II),修改表配置(改變/撤消/生成)(I,III,II),刪除(改變/撤消)(I,III),描述(IV),插入行以預(yù)先集中表(V)。前面所說(shuō)的語(yǔ)句的SQL語(yǔ)法如下I)修改一個(gè)數(shù)據(jù)庫(kù)ALERTDATABASE數(shù)據(jù)庫(kù)名;II)定義一個(gè)新的表結(jié)構(gòu)CREATETABLE表名(字段名1NUMBER(9),字段名2CHAR(14));III)刪除一個(gè)表DROPTABLE表名IV)看表的定義DESC表名V)數(shù)據(jù)插入作為缺省INSERTINTO表名(域名1,域名2)VALUES(‘域值1’,‘域值2’);上面所提到的SQL語(yǔ)句能夠通過(guò)使用一個(gè)ASCII配置文件來(lái)被仿真,該文件是通過(guò)使用一個(gè)編輯器來(lái)書(shū)寫(xiě)和修改。對(duì)于每一個(gè)新表,生成一個(gè)ASCII文件。每一個(gè)行定義一個(gè)表的列。下面是在仿真器表配置ASCII文件上的表的例子,其中第一部分是表結(jié)構(gòu)定義,第二部分是作為缺省插入的用戶(hù)數(shù)據(jù)。字符“|”,“-”和“*”用作分隔數(shù)據(jù)。字符“#”表示有一個(gè)注釋行。在第一部分定義了表結(jié)構(gòu)。包含在H…H之間的數(shù)據(jù)表示表的定義,每一個(gè)以C開(kāi)始的行都是定義的表的一個(gè)列。為每一個(gè)表列定義的指定的參數(shù)為×類(lèi)型,×長(zhǎng)度,×是否字段能夠?yàn)榭?,×是否字段是唯一的訪問(wèn)記錄的索引。在這個(gè)例子的第二個(gè)部分具有數(shù)據(jù)的行被插入到表中。依據(jù)以前的表定義,執(zhí)行一個(gè)類(lèi)型檢查。<prelisting-type="program-listing"><![CDATA[ # #TableASH_states # HThistablehas4columns|4| # CApplicationServiceId.|NUMBER|3|NOTNULL|UNIQUEINDEX| CApplicationEntityId.|CHAR|32|NOTNULL|UNIQUEINDEX CSequenceNumber|NUMBER|3|NOTNUL|UNIQUEINDEX CStateName|CHAR|20|NOTNULL| H #------------------------------- *1|dh_1|0|IDLE| *1|dh_1|1|START_INT_DIAL_PEND| *1|dh_1|2|INT_DIAL_EXP| *1|dh_1|3|INT_DLAL_PEND| *1|dh_1|4|WAIT_FOR_CONT| *1|dh_1|5|WAIT_FOR_LAST| *1|dh_1|998|PROVIDER_ABORT| *1|dh_1|999|SUCCESFUL_COMPLETED| #---------------------------- *2|bh_1|0|IDLE| *2|bh_1|1|COMMAND_EXPECTED|*2|bh_1|998|PROVIDDER_ABORT| *2|bh_1|999|SUCCESFUL_COMPLETED| #----------------------------]]></pre>熟練的技術(shù)人員應(yīng)意識(shí)到還存在其它的配置模式。為了進(jìn)一步的解釋?zhuān)苯訁⒖紙D3,它是圖解形式。包括在用戶(hù)應(yīng)用程序中的一條SQL語(yǔ)句,激活了一個(gè)仿真器接口函數(shù)IFi,該函數(shù)依據(jù)特定的SQL語(yǔ)句,調(diào)用一系列用于訪問(wèn)包含有用戶(hù)數(shù)據(jù)的ASCII文件AF1…AFk的仿真庫(kù)函數(shù)LF1…LFm。例如,當(dāng)SQL語(yǔ)句INSERTINTOTab2(字段名1,字段名2)VALUES(‘字段值1’,‘字段值2’);被用戶(hù)應(yīng)用程序An調(diào)用時(shí),激活了INSERT仿真器接口函數(shù)IF1;它調(diào)用一系列仿真庫(kù)函數(shù),這些仿真庫(kù)函數(shù)訪問(wèn)包含有用戶(hù)數(shù)據(jù)的Tab2ASCII文件AF2,下面將詳細(xì)的予以解釋。下面是另一個(gè)例子當(dāng)SQL語(yǔ)句SELECTFROMTab2被用戶(hù)應(yīng)用程序An調(diào)用時(shí),激活了SELECTn仿真器接口函數(shù)IFn;它調(diào)用一系列仿真庫(kù)函數(shù)的序列,這些仿真庫(kù)函數(shù)用于訪問(wèn)Tab2ASCII文件??梢缘玫教峁┖瘮?shù)LF1…LFm集的一個(gè)模塊仿真器庫(kù)。所述的函數(shù)的子集能夠被組合以實(shí)現(xiàn)一個(gè)SQL語(yǔ)句。下面是庫(kù)函數(shù)的一個(gè)例子<prelisting-type="program-listing"><![CDATA[ F1_get_table_descr F2_open_table F3_close_table F4_search_first_row F5_search_next_row F6_fetch_row_at_curr_pos F7_fetch_row_at_abs_pos F8_write_rowF9_delete_row F10_refresh_table_file]]></pre>下面將提供每一個(gè)函數(shù)的詳細(xì)的描述。在圖4中詳細(xì)的顯示了前面所列出的并在圖3中顯示的接口函數(shù)IF1IFn中一個(gè)的實(shí)現(xiàn)的過(guò)程。所述的函數(shù)被轉(zhuǎn)換為一系列訪問(wèn)ASCII文件的仿真庫(kù)函數(shù)LF1LFm。在函數(shù)IFi的數(shù)據(jù)區(qū)內(nèi)定義了表描述A和訪問(wèn)描述B;它們被作為一個(gè)記錄的數(shù)組來(lái)實(shí)現(xiàn),其中對(duì)于每一個(gè)數(shù)據(jù)庫(kù)表列都有一個(gè)元素。表描述A由下面的配置數(shù)據(jù)組成1=列類(lèi)型,2=列長(zhǎng)度,3=字段是否能為空,4=字段是否為訪問(wèn)記錄的索引。訪問(wèn)描述B包括依據(jù)初始的SQL語(yǔ)句類(lèi)型的訪問(wèn)類(lèi)型和方式。它包括下面的數(shù)據(jù),由仿真器接口函數(shù)Ifi依據(jù)SQL語(yǔ)句使用哪一列來(lái)填充。1=使用標(biāo)記來(lái)指示是否該列被使用(T=是,F(xiàn)=否),2=串大小,下面的字段讀/寫(xiě)操作的結(jié)果(由_fetch_row寫(xiě)或由_write_row讀)3=一個(gè)標(biāo)記用于指示是否該字段能夠?yàn)榭?T=true是,F(xiàn)=false否),4=一個(gè)標(biāo)記用于指示是否該字段包括一個(gè)數(shù)字值,5=一個(gè)標(biāo)記用于指示是否該字段包括一個(gè)數(shù)字字母值(char=字符/ptr=指針)。第一個(gè)在RAM存儲(chǔ)器中執(zhí)行的操作是_get_table_description函數(shù)激活以從數(shù)據(jù)文件中檢索用戶(hù)表定義并將它拷貝到表描述A中。接下來(lái),所有的仿真器庫(kù)函數(shù)將使用表描述A來(lái)讀/寫(xiě)訪問(wèn)描述B。圖5顯示了用于管理電話(huà)網(wǎng)絡(luò)的一個(gè)系統(tǒng),該系統(tǒng)使用了包括了能夠?qū)崿F(xiàn)本發(fā)明的簡(jiǎn)化了硬件配置的通信服務(wù)器的LAN網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)。系統(tǒng)包括兩個(gè)應(yīng)用服務(wù)器AS1和AS2,一臺(tái)工作而另一臺(tái)處于備用狀態(tài),用于執(zhí)行網(wǎng)絡(luò)的管理功能;這些設(shè)備具有包括重復(fù)的磁盤(pán)HD在內(nèi)的完全的硬件和軟件配置。操作員通過(guò)使用所謂的X_Terminal與管理系統(tǒng)相接口,X_Terminal與提供圖形的操作員接口的X_Terminal服務(wù)器相連接。安裝了大量的具有簡(jiǎn)化了的硬件配置的可能的通信服務(wù)器CS1CSn,它們能夠完成本發(fā)明。在以后具有不同硬件配置的通信服務(wù)器CS1CSn的數(shù)目能夠增加網(wǎng)絡(luò)的升級(jí)。應(yīng)用程序應(yīng)該能夠被安裝到通信服務(wù)器CS上,該應(yīng)用程序是在具有包括一個(gè)商用數(shù)據(jù)庫(kù)在內(nèi)全部的軟件平臺(tái)的不同的硬件配置設(shè)備上被開(kāi)發(fā)的。作為簡(jiǎn)化的通信服務(wù)器CS軟件平臺(tái)還應(yīng)包括通信軟件,并且由于商用SQL關(guān)系數(shù)據(jù)庫(kù)非常耗費(fèi)硬件資源,所以仿真方式能夠共享內(nèi)存和CPU時(shí)間。圖6顯示了根據(jù)圖5的網(wǎng)絡(luò)管理系統(tǒng)的電話(huà)網(wǎng)絡(luò)管理系統(tǒng)的體系結(jié)構(gòu)的例子,其中包括了能夠完成本發(fā)明的設(shè)備。從以后的網(wǎng)絡(luò)的擴(kuò)展的角度來(lái)看,仿真器的方法是有用的,擴(kuò)展是通過(guò)插入多個(gè)具有不同硬件配置的設(shè)備,在不同的硬件配置上應(yīng)該能夠執(zhí)行需要一個(gè)SQL關(guān)系數(shù)據(jù)庫(kù)的應(yīng)用程序。隨著網(wǎng)絡(luò)拓?fù)鋸?fù)雜性的增加,網(wǎng)絡(luò)管理系統(tǒng)應(yīng)該在安裝的設(shè)備和運(yùn)行在所述上的應(yīng)用的數(shù)量方面被升級(jí)。圖5中所示的網(wǎng)絡(luò)管理系統(tǒng)的結(jié)構(gòu)能夠被分解為大量的通過(guò)網(wǎng)絡(luò)互連的協(xié)同操作的子系統(tǒng)。具有不同配置的設(shè)備的網(wǎng)絡(luò)管理系統(tǒng)SYSTEM1、SYSTEM2和SYSTEM3被互連為一個(gè)網(wǎng)絡(luò)來(lái)管理,目的是協(xié)同操作交換管理信息。仿真器方法能夠使在所有硬件和軟件平臺(tái)上開(kāi)發(fā)的應(yīng)用程序移植到任何網(wǎng)絡(luò)設(shè)備上。上面曾經(jīng)提過(guò),以上在圖3中列出并顯示的每一個(gè)接口函數(shù)IF1…IFn被翻譯為一系列訪問(wèn)ASCII文件的仿真庫(kù)函數(shù)IF1…IFm。通過(guò)進(jìn)一步的解釋?zhuān)脩?hù)應(yīng)用程序中的一個(gè)SQL語(yǔ)句被轉(zhuǎn)化為一個(gè)IF函數(shù),每個(gè)IF函數(shù)與仿真庫(kù)中的函數(shù)序列相關(guān)聯(lián),其中該序列取決于SQL語(yǔ)句,SQL命令的輸出被返回到用戶(hù)應(yīng)用,如以上的描述。下面將更加詳細(xì)地解釋以下內(nèi)容IF函數(shù)仿真庫(kù)ASCII文件下面將是IF函數(shù)集的一個(gè)例子-insert;-delete;-update;-select1;;and-selectn.依據(jù)一個(gè)SQL語(yǔ)法,一個(gè)SELECT語(yǔ)句可能具有一個(gè)不同的WHERE子句。這里有一些具有不同的復(fù)雜度的例子。字符*意為ALL。<prelisting-type="program-listing"><![CDATA[SELECTf1,f2FROMtab1;SELCET*FROMtab1;SELECTf1,f5FROMtab1WHERE(f1=0ANDf2=‘string’);SELECTf1,f5FROMtab1WHERE(F1=0ANDf2NOTIN(SELECTf3,f4FROMTAB2 WHERE(f1=10ANDf2=‘string1’)));((SELECTf1,f5FROMtab1 WHERE(F1=0ANDf2NOTIN (SELECT13,f4FROMtab2WHERE(F1=10ANDf2=‘string1’))))UNION(SELECTf1,f5FROMtab1WHERE(F1=0ANDt2NOTIN (SELECTf3,f4FROMtab2WHERE(f1=10ANDF2=‘string1’))); ) );]]></pre>用戶(hù)應(yīng)用程序An通過(guò)使用SQL語(yǔ)句和傳遞參數(shù)(指向包含被送到數(shù)據(jù)庫(kù)的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)的指針和指向在其中包含SQL指令的輸出將被返回的數(shù)據(jù)結(jié)構(gòu)的指針)來(lái)與數(shù)據(jù)庫(kù)相接口。下面將描述前面所述的IF函數(shù)中的一個(gè),它對(duì)應(yīng)于SQL語(yǔ)句SELECT,它的實(shí)現(xiàn)為大家所關(guān)心。TAB1是具有被定義為C1…C6的6列的數(shù)據(jù)庫(kù)表的一個(gè)例子。兩個(gè)數(shù)據(jù)行已經(jīng)被插入到TAB1中;僅僅與例子相關(guān)的數(shù)據(jù)被寫(xiě)了出來(lái),其余的字段可以為任何值。TAB1C1C2C3C4C5C65700string10100200string下面的SQL語(yǔ)句可能來(lái)源于用戶(hù)應(yīng)用程序AnSELECTc2,c4,c5FROMtab1WHERE(c2=10ANDc6=‘string’);下面將討論仿真器是如何工作的以獲得結(jié)果。在這個(gè)SELECT語(yǔ)句中具有WHERE這個(gè)子句,圖4中所定義的訪問(wèn)描述表B被復(fù)制在-訪問(wèn)描述SelectB1(圖中未顯示),-訪問(wèn)描述WhereB2(圖中未顯示)。在這種情況下,通過(guò)使用兩個(gè)訪問(wèn)描述表來(lái)實(shí)現(xiàn)對(duì)用戶(hù)數(shù)據(jù)兩種不同的訪問(wèn)。如上面所解釋的,表描述A和訪問(wèn)描述B或者B1和B2中的每一行都對(duì)應(yīng)于在生成階段定義的數(shù)據(jù)庫(kù)表的一列。通過(guò)將感興趣的字段標(biāo)記為T(mén),在本例中為c1,c4和c5,訪問(wèn)描述SelectB1定義了對(duì)于TAB1中現(xiàn)存的行中所選擇的每一個(gè)數(shù)據(jù)行,在C1C6之中哪些字段將被檢索并且應(yīng)該送至應(yīng)用程序An12345useC1FC2T10C3FC4T100C5T200C6F通過(guò)將在WHERE(c2=10ANDC6=string)子句中引用的字段標(biāo)記為T(mén),訪問(wèn)描述WhereB2定義了子句來(lái)識(shí)別在TAB1中現(xiàn)存的哪些行應(yīng)該被選擇12345useC1FC2T10C3FC4FC5FC6T5string在一個(gè)不同的SELECT語(yǔ)句中,例如SELECTf1,f2FROMtab1,另外的一個(gè)解決方法能夠通過(guò)使用一個(gè)單個(gè)的訪問(wèn)和一個(gè)單個(gè)的訪問(wèn)描述B來(lái)實(shí)現(xiàn)。圖4-B是圖4的一個(gè)特殊情況。這是下面的SQL語(yǔ)句實(shí)現(xiàn)的情況。<prelisting-type="program-listing"><![CDATA[ ((SELECTf1,f5FROMtab1 WHERE(F1=0ANDf2NOTIN (SELECTf3,f4FROMtab2WHERE(f1=10AND‘string1’))))UNION((SELECTf1,f5FROMtab1 WHERE(Fl=0ANDf2NOTIN (SELECTf3,f4FROMtab2WHERE(f1=l0ANDF2=‘stringl’))); ) );]]></pre>它可以通過(guò)使用以下的來(lái)執(zhí)行-一個(gè)多表描述A1和A2-一個(gè)多訪問(wèn)描述B1和B2。下面的段落將解釋IFnSELECT函數(shù)怎樣通過(guò)調(diào)用一個(gè)確定的仿真器庫(kù)函數(shù)序列來(lái)執(zhí)行不同的步驟。當(dāng)用戶(hù)應(yīng)用程序An要求IFn從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)時(shí),它向仿真器發(fā)送一個(gè)指向包含有SQL語(yǔ)句SELECT的參數(shù)的數(shù)據(jù)結(jié)構(gòu)的指針,并且在操作的最后,指向查詢(xún)的檢索的數(shù)據(jù)結(jié)果的指針將被返回。IFn執(zhí)行前面所說(shuō)的任務(wù)的一種方法如下根據(jù)從包含配置數(shù)據(jù)的ASCII文件中讀取的表描述來(lái)初始化圖4中的數(shù)據(jù)區(qū)中的表描述A,特別是通過(guò)調(diào)用仿真器庫(kù)函數(shù)_get_table_descr()LF,表描述A的結(jié)構(gòu)的數(shù)組被填充,每一個(gè)表列對(duì)應(yīng)一行;包含有與以前訪問(wèn)的表配置相關(guān)的用戶(hù)數(shù)據(jù)的ASCII文件被打開(kāi),函數(shù)識(shí)別文件以前是否被打開(kāi)過(guò)。如果文件是第一次被打開(kāi)的話(huà)-打開(kāi)文件-通過(guò)調(diào)用函數(shù)_search_next_row()移至第一行。如果文件不是第一次被打開(kāi)的話(huà),通過(guò)調(diào)用函數(shù)_search_next_row()將指向文件的指針移至某行,并且返回指向該行的指針,循環(huán)直至··文件的結(jié)尾,或··指定數(shù)量的行已經(jīng)被讀完;3)對(duì)于每一行,通過(guò)調(diào)用函數(shù)fetchrowatcurr_pos()在當(dāng)前位置讀取該行,并檢驗(yàn)在B2中寫(xiě)入的WHERE子句是否滿(mǎn)足該行,在這種情況下,將用戶(hù)數(shù)據(jù)行所要求的字段拷貝到B1(SELECT訪問(wèn)描述)中,依據(jù)數(shù)據(jù)類(lèi)型填充最后三列(null,long/int,char/ptr)。4)在最后關(guān)閉用戶(hù)數(shù)據(jù)表文件。作為這個(gè)函數(shù)的結(jié)果,SELECT子句的輸出將在訪問(wèn)描述表(B1的最后三列)中獲得,并且返回到應(yīng)用程序An。上面所列的仿真庫(kù)的一個(gè)例子能夠如以下描述。函數(shù)的子集能夠聯(lián)合起來(lái)來(lái)實(shí)現(xiàn)一個(gè)SQL語(yǔ)句。在下面,將給出每個(gè)函數(shù)更加詳細(xì)的描述。F1名字_get_table_descr描述對(duì)于一個(gè)特定的表(輸入?yún)?shù)_table_name),它取得表的描述,填充“行描述”結(jié)構(gòu)(輸出參數(shù)_row_desc)。正確的表文件被打開(kāi),并且在完成了表描述讀取之后被關(guān)閉。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F2名字_open_table描述它為一個(gè)特定的表(輸入?yún)?shù)_table_name)打開(kāi)一個(gè)表文件。依據(jù)指定的動(dòng)作類(lèi)型(輸入?yún)?shù)_action_type所指定的SELECT,DELETE和INSERT)文件能夠被打開(kāi),以用于讀,修改和追加。它返回調(diào)用函數(shù),指針指向打開(kāi)的文件(輸出參數(shù)_file_ptr)。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F3名字_close_table描述對(duì)于一個(gè)特定的表名(輸入?yún)?shù)_table_name),它關(guān)閉一個(gè)表文件。通過(guò)調(diào)用函數(shù)(輸入?yún)?shù)_file_ptr)來(lái)給定文件指針。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F4名字_search_first_row描述它在一個(gè)表中尋找第一個(gè)行。這意味著表描述行被作為注釋行而跳過(guò),直到第二個(gè)標(biāo)題行(關(guān)閉表描述)被發(fā)現(xiàn)。從調(diào)用的函數(shù)中獲得文件指針(輸入?yún)?shù)_file_ptr)和被插入在錯(cuò)誤信息中的表名(輸入?yún)?shù)_table_name)。如果行能夠正確的被發(fā)現(xiàn)的話(huà),那將返回調(diào)用函數(shù)到表文件中行的位置(輸出參數(shù)_file_pos)它是行類(lèi)型字符的位置。假定文件指針的初始值是指向文件行的第一個(gè)字節(jié),否則搜索失敗。從文件中得到的最后的字符為-行的第一個(gè)字符(當(dāng)它被正確發(fā)現(xiàn)的時(shí)候)-在一行的開(kāi)始處發(fā)現(xiàn)了文件結(jié)束(在表中沒(méi)有行)-一個(gè)未預(yù)期的行第一個(gè)字符-一個(gè)未預(yù)期的文件結(jié)束。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F5名字_search_next_row描述它在表中尋找下一行。這意味著如果發(fā)現(xiàn)了表描述行則認(rèn)為其是“未預(yù)期的行”。從調(diào)用的函數(shù)中獲得文件指針(輸入?yún)?shù)_file_ptr)和被插入在錯(cuò)誤信息中的表名(輸入?yún)?shù)_table_name)。如果行能夠被正確的發(fā)現(xiàn)的話(huà)將調(diào)用函數(shù)返回到表文件中行的位置(輸出參數(shù)_file_pos)它是行類(lèi)型字符的位置。假定文件指針的初始值是指向文件行的第一個(gè)字節(jié),否則搜索失敗。從文件中得到的最后的字符為-行的第一個(gè)字符(當(dāng)它被正確發(fā)現(xiàn)的時(shí)候)-在一行的開(kāi)始處發(fā)現(xiàn)了文件結(jié)束(在表中沒(méi)有更多的行)-一個(gè)未預(yù)期的行第一個(gè)字符-一個(gè)未預(yù)期的文件結(jié)束。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F6名字_fetcn_row_at_curr_pos描述它從表文件的當(dāng)前位置(位置由調(diào)用函數(shù)在文件指針_file_ptr中給定)開(kāi)始取回一個(gè)表的行。為了搜索行,它使用調(diào)用函數(shù)在輸入?yún)?shù)_row_desc中所給定的行描述。它填充在調(diào)用函數(shù)的內(nèi)存區(qū)的“訪問(wèn)結(jié)構(gòu)”(參數(shù)_row_access)。若要得到更多的細(xì)節(jié),參看內(nèi)部函數(shù)_fetch_row。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F7名字_fetch_row_at_abs_pos描述它從由調(diào)用函數(shù)以輸入?yún)?shù)_file_pos(除文件指針_file_ptr以外)顯式給定的位置開(kāi)始取回一個(gè)表的行。為了搜索行,它使用由調(diào)用函數(shù)在輸入?yún)?shù)_row_desc中所給定的行描述。它填充在調(diào)用函數(shù)的內(nèi)存區(qū)的“訪問(wèn)結(jié)構(gòu)”(參數(shù)_row_access)。若要得到更多的細(xì)節(jié),參看內(nèi)部函數(shù)_fetch_row。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。F8名字_write_row描述當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。輸入A和B。它在一個(gè)表中插入一個(gè)行(行被追加在文件表的底部)。它使用調(diào)用函數(shù)給定的行描述作為輸入?yún)?shù)。它采用調(diào)用函數(shù)給定的從訪問(wèn)描述結(jié)構(gòu)B寫(xiě)入的數(shù)據(jù)作為輸入?yún)?shù)。它打開(kāi)并關(guān)閉表文件。它檢查在表中是否已經(jīng)存在一個(gè)具有唯一的索引的行。F9名字_delete_row描述它在邏輯上刪除表中的一個(gè)行。調(diào)用函數(shù)必須給出在表中行的位置。它修改刪除行的計(jì)數(shù)器。F10名字_refresh_table_file描述對(duì)于一個(gè)特定的行,它檢查是否刪除行的計(jì)數(shù)器已經(jīng)達(dá)到了閾值。如果是的話(huà),它重寫(xiě)表文件,但不包括以前已經(jīng)在邏輯上被刪除的所有行。當(dāng)超過(guò)閾值時(shí),計(jì)數(shù)器被置位為0,當(dāng)它小于閾值時(shí),計(jì)數(shù)器保持值不變。F11名字_fetch_row描述它從表文件的當(dāng)前位置(位置由調(diào)用函數(shù)在文件指針_file_ptr中給定)開(kāi)始取回一個(gè)表的行。為了搜索行,它使用調(diào)用函數(shù)在輸入?yún)?shù)_row_desc中所給定的行描述。它填充在調(diào)用函數(shù)的內(nèi)存區(qū)的“訪問(wèn)結(jié)構(gòu)”(參數(shù)_row_access)。它從調(diào)用函數(shù)獲得被插入到錯(cuò)誤信息中的表名字(參數(shù)_table_name)和行號(hào)(參數(shù)_row_nbr)。如果沒(méi)有錯(cuò)誤發(fā)生,則在最后一列后在行結(jié)束處搜索結(jié)束。否則,當(dāng)發(fā)現(xiàn)第一個(gè)錯(cuò)誤時(shí),檢索被異常終止。假定文件指針的初始值正指向緊接在初始化行的特定字符之后的字符。最后的字符從文件中獲得-終止組成行的最后(或唯一的)行的行結(jié)束(取過(guò)程成功終止),-取回的最后一列的列終止符或初始化一個(gè)行的壞字符或未預(yù)期的行結(jié)束或未預(yù)期的文件結(jié)束(取過(guò)程被異常終止)。當(dāng)出現(xiàn)錯(cuò)誤時(shí),它記錄一個(gè)消息。為了簡(jiǎn)化一個(gè)現(xiàn)存的應(yīng)用程序向目標(biāo)設(shè)備的移植,仿真所描述的一個(gè)SQL關(guān)系數(shù)據(jù)庫(kù)的方法被認(rèn)為在節(jié)省內(nèi)存和CPU時(shí)間方面具有很大的優(yōu)越性。權(quán)利要求1.一種向一個(gè)現(xiàn)存的應(yīng)用程序提供SQL關(guān)系數(shù)據(jù)庫(kù)函數(shù)的子集的方法,其包括以下的步驟-生成SQL表和定義字段;-存儲(chǔ),修改和刪除在已生成的表上的數(shù)據(jù),其中依據(jù)字段定義進(jìn)行類(lèi)型檢查;并且-通過(guò)使用SQL篩選程序檢索這樣的數(shù)據(jù);其中,通過(guò)在配置階段減少所要求的數(shù)據(jù)庫(kù)的大小來(lái)最小化內(nèi)存和CPU時(shí)間,并且,其中所提供的函數(shù)能夠被再分為不同的層次,目的是×將來(lái)自一個(gè)現(xiàn)存的用戶(hù)應(yīng)用程序的SQL語(yǔ)句轉(zhuǎn)化為一系列基本的接口函數(shù)(IF1…IFn),×使用所述的接口函數(shù)來(lái)讀/寫(xiě)數(shù)據(jù)文件(F1…Fn),×處理被提供給要求的用戶(hù)應(yīng)用程序(An)的輸出數(shù)據(jù)。2.如權(quán)利要求1所要求的方法,其中所生成的包括有字段定義的SQL表被存儲(chǔ)在配置ASCII文件之中(F1…Fm-1),并且用戶(hù)數(shù)據(jù)被存儲(chǔ)在ASCII用戶(hù)文件之中(Fm…Fn)。3.如權(quán)利要求1所要求的方法,其中用戶(hù)數(shù)據(jù)文件依據(jù)一種算法來(lái)被加密以確保安全性,對(duì)數(shù)據(jù)的訪問(wèn)是通過(guò)加密/解密模塊(M3)來(lái)被處理的。4.將一個(gè)使用SQL關(guān)系數(shù)據(jù)庫(kù)的現(xiàn)存的應(yīng)用程序向簡(jiǎn)化了的硬件(HW2)的設(shè)備移植的裝置,其中在HW2上權(quán)利要求1的方法被執(zhí)行,簡(jiǎn)化了移植過(guò)程,僅僅為×拷貝×再編譯×執(zhí)行應(yīng)用文件。5.根據(jù)權(quán)利要求4的移植的裝置,其中被提供的SQL函數(shù)的子集能夠根據(jù)現(xiàn)存的用戶(hù)應(yīng)用程序(An)的要求被配置、減少或者增加。全文摘要一種方法和裝置,用于將一個(gè)使用具有SQL界面的關(guān)系數(shù)據(jù)庫(kù)的現(xiàn)存的應(yīng)用程序向具有不包括一個(gè)SQL關(guān)系數(shù)據(jù)庫(kù)簡(jiǎn)化了的硬件配置移植。本發(fā)明仿真一個(gè)SQL數(shù)據(jù)庫(kù),使能夠節(jié)省硬件資源并能提供函數(shù)的子集,目的是:生成SQL表并定義字段;存儲(chǔ),修改并刪除在生成的表上的數(shù)據(jù),具有一個(gè)類(lèi)型檢查,通過(guò)使用SQL篩選程序檢索這樣的數(shù)據(jù)。函數(shù)能夠被再分為若干層次(M1,M2,M3),目的是:將來(lái)自一個(gè)現(xiàn)存的用戶(hù)應(yīng)用程序(An)的SQL語(yǔ)句轉(zhuǎn)化為一系列基本的接口函數(shù)(IF1IFn),使用所述的接口函數(shù)來(lái)讀/寫(xiě)數(shù)據(jù)文件(F1Fn),處理所提供的輸出數(shù)據(jù)給要求的用戶(hù)應(yīng)用程序(An)。文檔編號(hào)G06FGK1191026SQ96195530公開(kāi)日1998年8月19日申請(qǐng)日期1996年7月13日優(yōu)先權(quán)日1995年7月14日發(fā)明者羅德?tīng)柗颉け敬纳暾?qǐng)人:阿爾卡塔爾有限公司