O2 ODMG Database System Tutorial

 
CONTINUE READING
O2 ODMG
Database System
    Tutorial

    Release 5.0 - April 1998
In for m at ion in t h is docu m en t is su bject t o ch an ge wit h ou t n ot ice an d sh ou ld n ot be
con st r u ed as a com m it m en t by O2 Tech n ology.

Th e soft war e descr ibed in t h is docu m en t is deliver ed u n der a licen se or n on disclosu r e
agr eem en t .

Th e soft war e can on ly be u sed or copied in accor dan ce wit h t h e t er m s of t h e
agr eem en t . It is again st th e law t o copy t h is softwar e t o m agn et ic t ape, disk , or an y
oth er m ediu m for an y pu r pose ot h er t h an t h e pu r ch aser ’s own u se.

Copyr igh t 1992-1998 O 2 Tech n ology.

All r igh ts r eser ved. No par t of t h is pu blicat ion can be r epr odu ced, st or ed in a r et r ieval
syst em or t r an sm it ted in an y for m or by an y m ean s, elect r on ic, m ech an ical, ph ot ocopy
wit h ou t pr ior wr it t en per m ission of O2 Tech n ology.

O 2 , O2 En gin e API, O2 C, O 2 DBAccess, O 2 En gin e, O2 Gr aph , O 2 Kit , O2 Look , O2 St or e,
O 2 Tools, an d O 2 Web ar e r egist er ed t r adem ar k s of O2 Tech n ology.

SQL an d AIX ar e r egist er ed tr adem ar k s of In t er n at ion al Bu sin ess Mach in es
Cor por at ion .

Su n , Su n OS, an d SOLARIS ar e r egist er ed t r adem ar k s of Su n M icr osyst em s, In c.

X Win dow Syst em is a r egister ed t r adem ar k of t h e Massach u set ts In stit u t e of
Tech n ology.

Un ix is a r egist er ed tr adem ar k of Un ix Syst em Labor at or ies, In c.

H PUX is a r egist er ed t r adem ar k of Hewlet t -Pack ar d Com pan y.

BOSX is a r egist er ed t r adem ar k of Bu ll S.A.

IRIX is a r egist er ed t r adem ar k of Siem en s Nixdor f, A.G.

NeXTSt ep is a r egist er ed t r adem ar k of t h e NeXT Com pu ter , In c.

Pu r ify, Qu an t ify ar e r egist er ed t r adem ar k s of Pu r e Soft war e In c.

Win dows is a r egist er ed t r adem ar k of M icr osoft Cor por at ion .

All ot h er com pan y or pr odu ct n am es qu ot ed ar e t r adem ar k s or r egister ed t r adem ar k s
of t h eir r espect ive t r adem ar k h older s.

In for m at ion in t h is docu m en t is su bject t o ch an ge wit h ou t n ot ice an d sh ou ld n ot be
con st r u ed as a com m it m en t by O2 Tech n ology.

Th e soft war e descr ibed in t h is docu m en t is deliver ed u n der a licen se or n on disclosu r e
agr eem en t.
Who should use this tutorial

          Th is t u t or ial is for pr ogr am m er s wh o wish t o wr ite or adapt C++
          applicat ion s t o r u n wit h O2 .

          It pr esen t s an exam ple applicat ion an d descr ibes t h e st eps r equ ir ed t o por t
          t h is applicat ion t o O2 . A pr ior k n owledge of C++ is assu m ed.

          It also pr esen t s t h e object qu er y lan gu age (OQL) wh ich can be u sed for
          st an d-alon e qu er ies or em bed qu er ies in a C++ pr ogr am .

          Th e followin g m an u als give fu r t h er det ails on t h e topics cover ed in t h is
          t u t or ial:

          ODMG C++ Binding Guide

          ODMG C++ Binding Reference Manual

          OQL User Manual

          O2 System Administration Guide

          O2 System Administration Reference Manual

          Oth er docu m en t s available ar e ou t lin ed, click below.

See O2 Documentation set.
TABLE OF CON TENTS

Th is t u t or ial con t ain s t h e followin g sect ion s:
       1 - In t r odu ction
       2 - Por t in g a C++ applicat ion
       3 - OQL

O2 ODMG Dat abase System Tu t or ial                          5
TABLE OF CONTENTS

1          Introduction                                                                                         9

     1.1 Introduction to O2 ....................................................................10
                  Architecture..................................................................................10
     1.2 Object Database Management Group (ODMG)...................... 11
                  The O2 ODMG C++ Binding ......................................................12
     1.3 Benefits of porting to O2 .........................................................13

     1.4 Example application.................................................................15
                  Relevant files................................................................................17
     1.5 Setup .........................................................................................19

2          Porting a C++ Application                                                                          23

     2.1 Store C++ objects in an O2 database .....................................26

     2.2 Change C++ pointers to persistent pointers .........................28

     2.3 Include files...............................................................................32

     2.4 Connect to the database..........................................................33

     2.5 Run a transaction .....................................................................34

     2.6 Create names............................................................................35

     2.7 Modify source code..................................................................36

     2.8 Create persistent objects ........................................................38

     2.9 Build and Run the Application ................................................41

    2.10 Replace arrays by collection classes.....................................42

    2.11 Build and Run the Application ................................................49

3          OQL                                                                                                51

     3.1 The O2 ODMG Object Query Language .................................52
                  Interactive ad hoc queries ............................................................52
                  Accessing data..............................................................................53

6             O2 ODM G D at abase Syst em Tu t or ial
TABLE OF CONTENTS

           Selecting data............................................................................... 53
           Manipulating complex values...................................................... 54
           Manipulating polymorphic collections........................................ 54
           Composing operators................................................................... 55
3.2 Embedding OQL in C++ .......................................................... 56

3.3 Build and Run the Application ............................................... 58

      O2 ODMG Database Syst em Tu t or ial                                                                    7
TABLE OF CONTENTS

8      O2 ODM G D at abase Syst em Tu t or ial
11                        I ntr oduction

                                 In t r odu ct ion t o t h e ben efit s of O2 .

Th is ch apt er br iefly in tr odu ces t h e O2 system an d t h e ben efit s of por t in g
a C++ applicat ion to O2. It con t ain s t h e followin g section s:
• Introduction to O2
• Object D at abase M an agem en t Gr ou p (OD MG)
• Benefits of porting to O2
• Exam ple applicat ion
• Set u p

O2 OD MG Dat abase Syst em Tu tor ial                                                    9
1       Introduction

          1.1 Introduction to O2

               Th e O 2 ODM G dat abase syst em is a fu lly OD MG com plian t syst em ,
               offer in g a power fu l dat abase en gin e, a C++ pr ogr am m in g in t er face an d
               an OQL qu er y in t er face. Th e O2 ODMG dat abase syst em offer s a dat a
               m odel fu lly com patible wit h t h e C++ t ype syst em . It pr ovides
               t r an spar en t m u lt i-u ser access t o a dat abase an d in clu des a com plet e
               em bedded qu er y lan gu age for associat ive access t o dat a.

               Th e O 2 system h as been design ed to su ppor t lar ge dat abases wit h a
               lar ge n u m ber of u ser s.

               O 2 is a t otally open syst em t h at in t egr at es easily wit h ot h er soft war e.
               Th e open ar ch it ect u r e of O2 pr ovides con n ect ion s t o r elat ion al dat abase
               en gin es, GUI t ools, t h e Wor ld Wide Web, pr ogr am m in g lan gu ages an d
               CASE an d m et h odology tools.

               O 2 is lan gu age an d com piler in depen den t . To pr ovide m axim u m
               flexibilit y you can access t h e sam e dat abase wit h an y of t h e su ppor ted
               pr ogr am m in g lan gu ages su ch as C, C++, J ava, Eiffel, Lisp, Objective C
               an d O2 C wh ich is a fou r t h gen er at ion object lan gu age.

               O 2 applicat ion s can be developed u sin g th e stan dar d pr ogr am m in g
               en vir on m en t s available or u sin g O2 Tools. With O 2 , you can u se
               st an dar d object -or ien t ed m et h odologies an d associat ed tools (Tr am is,
               LOV, Object eer in g, ROSE, et c.).

     Architecture

               Th e O 2 Syst em su ppor ts a clien t ser ver ar ch itect u r e. Th e clien t an d
               ser ver ar e separ at e pr ocesses wh ich com m u n icat e over a n et wor k . Th er e
               is u su ally a sin gle ser ver pr ocess wh ich com m u n icat es wit h m u lt iple
               clien t s.

               Th e ser ver (o2server) is r espon sible for r eadin g an d wr it in g dat a t o
               per m an en t st or age, m an agin g con cu r r en t access to t h e dat a fr om
               m u lt iple clien ts, back in g u p t h e database an d r ecover in g t h e dat abase
               aft er a cr ash .

               Th e clien t pr ocess is a u ser application pr ogr am . For t h e pu r poses of
               t h is tu t or ial t h e clien t is an exam ple C++ applicat ion . In t h e C++ sam ple
               applicat ion t h e com m u n ication wit h t h e ser ver is t r an spar en t t o t h e C++
               developer . Th e C++ applicat ion au t om atically com m u n icat es wit h t h e
               o2server t h r ou gh t h e O2 C++ r u n tim e libr ar y.

10             O 2 ODM G D at abase Syst em Tu t or ial
Object Database Management Group (ODMG)

1.2 Object Database Management Group (ODMG)

   Th e Object Dat abase Man agem en t Gr ou p (ODMG) is m ade u p of th e
   leadin g Object D at abase ven dor s plu s a lar ge n u m ber of com pan ies t h at
   ar e in t er est ed in an ODBM S st an dar d. Th e ODM G h as pr odu ced a
   st an dar d for object dat abases. Th e OD MG St an dar d is an
   in t er oper abilit y st an dar d wh ich allows applicat ion s wr it ten t o t h e
   st an dar d t o r u n on an y com plian t syst em .

   Th is st an dar d con t ain s five cat egor ies:

   - Object M odel

   - Object D efin it ion Lan gu age (ODL)

   - Object Qu er y Lan gu age (OQL)

   - C++ Lan gu age Bin din g

   - J ava Lan gu age Bin din g

   Th e ODM G Object m odel is an ext en sion of t h e OM G object m odel. Th e
   object m odel su ppor t s t h e n ot ion s of class, objects wit h at t r ibu t es an d
   m et h ods, in h er it an ce, an d specialization . Th e exten sion s to t h e OMG
   object m odel in clu de su ppor t for r elat ion sh ips between object s, su ppor t
   for collect ion classes an d a set of base classes for dat e, tim e an d
   ch ar act er str in gs.

   Th e ODM G-93 st an dar d also allows for explicit n am es for an object or
   collection . Fr om a n am e, an applicat ion can dir ect ly r et r ieve th e n am ed
   object an d oper ate on it or n avigat e t o ot h er objects followin g
   r elat ion sh ip lin k s.

   A n am e in t h e sch em a plays t h e r ole of a var iable in a pr ogr am . Nam es
   ar e en tr y poin t s to th e dat abase. Fr om t h ese en tr y poin t s, ot h er object s
   can be r each ed t h r ou gh associative qu er ies or n avigat ion .

   Th e O2 OD MG Dat abase is fu lly com patible wit h t h e OD MG object
   m odel, object qu er y lan gu age (OQL) an d C++ bin din g.

   O2 ODMG Dat abase System Tu tor ial                                                   11
1       Introduction

     The O2 ODMG C++ Binding

             Th e ODMG C++ lan gu age bin din g is design ed t o br in g t r an spar en t
             per sist en ce t o C++ applicat ion s. Per sist en ce is t h e abilit y for an object t o
             ou t live t h e pr ocess wh ich cr eat ed it . Tr an spar en cy applies t o bot h t h e
             t ype syst em an d t h e pr ogr am m in g lan gu age. Fr om t h e C++ developer ’s
             per spect ive t h er e is a sin gle u n ified t ype syst em acr oss t h e
             pr ogr am m in g lan gu age an d t h e dat abase. Th er efor e an y C++ class can
             be stor ed in t h e database. Th e dat abase m an ipu lat ion lan gu age is C++
             so th er e is n o n eed for a separ at e database pr ogr am m in g lan gu age t o
             access an d m an ipu lat e data.

             Th e ODMG C++ bin din g con sist s of st an dar d C++ code. Th er e ar e n o
             n ew lan gu age con st r u ct s u sed for t h e bin din g. Th e bin din g m ak es u se
             of C++ t em plat es t o pr ovide per sisten ce. Sin ce t h e code is st an dar d C++
             code t h er e is n ot a special pr e-com piler for t h e sou r ce code, so you can
             con tin u e t o u se an y of you r exist in g C++ t ools as well as adopt n ew tools
             in th e fu t u r e.

12            O 2 ODM G D at abase Syst em Tu t or ial
Benefits of porting to O2

1.3 Benefits of porting to O2

    A sh or t ban k in g applicat ion is pr ovided for t h e pu r poses of th is t u t or ial.
    It is an au tom at ed teller m ach in e (ATM ) applicat ion . Th e applicat ion
    allows u ser s t o login t o t h eir accou n t s t o m ak e deposits or wit h dr awals
    an d t o ch eck t h e balan ce of an accou n t or r eview r ecen t t r an sact ion s.

    Th e ch an ges r equ ir ed to por t t h e application t o O2 in volve less t h an
    10% of t h e code an d t h ou gh on ly a sm all por t ion of code is m odified t h e
    applicat ion gain s su bst an t ially in t er m s of fu n ct ion alit y. It gain s in
    t er m s of du r abilit y, con cu r r en cy, scalability an d accessibilit y t h r ou gh
    OQL.

    Th e or igin al ver sion of t h e sou r ce code r eads cu st om er data at st ar t u p
    an d wr it es in for m at ion back wh en t h e pr ogr am en ds. If t h e pr ogr am
    fails all m odification s m ade will be lost . Th e possibilit y of losin g dat a is
    u n accept able. Th e O2 System pr otect s dat a by en su r in g t h at all ch an ges
    com m it t ed to t h e dat abase ar e in deed wr it t en t o th e dat abase an d t h at
    if a cr ash occu r s t h e dat a is safe fr om cor r u pt ion .

    Th e O2 System allows for con cu r r en t access t o dat a. Wit h con cu r r en t
    access it is possible t o h ave m u lt iple pr ocesses accessin g t h e dat abase
    at th e sam e t im e. For exam ple you cou ld h ave sever al ATM m ach in es
    accessin g th e sam e dat abase. Th e dat abase con t r ols t h e access t o t h e
    dat a en su r in g t h at ever y clien t h as a con sist en t view of th e dat a.

    On e of t h e m ost im por tan t im pr ovem en ts t o t h e sam ple applicat ion will
    be t o m ak e t h e application m or e scalable. Th e or igin al applicat ion is
    lim it ed in t h e am ou n t of dat a it can st or e t o m ach in e m em or y. By u sin g
    t h e O2 dat abase t h e applicat ion is n o lon ger lim it ed in t h is way. Th er e is
    n o pr act ical lim it t o th e size of an O2 dat abase.

    Th e addit ion of ODMG collect ion classes an d OQL qu er ies r edu ces th e
    ph ysical lim itation s of t h e applicat ion . ODM G collection classes pr ovide
    flexible collect ion s wh ich can gr ow as dat a expan ds an d t h ey ar e t igh tly
    lin k ed t o t h e dat abase en gin e t o pr ovide efficien t cach in g of lar ge
    collection s. By r eu sin g t h e OD MG collect ion classes you will also r edu ce
    t h e am ou n t of code t h at you n eed t o develop an d m ain t ain .

    Th e OQL qu er y lan gu age is an opt im ized qu er y lan gu age. All qu er ies will
    be au tom at ically opt im ized t o im pr ove t h e per for m an ce of you r
    applicat ion . Th e OQL qu er y lan gu age is a declar at ive qu er y lan gu age so
    t h e ph ysical st r u ct u r e of t h e dat a can be ch an ged wit h ou t h avin g to
    ch an ge th e qu er y. Th is allows an adm in ist r at or to add in dexes to lar ge
    collection s wit h ou t h avin g t o m odify or r ecom pile t h e applicat ion .

    O2 ODMG Dat abase System Tu tor ial                                                    13
1   Introduction

         Th e O2 System can r eplace exist in g code th at im plem en ts dat abase t ype
         feat u r es t h u s r edu cin g th e am ou n t of code t o be m ain t ain ed. For n ew
         developm en t s t h e O2 Syst em r edu ces t h e am ou n t of code r equ ir ed. For
         t h e sam ple applicat ion we can r em ove t h e code for t h e
         initializeAccounts an d updateAccounts m eth ods. By r em ovin g th e
         code wh ich becom es u seless th r ou gh por tin g we r edu ce t h e size of t h e
         applicat ion by 200 lin es or 25%.

         On e of t h e k ey featu r es of t h e O 2 ODMG C++ Bin din g is t h at it does n ot
         ext en d t h e C++ lan gu age t o add special dat abase k eywor ds. Th e bin din g
         u ses st an dar d C++ con cept s su ch as t em plates an d in h er it an ce t o
         pr ovide con n ect ion t o t h e dat abase. Th e u se of st an dar d C++ does n ot
         for ce developer s t o ch an ge t h e m et h ods or t ools t h ey u se t o develop
         code. An y t ool t h at can wor k wit h stan dar d C++ can be u sed wit h t h e O 2
         ODMG C++ Bin din g. Th ese in clu de fr on t en d case t ools wh ich gen er at e
         C++ code, edit or s, debu gger s, m em or y m an agem en t t ools an d t h ir d
         par t y class libr ar ies.

         Th is t u t or ial is in ten ded t o pr ovide a qu ick in t r odu ct ion t o t h e O2
         ODMG C++ In ter face an d t h e OQL qu er y lan gu age. Th er e ar e m an y
         im por t an t feat u r es of t h e O 2 Syst em t h at wer e n ot cover ed in t h is
         t u t or ial. Th ese in clu de dat abase feat u r es su ch as t r an sact ion types.
         sch em a u pdat es, war m an d cold r ecover y, an d su ppor t for con t in u ou s
         oper at ion .

         An ot h er obviou s advan t age is O2 Tech n ology’s com m it m en t t o in du st r y
         st an dar ds. Usin g a syst em t h at com plies wit h in du st r y st an dar ds
         en su r es t h e in ter oper abilit y bet ween you r applicat ion an d ot h er t ools
         an d does n ot lock you r sou r ce code t o a specific ven dor .

14       O 2 ODM G D at abase Syst em Tu t or ial
Example application

1.4 Example application

   In t h is t u t or ial we ar e goin g t o be wor k in g wit h a C++ ban k in g
   applicat ion wh er e cu st om er s u se au tom at ic t eller m ach in es (ATM) t o
   ch eck t h eir accou n ts or car r y ou t sim ple ban k in g t r an sact ion s. Th is is
   n ot a pr odu ct ion applicat ion , bu t a sim ple pr ogr am u sed for exam ple
   pu r poses on ly. Th e application u ses a sim ple t er m in al in ter face to
   com m u n icat e with cu st om er s.

   Befor e bein g por ted t o O2 , t h e applicat ion u ses st an dar d oper at in g
   syst em files t o st or e in for m at ion abou t cu st om er s an d accou n t s. Wh en
   t h e ATM applicat ion is star t ed in for m at ion abou t exist in g accou n t s is
   r ead fr om a file an d wh en t h e applicat ion st ops in for m at ion is wr it t en
   back t o th e file. Th e class com posit ion is sh own in figu r e 1.

    O2 ODMG Dat abase System Tu tor ial                                                  15
1           Introduction

             Terminal                                ATM
         displayLogin                          cash_balance
         displaySelectEvent                    total_deposits
         displayBalance                        term
         displaySelectAccount                  account_list
         displayMessage                        location
         displayPerson                         lookupAccount
         displayEvent                          dispenseCash
         getString                             printReceipt
         getNumber                             initializeAccounts
         getAmount                             run

         Account                                                    Address
         number                                                     Street
         balance                          Person                    city
         description                   firstName                    state
         owners                        middleName                   zip_code
         events_completed              lastName
         lookupOwner                   personal_id
         newOwner                      accounts
         insertEvent                   address                        Event
         getNumber                     showDeposits                 machine
         getBalance                    showWithdraws                message
         title                         showEvents                   amount
         deposit                                                    execute
         withdraw                                                   show

          Attributes
                                                                    one to one
          Methods                     Figure 1.                     one to many

16                O 2 ODM G D at abase Syst em Tu t or ial
Example application

          Th e in h er itan ce h ier ar ch y of t h e even t classes is sh own in figu r e 2.

                                              Event

                 depositEvent             withdrawEvent              balanceEvent

                                           Figure 2.

Relevant files

          Th e applicat ion sou r ce code is st or ed in var iou s files:

          main.cxx - con t ain s t h e m ain pr ogr am .

          atm.hxx an d atm.cxx - con t ain t h e defin it ion of t h e ATM class an d
          m et h od defin it ion s.

          account.hxx an d account.cxx - con t ain t h e defin it ion s of t h e Addr ess,
          Per son an d Accou n t classes an d m et h od defin ition s.

          event.hxx an d event.cxx - con t ain t h e defin it ion s of t h e Even t ,
          deposit Even t , wit h dr awEven t an d balan ceEven t classes an d t h eir
          m et h od defin it ion s.

          terminal.hxx an d terminal.cxx - con t ain t h e Ter m in al class
          defin ition an d m eth od defin it ion s.

          MakefileUnix.original or MakefileNt.original -con t ain th e
          m ak efile for com pilin g t h e or igin al ver sion of t h e applicat ion .

          Th e m ain r ou t in e of t h e pr ogr am cr eat es t h e ATM, Per son an d Accou n t
          object s, fr om dat a in a file an d t h en passes con t r ol t o t h e ATM ::r u n
          m et h od. Th e data file is locat ed in dat a/ accou n t s.

          Fin ally, README files descr ibe t h e st ep by st ep pr ocess t o r u n t h e
          t u t or ial. Please h ave a look at t h em .

          O2 ODMG Dat abase System Tu tor ial                                                   17
1   Introduction

         Th e ATM::r u n m et h od con t r ols t h e in t er act ion bet ween cu st om er s an d
         accou n t s. Th e m et h od fir st displays a login pr om pt t o t h e u ser . Th e
         login pr ocess pr odu ces an accou n t n u m ber an d a per son al iden t ificat ion
         n u m ber (PIN). Th e ATM:look u pAccou n t m eth od is t h en u sed t o fin d an
         accou n t cor r espon din g t o th e accou n t n u m ber . Th en t h e
         Accou n t ::look u pOwn er m et h od is u sed t o look u p a Per son based on t h e
         PIN. Th e t er m in al t h en displays a list of action s t h at t h e cu st om er can
         t ak e.

         Th e act ion s ar e r epr esen t ed as even t object s wh ich r epr esen t t h e
         in t er face between cu stom er s an d t h eir accou n t s. Even t object s ar e
         saved in t h e dat abase t o m ain t ain an accou n t h ist or y. Even t object s ar e
         t h e on ly n ew object s cr eat ed in t h e database wh ile th e ATM:Ru n m et h od
         is r u n n in g. Th e ot h er object s in th e database ar e on ly m odified wh en t h e
         ATM is r u n n in g, for in st an ce t h e Accou n t object is u pdat ed t o r eflect
         an y ch an ge in t h e balan ce of t h e accou n t an d also t o add even t s t o t h e
         even t h ist or y.

18       O 2 ODM G D at abase Syst em Tu t or ial
Setup

1.5 Setup

   It is assu m ed t h at t h e O2 soft war e is in st alled. If t h is is n ot t h e case,
   r efer t o t h e O2 In st allat ion sh eet for fu r t h er det ails.

   Th e O2 system m u st be set u p befor e you can begin por t in g t h e exam ple
   applicat ion .

   Set an en vir on m en t var iable called O2HOME specifyin g t h e dir ector y path
   wh er e t h e O2 soft war e is in st alled.

   Position you r self at O2HOME:

   > cd $O2HOME

   Add th e O2HOME/bin dir ect or y t o th e path in each wor k in g win dow:

   > set path = ($O2HOME/bin $path)

   In or der t o r u n t h e O 2 Syst em you n eed to h ave a .O2KEYS licen se file
   for th e m ach in e you ar e r u n n in g on . Th e .O2KEYS file sh ou ld be st or ed
   in th e O2 in st allat ion dir ect or y.

   Th e o2server pr ogr am calls t h e O2 dat abase ser ver . Each o2server
   r u n s a sin gle n am ed syst em . Th e logical defin it ion for each syst em is
   given in t h e .o2serverrc file locat ed in t h e O2HOME dir ect or y. Th e
   .o2serverrc file con t ain s t h e syst em n am e, n am e of t h e ser ver
   m ach in e, t h e locat ion of t h e catalog, log an d sh adow dir ect or y. For
   m or e in for m at ion abou t th e .o2serverrc file r efer t o t h e O2 System
   Adm in ist r at ion Gu ide. Fr om th e O2HOME dir ect or y u se t h e followin g
   com m an ds t o cr eat e a .o2serverrc file for t h e tu tor ial.

   > mkdir o2vol

            Edit t h e .o2ser ver r c file an d add th e followin g lin es:

   demo.server = 
   demo.cataldir = $O2HOME/o2vol
   demo.logdir = $O2HOME/o2vol
   demo.shadowdir = $O2HOME/o2vol

   wh er e  is h e n am e of t h e m ach in e wh er e th e O2 ser ver will
   run.

            Th e defau lt syst em n am e an d ser ver n am e can be specified by
            th e en vir on m en t var aible O2OPTIONS. Use th e followin g
            com m an ds t o set O2OPTIONS:

   O2 ODMG Dat abase System Tu tor ial                                                        19
1   Introduction

         On Un ix,
                (in sh) set O2OPTIONS "-system demo -server
                 ; export O2SYSTEM
                (in csh) setenv O2OPTIONS "-system demo -server
                "

         On Win dows NT, u se th e Environment tab of t h e syst em pr oper t ies
         pan el to set t h e O2OPTIONS var iable.

         Th e O2OPTIONS en vir on m en t var iable is u sed by all O 2 u t ilit ies
         pr ogr am s.

         You m u st in it ialize a syst em befor e you can r u n a dat abase ser ver . Th e
         in it ializat ion pr ocess cr eat es t h e files u sed by th e dat abase ser ver . To
         in it ialize th e system u se th e followin g com m an d.

         > o2dba_init -system demo -server 

         Now st ar t t h e dat abase ser ver for t h e system with t h e followin g
         com m an d:

         > o2server -system demo

         Each syst em can con t ain m u lt iple sch em as an d bases. A schema is a
         collect ion of class defin ition s. A base is a collect ion of in st an ces of
         classes. Sch em as allow for t h e r eu se of code by let t in g you or gan ize a
         gr ou p of classes t h at wor k t oget h er in t o a sin gle sch em a. For in st an ce,
         you cou ld cr eat e a cu st om er sch em a t h at cou ld con t ain sever al classes
         to deal with cu st om er s. Th en an y ot h er applicat ion th at n eeded to deal
         with cu st om er s h as on ly t o im por t th e r elevan t classes fr om t h e
         cu st om er sch em a.

         You m u st cr eat e t h e schema an d base for t h e t u t or ial. Th is can be don e
         fr om a C++ pr ogr am or in t er act ively u sin g t h e O2 adm in ist r at ion tools.
         We will cr eat e th e schema an d base in t er actively. Fir st st ar t t h e O2
         adm in ist r at ion t ool.

         > o2dsa_shell

         Now cr eat e t h e sch em a an d base. Com m an ds ar e con fir m ed by t ypin g a
         n ew lin e followed by ctr l D.

         schema bankSchema;

         base bankBase;

         quit;

         ^D

20       O 2 ODM G D at abase Syst em Tu t or ial
Setup

Now copy t h e t u t or ial sou r ce code t o a wor k in g dir ect or y. To com plet e
t h e tu t or ial you will n eed appr oxim at ely t en m egabyt es of disk space in
t h e wor k in g dir ect or y. To copy t h e sou r ce code t o a dir ect or y called
working_directory execu t e t h e followin g:

On Un ix,
> cd $O2HOME/samples/o2cplusplus/odmg_tutorial/
> cp -r * working_directory

On Win dows NT, sim ply m ak e a copy/paste oper at ion t o t h e folder
u sin g t h e NT Explor er .

Th e dir ect or y called wor k in g_dir ect or y m u st alr eady exist . Now m ove t o
t h e wor k in g dir ect or y

On Un ix,
> cd working_directory/original

On Win dows NT,
> cd working_directory\original

You ar e n ow r eady t o por t t h e exam ple applicat ion t o O 2 .

O2 ODMG Dat abase System Tu tor ial                                                 21
1   Introduction

22       O 2 ODM G D at abase Syst em Tu t or ial
22                         P orting a C++
                           A p p l i ca ti o n

Th is ch apt er descr ibes h ow to por t an exam ple C++ applicat ion t o O2 .

It con tain s th e followin g sect ion s:
• St or e C++ object s in an O2 dat abase: im por t in g class defin it ion s t o O 2
• Ch an ge C++ poin t er s t o per sist en t poin t er s
• In clu de files
• Con n ect t o t h e database
• Ru n a t r an sact ion
• Cr eat e n am es
• M odify sou r ce code
• Cr eat e per sisten t object s
• Replace ar r ays by collect ion classes

O2 OD MG Dat abase Syst em Tu tor ial                                             23
2   Porting a C++ Application

         Th e exam ple application wor k s in it s cu r r en t st at e. Befor e pr oceedin g
         we su ggest you br owse t h r ou gh t h e files t o fam iliar ize you r self wit h t h e
         applicat ion , th en com pile, lin k an d execu te it . To com pile an d lin k t h e
         applicat ion en t er th e followin g com m an d:

         On Un ix
         > make -f MakefileUnix.original

         On Win dows NT

         > nmake -F MakefileNt.original

         On ce it h as been com piled r u n t h e pr ogr am t h r ou gh t h e followin g
         com m an ds:

         Star t t h e applicat ion

         > bank

         En ter t h e Accou n t n u m ber 11111 at t h e pr om pt an d pr ess en t er . Th e
         followin g will be displayed.

         Welcome to the Bank of O2

         Enter Account Number, 0 to exit

         > 11111

         At th e per son al ID pr om pt en ter t h e n u m ber 9999 an d pr ess en t er .

         Enter Personal ID Number, 0 to exit

         > 9999

         You ar e n ow logged in t o t h e syst em so you can car r y ou t t r an sact ion s
         wit h t h e accou n t s available.

         Now exit t h e pr ogr am .

         We will n ow go t h r ou gh t h e st eps n ecessar y t o por t t h e existin g
         applicat ion t o th e O2 Syst em . Figu r e 3 sh ows th e im por t , com pile an d
         lin k st eps t h at ar e n ecessar y t o gen er at e an O2 C++ dat abase
         applicat ion .

24       O 2 ODM G D at abase Syst em Tu t or ial
C++ Class
            Definitions

           o2import

                      Generated          Application
                      C++ Code           C++ Code

                            C++ Compiler

                      O2                  Object
Database              Runtime             Code
                      Library

                                Linker

                            Executable
                            Application
                            O2 Runtime
                            Library

               Figure 3.

  O2 ODMG Dat abase System Tu tor ial                  25
2      Porting a C++ Application

         2.1 Store C++ objects in an O2 database

             To st or e a C++ object in an O2 database, t h e dat abase n eeds in for m ation
             on t h e st r u ct u r e of t h e object . You can su pply th is in for m at ion by
             im por t in g C++ class defin it ion s. Th e im por t pr ocess par ses class
             defin it ion s to gen er at e m et a in for m at ion for t h e dat abase an d it
             en h an ces t h e exist in g class defin it ion s t o add per sist en ce. An en h an ced
             class defin it ion is a su bclass of a r oot per sist en t class (o2 _r oot ) an d
             sever al m et h ods ar e gen er ated for t h e class wh ich m an age in t er action
             wit h t h e dat abase.

             On ce t h e class h as been im por t ed in t o O2 , in stan ces of t h e class can be
             st or ed in t h e database or can con t in u e t o be u sed as n or m al t r an sien t
             C++ object s. Su ch classes ar e k n own as per sist en t capable classes.

             Th e o2cpp_import tool im por t s class defin it ion s in t o O 2 . To sim plify th e
             pr ocess of im por t in g m u ltiple classes in t o O2 a u t ilit y is pr ovided. Th is is
             o2makegen an d it gen er ates a M ak efile t o im por t all you r classes. Th e
             gen er at ed Mak efile can be u sed dir ect ly or can be in t egr at ed in t o you r
             exist in g m ak e pr ocess.

             Th e o2makegen pr ogr am t ak es a con figu r at ion file as in pu t . Th e
             con figu r at ion file for t h is tu t or ial is alr eady wr it ten . Th e file is
             bank.config. Th is con figu r at ion file in clu des com m en ts wh ich descr ibe
             t h e syn t ax. You sh ou ld r eview th is file t o bet ter u n der st an d th e
             in for m at ion n eeded t o im por t classes in t o O2 .

             Th e files im por ted m u st be com pilable in C++ or self-con t ain ed. H eader
             files ar e u su ally par sed du r in g t h e com pilat ion of a sou r ce file. Th e
             sou r ce file m ay pr ovide con t ext in for m at ion t h at is n eeded t o par se t h e
             h eader file. Com m an d lin e opt ion s m ay also pr ovide vit al in for m at ion .
             Most h eader files ar e self con t ain ed, h owever .

             Som e h eader files do r equ ir e addition al con t ext in for m at ion t o be
             im por t ed in t o O 2 . Th e m ost com m on addit ion al in for m ation n eeded is
             ot h er class defin it ion s. Th e best way t o solve t h is is to or der t h e im por t
             pr ocess so t h at an y class defin it ion n eeded by a class h as alr eady been
             im por t ed.

             Som et im es a closed cir cle of poin t er s can exist in class defin it ion s, for
             exam ple:
                  class A { B *pointer };
                  class B { A *pointer };

             To br eak t h is cycle you can u se t h e ImpForwardClasses opt ion with
             o2makegen t o declar e classes wh ich ar e n eeded t o par se a file, bu t
             wh ich h ave n ot yet been defin ed.

26           O 2 ODM G D at abase Syst em Tu t or ial
Store C++ objects in an O2 database

On ce im por t ed, t h e en h an ced per sist en t capable class defin it ion s m u st
be u sed in st ead of t h e or igin al t r an sien t class defin ition s. You can
eit h er h ave t h e o2cpp_import over wr it e t h e or igin al ver sion of th e
h eader file or wr it e it t o an ot h er file. In t h is exam ple we do n ot over wr it e
t h e h eader files. Th e lin e "[FILENAM E]Im pOu t pu t Dir : ou t pu t " in
bank.config specifies t h at th e gen er at ed files sh ou ld be st or ed in t h e
output dir ect or y.

To gen er ate t h e Mak efile for t h e applicat ion execu t e t h e followin g
com m an d:

> o2makegen bank.config

O2 ODMG Dat abase System Tu tor ial                                                    27
2      Porting a C++ Application

         2.2 Change C++ pointers to persistent pointers

             For each class T im por t ed in t o O 2 an an cillar y class d_Ref is
             available. An in stan ce of t h e d_Ref class is called a per sist en t poin t er .
             Th e per sist en t poin t er is t h en u sed t o r efer en ce an in stan ce of a
             per sist en t capable class. Per sist en t poin t er s ar e m an ipu lat ed in t h e
             sam e way as st an dar d C++ poin t er s. Per sist en t poin t er s m ain tain a
             r elat ion sh ip bet ween two object s per m an en t ly in t h e dat abase.
             Stan dar d C++ poin t er s r efer t o an addr ess wh ich is valid on ly wh ile a
             pr ogr am is execu t in g.

             Befor e im por t in g class defin ition s in to O2 you m u st ch an ge st an dar d
             C++ poin t er s in per sist en t capable classes to per sisten t poin t er s. For
             in st an ce in t h e exam ple applicat ion t h e Per son class h as a poin t er t o an
             addr ess object .
                   class Person {
                   ...
                   Address *address;
                   ...
                   };

             So t h at t h e dat abase can m ain t ain t h e r elat ion sh ip bet ween t h e Per son
             an d t h e Addr ess you n eed t o ch an ge t h e poin t er t o a per sist en t poin t er .
                   class Person {
                   ...
                   d_Ref address;
                   ...
                   };

             Th e per sist en t poin t er m ech an ism offer s a n u m ber of advan t ages t o t h e
             C++ pr ogr am m er . Per sist en t poin t er s ch eck r efer en t ial in tegr it y so you r
             dat a is safe fr om cor r u pt ion by dan glin g poin ter s. A per sist en t poin t er
             can addr ess m or e dat a t h an th e st an dar d 32 bit C++ poin t er so you r
             dat abase can be scaled t o a lar ger size.

             o2cpp_import h elps you by au t om at ically m odifyin g t h e class defin ition
             t o u se per sist en t poin t er s in st ead of st an dar d C++ poin t er s. If an
             at t r ibu t e is a poin t er t o an ot h er k n own per sist en t class th e poin t er will
             au tom at ically be ch an ged t o a per sist en t poin ter . Th e m et h od
             sign at u r es m ay also con t ain r efer en ces t o per sist en t capable classes.
             However , m et h od sign at u r es m ay or m ay n ot n eed t o be ch an ged
             depen din g on wh et h er or n ot t h e dat a r efer en ced is per sist en t . For t h is
             r eason m et h od sign at u r es ar e n ot m odified by o2cpp_import an d it is
             left t o you t o decide if m eth od sign atu r es sh ou ld be ch an ged.

             In t h e accou n t .h xx file you on ly n eed t o ch an ge t wo m et h od sign at u r es
             of t h e Accou n t class. Th e Per son an d Addr ess class can be im por t ed
             wit h ou t ch an ge. You m u st m ak e t h e ch an ges ou tlin ed below t o t h e
             Accou n t class.

28           O 2 ODM G D at abase Syst em Tu t or ial
Change C++ pointers to persistent pointers

  Wh en m ak in g ch an ges you can delet e lin es or con ver t t h em t o
  com m en t s. Bot h t h e or igin al ver sion an d th e m odified ver sion ar e in t h e
  file. Th e m odified ver sion is in com m en t s. You n eed on ly r em ove th e
  com m en t s an d delete t h e or igin al ver sion or con ver t it t o com m en t s. Th e
  best way t o fin d t h e lin es t h at n eed t o be ch an ged is t o sear ch for t h e
  class n am e or m et h od n am e wh er e t h e ch an ge tak es place. Th e lin e "/ /
  ODMG Per sist en t Ver sion " sh ou ld r em ain in com m en ts.

• account.hxx file

  In t h e Accou n t class defin it ion in t h e accou n t .h xx file delet e or
  com m en t ou t th e followin g lin es:
        // Original Version
        Person *lookupOwner(int pin_number) const;
        void newOwner(Person *NewOwner);
        void insertEvent(Event* event);

  an d add or u n -com m en t th e followin g lin es in t h eir place:
        // ODMG Persistent Version
        d_Ref lookupOwner(int pin_number) const;
        void newOwner(d_Ref &NewOwner);
        void insertEvent(const d_Ref &event);

  You m u st also ch an ge t h e cor r espon din g sign at u r e of th e m et h od
  defin ition .

• account.cxx file

  In t h e file accou n t .cxx delet e or com m en t ou t t h e followin g lin e:
        // Original Version
        Person * Account::lookupOwner(int pin_number) const {

  an d add or u n -com m en t t h e followin g lin e in it s place:
        // ODMG Persistent Version
        d_Ref Account::lookupOwner(int pin_number)
          const{

  In t h e file accou n t .cxx delet e or com m en t ou t t h e followin g lin e:
        // Original Version
        void Account::newOwner(Person *NewOwner) {

  an d add or u n -com m en t t h e followin g lin e in it s place:
        // ODMG Persistent Version
        void Account::newOwner(d_Ref &NewOwner) {

   O2 ODMG Dat abase System Tu tor ial                                                  29
2    Porting a C++ Application

            In t h e file accou n t .cxx delet e or com m en t ou t t h e followin g lin e:
                 // Original Version
                 void Account::insertEvent(Event* event) {

            an d add or u n -com m en t t h e followin g lin e in it s place:
                 // ODMG Persistent Version
                 void Account::insertEvent(const d_Ref &event) {

         • atm.hxx file

            In t h e file at m .h xx again you on ly n eed t o ch an ge t h e m et h od
            sign at u r es. Mak e t h e ch an ges ou t lin ed below t o at m .h xx.

            In t h e ATM class defin it ion in t h e file at m .h xx delet e or com m en t ou t t h e
            followin g lin es:
                 // Original Version
                 Account *newAccount(int account_number, ...);
                 Account *lookupAccount(int account_number) const;

            an d add or u n -com m en t t h e followin g lin es in t h eir place:
                 // ODMG Persistent Version
                 d_Ref newAccount(int account_number, ...);
                 d_Ref lookupAccount(int account_number) const;

            Again ch an ge t h e cor r espon din g sign at u r es in t h e m et h od defin it ion s.

         • atm.cxx file

            In t h e file at m .cxx delet e or com m en t ou t th e followin g lin e:
                 // Original Version
                 Account * ATM::lookupAccount(int account_number) const

            an d add or u n -com m en t t h e followin g lin e in it s place
                 // ODMG Persistent Version
                 d_RefATM::lookupAccount(int
                   account_number)const

            In file atm .cxx delet e or com m en t ou t t h e followin g lin e:
                 // Original Version
                 Account * ATM::newAccount(int account_number, ...) {

            an d add or u n -com m en t t h e followin g lin e in it s place
                 // ODMG Persistent Version
                 d_Ref ATM::newAccount(int account_number,
                   ...);

30          O 2 ODM G D at abase Syst em Tu t or ial
Change C++ pointers to persistent pointers

• terminal.hxx file

   In file ter m in al.h xx in t h e class Ter m in al delet e or com m en t ou t t h e
   followin g lin es:
        // Original Version
        Account *displaySelectAccount(const Person* customer)
          const;
        void displayPerson(const Person *customer) const;

   an d add or u n -com m en t t h e followin g lin e in th eir place
        // ODMG Persistent Version
        d_Ref displaySelectAccount(const d_Ref
          &customer) const;
        void displayPerson(const d_Ref &customer)
          const;

   On ce again ch an ge t h e cor r espon din g m et h od defin it ion s.

• terminal.cxx file

   In file ter m in al.cxx delet e or com m en t ou t t h e followin g lin e:
        // Orignal Version
        Account* Terminal::displaySelectAccount(const Person*
          customer) const{

   an d add or u n -com m en t t h e followin g lin e in it s place
        // ODMG Persistent Version
        d_Ref Terminal::displaySelectAccount(const
          d_Ref& customer) const {

   In file ter m in al.cxx delet e or com m en t ou t t h e followin g lin e:
        // Original Version
        void Terminal::displayPerson(const Person *customer)
          const {

   an d add or u n -com m en t t h e followin g lin e in it s place
        // ODMG Persistent Version
        void Terminal::displayPerson(const d_Ref&
          customer) const{

   O2 ODMG Dat abase System Tu tor ial                                                    31
2      Porting a C++ Application

         2.3 Include files

              You m u st add t h e followin g in clu de files t o t h e applicat ion . Th ese
              in clu de files con t ain t h e object s, classes an d fu n ct ion s wh ich pr ovide
              t h e in t er face bet ween t h e applicat ion an d t h e database.

              Th e atm .h xx file is in clu ded by ever y sou r ce file so we will add t h e
              in clu de lin es t o t h at file.

           • atm.hxx file

              In t h e file at m .h xx add or u n -com m en t t h e followin g lin es
                   // ODMG Persistent Version
                   // Contains d_Session, d_Database and d_Transaction
                     classes
                   #include “o2lib_CC.hxx
                   // Contains templates for d_Ref, d_Set, d_List, ...
                   #include “o2template_CC.hxx”
                   // Contains OQL interface
                   #include “OQL_CC.hxx”

32            O 2 ODM G D at abase Syst em Tu t or ial
Connect to the database

2.4 Connect to the database

    Th e ODM G C++ bin din g con t ain s a set of classes for database
    m an agem en t. Th e d_Session class set s u p com m u n icat ion s between a
    C++ applicat ion an d a dat abase ser ver . Th e d_D at abase class is u sed t o
    cr eat e, dest r oy, open an d close a dat abase. Th e d_Dat abase class can
    also be u sed t o cr eat e an d dest r oy n am es in t h e dat abase as well as
    associat in g C++ var iables t o n am es. Th e d_Tr an sact ion class star t s an d
    en ds t r an sact ion s wit h t h e dat abase. You n eed to add in st an ces of all of
    t h ese classes t o th e exam ple applicat ion .

    Th e d_Session class h as a begin m et h od t o est ablish com m u n ication
    wit h t h e dat abase ser ver . Th e followin g lin e in t h e sou r ce code sh ows
    t h e call t o begin :
         session.set_default_env();
         if (session.begin(argc,argv)) {

    Th e par am et er s passed t o begin ar e t h e ar gc an d ar gv par am et er s
    passed t o t h e m ain r ou t in e. Th e set _defau lt _en v m et h od sets t h e O2
    Syst em n am e, t h e n am e of t h e m ach in e t h at t h e O2 Ser ver is r u n n in g
    on an d t h e locat ion of th e O2 soft war e.

    Th e d_Session class also h as an en d m et h od. Th is m eth od closes t h e
    con n ection wit h th e dat abase. Th e followin g lin e fr om t h e sou r ce code
    sh ows t h e call to en d:
         session.end();

    Aft er con n ect in g t o t h e dat abase ser ver t h e applicat ion m u st specify
    wh ich dat abase t o open . Th e followin g lin e sh ows t h e call n eed t o open
    t h e ban k Base dat abase.
         database_g->open("bankBase");

    It is possible t o open an d close m u lt iple dat abases in a sin gle session .
    Th e followin g lin e sh ow th e call n eeded t o close t h e dat abase
         database_g->close();

    O2 ODMG Dat abase System Tu tor ial                                                    33
2      Porting a C++ Application

         2.5 Run a transaction

             In or der t o m odify dat a in t h e database you n eed to be in a t r an sact ion .

             Th e t r an sact ion m ech an ism pr ot ect s an applicat ion again st failu r e an d
             en su r es t h at dat a is con sist en t in a m u lt i-u ser en vir on m en t .

             In side a t r an sact ion , O2 pr ovides an isolat ion pr oper t y by lock in g t h e
             objects. Con sequ en t ly, in cer tain cir cu m st an ces a t r an sact ion wait s
             u n t il an oth er t r an sact ion com m its.

             To m in im ize t h e wait t im e, we declar e a t r an sact ion on ly in t h e m et h ods
             th at m odify t h e dat a.

          • account.cxx file

             In th e m et h od Accou n t ::deposit add or u n -com m en t t h e followin g lin es:
                  d_Transaction transaction;
                  transaction.begin();
                  ...
                  transaction.validate();

             In th e m et h od Accou n t ::wit h dr aw add or u n -com m en t t h e followin g
             lin es:
                  d_Transaction transaction;
                  transaction.begin();
                  ...
                  transaction.validate();

          • atm.cxx file

             In th e m et h od ATM::in it ializeAccou n t s() add or u n -com m en t t h e
             followin g lin es:
                  d_Transaction transaction;
                  transaction.begin();
                  ...
                  transaction.validate();

34           O 2 ODM G D at abase Syst em Tu t or ial
Create names

2.6 Create names

   You will n eed t o cr eat e n am es in th e dat abase. A n am e is t h e en t r y poin t
   for t h e application to th e database. You can cr eat e a sin gle n am e for t h e
   ATM object , ATM_MACH INE an d th en access all per sist en t dat a by
   t r aver sin g fr om t h e n am ed ATM object . Sin ce t h e n am e n eeds t o be
   cr eat ed on ly on ce you can cr eat e it du r in g in it ializat ion . Th e
   set_object _n am e m et h od of t h e d_Database class is u sed t o cr eate t h e
   n am e. Th e followin g lin e sh ows t h e call n eeded t o cr eat e t h e
   ATM _MACHINE n am e
         database_g-> set_object_name(atm_machine,
           "ATM_MACHINE");

   On ce t h e n am e is cr eat ed you access t h e n am e t h r ou gh a per sist en t
   poin t er . You can associat e a per sist en t poin t er wit h a n am ed object by
   t r an sm it t in g t h e n am e as an ar gu m en t t o t h e con str u ct or . For exam ple:
         d_Ref machine("ATM_MACHINE");

   Th e r elat ion sh ip can also be est ablish ed by u sin g t h e
   d_Dat base::look u p_object m et h od. We will u se t h e look u p_object
   m et h od for t h e ATM applicat ion sin ce th e per sist en t poin t er is declar ed
   befor e t h e n am e h as been cr eat ed. Th e followin g lin e sh ows t h e call
   n eeded t o look u p th e n am e ATM_MACH INE
         atm_machine->lookup_object("ATM_MACHINE");

   O2 ODMG Dat abase System Tu tor ial                                                       35
2      Porting a C++ Application

         2.7 Modify source code

             We n eed t o cr eat e an in st an ce of d_D at abase in global scope so t h at we
             can cr eate n ew object s in t h e database in an y fu n ct ion or m et h od.

             Near lin e 80 in m ain .cxx add or u n -com m en t th e followin g global
             declar at ion .

          • main.cxx file

             In t h e file m ain .cxx n ear lin e 80 add or u n -com m en t t h e followin g global
             declar at ion .
                   d_Database* database_g = new d_Database;

             We also n eed t o add a declar at ion so t h at ot h er files can access t h e
             global var iable. We will add th e declar at ion t o t h e file at m .h xx sin ce it is
             in clu ded by ever y sou r ce file.

          • atm.hxx file

             In file atm .h xx add or u n -com m en t t h e followin g lin es:
                   // ODMG Persistent Version
                   // Global database pointer for creating objects in the
                     database
                   extern d_Database* database_g;

             You can t h en add th e code t o est ablish a con n ect ion with t h e dat abase,
             open t h e ban k Base dat abase, st ar t t h e t r an sact ion , cr eat e th e n am es in
             t h e dat abase, en d th e t r an sact ion , close t h e ban k Base an d fin ally close
             t h e con n ect ion wit h t h e dat abase.

             In t h e class ATM add or u n -com m en t t h e followin g lin e:
                   void d_activate {term = new Terminal;}

             You m u st in itialize t h e t em por ar y at tr ibu t e t er m wh en t h e per sist en t
             object of t h e class ATM is r ead fr om t h e dat abase for th e fir st t im e.

          • main.cxx file

             In t h e file m ain .cxx delete or com m en t ou t t h e followin g lin es:
                   // Original Version
                      ATM* atm_machine;
                      atm_machine->initializeAccounts();
                      atm_machine = new ATM;
                      atm_machine->run();

             an d add or u n -com m en t t h e followin g lin es in t h eir place, n ot e t h at t h e
             com m en ted ou t por t ion begin s wit h "/ * BEGIN PERSISENT VERSION"

36           O 2 ODM G D at abase Syst em Tu t or ial
Modify source code

an d en ds wit h "END PERSISTENT VERSION */ " in st ead of th e "/ / "
com m en t s:
     // ODMG Persistent Version
     /* BEGIN PERSISTENT VERSION */
        d_Session session;
        d_Transaction transaction;
        // ODMG Persistent Version
        d_Ref atm_machine;
        session.set_default_env();
        if (session.begin(argc,argv)) {
          cerrinitializeAccounts();
        } else {
           database_g->open("bankBase");
           atm_machine =
            database_g->lookup_object("ATM_MACHINE");
        }
           if (! atm_machine) {
           cerr close();
        session.end();
     /* END PERSISTENT VERSION */

Now you ar e r eady t o cr eat e object s in t h e dat abase.

O2 ODMG Dat abase System Tu tor ial                                      37
2      Porting a C++ Application

         2.8 Create persistent objects

             In t h e OD MG bin din g, per sist en ce is specified at object cr eat ion tim e. If
             you wan t t o cr eat e a per sist en t object you t r an sm it a d_Database
             poin t er t o t h e n ew oper at or of t h e object . Sin ce all per sist en t dat a is
             accessed fr om n am es, each n ewly cr eated per sist en t object sh ou ld be
             at t ain able fr om a n am e. An object can be associat ed dir ect ly wit h a
             n am e or an object can be in dir ect ly att ain able fr om a n am e th r ou gh
             per sist en t poin t er s.

             Th e allocat ion st at em en ts in t h e exam ple applicat ion m u st be m odified
             t o cr eat e per sist en t object s in st ead of t r an sien t on es. Som e local
             var iable declar ation s wh ich ar e poin t er s t o per sist en t object s n eed t o be
             ch an ged t o per sist en t poin ter s. Th is en su r es th at per sist en t object s ar e
             k ept in t h e C++ cach e. Th e dat abase will swap per sist en t object s ou t of
             t h e cach e t h at ar e n o lon ger poin t ed t o by a per sisten t poin t er .

           • account.cxx file

             In file accou n t .cxx in t h e m et h od Accou n t ::deposit delet e or com m en t
             ou t t h e followin g lin es:
                  // Original Version
                  depositEvent* event = new depositEvent(machine_g);

             an d add or u n -com m en t t h e followin g lin es in t h eir place
                  // ODMG Persistent Version
                  d_Ref event = new(database_g)
                    depositEvent(machine_g);

             In file accou n t .cxx in t h e m et h od Accou n t ::wit h dr aw delet e or com m en t
             ou t t h e followin g lin es:
                  // Original Version
                  withdrawEvent* event = new withdrawEvent(machine_g);

             an d add or u n -com m en t t h e followin g lin es in t h eir place

                  d_Ref event = new(database_g)
                    withdrawEvent(machine_g);

38            O 2 ODM G D at abase Syst em Tu t or ial
Create persistent objects

• atm.cxx file

   In file at m .cxx in t h e m et h od ATM::r u n delet e or com m en t ou t t h e
   followin g lin es:
        // Original Version
        Account * current_account;
        Person * current_customer

   an d add or u n -com m en t t h e followin g lin es in t h eir place
        // ODMG Persistent Version
        d_Ref current_account;
        d_Ref current_customer;

   In file at m .cxx in t h e con st r u ct or ATM ::ATM () delet e or com m en t ou t t h e
   followin g lin es:
         // Original Version
        location = new Address("3600_BAYSHORE","PALO
          ALTO","CA","94043");

   an d add or u n -com m en t t h e followin g lin es in t h eir place
        // ODMG Persistent Version
        location = new(database_g) Address("3600_BAYSHORE",
          "PALO_ALTO", "CA", "94303");

   In file at m .cxx in t h e m et h od ATM ::look u pAccou n t (in t accou n t _n u m ber )
   delet e or com m en t ou t t h e followin g lin es:
        // Original Version
        Account *target_account = (Account*) NULL;

   an d add or u n -com m en t t h e followin g lin es in t h eir place
        // ODMG Persistent Version
        d_Ref target_account = (Account*)NULL;

   In file at m .cxx in t h e m et h od ATM:in it ializeAccou n t s() delet e or
   com m en t ou t th e followin g lin es:
        // Original Version
        Person* current_person;
        ...
        Account* new_account = new Account;
        inFile >> * new_account;
        ...
        // Original Version
        current_person = new Person;
        inFile >> * current_person;

   O2 ODMG Dat abase System Tu tor ial                                                   39
2   Porting a C++ Application

         an d add or u n -com m en t t h e followin g lin es in t h eir place
              // ODMG Persistent Version
              d_Ref current_person;
              ...
              d_Ref new_account = new(database_g) Account;
              inFile >> * (new_account.ptr());
              ...
              // ODMG Persistent Version
              current_person = new(database_g) Person;
              inFile >> * (current_person.ptr());

         In file atm .cxx in t h e m et h od ATM:n ewAccou n t(in t accou n t_n u m ber , ...)
         delet e or com m en t ou t t h e followin g lin es:
              // Original Version
              Account* new_account = new Account(account_number,
                description, balance);

         an d add or u n -com m en t t h e followin g lin es in t h eir place
              // ODMG Persistent Version
              d_Ref new_account = new(database_g) Account
                (account_number, description, balance);

         Sin ce t h e ATM object is n am ed an d all per sist en t object s ar e associat ed
         wit h t h e ATM by per sist en t poin t er s n o addition al n am es n eed t o be
         cr eat ed.

         J u st as wit h a typical C++ pr ogr am you can explicit ly delete object s
         fr om th e dat abase wh en t h ey ar e n o lon ger n eeded. However , O2
         pr ovides a gar bage fu n ct ion t o deal wit h dat a t h at is n ot delet ed by t h e
         applicat ion .

         In file accou n t .cxx in t h e oper at or >> (ifst r eam & , Per son & ) delet e or
         com m en t ou t t h e followin g lin es:
              p.address = new Address;
              ifs >> *p.address
              ...
              Account* current_account;

         an d add or u n -com m en t t h e followin g lin es in t h eir place
              p.address = new(database_g) Address;
              ifs >> *(p.address.ptr());
              ...
              d_Ref current_account;

40       O 2 ODM G D at abase Syst em Tu t or ial
Build and Run the Application

2.9 Build and Run the Application

    Th e sam ple applicat ion is n ow por t ed t o th e O2 Syst em .

    To com pile, lin k an d r u n t h e applicat ion en t er th e followin g com m an d:

    On Un ix,
    > make clean
    > make

    On Win dows NT,
    > nmake clean
    > nmake

    If n ecessar y, cor r ect an y t ypin g er r or s you m igh t h ave m ade t h at cau se
    syn t ax er r or s an d r epeat t h e m ak e.

    On ce it h as been com piled an d lin k ed r u n t h e pr ogr am t h r ou gh t h e
    followin g com m an ds:

    St ar t t h e applicat ion

    > bank -initialize

    En t er t h e Accou n t n u m ber 11111 at t h e pr om pt an d pr ess en t er . Th e
    followin g will be displayed.

    Welcome to the Bank of O2

    Enter Account Number, 0 to exit

    > 11111

    At t h e per son al ID pr om pt en t er t h e n u m ber 9999 an d pr ess en t er .

    Enter PIN Number

    > 9999

    You ar e n ow logged in to t h e syst em so you can car r y ou t tr an sact ion s
    wit h t h e accou n t s available.

    Now exit t h e pr ogr am

    O2 ODMG Dat abase System Tu tor ial                                                  41
2       Porting a C++ Application

         2.10 Replace arrays by collection classes

               ODMG-93 in t r odu ces pr edefin ed gen er ic collect ion classes. An O2
               OD MG dat abase su ppor ts all ODM G collect ion classes. Th e collect ion s
               su ppor t ed ar e:

               d_Set - u n or der ed collect ion of elem en t s wit h n o du plicat es.

               d_Bag - u n or der ed collect ion of elem en t s t h at allows for du plicat es.

               d_List - an or der ed collection of elem en t s t h at allows for du plicates.

               d_Var r ay - a on e dim en sion al ar r ay of var yin g len gt h .

               Collection classes u se st an dar d C++ t em plat e classes t o pr ovide su ppor t
               for elem en ts of an ar bit r ar y type. Th ese classes h ave m et h ods for
               var iou s oper ation s, su ch as in ser t , delet e, appen d, u n ion , in t er sect ion ,
               et c. Th er e is also an it er at or t em plat e class for defin in g iter ator s for an y
               t ype of collect ion . Th e it er at or s ar e u sed t o scan a collect ion sequ en tially
               r et u r n in g each m at ch in g elem en t fr om t h e collect ion .

               Th e u se of collect ion classes in C++ pr ogr am s m ak es t h e pr ogr am s m or e
               scalable. Ou r exam ple applicat ion u ses ar r ays t o st or e collect ion s. Th e
               size of t h e ar r ays is set at t h e t im e t h e applicat ion is com piled. Th e
               OD MG C++ collect ion classes ar e n ot of a fixed size an d can expan d as
               t h e applicat ion evolves.

               Collection classes ar e t igh t ly cou pled to t h e O 2 dat abase t o pr ovide
               t r an spar en t cach in g of lar ge collect ion s. Wh en an applicat ion accesses a
               lar ge ODM G collect ion on ly a por t ion of t h e collect ion is br ou gh t in t o
               applicat ion m em or y. As t h e applicat ion tr aver ses t h e collect ion t h e r est
               of t h e collect ion is br ou gh t in . Accessin g data in collect ion s can be
               speeded u p by cr eat in g in dexes on a collect ion .

               You can n ow r eplace t h e ar r ays in t h e exam ple application wit h
               collect ion classes. Th e ATM class con t ain s t h e list of accou n ts. Th is is
               k n own as t h e accou n t s_list . Th e list of accou n t s is im plem en t ed u sin g a
               st an dar d C++ ar r ay. Sin ce t h er e is n o r equ ir em en t t o m ain t ain an y
               or der in g on t h e list of accou n t s we will u se a d_Set t o r eplace t h e ar r ay.
               Fir st we n eed t o m odify t h e declar at ion of t h e accou n t list .

            • atm.hxx file

               In t h e ATM class declar at ion in t h e file at m .h xx com m en t ou t or delete
               t h e followin g lin es:
                    // Original Version
                    Account *accounts_list[MAX_ACCOUNTS];

               an d add or u n -com m en t t h e followin g lin es in t h eir place:

42             O 2 ODM G D at abase Syst em Tu t or ial
Replace arrays by collection classes

         // ODMG Collection Class Replacement
         d_Set< d_Ref > accounts_list;

   Not e t h e u se of a space bet ween > > to differ en t iate bet ween a n ested
   t em plat e an d t h e sh ift oper ator .

   Now m odify t h e code wh er e t h e accou n t s_list is bein g u sed. On ly t h e
   look u pAccou n t m et h od accesses t h e accou n t s_list . Rem ove t h e
   in it ializat ion code th at is n o lon ger n eeded t h en r eplace t h e for loop
   u sed in t h e m et h od wit h t h e u se of an iter ator . Fir st cr eat e t h e it er at or
   fr om t h e accou n ts_list collect ion an d t h en t r aver se th e collect ion u sin g
   t h e it er at or .

• atm.cxx file

   In t h e con st r u ct or ATM::ATM in t h e file atm .cxx delet e or com m en t ou t
   t h e followin g lin es:
            // Original Version
            //for(int i=0;igetNumber() == account_number)
           {
                     target_account = accounts_list[i];
               }     break;
            }

   an d add or u n -com m en t t h e followin g lin es in t h eir place:
         // ODMG Collection Class Replacement
            d_Ref search_account;
            d_Iterator< d_Ref > iterator =
           accounts_list.create_iterator();
            while ( iterator.next(search_account) ) {
                    if (search_account->getNumber() ==
                                        account_number)
                       target_account = search_account;
            }          break;

   O2 ODMG Dat abase System Tu tor ial                                                        43
2   Porting a C++ Application

         M odify t h e accou n t cr eat ion r ou t in e t o appen d t h e n ew accou n t on t o t h e
         list by m ak in g t h e followin g m odificat ion .

         In t h e m et h od ATM::in itializeAccou n t s in th e file at m .cxx delet e or
         com m en t ou t t h e followin g lin es:

                  // Original Version
                  int i = 0;
                  while (accounts_list[i] != NULL)
                      i++;
                   accounts_list[i] = new_account;

         an d add or u n -com m en t t h e followin g lin es in t h eir place:

                   // ODMG Collection Class Version
                   accounts_list.insert_element( new_account );

         In t h e m et h od ATM::n ewAccou n t in t h e file at m .cxx delet e or com m en t
         ou t t h e followin g lin es:

                 // Original Version
                 int i = 0;
                 while (accounts_list[i] != NULL)
                     i++;
                  accounts_list[i] = new_account;

         an d add or u n -com m en t t h e followin g lin es in t h eir place:

                 // ODMG Collection Class Version
                  accounts_list.insert_element( new_account );

         Replace t h e ar r ay of poin t er s t o even t s in t h e Accou n t class t o u se an
         OD MG collect ion class. Th e or der of t h e even ts is sign ifican t so u se a
         d_List t o m ain t ain t h e or der . Collect ion classes su ppor t polym or ph ism
         t h r ou gh class h ier ar ch y t h er efor e t h e d_List  m ay
         con tain elem en t s of t h e su bclasses of Even t , n am ely deposit Even t an d
         wit h dr awEven t . Replace t h e ar r ay of Per son by a r elation sh ip of t ype
         d_Set  t o m ain t ain r efer en t ial in t egr it y wit h Per son an d
         ch an ge it s in ver se lin k , accou n t s in t h e Per son class, to a r elation sh ip of
         t h e t ype d_List . M ak e th e followin g ch an ges t o t h e
         declar at ion of t h e even ts_com plet ed, own er s in t h e Accou n t class an d
         accou n t s in t h e Per son class.

44       O 2 ODM G D at abase Syst em Tu t or ial
Replace arrays by collection classes

• account.hxx file

  In t h e accou n t class declar ation in t h e file accou n t .h xx delet e or
  com m en t ou t th e followin g lin es:
        // Original Version
            Person* owners[CUSTOMERS_PER_ACCOUNT];
            ...
            Event *events_completed[MAX_EVENTS];

  Add or u n -com m en t th e followin g lin es in th eir place:
        // ODMG Collection Class Replacement
            d_Set owners inverse accounts;
            ...
            d_List< d_Ref > events_completed;

  In t h e Per son class declar at ion delet e or com m en t ou t th e followin g
  lin es:
        // Original Version
        Account* accounts[ACCOUNTS_PER_CUST]

   Add or u n -com m en t t h e followin g lin es in t h eir place:
        // ODMG Collection Class Replacement
        d_List accounts inverse owners

  You also n eed t o ch an ge th e way t h e even t s_com plet ed an d t h e own er s
  ar e u sed. St op th e even t s_com plet ed an d own er s bein g in it ialized t o
  NULL in bot h t h e Accou n t con st r u ct or s an d add t h e in itializer for th e
  r elat ion sh ip.

• account.cxx file

  In t h e con st r u ct or Accou n t ::Accou n t in t h e file accou n t .cxx delet e or
  com m en t ou t th e followin g lin es
        // Original Version
        int i;
        for (i=0;i
2   Porting a C++ Application

                    for (i=0;ipersonal_id ==
                  pin_number) {
                         return owners[j];

46       O 2 ODM G D at abase Syst em Tu t or ial
Replace arrays by collection classes

an d u n -com m en t or add t h e followin g lin es:
     d_Ref search_person;
     d_Iterator< d_Ref > iterator =
       owners.create_iterator();
     while ( iterator.next(search_person) ) {
          if (search_person->personal_id == pin_number) {
               return search_person;
          }
     }

In t h e m et h od Accou n t ::n ewOwn er in t h e file accou n t .cxx r em ove or
com m en t ou t th e followin g lin es:
          // Original Version
            int i = 0;
            while (owners[i]) i++;
            owners[i] = NewOwner;

an d u n -com m en t or add t h e followin g lin es:
          // ODMG Collection Class Version
           owners.insert_element(NewOwner);

In t h e con st r u ct or Per son ::Per son () in t h e file accou n t.cxx r em ove or
com m en t ou t th e followin g lin es:
       // Original Version
       Person::Person() {
          for (int i = 0; inewOwner(&p);

an d u n -com m en t or add t h e followin g lin es:
      // ODMG Collection Class Version
       p.accounts.insert_element (current_account);

O2 ODMG Dat abase System Tu tor ial                                                      47
2   Porting a C++ Application

         In t h e m et h od Ter m in al::displaySelect Accou n t in t h e file t er m in al.cxx
         r em ove or com m en t ou t th e followin g lin es:
                // Original Version
                while (i < ACCOUNTS_PER_CUST && customer->accounts[i])
                 {

         an d u n -com m en t or add t h e followin g lin es:
                // ODMG Collection Class Version
                int nb = customer->accounts.cardinality();
                while (i < nb && customer-accounts[i]) {

48       O 2 ODM G D at abase Syst em Tu t or ial
Build and Run the Application

2.11 Build and Run the Application

     Now you h ave por t ed t h e au t om at ed t eller m ach in e applicat ion t o u se
     ODMG collect ion classes. Th e n ext st ep is t o com pile an d lin k th e
     m odified applicat ion .

     Ru n t h e followin g com m an d t o com pile an d lin k t h e applicat ion :

     On Un ix,
     > make

     On Win dows NT,
     > nmake

     If n ecessar y, cor r ect an y t ypin g er r or s you m igh t h ave m ade t h at cau se
     syn t ax er r or s an d r epeat t h e m ak e.

     Now r u n t h e application , u sin g t h e in it ialize option t o r er ead t h e dat a
     fr om t h e files. You n eed t o r ein it ialize t h e dat abase becau se you
     m odified t h e sch em a wh en you added th e collect ion classes.

     > bank -initialize

     En t er t h e Accou n t n u m ber 11111 at t h e pr om pt an d pr ess en t er . Th e
     followin g will be displayed.

     Welcome to the Bank of O2

     Enter Account Number, 0 to exit

     > 11111

     At t h e per son al ID pr om pt en t er t h e n u m ber 9999 an d pr ess en t er .

     Enter PIN Number

     > 9999

     You ar e n ow logged in to t h e syst em so you can car r y ou t tr an sact ion s
     wit h t h e accou n t s available.

     To exit t h e pr ogr am en t er 0 at t h e accou n t n u m ber pr om pt .

     O2 ODMG Dat abase System Tu tor ial                                                        49
2   Porting a C++ Application

50       O 2 ODM G D at abase Syst em Tu t or ial
33                       OQL

Th is ch apt er descr ibes OQL.

It con tain s th e followin g sect ion s:
• Th e O2 OD MG Object Qu er y Lan gu age
• Em beddin g OQL in C++
• Bu ild an d Ru n t h e Applicat ion

O2 OD MG Dat abase Syst em Tu tor ial       51
3       OQL

          3.1 The O2 ODMG Object Query Language

               OD MG-93 in t r odu ces an object qu er y lan gu age (OQL). OQL is an SQL-
               st yle lan gu age t h at allows for easy access t o object s. Sim ilar in u se t o
               SQL, OQL is an essen t ial t ool for developin g dat abase applicat ion s.

            • Query optimization

               Th e syst em opt im izes you r qu er ies. Tr ied an d t est ed opt im izat ion
               t ech n iqu es ar e u sed t o evalu at e an OQL qu er y. For exam ple, OQL u ses
               appr opr iat e in dexes to r edu ce t h e am ou n t of data t o be filter ed. It
               fact or izes com m on su b-expr ession s, discover s wh ich expr ession s can be
               com pu t ed on ce ou t side an it er at ion , an d m ak es select ion s befor e
               st ar t in g an in n er it er at ion .

            • Logical and physical independence

               OQL differ s fr om st an dar d pr ogr am m in g lan gu ages in t h at t h e execu t ion
               of an OQL qu er y can be im pr oved dr am at ically wit h ou t m odifyin g t h e
               qu er y it self. Th is is don e by declar in g n ew ph ysical dat a st r u ct u r es or
               n ew in dexin g or clu st er in g st r at egies. Th is r edu ces r espon se t im e.

               Th is sor t of m odificat ion in a pu r ely im per at ive lan gu age lik e C++
               r equ ir es t h at an algor it h m be com pletely r ewr itt en , as it m ak es u se of
               ph ysical st r u ct u r es.

     Interactive ad hoc queries

               A dat abase u ser can n ot be ask ed t o wr it e, com pile, lin k , edit an d debu g
               a C++ pr ogr am to m ak e sim ple qu er ies. OQL can be u sed dir ect ly as a
               st an d-alon e qu er y in t er pr et er . Its syn t ax is sim ple an d flexible. For
               som eon e fam iliar with SQL, OQL can be lear n ed in a sh or t t im e.

               Som e exam ples ar e given t o dem on st r at e th e m ost u sefu l feat u r es of
               OQL. You can execu t e t h em as ad h oc qu er ies with o2dsa. Fir st st ar t th e
               o2dsa in t er pr et er :

               > o2dsa_shell

               Now set th e base an d pu t th e in t er pr et er in to qu er y m ode

               set base bankBase

               ^D

               query

               ^D
52             O 2 ODM G D at abase Syst em Tu t or ial
You can also read