220 likes | 361 Views
OQL コンパイラの使い方. 田村 慶一,宇徳 浩二 平成13年10月4日 . 目次. ユーザが行なうべき全体の処理の流れ 使い方 出力コードとイナダ OQL コンパイラのためのヒープ 出力コードと Extent Object. ユーザが行なうべき全体の処理の流れ. (1)ODL プリプロセッサを使ってスキーマを定義したファイルからオブジェクト定義情報をスキーマレポジトリに格納 (2)OQL 文を書いた C++ プログラムを OQL コンパイラでコンパイル. 出力コード ( C++ プログラム). スキーマ 定義ファイル. (1). ソースファイル
E N D
OQLコンパイラの使い方 田村 慶一,宇徳 浩二 平成13年10月4日
目次 • ユーザが行なうべき全体の処理の流れ • 使い方 • 出力コードとイナダ • OQLコンパイラのためのヒープ • 出力コードとExtent Object
ユーザが行なうべき全体の処理の流れ (1)ODLプリプロセッサを使ってスキーマを定義したファイルからオブジェクト定義情報をスキーマレポジトリに格納 (2)OQL文を書いたC++プログラムをOQLコンパイラでコンパイル 出力コード (C++プログラム) スキーマ 定義ファイル (1) ソースファイル (OQL文を含む C++プログラム) ODL プリプロセッサ 格納 make (2) OQL コンパイラ スキーマレポジトリ スキーマレポジトリの参照 実行コード データベース
準備 1.最新の出世魚を展開しておく → 以下<出世魚の展開ディレクトリ>と書く 2.コンパイルを行うディレクトリを決める → 以下<作業ディレクトリ>と書く 3.システムヒープを置くサイトを決めておく → dbconfig の SYSTEM_HEAP_PRIMARY に書 いておく
作業手順(1/5) 1.<システムヒープを置くサイト>にログイン 2.環境変数の設定 setenv INADA_DBDIR <データベース構成ファイル格納ディレクトリ> setenv LD_LIBRARY_PATH <出世魚の展開ディレクトリ>/lib set path = (<出世魚の展開ディレクトリ>/metadata $path) rehash → シェルスクリプトで書いておくこと
環境変数設定用スクリプトの例 #!/bin/csh setenv INADA_DBDIR /home/db/utoku/gpml/db set path = (/home/db/utoku/s6-oql/metadata $path) setenv LD_LIBRARY_PATH /home/db/utoku/s6-oql/metadata/:"$LD_LIBRARY_PATH"
作業手順(2/5) 3. pserver, tserverを起動 (別に xterm を2つ起動して) 4. cd <作業ディレクトリ> 5. ヒープ生成 dbconfig ファイルを設定し,genheap スクリプトを実行(「イナダ・ワカシの使用法」を見よ)
作業手順(3/5) 6.patchmetadata の実行 <出世魚の展開ディレクトリ>/OQL/compiler/patchmetadataを実行 注: patchmetadataはnamed_query用のエクステントを作成する。named_queryを使わないのであれば、実行しなくてもよい。(GPMLではpatchmetadata を実行しなくても問題は発生しなかった)
作業手順(4/5) 7. スキーマ情報をスキーマレポジトリに登録 ODLプリプロセッサを使用 <出世魚の展開ディレクトリ>/metadata/odlpc ***.h ***.C ここで,***.h はスキーマ定義のファイル名, ***.C はスキーマ実装のファイル名 途中でデータベース名を要求されるので,入力 注:odlpcを実行する際、 ***.h に/**/のコメントアウトが あると、エラーが発生。// に変更することによって 解決。
サンプルDBでのスキーマレポジトリの作り方 • pserver,tserverを起動する • cd <出世魚の展開ディレクトリ>/OQL/genDB • ./genheap • ../compiler/patchmetadata • ../../metadata/odlpc ../schema/sample_schema.h ¥ ../schema/sample_schema.C
サンプルDBでのスキーマレポジトリの作り方(注意点)サンプルDBでのスキーマレポジトリの作り方(注意点) • <出世魚の展開ディレクトリ>/OQL/genDBでgenheapは実行する • 実行時にdbconfigを参照するため • dbconfigはデータベースコンフィギュレーションファイル • odlpcを実行時に“Please Input Database Name:”とメッセージが出るので,OQL_dbと入力する • OQL_dbはサンプルDBで使われるデータベース名
作業手順(5/5) 8. extent object の生成 プログラムの見本は, /home/db/utoku/s8/gpml/extent_creation 9. データベースの生成 5.て作ったヒープに実際のデータを入れる
コンパイル法(1/2) 1. OQLコンパイラでコンパイル <出世魚の展開ディレクトリ>/OQL/compiler/OQLmain ***.C (***.CはC++のOQLプログラム) → result.Cが生成される。 注: ・result.CをコンパイルするMakefileは生成されない ので、自分で作成の必要あり。 ・/home/db/s8/OQL/test のMakefileを参考に 作成する。
Makefile • /home/db/s8/OQL/testのMakefileを一部 変更して作成。 変更点 INCLUDES … に -I<スキーマ定義のファイルがあるディレクトリ> 必要なら,LDLIBS … に -l<ライブラリ名> を追加
コンパイル法(2/2) 2. make 実行ファイルが生成される。 3. 実行 問合せが処理される。
C++OQLプログラム作成の注意点 ・database->open(”データベース名 ”, …); という書き方にする。 ・d_OQL_Query q(”…”);の()内のOQL文 を書く際、改行、”を含む場合は\でをエスケープする必要がある。
例 Sequoia2000 Query6 . . \により改行コードをエスケープ (OQLコンパイラの仕様) . d_Ref<d_Bag<d_Polygon> > result; d_OQL_Query q(“ select * \ from polygons ploygon \ where polygon.intersectRectangle \ (100, 100, 100, 100) \ ); q.oql_execute((d_Ref<d_Object>&) result); . . .
出力コード(一部) virtual void oql_execute( d_Ref<d_Object>& result){略 //folowing codes generated by code generator.d_Ref < d_Bag < d_Ref < Polygon > > > tmpvar_3=new(database,"d_Bag < d_Ref < Polygon > > ")d_Bag < d_Ref < Polygon > > ;{d_Ref < d_Set < d_Ref < Polygon > > > tmpvar_1=database->lookup_object("polygons");d_Ref < d_Set < d_Ref < Polygon > > > tmpvar_2=new(database,"d_Set < d_Ref < Polygon > > ")d_Set < d_Ref < Polygon > > ;d_Iterator<d_Ref < Polygon > > iter_sel2=tmpvar_1->create_iterator( );d_Ref < Polygon > polygon;while(iter_sel2.next(polygon) ) { if(polygon->intersectRectangle(100100,100,100,)) tmpvar_2->insert_element(polygon);}d_Iterator<d_Ref < Polygon > > iter_proj3=tmpvar_2->create_iterator( );d_Ref < Polygon > tmpid_0; while(iter_proj3.next(tmpid_0) ) { tmpvar_3->insert_element(tmpid_0);}result=tmpvar_3;//end!! 以下略
出力コードとイナダ • 出力コードがODMG3.0 C++bindingに準拠しているか? new以外特に準拠していないコードはない tmpvar_2=new(database,"d_Set < d_Ref < Polygon > > ") d_Set < d_Ref < Polygon > > ;
OQLコンパイラのためのヒープ • スキーマレポジトリをヒープ番号1番のヒープに格納 スキーマ 定義ファイル ODL プリプロセッサ スキーマレポジトリ 格納 ヒープ番号1番 データベース ヒープ
Extent objectをDBから取り出す 出力コードとExtent object iteratorを作成 d_Ref < d_Set < d_Ref < Polygon > > > tmpvar_1 = database->lookup_object("polygons");d_Ref < d_Set < d_Ref < Polygon > > > tmpvar_2=new(database,"d_Set < d_Ref < Polygon > > ") d_Set < d_Ref < Polygon > > ;d_Iterator<d_Ref < Polygon > > iter_sel2 = tmpvar_1->create_iterator( );d_Ref < Polygon > polygon;while( iter_sel2.next(polygon) ) { if( polygon->intersectRectangle(100,100,100,100) ) tmpvar_2->insert_element(polygon);} Extent objectに登録されている すべてのpolygonに対して検索範囲 と交差するものを結果に格納
出力コードより d_Ref < Association > tmpid_100; while(iter_unsl3.next(tmpid_100) ) { d_Iterator<d_Ref < Role > > iter_unsr3=(tmpid_100->has_role->create_iterator( ); while(iter_unsr3.next(tmpid_101) ) { STRUCT_TYPE_22573 element; element.tmpid_100=tmpid_100; element.tmpid_101=tmpid_101; tmpvar_3->insert_element(element); } }