Documentation  22/05/2002    Puech Dominique  Météo-France  CNRM/GMAP/OBS

I. Le programme

  I.1. Ouverture de la base
  I.2. Lecture de vue(s)
  I.3. Fermeture de la base
  I.4. Les pointeurs
  I.5. Les modules odb

II. Les impressions

  II.1. Ouverture de la base
  II.2. Lecture de vue(s) avec getdb
  II.3. call ctxprint(...)
  II.4. options "debug"
     II.4.1.  ODB_TRACE_*
     II.4.2.  ODB_DEBUG

III. Les erreurs

  Exécution
    III.1.  Problème au opendb
    III.2.  Problems in CTXGETDB with column indices of view="xxx"
    III.3.  Linking failed for VIEW="xxx"
    III.4.  Unable to obtain context id for "xxx"
  Compilation
    III.5.  undeclared identifier `K1_len`

IV. Les compilations

    IV.2.   Run sur une base de cycle différent

V. Remarques

    V.1.    ctxinitdb.F90
    V.2.    divers


I. Le programme

I.1. Ouverture de la base

   ihandle=ODB_open('type_base','option',inbpool)
                   ou
   call opendb('type_base','option',info,infolen)

   type_base = 'ECMA', 'CCMA' ou 'ECMASCR'
   option = 'NEW','CREATE' ; 'OLD','R/W','READ WRITE','READWRITE','READ/WRITE' ;
            'R/O','READONLY','READ','READ ONLY','READ/ONLY','R' ;
            '*','UNKNOWN','UPDATE','APPEND','ADD','WRITE','W','A'

   1) avec  USE  ODB, ONLY : ODB_open
      retour -> inbpool=nb de pool  ihandle=numéro de base

   2) retours   infolen >=1  info(1)=nb de pool
                infolen >=2  info(2)=max(ihandle,$nmxupd)
                ihandle  -> NHANDLEDB(1)  (yomdb)

I.2. Lecture de vue(s)

   irc=ODB_addview(ihandle,'nom_vue_x')
   do jp=1,inbpool
     irc=ODB_select(ihandle,'nom_vue_x',nrows,ncols,nra,pollno=jp)
     allocate(tab_x(nrows,0:ncols))
     irc=ODB_get(ihandle,'nom_vue_x',tab_x,nrows,pollno=jp)
     irc=ODB_put(ihandle,'manda_update',ROBODY,nbval,poolno=jp)  pour sauvegarde
     irc=ODB_store(ihandle,poolno=jp)                             "       "
     irc=ODB_cancel(ihandle,'nom_vue_x',pollno=jp)
     irc=ODB_swapout(ihandle,'*',poolno=jp)
   enddo
            ou
   call getdb('nom_contexte',iversion,iret,info,0,zinfo,0,iset,islot,ipool,iobstype,icodetype)
   call putdb('nom_contexte',iversion,iret,info,0,zinfo,0)

 lecture de table
   call getatdb('@nom_table',-1,info,n)  n=2 ou 3 selon les tables
   call putatdb('@nom_table',-1,info,n)  n=2 ou 3 selon les tables

1) ODB_addview   input    ihandle
                 retour   irc = numéro informatique de vue
   ODB_select    input    ihandle, ipool
                 retour   irc = nrows = nb de lignes
                          ncols = nb de colonnes
                          nra = nrows +  mod(nrows+1,2)
   ODB_get       input    ihandle, nom_vue_x, nrows
                 retour   les données dans le tableau tab_x
   ODB_cancel    input    ihandle, nom_vue_x

2) Cet appel implique une définition de contexte dans ctxinitdb.F90 (odb/odbport)
   Le contexte contenant une ou plusieurs vues
    ----------------------------------------------------------------
       if (cdretr == 'nom_contexte') then
         CALL next_context('nom_vue', version=x)
         do it=1,inumt
           ctx(idctx,it)%view(1)%name = 'nom_vue_1'
           ctx(idctx,it)%view(1)%ncase = JPCASE_ROBHDR
       !x eventuellement !x
           ctx(idctx,it)%view(2)%name = 'nom_vue_2'
           ctx(idctx,it)%view(2)%ncase = JPCASE_ROBODY
           .....
         enddo
       endif
    ----------------------------------------------------
   nom_contexte    nom d'appel dans getdb
   nom_vue_x   nom dans requête sql  (CREATE VIEW nom_vue_x AS)
   version     numéro de version
   JPCASE_ROBHDR   récupération des données sur un tableau ROBHDR(:,:)

    input
   nom_contexte, iversion
   iset, islot, ipool, iobstype, icodetype : initialisation à -1 -> pas de test
       ex d'utilation  WHERE (($tslot == -1 AND tslot > 0) OR (tslot == $tslot))

    output
   iret = nb de lignes retournées
   aucun retour sur info, zinfo
   ROBHDR(ilig,0:icol) -> nom du tableau indiqué dans ctxinitdb (JPCASE_ROBHDR)
       ilig = iret +  mod(iret+1,2)

I.3. Fermeture de la base

   irc=ODB_close(ihandle[,save=ldsave])
   irc=ODB_end()
                   ou
   call closedb('type_base',ldsave)

   ldsave=.true. -> sauvegarde des modifications
   1) ldsave=.false. implicitement

I.4. Les pointeurs

I.5. Les modules odb

   ODB_getnames récupération de noms
    irc=ODB_getnames(ihandle,'nom_vue','name')  -> irc=nb de colonnes de la vue
    irc=ODB_getnames(ihandle,'nom_vue','name',clvar)
       ihandle : numéro base cf ODB_open
        name : option
        -> irc=nb de colonnes de la vue
        -> clvar*128 -> liste des noms de colonnes
     utilisation avec 'table' -> idem avec noms des tables

   cmdb_reg   enregistrement de noms de colonnes
    call cmdb_reg('lat@hdr','MDBLAT',MDBLAT,it,irc)
       it : cf itdef.h
        -> irc = numéro d'enregistrement

   cmdb_name  récupération du nom et "numéro" de pointeur
    call cmdb_name('lat@hdr',chaine,irc)
       -> chaine='MDBLAT'
        -> irc = numéro d'enregistrement  cf cmdb_reg


II. Les impressions -extraits de listings-

II.1. Ouverture de la base

    sortie standard    impression de ODB_open
MPL_INIT : MPL_METHOD=JP_BLOCKING_STANDARD
MPL_INIT : MAILBOX SIZE=    32000000

    sortie erreur
 1 : OPENDB("ECMA")  impression de opendb

       impression de ODB_open
***Warning: Assuming static linking mode
 OPEN_DB: handle= 1
 DataBase-name="ECMA"
 inuse ?  T
 newdb ?  F
 readonly ?  T
 no. of global pools =  1
 no. of local pools =  1
 sequence no. scaling factor =  1073741824
 max. no. of rows per pool =  1073741823
 iounit =  0
 ntables =  23
 END of OPEN_DB

       impression de opendb
 1 1 : Allocating o_(:)-structure with inumt = 1  elements
 1 1 : size(o_),shape(o_)= 1 1
 UNMAPDB: ODB_UNDEF from 0x8B8B8B8B to 0x8B8B8B8B
 *** OBSPROC_INIT ***
0NUMERICAL CONSTANTS SETUP

II.2. Lecture de vue(s)

  sortie standard  aucune

  sortie erreur   avec getdb
 ADDVIEWDB("nom_vue_1" : db="ECMA") : total#, dbhandle, viewhandle = 1 1 10311
 ADDVIEWDB("nom_vue_2" : db="ECMA") : total#, dbhandle, viewhandle = 2 1 11367
 

II.3. ctxprint

    call ctxprint(1,'commentaire personnel','type_base')

 type_base = ECMA, ECMASCR, CCMA
 entre le opendb et closedb

 exemple
 ---------------------------------------------------------------------
 ctxprint: essai_print ECMA
 NMAXCTX,NMAXCTX_ALLOC,shape(ctx)= 4 201 201 1
 === Thread# 1  ===
    2, master# 1, hash#= 120, version#=           1, db="ECMA", retr="MANDALAY"
          PEvar="", active ? T, pool#  -1, replicate_PE=   0, # of views=  1
         1 "manda_laelalo" :       10311  (irc de addview)
               execute=T, processed=T, cancel=F, putdb=T, swapout=F, update_col_flip=F
               shared_idx=  0, shared_arr=  0, h2b=  0, h2sat=  0, ncase= 3
   *****   "ROBODY "     nra=      199999  nrows=      199998  ncols=    5  nghost=    0
               kset=  2147483647  tslot=  2147483647  obstype=  2147483647  codetype=2147483647
               hdr_min=  2147483647  hdr_max=  2147483647  all=  2147483647
           Created  : 20020619 142635.560 Last Select : 20020619 142637.774
           Last Get : 20020619 142637.805 : call count =        1
            colname(   1, update ? F)="lon@hdr"  i.e.  MDBLON =            1  (noms des pointeurs
            colname(   2, update ? F)="lat@hdr"  i.e.  MDBLAT =            2  et rang dans le tableau )
            colname(   3, update ? F)="obstype@hdr"  i.e.  MDBOTP =            3
            colname(   4, update ? F)="obschar@hdr"  i.e.  MDBOCH =            4
            colname(   5, update ? F)="ident@hdr"  i.e.  MDB_ident_AT_hdr =            5
   1: ROBODY        :      1199994      199999 (nra)     6 (0:ncols)
 ---------------------------------------------------------------------

II.4. Options "debug"

II.4.1.  ODB_TRACE_*

  Instructions suivantes dans la procédure d'exécution
      export ODB_TRACE_PROC=-1 (tous les procs) ou numéro proc
      export ODB_TRACE_FILE=List_odb (1 seul fichier global)
         ou
      export ODB_TRACE_FILE=List_odb.% (indicé par proc)
      export ODB_TRACE_FLUSH_FREQ=1 (vidage des i/o)

  exemple de sortie
---------------------------------------------------------------------
20020620 074318:  136.0M    0.0M      0.00      0.13 : Tracing started on PE#1, pid=1604452387 [thread#1].
>> Library compiled on Apr  5 2002  13:52:22
20020620 074318: [#1]     =       =     0.00      0.13 > 1 ODB_open:ECMA:READONLY
20020620 074318: [#1]  136.1M    0.0M   0.02      0.13 : Added '$nmxupd' at 0x80aef00, value=3, db=ECMA : hash#42
 *****    Added '$mdi' at 0x80aef08, value=2147483647, db=ECMA : hash#32
 *****    Added '$synop' at 0x80aef10, value=1, db=ECMA : hash#71
  ......
 *****    Added '$bg' at 0x80af280, value=1, db=ECMA : hash#31
 *****   Added '$adj' at 0x80af288, value=2, db=ECMA : hash#101
 *****   1 ODB_open:ECMA:READONLY 1
 *****   1 GETDB(MANDALAY) 1 0 -1 -1 -1 -1 -1
 *****   1 ODB_addview:manda_laelalo
 *****   1 ODB_addview:manda_laelalo 10311
 *****   1 ODB_getsize:manda_laelalo 1 0 0 5 1
 *****   1 ODB_select:manda_laelalo
 *****   1 Loading TABLE hdr 1
 *****   1 TABLE hdr loaded 1 199998 36 199998 16311492
 *****   1 Some tables in {hdr} loaded on demand for 'manda_laelalo' -1 1 16311492
 *****   1 PrS -1 1 0
 *****   1 PrS -1 1 199998
 *****   1 PoS -1 1 0
 *****   1 PoS -1 1 199998
 *****   1 ODB_select:manda_laelalo 199999 199998 5
 *****   1 ODB_dget:manda_laelalo 199999 199998 5
 *****   restore_peinfo: vhandle=10311, found=0x0, repl_PE=0, npes=0
 *****   1 Fetching 'lon@hdr' in view 'manda_laelalo' 1 0 0 199998 199999 199999 0
 *****   1 Fetching 'lat@hdr' in view 'manda_laelalo' 1 1 0 199998 199999 199999 0
 *****   1 Fetching 'obstype@hdr' in view 'manda_laelalo' 1 2 0 199998 199999 199999 1
 *****   1 Fetching 'obschar@hdr' in view 'manda_laelalo' 1 3 0 199998 199999 199999 0
 *****   1 Fetching 'ident@hdr' in view 'manda_laelalo' 1 4 0 199998 199999 199999 1 *****     1 ODB_dget:manda_laelalo
 *****   1 GETDB(MANDALAY) 1 199998 -1 -1 -1 -1 -1 1 2
 *****   1 ODB_close:ECMA 0
 *****   1 TABLE hdr swapped out 1 36 36 17487668
 *****   1 ODB_close:ECMA 0
 *****   Tracing finished on PE#1, pid=1604452387 [thread#1].
---------------------------------------------------------------------

II.4.2.  ODB_DEBUG

  Instructions suivantes dans la procédure d'exécution
       export ODB_DEBUG=1

exemple de sortie
---------------------------------------------------------------------
 OPENDB("ECMA") -->  1
 codb_print_vars_: OPENDB("ECMA")
 codb_print_vars_: hashsize=200, hashmin=0, hashmax=199, hashtable at 0x87f00a0
 hash#0 [hit#1] : db='ECMA', symbol='$tgtg', view='(nil)' : value=73 at 0x80af070
 hash#1 [hit#1] : db='ECMA', symbol='$ts', view='(nil)' : value=11 at 0x80aeff8
     ....
 hash#195 [hit#1] : db='ECMA', symbol='$u10m', view='(nil)' : value=41 at 0x80af158
 hash#199 [hit#1] : db='ECMA', symbol='$cllqw', view='(nil)' : value=123 at 0x80af178
 codb_print_vars_: Total 114 hits in 90 hash-entries
 *** addviewdb("manda_laelalo") :  1 1 F
 "manda_laelalo" : handle =  1
 lon@hdr =>  1
 lat@hdr =>  2
 obstype@hdr =>  3
 obschar@hdr =>  4
 ident@hdr =>  5
---------------------------------------------------------------------


III. Les erreurs

III.1. Problème au opendb

     indices : vérifier l'existance de la base
               vérifier "export ioassign " et cohérence avec base
               vérifier les export *PATH*
 

III.2.  Problems in CTXGETDB with column indices of view="xxx"

-------------------------------------------------------------------------
20010801 063918:     =       =      500.55    225.90 > 1 Loading TABLE rtovs_body 1
20010801 063918:     =       =      500.64    225.90 < 1 TABLE rtovs_body loaded 1 30 2 30 92
20010801 063918:     =       =      500.64    225.90 : 1 Some tables in {index,hdr,sat,rtovs,rtovs_body}
       loaded on demand for 'satbody_screen_rtovs' -1 1 92
20010801 063918:     =       =      500.64    225.90 > 1 PrS -1 1 0
20010801 063918:     =       =      500.64    225.90 < 1 PrS -1 1 30
20010801 063918:     =       =      500.64    225.90 > 1 PoS -1 1 0
20010801 063918:     =       =      500.64    225.90 < 1 PoS -1 1 30
20010801 063918:     =       =      500.64    225.90 : '$kset' at 0x8c1d498, db=ECMA, (old,new)=(1,0)
        [satbody_screen_rtovs] : hash#111
 ADDVIEWDB("ecset") : total#, dbhandle, viewhandle = 11 1 17031
 *** Problems in CTXGETDB with column indices of view="robody_traj_2"
    2 : hires_3@update                                                   : column#           0
------------------------------------------------------------------------

     indice : on recherche la valeur hires_3   qui n'est pas définie dans robody_traj_2
 

III.3.  Linking failed for VIEW="xxx"

-------------------------------------------------------------------------
ADDVIEWDB("robody_tc") : total#, dbhandle, viewhandle = 13 1 19882
 *** Error in routine "ODB_addview"
 Linking failed for VIEW="robody"
-------------------------------------------------------------------------

      indices : la vue robody n'est pas définie
          vérifier la compilation de la requête robody.sql
               et l'existence de  XCMA_robody.o  dans la lib correspondante
          vérifier la mise à jour du fichier xCMA_Sstatic.c  et sa compilation
               le fichier doit contenir les référence de la vue recherchée
 

III.4.  Unable to obtain context id for "xxx"

-------------------------------------------------------------------------
1  : "ECMA" : LSCREEN, LTOVSCV, NUPTRA, NRESUPD, NCONF= F T 1 3 1
 1 : DELAYED_INIT() : "BLACK", version= 1
   1: MOBPNT        :            0           0
   1: MLNSET        :          323         323
   1: MMXBDY        :          323         323
   1: MTYPOB        :          323         323
   1: MABNOB        :            0           0           0
   1: MAPOMM        :       124533      124533
 *** Error in routine "GETDB"
 Unable to obtain context id for "BLACK"
 Message code = 1
-------------------------------------------------------------------------

       indice : Vérifier dans ctxinitdb.F90 la définition du contexte,
     et si elle existe si elle n'est pas sous une clé
 

III.5.  undeclared identifier `K1_len`

-------------------------------------------------------------------------
error : undeclared identifier `K1_len`        à la compilation d'un *.sql
-------------------------------------------------------------------------

       indice : Vérifier les tables du FROM  Pb avec les liens


IV. Les compilations

IV.2.  Run sur une base de cycle différent

     principe de base : nouveaux ${base}.o ${base}_T_${table}.o
                        recompilation des requêtes sql
                        édition de liens

     nouveaux ${base}.o ${base}_T_${table}.o  ${base}.h
       * procédure ~mrpa660/uti/env_odb
            le cycle odb est précisé en tête de procédure
            le cycle de la base est donné en argument  ex: 23R4  cyclbase
            {base}.h et les points objets (${cyclbase}.LIBodb.a) sont archivés  sous
              ODB_${cyclodb}    andante /utemp/mrpa/mrpa660/EXEC
                                kami  ~mrpa660/util
         remarque : le répertoire ODB_${cyclodb} a été initialement crée et contient les ${cyclbase}.${base}.sch
       * principe   pour chaque type de base (CCMA, ECMA, ECMASCR)
            cp ${base}.sch ${base}.ddl         récupération du "format" de la base à lire
            ${ODB_cyclodb}/bintmp/odb98.x -c -I${ODB_cyclodb}/include -V -O3 -DCANARI ${base}.ddl
       * remarque : les procédures sql de mandaodb sont également recompilées
            les points objets sont archivés dans ${cyclbase}.LIBloc.a

     compilation des requêtes sql
            cp ${base}.sch ${base}.ddl
            cp ${base}.sch ${base}.ddl_
            cp .../ODB_${cyclodb}/${cyclbase}.${base}.h ${base}.h
            ${ODB_cyclodb}/bintmp/odb98.x -c -I${ODB_cyclodb}/include -V -O3 -DCANARI -l ${base} -i -s -w ${file.sql}

     édition de liens
            utiliser la(ou les) bibliothèque(s) prédéfinies


V. Remarques

V.1.  ctxinitdb.F90

V.2.  divers

* Utilisation de MLNKH2B
    -> définition de MOBHDR et MOBODY dans ctxinitdb.F90
    -> valeurs integer en premier dans la requete

* Update sur MOBHDR  (ou MOB*)
    -> spécifier l'update dans ctxinitdb.F90 à la fois sur ROBHDR et MOBHDR

* Valeur manquante   $MDI = 2147483647   mdi.inc (odb)