OQL
This presentation is the property of its rightful owner.
Sponsored Links
1 / 22

OQL コンパイラの使い方 PowerPoint PPT Presentation


  • 81 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Oql

OQLコンパイラの使い方

田村 慶一,宇徳 浩二

平成13年10月4日    


Oql

目次

  • ユーザが行なうべき全体の処理の流れ

  • 使い方

  • 出力コードとイナダ

  • OQLコンパイラのためのヒープ

  • 出力コードとExtent Object


Oql

ユーザが行なうべき全体の処理の流れ

(1)ODLプリプロセッサを使ってスキーマを定義したファイルからオブジェクト定義情報をスキーマレポジトリに格納

(2)OQL文を書いたC++プログラムをOQLコンパイラでコンパイル

出力コード

(C++プログラム)

スキーマ

定義ファイル

(1)

ソースファイル

(OQL文を含む

C++プログラム)

ODL

プリプロセッサ

格納

make

(2)

OQL

コンパイラ

スキーマレポジトリ

スキーマレポジトリの参照

実行コード

データベース


Oql

準備

1.最新の出世魚を展開しておく

→ 以下<出世魚の展開ディレクトリ>と書く

2.コンパイルを行うディレクトリを決める

    → 以下<作業ディレクトリ>と書く

3.システムヒープを置くサイトを決めておく

→ dbconfig の SYSTEM_HEAP_PRIMARY に書     いておく


Oql

作業手順(1/5)

1.<システムヒープを置くサイト>にログイン

2.環境変数の設定

setenv INADA_DBDIR <データベース構成ファイル格納ディレクトリ>

setenv LD_LIBRARY_PATH <出世魚の展開ディレクトリ>/lib

set path = (<出世魚の展開ディレクトリ>/metadata $path)

rehash

→ シェルスクリプトで書いておくこと


Oql

環境変数設定用スクリプトの例

#!/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"


Oql

作業手順(2/5)

3. pserver, tserverを起動

(別に xterm を2つ起動して)

4. cd <作業ディレクトリ>

5. ヒープ生成

dbconfig ファイルを設定し,genheap スクリプトを実行(「イナダ・ワカシの使用法」を見よ)


Oql

作業手順(3/5)

6.patchmetadata の実行

<出世魚の展開ディレクトリ>/OQL/compiler/patchmetadataを実行

注: patchmetadataはnamed_query用のエクステントを作成する。named_queryを使わないのであれば、実行しなくてもよい。(GPMLではpatchmetadata を実行しなくても問題は発生しなかった)


Oql

作業手順(4/5)

7. スキーマ情報をスキーマレポジトリに登録

   ODLプリプロセッサを使用

<出世魚の展開ディレクトリ>/metadata/odlpc ***.h ***.C

ここで,***.h はスキーマ定義のファイル名,

  ***.C はスキーマ実装のファイル名

  途中でデータベース名を要求されるので,入力

注:odlpcを実行する際、 ***.h に/**/のコメントアウトが

  あると、エラーが発生。// に変更することによって

解決。


Oql

サンプルDBでのスキーマレポジトリの作り方

  • pserver,tserverを起動する

  • cd <出世魚の展開ディレクトリ>/OQL/genDB

  • ./genheap

  • ../compiler/patchmetadata

  • ../../metadata/odlpc ../schema/sample_schema.h ¥

    ../schema/sample_schema.C


Oql

サンプルDBでのスキーマレポジトリの作り方(注意点)

  • <出世魚の展開ディレクトリ>/OQL/genDBでgenheapは実行する

    • 実行時にdbconfigを参照するため

    • dbconfigはデータベースコンフィギュレーションファイル

  • odlpcを実行時に“Please Input Database Name:”とメッセージが出るので,OQL_dbと入力する

    • OQL_dbはサンプルDBで使われるデータベース名


Oql

作業手順(5/5)

8. extent object の生成

プログラムの見本は,

/home/db/utoku/s8/gpml/extent_creation

9. データベースの生成

5.て作ったヒープに実際のデータを入れる


Oql

コンパイル法(1/2)

1. OQLコンパイラでコンパイル

<出世魚の展開ディレクトリ>/OQL/compiler/OQLmain ***.C

(***.CはC++のOQLプログラム)

→ result.Cが生成される。

注: ・result.CをコンパイルするMakefileは生成されない

   ので、自分で作成の必要あり。

   ・/home/db/s8/OQL/test のMakefileを参考に

   作成する。


Makefile

Makefile

  • /home/db/s8/OQL/testのMakefileを一部

    変更して作成。

    変更点

    INCLUDES … に

    -I<スキーマ定義のファイルがあるディレクトリ>

      必要なら,LDLIBS … に

    -l<ライブラリ名>

     を追加


Oql

コンパイル法(2/2)

2. make

実行ファイルが生成される。

3. 実行 

 問合せが処理される。


C oql

C++OQLプログラム作成の注意点

・database->open(”データベース名”, …);

という書き方にする。

・d_OQL_Query q(”…”);の()内のOQL文

 を書く際、改行、”を含む場合は\でをエスケープする必要がある。


Sequoia query6

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

.

.

.


Oql

出力コード(一部)

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!! 以下略


Oql

出力コードとイナダ

  • 出力コードがODMG3.0 C++bindingに準拠しているか?

    new以外特に準拠していないコードはない

tmpvar_2=new(database,"d_Set < d_Ref < Polygon > > ")

d_Set < d_Ref < Polygon > > ;


Oql

OQLコンパイラのためのヒープ

  • スキーマレポジトリをヒープ番号1番のヒープに格納

スキーマ

定義ファイル

ODL

プリプロセッサ

スキーマレポジトリ

格納

ヒープ番号1番

データベース

ヒープ


Extent object

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に対して検索範囲

と交差するものを結果に格納


Oql

出力コードより

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);

}

}


  • Login