1 / 22

OQL コンパイラの使い方

OQL コンパイラの使い方. 田村 慶一,宇徳 浩二 平成13年10月4日    . 目次. ユーザが行なうべき全体の処理の流れ 使い方 出力コードとイナダ OQL コンパイラのためのヒープ 出力コードと Extent Object. ユーザが行なうべき全体の処理の流れ. (1)ODL プリプロセッサを使ってスキーマを定義したファイルからオブジェクト定義情報をスキーマレポジトリに格納 (2)OQL 文を書いた C++ プログラムを OQL コンパイラでコンパイル. 出力コード ( C++ プログラム). スキーマ 定義ファイル. (1). ソースファイル

season
Télécharger la présentation

OQL コンパイラの使い方

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. OQLコンパイラの使い方 田村 慶一,宇徳 浩二 平成13年10月4日    

  2. 目次 • ユーザが行なうべき全体の処理の流れ • 使い方 • 出力コードとイナダ • OQLコンパイラのためのヒープ • 出力コードとExtent Object

  3. ユーザが行なうべき全体の処理の流れ (1)ODLプリプロセッサを使ってスキーマを定義したファイルからオブジェクト定義情報をスキーマレポジトリに格納 (2)OQL文を書いたC++プログラムをOQLコンパイラでコンパイル 出力コード (C++プログラム) スキーマ 定義ファイル (1) ソースファイル (OQL文を含む C++プログラム) ODL プリプロセッサ 格納 make (2) OQL コンパイラ スキーマレポジトリ スキーマレポジトリの参照 実行コード データベース

  4. 準備 1.最新の出世魚を展開しておく → 以下<出世魚の展開ディレクトリ>と書く 2.コンパイルを行うディレクトリを決める     → 以下<作業ディレクトリ>と書く 3.システムヒープを置くサイトを決めておく → dbconfig の SYSTEM_HEAP_PRIMARY に書     いておく

  5. 作業手順(1/5) 1.<システムヒープを置くサイト>にログイン 2.環境変数の設定 setenv INADA_DBDIR <データベース構成ファイル格納ディレクトリ> setenv LD_LIBRARY_PATH <出世魚の展開ディレクトリ>/lib set path = (<出世魚の展開ディレクトリ>/metadata $path) rehash → シェルスクリプトで書いておくこと

  6. 環境変数設定用スクリプトの例 #!/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"

  7. 作業手順(2/5) 3. pserver, tserverを起動 (別に xterm を2つ起動して) 4. cd <作業ディレクトリ> 5. ヒープ生成 dbconfig ファイルを設定し,genheap スクリプトを実行(「イナダ・ワカシの使用法」を見よ)

  8. 作業手順(3/5) 6.patchmetadata の実行 <出世魚の展開ディレクトリ>/OQL/compiler/patchmetadataを実行 注: patchmetadataはnamed_query用のエクステントを作成する。named_queryを使わないのであれば、実行しなくてもよい。(GPMLではpatchmetadata を実行しなくても問題は発生しなかった)

  9. 作業手順(4/5) 7. スキーマ情報をスキーマレポジトリに登録    ODLプリプロセッサを使用 <出世魚の展開ディレクトリ>/metadata/odlpc ***.h ***.C ここで,***.h はスキーマ定義のファイル名,   ***.C はスキーマ実装のファイル名   途中でデータベース名を要求されるので,入力 注:odlpcを実行する際、 ***.h に/**/のコメントアウトが   あると、エラーが発生。// に変更することによって 解決。

  10. サンプルDBでのスキーマレポジトリの作り方 • pserver,tserverを起動する • cd <出世魚の展開ディレクトリ>/OQL/genDB • ./genheap • ../compiler/patchmetadata • ../../metadata/odlpc ../schema/sample_schema.h ¥ ../schema/sample_schema.C

  11. サンプルDBでのスキーマレポジトリの作り方(注意点)サンプルDBでのスキーマレポジトリの作り方(注意点) • <出世魚の展開ディレクトリ>/OQL/genDBでgenheapは実行する • 実行時にdbconfigを参照するため • dbconfigはデータベースコンフィギュレーションファイル • odlpcを実行時に“Please Input Database Name:”とメッセージが出るので,OQL_dbと入力する • OQL_dbはサンプルDBで使われるデータベース名

  12. 作業手順(5/5) 8. extent object の生成 プログラムの見本は, /home/db/utoku/s8/gpml/extent_creation 9. データベースの生成 5.て作ったヒープに実際のデータを入れる

  13. コンパイル法(1/2) 1. OQLコンパイラでコンパイル <出世魚の展開ディレクトリ>/OQL/compiler/OQLmain ***.C (***.CはC++のOQLプログラム) → result.Cが生成される。 注: ・result.CをコンパイルするMakefileは生成されない    ので、自分で作成の必要あり。    ・/home/db/s8/OQL/test のMakefileを参考に    作成する。

  14. Makefile • /home/db/s8/OQL/testのMakefileを一部 変更して作成。 変更点 INCLUDES … に -I<スキーマ定義のファイルがあるディレクトリ>   必要なら,LDLIBS … に -l<ライブラリ名>  を追加

  15. コンパイル法(2/2) 2. make 実行ファイルが生成される。 3. 実行   問合せが処理される。

  16. C++OQLプログラム作成の注意点 ・database->open(”データベース名 ”, …); という書き方にする。 ・d_OQL_Query q(”…”);の()内のOQL文  を書く際、改行、”を含む場合は\でをエスケープする必要がある。

  17. 例 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); . . .

  18. 出力コード(一部) 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!! 以下略

  19. 出力コードとイナダ • 出力コードがODMG3.0 C++bindingに準拠しているか? new以外特に準拠していないコードはない tmpvar_2=new(database,"d_Set < d_Ref < Polygon > > ") d_Set < d_Ref < Polygon > > ;

  20. OQLコンパイラのためのヒープ • スキーマレポジトリをヒープ番号1番のヒープに格納 スキーマ 定義ファイル ODL プリプロセッサ スキーマレポジトリ 格納 ヒープ番号1番 データベース ヒープ

  21. 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に対して検索範囲 と交差するものを結果に格納

  22. 出力コードより 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); } }

More Related