TEKNINEN SELOSTE
_________________________________________________________________________________
Sovelluksen nimi
DBRMUI - Database and Resource Management User Interface
_________________________________________________________________________________
Laati Tarkasti Hyväksyi Edellinen hyväksytty painos
Erkki Hietalahti 3.1
_________________________________________________________________________________
Dokum. tila Tallennuspaikka Editointipvm.
suunnittelu /usr/local/NokiaOMC/src/image/dbrmui/doc/RCS/dbrmuimx.doc,v 17.5.1994
_________________________________________________________________________________
Hakusanat
Nokia
_________________________________________________________________________________
Yhteenveto
DBRMUI-sovellus on
_________________________________________________________________________________
Jakelu
_________________________________________________________________________________
SISÄLLYSLUETTELO
1. YLEISKUVAUS OHJELMASTA.................................................................................... 1
1.1. Ohjelman tehtävä...................................................................................................... 1
1.2. Ohjelman sijainti järjestelmässä................................................................................ 2
1.3. Käsitteet................................................................................................................... 5
1.4. Viitteet...................................................................................................................... 6
1.5. Muutoshistoria.......................................................................................................... 7
2. VAATIMUKSET JA RAJOITUKSET............................................................................ 9
2.1. Ehdottomat vaatimukset.......................................................................................... 9
2.1.1. Konfigurointi ja oikeudet............................................................................. 9
2.1.2. Virhetilanteet............................................................................................... 9
2.1.3. Sidokset muihin sovelluksiin...................................................................... 11
2.2. Toivottavat piirteet................................................................................................. 12
2.2.1. Käyttäjäpalaute.......................................................................................... 12
2.2.2. Toteutuksen keveys.................................................................................... 12
2.2.3. Käyttöliittymän konfigurointi.................................................................... 13
2.2.4. Käynnistys- ja vasteajoista......................................................................... 13
2.3. Rajoitukset.............................................................................................................. 15
2.3.1. Käynnistettävien sovellusten asettamat rajoitukset................................... 15
3. OLIOMALLI.................................................................................................................... 16
3.1. MVC-mallin model-osaan liittyvät keskeisimmät oliomallit.................................. 17
3.1.1. Tietokannan täyttöasteluokat..................................................................... 18
3.1.2. Konfigurointi-/profiililuokka...................................................................... 27
3.1.3. Tietojen näyttämiseen liittyvät rajoitukset toteuttava luokka.................... 34
3.1.4. GSM_DB_INFO -taulun käsittelyn ja muun tietokantaoperoinnin toteuttava luokka 37
3.1.5. PDARCH-kirjaston palvelut liittävä luokka.............................................. 43
3.1.6. Työkaluluokka PM-tietokantaspesifisten asioiden käsittelyyn.................. 48
3.1.7. Virhekäsittelyluokka.................................................................................. 53
3.2. MVC-mallin view-osaan liittyvät keskeisimmät oliomallit..................................... 57
3.2.1. DBRMUI-sovelluksen dialogiluokat......................................................... 57
3.2.2. Mittaustyypin täysinäisyyden ikkunassa esittävä luokka........................... 70
3.3. Muut sovelluksen apuluokat ja -funktiot................................................................ 73
3.3.1. Käteviä työkalumetodeita sisältävä luokka................................................ 73
3.4. Callback-funktiot ja niissä käytetyt apufunktiot.................................................... 75
3.5. DBRMUI:n käyttämät ympäristömuuttujat........................................................... 80
3.6. DBRMUI-käännöksessä käytetyt define-muuttujat.............................................. 81
3.7. XDesigner -ohjelman käytöstä............................................................................... 83
3.8. DBRMUI-toteutukseen implementoidut skriptit................................................... 84
4. TOIMINTOJEN KUVAUS............................................................................................. 85
4.1. Käyttöliittymä........................................................................................................ 85
4.2. Toiminnot............................................................................................................... 86
4.2.1. Tietokantaoperointi.................................................................................... 86
4.3. Ohjelman dynaaminen malli................................................................................... 91
5. TIETOLIIKENNERATKAISUT................................................................................... 92
5.1. Muut prosessin ulkoiset liittymät............................................................................ 92
6. TIETOVARASTOT......................................................................................................... 93
6.1. Relaatiotietokannan käyttö..................................................................................... 93
6.2. Omien tiedostojen käyttö....................................................................................... 94
7. YLLÄPITOVINKIT........................................................................................................ 97
7.1. Profiili-/konfigurointitiedostojen formaatin muuttaminen..................................... 97
7.2. Käytettyjen tietokantataulujen rakenteiden muutokset.......................................... 97
8. JATKOKEHITYSIDEAT............................................................................................... 98
8.1. Meas.DB -dialogin ikonoinnista ja skrollausaskeleesta.......................................... 98
8.2. Meas. DB -dialogin scrollbar:in nuolinäppäinten käyttäytymisestä....................... 99
8.3. Printtauspalvelun käyttöönotto DBMUI:ssa........................................................ 100
8.4. Week-moodin sisällyttäminen Day-Time Setting -dialogiin................................. 102
8.5. Näytettävien verkkoelementtityyppien konfigurointi.......................................... 102
8.6. Selektiivinen/automaattinen Recount................................................................... 102
8.7. Main OMC -konseptin vaatimat muutokset......................................................... 102
8.8. Sovelluksen starttivaiheen nopeuttaminen........................................................... 103
9. HYLÄTYT TOTEUTUKSET...................................................................................... 105
9.1. Täydellisen UIL:n (=User Interface Language) toteutus..................................... 105
9.2. DBKEEP-sovelluksen käyttö............................................................................... 106
9.3. Ohjelman lähettämien/vastaanottamien sanomien kuvaukset............................... 107
9.3.1. DBKEEP:lle/ltä lähetettävien/vastaanotettavien sanomien kuvaukset.... 107
9.4. Oman protokollan toteutus DBKEEP:iin päin..................................................... 109
9.4.1. Ohjelman dynaaminen malli WNELIB:iä käytettäessä........................... 110
9.4.2. Tietoliikenneratkaisut WNELIB:iä käytettäessä...................................... 114
9.5. Hylätty käyttöliittymäsuunnitelma....................................................................... 119
9.5.1. Hylätyn käyttöliittymän toiminnot.......................................................... 121
9.6. Hylätty käyttöliittymän oliomalli......................................................................... 124
9.6. Tietokannan käsittelyohjelmien tallennus tietokantaan........................................ 125
9.7. UIL:n kehittäminen käyttöliittymän tiedostopohjaiseen konfigurointiin............. 126
9.8. SELECT COUNT(ROWID) FROM ... -kyselyn käyttö..................................... 127
1. YLEISKUVAUS OHJELMASTA
1.1. Ohjelman tehtävä
DBRMUI-sovellus (Database and Resource Management User Interface) on
DBRMUI-sovellus käynnistetään OMC:n Top Level User Interface:sta (= GUIMAN-sovellus).
1.2. Ohjelman sijainti järjestelmässä
Seuraavassa kuvassa esitetään DBRMUI-ohjelman sijainti OMC:n työasemassa OMC:n muihin sovelluksiin nähden. Lisäksi kuvassa on esitetty näille ohjelmille yhteisiä tietovarastoja:

Kuvan notaatio noudattaa OMT-menetelmän toiminnallista mallia seuraavin poikkeuksin ja täsmennyksin: kaksinkertaisella viivalla piirretyllä ellipsillä kuvataan OMC:n muita DBRMUI:hin sidoksissa olevia sovelluksia. Nuoli ilmaisee IO-toimintaa - joko lukemista tai kirjoittamista tai molempia.
Tarkemmin ottaen kuvassa esiintyvät nuolet kuvaavat seuraavia toimintoja:
1. DBRMUI-sovellus lukee GSM_DB_INFO -taulusta tiedot kaikista valvottavista tauluista - lähinnä ollaan kiinnostuneita näiden nimistä ja maksimikoosta. DBRMUI:n kannalta valvottavia tauluja ovat ne GSM_DB_INFO -taulussa mainitut taulut, joita vastaavalla rivillä ko. taulussa DBRMUI_ENABLE -sarakkeella on arvo 1. Tietokannan täyttöasteen seuranta perustuu näiden valvottavien taulujen tilanteen seurantaan.
2. Kustakin GSM_DB_INFO -taulussa mainitusta valvottavasta taulusta DBRMUI selvittää kulloinkin varattuna olevien rivien lukumäärän. Selvitys voi perustua joko GSM_DB_INFO -tauluun valmiiksi laskettuihin taulujen käytettyjen rivien lukumääriin tai myöskin näiden laskenta voidaan käynnistää ensiksi spyanamx.sh -skriptillä ja sen jälkeen käyttää laskennasta saatuja arvoja. Tästä skriptistä on tarkempaa informaatiota lähteessä /5/. Taulun täyttöaste on yksinkertaisesti käytettyjen rivien lukumäärän suhde maksimirivilukumäärään.
3. DBRMUI-sovelluksella voidaan siivota OMC:n tietokannassa olevia Performance Management -tietokantaosaan kuuluvia tauluja. Asetettavien siivouskriteerien nojalla tauluista voidaan joko kopioida, siirtää tai ainoastaan poistaa kriteerit täyttävät rivit.
4. Siivouksen tuloksena määrättyyn hakemistoon koneen levylle syntyy yksi tai useampia siivoustiedostoja. Nämä tiedostot ovat normaaleja Oracle:n export-tiedostoja. Siivoustiedostohakemistot määritellään tyypillisesti tietokantaosakohtaisesti sovelluksen konfigurointitiedostoissa - määrityksien puuttuessa sovellus käyttää omia oletusarvojaan.
5. SPYMAN-sovellus tarkkailee myöskin GSM_DB_INFO:ssa mainittuja sille valvottavaksi määriteltyjä tauluja (tarkemmin dokumentissa /3/). Sen tehtävänä on katsoa, onko tietyt täyttöasterajat ylitetty ko. tauluissa ja antaa siinä tapauksessa tilanteesta työasemahälytys (nuoli 8). Statustietoa taulun täyttymisestä pidetään yllä GSM_DB_INFO -taulun tietyissä kentissä, joita SPYMAN päivittää - tämä on kuvattu tarkemmin dokumentissa /3/.
6. SPYMAN-sovellus laskee samalla tavoin taulun käytettyjen rivien lukumäärän kuin DBRMUI nuolen 2 tapauksessa,
7. SPYMAN-sovellus käynnistetään määräaikavälein cron:sta ja kullakin kerralla se käy kertaalleen läpi kaikki sille valvottavaksi määritellyt taulut.
8. Työasemahälytys lähetetään, jos joku kriteeriraja taulun täyttymiselle on ylitetty ja SPYMAN valvoo ko. taulua.
9. Vasteaikasyistä valvottavan taulun käytettyjen rivien lukumäärää ei selvitetä DBRMUI -sovelluksessa SQL-kyselyllä "SELECT COUNT(ROWID) FROM
10. ja 11.
DBRMUI -sovelluksesta voidaan suorittaa tietokannan varmistus Offline-tietokantaan toiselle työasemalle.
DBRMUI:hin sidoksissa olevien sovellusten toiminta on kuvattu luvussa 1.3. (Käsitteet) ja tarkemmin kyseisten sovellusten teknisissä selosteissa (/3/, /5/).
1.3. Käsitteet
DBRMUI Database and Resource Management User Interface -
tietokannan hallintatyökalu.
WCLLIB Workstation Command Log Library - tapahtumien kirjaamisen lokiin tarjoava "komentoloki" -palvelu.
Konfigurointi Ohjelman toimintaan vaikuttavien määritysten muuttamista. Määritykset ovat joko ohjelman asentajan tai sen käyttäjän tai molempien muutettavissa.
Profiili OMC-sovelluksen käyttäjät jaetaan käyttäjäryhmiin, joiden oikeuksia ohjelman toimintoihin säädellään profiilitiedostojen avulla.
Tietokanta OMC-sovelluksien toiminnassaan käyttämä tietokanta. Voidaan jakaa tietojen ryhmittelyn perusteella mittaus-, hälytys-, konfiguraatio- ja objektiosiin.
On-line -kanta OMC:n työaseman varsinainen tietokanta, jota OMC- sovellukset operoivat.
Off-line -kanta Toiseen työasemaan varmennettu On-line -kannan tilanne. Tämä kanta on olemassa ainoastaan varmistuksien ja mahdollisen puolenvaihdon takia.
Komentoloki Tietovarasto, jonne OMC:n sovellukset kirjoittavat tietoja toiminnastaan.
cron Unix:in tarjoama palvelu ohjelman käynnistämiseen halutulla ajanhetkellä toistuvasti.
Valvottava taulu DBRMUI valvoo sellaista taulua, jonka tiedot löytyvät GSM_DB_INFO -taulusta ja jolle DBRMUI_ENABLE kentälle on asetettu arvo 1 ko. taulussa. Lisäksi missään DBRMUI:n konfigurointitiedostossa ei saa olla kiellettynä kyseisen taulun valvonta.
Taulun analysointi Taulun käytettyjen rivien lukumäärän laskenta tutkimalla sopivan kokoista otosta taulun riveistä. Analysointi tehdään Oracle 7:n SQL-tulkin ANALYZE
-komennolla. Jos otoskokona on taulun koko sisältö, antaa ANALYZE -komento taulun käytettyjen rivien lukumäärän tarkan arvon.
1.4. Viitteet
/1/ ORACLE RDBMS Error Messages and Codes Manual Version 6.0
/2/ User Interface Spesification Database and Resource Management painos 0.1
/3/ SPYMAN tekninen seloste, versio 3.1
/4/ ORACLE7 Server SQL Language Reference Manual
/5/ spyanamx.sh ja spyanamx.sql -skriptit (versioituina hakemistossa $RCSTREE/image/spyman/RCS)
/6/ PDARCH - Mittaustietokannan arkistoija. Tekninen seloste. Versio 2.0.
1.5. Muutoshistoria
MUUTOKSET
| Ohjelman versio | Dokumentin versio | Ohjelman tila/muutokset |
| | 0.1 | katselmoitava määrittelydokumentti |
| | 0.2 | uusintakatselmoitava määr.dok. |
| | 0.3 | lopullinen määrittelydokumentti |
| | 1.1 | katselmoitava suunnitteludokumentti |
| | 1.2 | lopullinen suunnitteludokumentti |
| | 3.1 | päivitetty T3-toteutuksen mukaiseksi |
| | 4.1 | T4:ään tulevat Refresh/Recount -piirteet mukana |
| | 4.2 | T4:ään tulleet pienet toiminnallisuuden muutokset otettu mukaan, esim. "Count:" -kenttien semantiikat GUI:ssa muuttuneet. |
| | 4.3 | Loput toteutetut T4 parannukset mukaan: ympäristömuuttujien laajentaminen konfigurointitiedostossa, käynnistettävien skriptien oikeuksien tarkistus lisätty ja parannettu paluuarvokäsittelyä ko. skripteistä. |
| | 4.4 | Päivitetty kommentit katselmuskierrokselta 29.4.1994. |
| | 6.1 | Poistettu jatkokehitysideoista kaikki toteutetut ja ne joille ei tehdä mitään. Lisätty jatkokehitysideoihin printtauspalvelun käyttö ja week-moodin tekeminen Day-Time Setting -dialogiin. |
KATSELMUKSET
| Dokumentin versio | Määrittely- katselmus | Suunnittelu- katselmus |
| 0.1 | 31.12.1992 | |
| 0.2 | 11.01.1993 | |
| 1.1 | 08.02.1993 | |
| 3.1 | | 17.03.1994 |
| 4.3 | | 29.04.1994 |
2. VAATIMUKSET JA RAJOITUKSET
2.1. Ehdottomat vaatimukset
2.1.1. Konfigurointi ja oikeudet
DBRMUI:n toimintaa voidaan konfiguroida sekä globaalilla konfiguraatiotiedostolla että käyttäjäkohtaisella konfiguraatiotiedostolla. Globaalin konfiguraatiotiedoston määritykset asettuvat voimaan ennen käyttäjäkohtaisen konfiguraatiotiedoston määrityksiä. Käyttäjäkohtainen konfiguraatiotiedosto sijaitsee käyttäjän Unix-kotihakemistossa ja globaali OMCCONFPATH-ympäristömuuttujan ilmaiseman polkunimilistan varrella (haetaan samalla tavoin kuin ajokelpoiset ohjelmat Unix:ssa PATH-ympäristömuuttujaa käyttäen). Mikäli mistään OMCCONFPATH:ssa mainitusta hakemistosta ei globaalia konfigurointitiedostoa löydy, yritetään se hakea vielä oletuspaikastaan, joka on /usr/local/NokiaOMC/conf/global.
Konfiguraatiotiedostossa voidaan määritellä esim. se, mitä OMC tietokannan tauluja sovelluksen avulla tarkkaillaan. Samoin niissä voidaan kertoa, minne taulujen siivouksen yhteydessä syntyneet siivoustiedostot sijoitetaan. Konfigurointitiedostojen sisältö on kuvattu tarkemmin luvussa 6.2. (Omien tiedostojen käyttö).
DBRMUI:n toimintaa voidaan säädellä myöskin käyttäjäryhmäkohtaisella profiililla. Profiilin ja käyttäjäkohtaisen konfiguroinnin erona on se, että käyttäjä voi muuttaa jälkimmäistä vapaasti esimerkiksi muuttamalla konfiguraatiotiedoston sisältöä tekstieditorilla, mutta profiilitiedot asettaa OMC:n System Operator eikä käyttäjä pääse niitä ryhmänsä sisällä muuttamaan. Globaalia konfigurointitiedostoa voi myöskin muuttaa ainoastaan OMC:n System Operator. Käyttäjäryhmän groupx profiilitiedosto sijaitsee OMC-käyttäjän kotihakemistossa olevassa conf-alihakemistossa (tämä on itse asiassa symbolinen linkki).
2.1.2. Virhetilanteet
Jos jotain DBRMUI:n toimintoa suoritettaessa tapahtuu käyttäjävirhe (esim. tietoja syötetty väärin), ohjelma antaa selväkielisen ilmoituksen virheen laadusta päädialogi-ikkunan viestialueelle. Asianomaisen dialogin "OK"-nappi muuttuu tällöin ei-sensitiiviseksi, jolloin käyttäjä ei pääse käynnistämään mitään operaatiota korjaamatta sille tarkoitettuja syötteitä. Erityisesti tämä periaate pätee sovelluksen PM tietokantaosan siivoukselle asetettavia kriteereitä varten luodussa dialogissa.
Mikäli DBRMUI-sovellusta ajettaessa sattuu jokin ajonaikainen virhe, jonka syynä ei ole sovellusvika, antaa DBRMUI virheestä ilmoituksen virhedialogi-ikkunaan. Ilmoituksessa kerrotaan virheen koodi, selittävä teksti, virheen tapahtumisaika, ao. prosessin numerotunnus käyttöjärjestelmässä ja virheen esiintymispaikka lähdekoodissa funktiokutsuketjuineen. Tällaiset virheet aiheuttavat sovelluksen hallitun päättämisen - virheikkunan "OK"-nappia on tosin ensin painettava tämän aikaansaamiseksi. Jotkut virhetilanteet aiheuttavat ainoastaan varoituksen antamisen asiasta samalla tavoin kuin virheen yhteydessä, jolloin sovelluksen toiminta jatkuu normaalisti virheikkunan "OK"-napin painamisen jälkeen.
DBRMUI:sta on mahdollista käynnistää tietokannan varmistusajo. Tämä operaatio kestää pitkään ja operaation aikana voikin painaa aktiivisena olevan dialogin "Cancel"-nappia, joka aiheuttaa operaation keskeytymisen. Tämän operaation normaali toiminta aiheuttaa sen tulosteiden näkymisen DBRMUI:n viestialueella. Operaatio etenee DBRMUI:n kannalta kuten tausta-ajo, jolloin ainakin osa käyttöliittymää on edelleen aktiivinen syötteelle. Käytännössä aktiivisena pidetään työikkunan joitain nappeja - lähinnä "Cancel"-nappia - isompien sekaannuksien välttämiseksi.
Edellä hahmoteltu taustalle käynnistetyn operaation suorituksen etenemisen seuranta asettaa käynnistettävälle sovellukselle seuraavia vaatimuksia:
sovellus raportoi tilannetietoja toimintansa etenemisestä kirjoittamalla ne stdout:iin. Tiedot voisivat kertoa esim. kuinka monta prosenttia työstä on suoritettu tai montako tapahtumaa on prosessoitu,
sovellus palauttaa paluustatuksena 0:n onnistuneen suorituksen päätteeksi ja 0:sta poikkeavan virhekoodin virhetilanteessa. Onnistuneen suorituksen päätteeksi sovellus voi myös tulostaa stdout:iin jonkin informatiivisemman viestin onnistumisesta, esim. 3017 observations deleted,
jos sovellus palauttaa virhekoodin (siis 0:sta poikkeavan), osaa DBRMUI tulostaa ikkunaan koodia vastaavan selväkielisen virheilmoituksen.
Virhetapauksessa DBRMUI:n tehtävänä on siis muuntaa käynnistetyltä taustasovellukselta saatu virhekoodi käyttäjälle merkitykselliseksi virheilmoitukseksi.
Joitakin taustasovelluksia ei ole mielekästä käynnistää useampaan kertaan samanaikaisesti. Tällainen sovellus on esimerkiksi tietokannan varmistusajosta huolehtiva sovellus. Tässä tapauksessa estosta huolehditaan itse käyttöliittymässä - samaa valintaa, josta varmistaminen valittiin, ei ole mahdollista valita itse varmistuksen aikana. Itse asiassa varmistuksen yhteydessä ainoastaan työikkunan "Cancel"-nappi on syötteelle aktiivinen. Sama käyttöliittymän epäaktiivisuusperiaate on käytössä myöskin PM tietokantaosan siivouksen suhteen.
2.1.3. Sidokset muihin sovelluksiin
DBRMUI käyttää tietokantavarmistukseen dbbackmx.sh -skriptiä ja GUI:sta aktivoitava Recount-operaatio käynnistää spyanamx.sh -skriptin, joka laskee valvottavien taulujen käytettyjen rivien lukumäärät GSM_DB_INFO -tauluun.
2.2. Toivottavat piirteet
2.2.1. Käyttäjäpalaute
Kun DBRMUI:sta käynnistetään jokin pitempään kestävä operaatio, näytetään käyttäjälle tilannetietoja operaation etenemisestä graafisessa ikkunassa (esim. komennon stdout:iin tulostamia rivejä/tiimalasi, joka kertoo, kuinka pitkälle suoritus on edennyt). Operaatio käynnistetään tällöin Unix:in taustasovellukseksi. Komennon suorituksen päätyttyä onnistuneesti kerrotaan tästäkin käyttäjälle OK-kuittauksella päädialogi-ikkunan viestialueella, jonka yhteydessä voidaan esittää joitain komennon suoritukseen liittyviä tilastotietoja (esim. kuinka monta riviä siivottiin jostain tietokannan taulusta). Operaation ajan muu osa käyttöliittymää pitäisi olla edelleen aktiivinen.
Käytännössä käyttöliittymän käyttäminen taustaoperaation aikana on hyvin rajoitettua kuten edellisessä luvussa on esitetty. Ongelmia tulee mm. siitä, että lähestulkoon mitään operaatiota ei ole syytä päästää käynnistymään yhtäaikaa jonkun toisen operaation kanssa. Esimerkiksi jos tietokannan varmistus on aloitettu ja halutaankin mennä siivoamaan PM kantaosaa niin herää kysymys säilyykö kannan konsistenssi varmasti jos nämä molemmat tehdään yhtäaikaa.
2.2.2. Toteutuksen keveys
Ohjelman toteutuksessa pyritään mahdollisimman keveisiin ratkaisuihin. Tällöin sovelluksen aktivoimat toiminnot voitaisiin toteuttaa Unix:in shellskripteinä ja ainoastaan käyttöliittymäosuus jäisi C++:lla toteutettavaksi. Käytännössä skriptitoteutukseen päästään ainoastaan tietokantavarmistuksen sekä Recount-operaation osalta. Mm. PM-kantaosan siivous tehdään C++:lla toteutetulla kirjastolla.
Konfiguroinneilla pyritään tekemään sovelluksen toiminnasta mahdollisimman dynaaminen ilman mainittavia uudelleenkäännöstarpeita. Esimerkiksi jos johonkin tietokantasiivousskriptiin tulee lisää parametreja, nämä määritellään konfiguraatiotiedostossa ja tämän pohjalta sovellus osaa kysyä uudet parametrit automaattisesti. Konfiguraatiomuutokset astuvat voimaan DBRMUI-sovellusta seuraavan kerran käynnistettäessä.
Käytännössä tämän piirteen toteutusta ei lähdetty tekemään. Seuraavassa muutamia perusteluja:
oman UIL:n kehittäminen muutaman yksinkertaisen dialogin tarpeisiin on liian raskas toimenpide,
siivouskriteerit ovat suhteellisen staattisia tietokantaosien sisällä,
verkkoelementti- ja mittaustyyppivalintalistojen sisällöt generoidaan muutamien tietokantataulujen sisältöjen pohjalta; kuinka tämä olisi kerrottu UIL:ssä,
miten virhetilanteet määriteltäsiin jne.
2.2.3. Käyttöliittymän konfigurointi
DBRMUI tarjoaa käyttäjälleen graafisen käyttöliittymän järjestelmään toteutettujen toimintojen suorittamiseksi. Koska näiden toimintojen kutsuprofiilit saattavat muuttua, voitaisiin DBRMUI:ssa varautua käyttäjältä kysyttävien asioiden muuttumiseen eri toimintojen osalta. Parasta olisi, jos käyttäjältä kysyttävät asiat voitaisiin kertoa kyseisen toiminnon osalta konfiguraatiotiedostossa, jolloin muutoksen tapahtuessa riittää editoida ko. tiedostoa eikä DBRMUI:n koodia tarvitsisi kääntää uudelleen. Täydellisen UIL:n (= User Interface Language) kehittämistä tässä yhteydessä tarkastellaan tarkemmin jatkokehitysideoita kuvaavassa luvussa 8.
Koska esim. PM kantaosan siivouskriteerit ovat käytännössä osoittautuneet varsin staattisiksi, ei toteutuksen ja testauksen yhteydessä ainakaan vahvistunut näkemys, että tähän piirteeseen satsaaminen kannattaisi.
2.2.4. Käynnistys- ja vasteajoista
Koska T3 -toteutuksessa isolla tietokanta-aineistolla (Oracle 6 -tietokannan hallintajärjestelmä) saattoi DBRMUI:n käynnistyminen kestää jopa puoli tuntia on esitetty vaatimus käynnistysajan huomattavasta pienentämisestä.
Pitkä käynnistysaika johtui suurimmalta osaltaan Oracle 6:n SQL-komennon "SELECT COUNT(ROWID) FROM
T4 -toteutuksessa on valvottavan taulun käytettyjen rivien lukumäärän selvittämiseen otettu toisenlainen lähestymistapa: DBRMUI -sovellus käyttää GSM_DB_INFO -tauluun valmiiksi laskettuja käytettyjen rivien lukumääriä. Nämä tiedot lasketaan GSM_DB_INFO -tauluun valmiiksi spyanamx.sh -skriptillä - tarkempaa tietoa sen toiminnasta saa lähteestä /5/. Lisäksi DBRMUI:sta voidaan käynnistää tarvittaessa valvottavien taulujen käytettyjen rivien uudelleenlaskenta tai ainoastaan noutaa uudestaan valmiiksi lasketut arvot.
Myöskin spyanamx.sh -skriptin toteutuksessa on otettu vasteajat huomioon siten, että se laskee taulun käytettyjen rivien lukumäärän vain likimääräisesti käsittelemällä taulun käytetyistä riveistä vain pienen osan - tästä on esitetty tarkempaa tietoa lähteessä /4/ SQLPLUS:n ANALYZE-komennon kuvauksen yhteydessä.
Myöskin turhia SQL-kyselyitä pyritään välttämään T4 -toteutuksessa sillä periaatteella, että kannasta noudetaan tarvittavat tiedot vain kertaalleen.
2.3. Rajoitukset
Tietokantojen osalta DBRMUI:lla voidaan seurata vain On-line kannan eri osien täyttöasteita. Täyttöasteita seurataan vain FM ja PM tietokantaosien osalta - nämä ovat toisaalta niitä osia, joiden tauluihin tulee jatkuvasti uutta dataa. OBJECT- ja CM-osien taulujen tilanvaraus onkin luonteeltaan varsin staattista.
2.3.1. Käynnistettävien sovellusten asettamat rajoitukset
DBRMUI-sovelluksesta voi olla samanaikaisesti käynnissä useampi instanssi samassa työasemassa. Jos jonkin operaation suoritus vaatii operaation kohteena olevan resurssin lukitusta operaation ajaksi, huolehtii tästä operaation suorittava ohjelma/kirjasto. Näin tapahtuu esimerkiksi PM tietokantaosan siivouksen yhteydessä.
Joitain sovelluksia ei ole mielekästä päästää käynnistymään useampaan kertaan samanaikaisesti. Tällöin kyseiset sovellukset huolehtivat siitä, ettei niistä voi olla käynnissä useampaa instanssia samanaikaisesti, vaan ylimääräiset käynnistykset aiheuttavat sen, että sovellukset palauttavat jonkin sovitun paluustatuksen, jonka perusteella DBRMUI osaa antaa käyttäjälle sopivan virheilmoituksen. Esimerkiksi mittaustietoja tietokannasta poistava kirjasto toimii juuri näin.
3. OLIOMALLI
DBRMUI:n oliomalli voidaan jakaa karkeasti sovelluksen operoimien resurssien oliomalliin sekä sovelluksen käyttöliittymän oliomalliin. Edellinen oliomalli kuvaa sovelluksen semantiikan (= sovelluksen sisäiset tiedot ympäröivästä maailmasta) vaatimat luokat ja jälkimmäinen näiden vasteet käyttöliittymässä. Tällä tavalla pyritään saamaan sovelluksen sisäiset luokat mahdollisimman erilleen käyttöliittymäluokista, jotta käyttöliittymän korvaaminen toisella olisi helppoa. Esimerkiksi voitaisiin vaatia, että X-Motif
perustainen käyttöliittymä pitää saada nopeasti vaihdettua VT-sarjan päätteissä toimivaan käyttöliittymään jotta testausta voitaisiin harrastaa kotoa käsin PC:n pääte-emulaattorilla modeemiyhteydellä.
Seuraavissa luvuissa on esitetty sekä sovellussemantiikkaan liittyvät luokat että käyttöliittymäluokat OMT-menetelmän mukaisina oliomalleina. Samassa yhteydessä kerrotaan, miten nämä luokat niveltyvät MVC-sovellusmallinnustapaan (Model - Controller - View), jonka model-osa vastaa ao. sovelluksen sisäisiä asioita kuvaavia luokkia ja view-osa käyttöliittymäluokkia.
3.1. MVC-mallin model-osaan liittyvät keskeisimmät oliomallit
DBRMUI-sovelluksen rakentamisessa on noudatettu MVC-mallia soveltuvin osin. Lähinnä sovelluksen tarkkailemat resurssit (= tietokanta, tietokantaosat, taulut) ja PM -tietokantaosan siivoukseen liittyvät asiat on mallinnettu MVC-mallin model-osaan kuuluvina seikkoina.
MVC-mallin mukaisia controller-luokkia ei ole tehty tähän sovellukseen, vaan view-osaan kuuluvien luokkien metodeista kutsutaan suoraan model-osan luokkien metodeita. View-osan mukaiset luokat pitävät puolestaan sisällään sovelluksen käyttöliittymäosuudet. Nämä view-luokat on esitelty tarkemmin luvussa 3.2.
3.1.1. Tietokannan täyttöasteluokat
Seuraavien luokkien avulla kuvataan koko tietokannan/tietokantaosien/tietokannan yksittäisen taulun täyttöastetilanne:

dbrDbFull_c -luokka kuvaa koko tietokannan täyttöasteen. Tässä käsiteltävä täyttöaste kuvaa ainoastaan tietokantataulujen tilanvarausta - kantaa ei oteta taulualueen tai indekseille varatun tilan täyttymiseen yms. Lisäksi on huomattava, että tämän sovelluksen kannalta tietokannan täyttöasteella tarkoitetaan sovellukselle valvottavaksi määriteltyjen taulujen yhdessä muodostamaa täyttöastetta, joka tyypillisimmillään on täysinäisimmän tällaisen taulun täyttöaste.
Luokan attribuuttien merkitys:
*dbrGsmDbInfo_p -attribuutti osoittaa dbrGsmDbInfo_c -luokan olioon. Tämän olion avulla luodaan yhteys käytettyyn SQL-tietokantaan ja haetaan sieltä tarvittavia tietoja, esim. GSM_DB_INFO -taulun rivejä.
fullCriteria -attribuutti kertoo kriteerin, jonka nojalla koko tietokannan täyttöaste lasketaan tietokantaosien täyttöasteista. T3-versiossa koko tietokannan täyttöaste on pahiten täyttyneen kantaosan täyttöaste - jatkossa se voisi olla esim. kantaosien täyttöasteiden keskiarvo.
chosenDbPart -attribuutti kertoo sen yksittäisen kantaosan, jonka täyttöaste kuvaa koko kannan täyttöastetta (pahiten täyttyneen tietokantaosan tapauksessa kyseisen osan). Jatkossa chosenDbPart -attribuutti voi sisältää halutun tietokantaosan.
dbrErrInConstructor -attribuutti kertoo sen, tapahtuiko luokan konstruktorissa jokin virhe vai ei. Tämä liittyy siihen, että C++:ssa konstruktorilla ei ole paluuarvoa ja jostain olis hyvä tietää konstruktorikutsun onnistuminen.
prcntFullness -attribuutti kertoo tietokannalle viimeksi lasketun prosentuaalisen täyttöasteen.
isCalculated -attribuutti kertoo sen, seurataanko ylipäätään tietokannan täyttöastetta vai ei. Tietokannan täyttymisen seurannan voi pistää pois päältä esimerkiksi konfigurointitiedostossa.
isAnalyzed -attribuutti kertoo sen, onko millekään tämän sovelluksen valvomalle taululle laskettu käytettyjen rivien lukumäärää Oracle 7:n SQLPLUS-tulkin ANALYZE-komennolla (arvo on tässä tapauksessa DBR_TRUE) vai ei (arvo on tällöin DBR_FALSE).
lastUpdTime -merkkijonoattribuutti sisältää ajankohdan, jolloin NMS tietokannan täyttöaste laskettiin viimeksi SQLPLUS:n ANALYZE -komennolla. Jos tietokannan eri tauluille on tehty kyseinen operaatio eri aikoina, on tässä aikaleimassa tallessa vanhin näistä eri tauluille voimassa olevista aika-arvoista. Attribuutti alustetaan arvoon "000000000000", joka jää voimaan, jos millekään valvottavalle taululle ei ole ajettu ANALYZE-komentoa. Ajankohdan formaatti on yyyymmddhhmm.
Luokan menetelmien merkitys:
konstruktori: konstruktorille annetaan kaksi parametria: tietokantayhteysolio (osoitin luokan dbrGsmDbInfo_c mukaiseen olioon) ja täysinäisyyskriteerityyppi. Nämä molemmat arvot sijoitetaan olion vastaaviin yksityisiin datajäseniin. Myöskin muut yksityiset datajäsenet alustetaan (chosenDbPart, prcntFullness, isAnalyzed ja lastUpdTime). Seuraavaksi globaalilta dbrMask_c -luokan oliolta kysytään, seurataanko koko tietokannan täyttöastetta vai ei ja tämä tieto sijoitetaan myöskin vastaavaan yksityiseen datajäseneen. Tämän jälkeen luodaan kaikki tietokantaosatäyttöasteoliot (luokan dbrDbPartFull_c mukaisia), jos koko tietokannan täyttöastetilannetta seurataan. Lopuksi jos tietokannan täyttöastetta seurataan, lasketaan kyseinen täyttöaste GSM_DB_INFO -taulun sisällön pohjalta eli todellisia taulujen käytettyjen rivien lukumääriä ei lähdetä selvittelemään esim. spyanamx.sh -skriptillä. GSM_DB_INFO -tauluun valmiiksi laskettuja kokoja/käytettyjen rivien lukumääriä käytetään hyväksi sen vuoksi että saataisiin DBRMUI -sovelluksen käynnistymisaikaa pienemmäksi. Jos konstruktoriajossa meni jotain vikaan, asetetaan virheeseen liittyvä virhekoodi globaaliin virheolioon (*dbrErrItem_p) ja indikaattori dbrErrInConstructor saa arvon DBR_TRUE (muutoin sen arvo on DBR_FALSE).
destruktori: kaikki tietokantaosatäyttöasteoliot vapautetaan dynaamisesta muistista, jos ne oli sieltä allokoitu.
WasErrInConstructor: voidaan kysyä, onnistuiko konstruktorikutsu vai ei.
UpdDbFullInfo: laskee koko tietokannan täyttöasteen tauluille viimeksi laskettujen käytettyjen/maksimissaan mahtuvien rivien lukumäärien perusteella. Laskennan aluksi lasketaan valvottavien (ja dynaamisesta muistista allokoitujen) tietokantaosien täyttöasteet UpdDbPartFullInfo() -metodilla se. nämä laskennat pohjautuvat ainoastaan GSM_DB_INFO -taulussa oleviin tietoihin (tämä on selitetty tarkemmin ko. metodin kuvauksen yhteydessä). UpdDbFullInfo()-metodilla on yksi refreshOnly -niminen parametri. Jos ko. parametrin arvona annetaan DBR_TRUE, niin tällöin täyttöastetiedon uudelleen laskennassa käytetään hyväksi ainoastaan GSM_DB_INFO -taulussa olevia tauluille laskettuja käytettyjen/maksimissaan mahtuvien rivien lukumääriä. Jos arvona annetaan puolestaan DBR_FALSE, niin edellisen toiminnan lisäksi taulujen käytettyjen rivien lukumäärät lasketaan ensiksi GSM_DB_INFO -tauluun spyanamx.sh -skriptillä (tämän toiminta on kuvattu tarkemmin lähteessä /5/), joka pohjautuu Oracle 7:n SQLPLUS-tulkin ANALYZE-komentoon. Oletusarvo tälle parametrille on DBR_TRUE vasteaikasyistä. Luokan yksityisen datajäsenen isAnalyzed arvoksi päivitetään DBR_TRUE, jos kannan yhdellekin valvottavalle taululle on laskettu käytettyjen rivien lukumäärä; muutoin isAnalyzed -datajäsenen arvoksi jää DBR_FALSE. Datajäsenen lastUpdTime arvoksi tulee vanhin aikaleima kannan valvottavien taulujen vastaavista aikaleimoista (näille tauluille on täytynyt laskea joskus käytettyjen rivien lukumäärät). Arvoksi jää merkkijono "000000000000" jos millekään kannan valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää. prcntFullness -datajäsenen arvoksi päivitetään täysinäisimmän valvottavan tietokantaosan vastaavan attribuutin arvo, jos täyttöastekriteeri tälle objektille on WORST_MEMBER. Samassa yhteydessä otetaan chosenDbPart -datajäseneen talteen kyseisen tietokantaosan tunnus.
GetPrcntFullness: antaa viimeksi lasketun täyttöasteen väliltä 0 - 100 reaalilukuna, jos kannan täyttöastetta seurataan ja yhdellekin sen taululle on laskettu käytettyjen rivien lukumäärä. Muutoin metodi palauttaa arvon (double)-1.0.
GetFullCriteria ja SetFullCriteria: tietokannan täyttöastekriteeri voidaan asettaa ja sen arvoa kysellä.
GetChosenDbPart: kertoo sen tietokantaosan nimen, jonka täyttöastetta näytetään suoraan koko kannan täyttöasteena, jos kannan täyttöastetta ylipäätään seurataan ja yhdellekin sen taululle on laskettu käytettyjen rivien lukumäärä ainakin kerran.
GetNextDbPart: palauttaa järjestyksessä kaikki tietokantaosat (yksi osa per kutsu).
GetDbPart: palauttaa osoittimen siihen tietokantaosaobjektiin, jonka nimi annetaan metodille parametrina. Jos kyseistä objektia ei löydy tai sitä ei ole allokoitu dynaamisesta muistista palautetaan paluuarvona 0.
IsCalculated: metodin avulla voidaan kysyä, lasketaanko tietokannan täyttöastetta vai ei.
IsAnalyzed: palauttaa arvon DBR_TRUE, jos yhdellekin tietokannan valvottavalle taululle on laskettu käytettyjen rivien lukumäärä spyanamx.sh -skriptillä, muutoin DBR_FALSE:n.
GetLastUpdTime: palauttaa ajankohdan, jolloin tietokannan täyttöaste laskettiin viimeksi spyanamx.sh -ohjelmalla. Jos kannan tauluille on laskettu täyttöaste eri aikoina, palautetaan tällöin vanhin näistä ajankohdista. Mikäli millekään tietokannan taululle ei ole laskettu käytettyjen rivien lukumäärää, tämä metodi palauttaa osoitteen merkkijonoon, jossa on pelkästään 12 '0'-merkkiä. Palautettavan ajankohdan formaatti on yyyymmddhhmm. Palautettavan arvon tyyppi on const char * ja se osoittaa objektin sisäiseen datajäsenpuskuriin, jonka arvoa ei ole syytä päivittää luokan ulkopuolelta.
dbrDbPartFull_c -luokan rakenne on likimain analoginen dbrDbFull_c -luokan rakenteen kanssa. Nyt vain luokka kuvaa tietokantaosan täyttöasteen ja käyttää hyväkseen tietokannan kyseiseen tietokantaosaan kuuluvien valvottavien taulujen täyttöasteita laskiessaan omaa täyttöastettaan.
dbrDbPartFull_c -luokan attribuuttien merkitys:
*dbrGsmDbInfo_p: käyttö sama kuin dbrDbFull_c -luokan yhteydessä,
dbPart: tietokantaosan identifikaatio.
fullCriteria: käyttö sama kuin dbrDbFull_c -luokan yhteydessä.
chosenTable: sen tähän tietokantaosaan kuuluvan taulun nimi, jonka täyttöaste esitetään koko kantaosan täyttöasteena.
*tablesList_p: lista, joka sisältää tähän tietokantaosaan kuuluvien valvottavien taulujen täyttöasteoliot.
*nextTable_p: osoitin kyseiseen tietokantaosaan kuuluvaan tauluun. Tätä käytetään yksinomaan metodissa GetNextTable, joka palauttaa vuoronperään jokaisen ko. kantaosaan kuuluvan valvottavan taulun (yhden taulun per kutsukerta).
dbrErrInConstructor: käytetään virheindikaattorina, johon talletaan tieto konstruktorikutsun onnistumisesta.
prnctFullness: käyttö sama kuin luokan dbrDbFull_c tapauksessa.
maxUsedRows -attribuutti sisältää käsiteltävän kantaosan täysinäisimmän valvottavan taulun käytettyjen rivien lukumäärän.
isCalculated: käyttö sama kuin luokan dbrDbFull_c tapauksessa.
ContainsAlreadyTable: tällä luokan sisäisellä metodilla voidaan kysellä, sisältääkö ko. tietokantaosa parametrina annetun nimisen valvottavan taulun.
isAnalyzed: kertoo sen, onko tämän tietokantaosan millekään taululle laskettu käytettyjen rivien lukumäärää spyanamx.sh -skriptillä (arvo on tällöin DBR_TRUE) vai ei (arvo on tällöin DBR_FALSE).
lastUpdTime: sisältää ajankohdan, jolloin tälle tietokantaosalle on viimeksi laskettu täyttöaste spyanamx.sh -skriptiä käyttäen. Jos tietokantaosan eri tauluille on ko. ajo suoritettu eri aikoina, on tässä aikaleimassa tallessa vanhin näistä ajankohdista. Mikäli millekään tietokantaosan taululle ei ole laskettu kyseisellä tavalla täyttöastetta, on tämän attribuutin arvo "000000000000", johon attribuutti on itse asiassa alustettu. Ajankohdan formaatti on yyyymmddhhmm.
ja saman luokan metodien merkitys:
konstruktori: konstruktorille annetaan kolme parametria: tietokantayhteys (tyyppiä dbrGsmDbInfo_c), tietokantaosan identifikaatio (dbrDbPart_t) ja täyttöastekriteeri (dbrFullCriteria_t). Näiden arvot sijoitetaan luokan vastaaviin yksityisiin datajäseniin. Konstruktorissa tehdään tämän lisäksi seuraavat asiat:
1. Luokan yksityiset datajäsenet alustetaan (chosenTable, tablesList_p, nextTable_p, prcntFullness, maxUsedRows, isAnalyzed, lastUpdTime) sopiviin arvoihin,
2. Globaalilta maskioliolta dbrMask_p kysytään, seurataanko tämän tietokantaosan täyttöastetta. Tieto tämän kyselyn tuloksesta viedään luokan yksityisen datajäsenen isCalculated arvoksi.
3. Jos tietokantaosan täyttöastetilannetta seurataan, konstruoidaan kaikista valvottavista tähän tietokantaosaan kuuluvista tauluista lista *tablesList_p. Valvottava taulu tarkoittaa taulua, joka on mainittu GSM_DB_INFO -taulussa ja johon liittyvä DBRMUI_ENABLE -sarake ko. taulussa sisältää arvon 1. Samassa yhteydessä tarkistetaan, ettei kyseisen taulun tietoja ole mainittu GSM_DB_INFO -taulussa useampaan kertaan. Konstruoitavan listan kussakin alkiossa on tyyppiä dbrTableFull_c oleva kenttä eli alkio sisältää datanaan taulun täyttöasteolion. Kutakin listan täyttöasteoliota luotaessa sille voidaan asettaa konstruktoriparametreina seuraavat tiedot: tietokantayhteys (tyyppinä dbrGsmDbInfo_c *), taulun nimi (char *), taulun koko (long), taulun käytettyjen rivien lukumäärä (long) ja taulun käytettyjen rivien lukumäärän laskemisajankohdan aikaleima (char *; formaatti yyyymmddhhmm). Datajäsen nextTable_p laitetaan osoittamaan listan tablesList_p ensimmäiseen alkioon.
Tietokantaosan konstruktorissa ei lasketa sen täyttöastetta valmiiksi metodilla UpdDbPartFullInfo(), koska DBRMUI -sovelluksessa täyttöasteiden laskenta suoritetaan ainoastaan kertaalleen keskitetysti kullekin valvottavalle tietokantaobjektille (taulut, tietokantaosat, koko tietokanta). Käytännössä kaikkien valvottavien tietokantaobjektien täyttöasteiden laskenta tehdään globaalin olion *dbrDbFull_p (luokan dbrDbFull_c mukainen) luonnin yhteydessä, jolloin metodin dbrDbFull_c::UpdDbFullInfo() kutsu kyseisen luokan konstruktorissa laskee kaikki tarvittavat täyttöasteet käyden läpi tietokantaobjektit puumaisena hierarkiana. Tällä keskittämisellä vältetään turhaa työtä ja samalla sovelluksen käynnistyminen nopeutuu.
Jos konstruktorin ajossa sattui joku virhe, asetetaan virheeseen liittyvä virhekoodi globaalin virheolion *dbrErrItem_p virhekoodiksi, indikaattorimuuttuja dbrErrInConstructor saa arvon DBR_TRUE ja virhekohdasta palataan välittömästi kutsujan koodiin. Jos virhettä ei tapahtunut, on muuttujan dbrErrInConstructor arvo kutsun jälkeen DBR_FALSE.
destruktori: kaikki listalle tablesList_p varattu dynaaminen muisti vapautetaan.
WasErrInConstructor: käyttö sama kuin luokan dbrDbFull_c yhteydessä.
UpdDbPartFullInfo: analoginen dbrDbFull_c -luokan metodin UpdDbFullInfo() kanssa; nyt päivitetään vain tietokantaosan täyttöaste joko GSM_DB_INFO -taulun tietojen nojalla tai sitten laskemalla kantaosan valvottavien taulujen käytetyt rivit ensiksi spyanamx.sh
-skriptillä ja etenemällä tämän jälkeen kuten ensimmäisessä vaihtoehdossa. Tietokantaosan täyttöasteen laskentaa varten lasketaan ensiksi siihen kuuluvien valvottavien taulujen täyttöasteet (metodi dbrTableFull_c::UpdUsedRows()). Jos kantaosan täyttöastekriteeriksi on asetettu WORST_MEMBER, tulee tietokantaosan täyttöasteeksi sen pahiten täyttyneen valvottavan taulun täyttöaste - taululle on tällöin täytynyt joskus laskea käytettyjen rivien lukumäärä. Kyseisen taulun nimi otetaan talteen yksityiseen datajäseneen chosenTable. Jos tietokantaosassa ei ole valvottavia tauluja, on sen prosentuaalinen täyttöaste 0.0 ja chosenTable-attribuutti on tällöin "" - maxUsedRows attribuutin arvoksi jää tällöin myöskin 0. Myöskin metodin ainoan parametrin refreshOnly käyttö ja oletusarvo ovat analogiset metodin dbrDbFull_c::UpdDbFullInfo() vastaavan parametrin käytön/oletusarvon kanssa. Metodi ei tee mitään, jos ko. kantaosan täyttöastetta ei seurata. Tämä metodi päivittää myöskin yksityisen datajäsenen isAnalyzed arvon: jos jollekin kantaosan valvottavalle taululle on laskettu käytettyjen rivien lukumäärä, saa isAnalyzed arvon DBR_TRUE; muutoin arvon DBR_FALSE. Myöskin lastUpdTime päivitetään siihen arvoon kuin se on tämän tietokantaosan sillä valvottavalla taululla, jolle käytettyjen rivien lukumäärä on laskennallisesti vanhin. Jos minkään taulun käytettyjä rivejä ei ole tässä tietokantaosassa laskettu, jää ko. datajäsenen arvoksi tällöin "000000000000" (= alkuarvo). Luokan yksityisen datajäsenen maxUsedRows arvoksi viedään käsiteltävän kantaosan täysinäisimmän valvottavan taulun käytettyjen rivien lukumäärä.
GetPrcntFullness: palauttaa prosentteina (double) tämän tietokantaosan täyttöasteen, jos sitä seurataan ja yhdellekin kantaosan taululle on joskus laskettu käytettyjen rivien lukumäärä. Muutoin metodi palauttaa arvon
-1.0.
GetMaxUsedRows: palauttaa maxUsedRows -attribuutin arvon, jos tämän tietokantaosan täyttöastetta seurataan ja recount on sille ainakin kerran tehty. Muussa tapauksessa palauttaa -1:n.
GetTotalTableRows: palauttaa tämän tietokantaosan niiden valvottavien taulujen, joille on laskettu käytettyjen rivien lukumäärä, näiden käytettyjen rivien yhteislukumäärän (long). Tämä yhteislukumäärätieto perustuu kannasta viimeksi laskettuihin taulujen käytettyjen rivien lukumääriin, jolloin palautettava tieto ei yleensä ole reaaliaikaista. Jos tietokantaosaa ei valvota tai sen tauluille ei ole laskettu käytettyjen rivien lukumäärää, metodi palauttaa -1:n.
GetFullCriteria: toimii analogisesti dbrDbFull_c -luokan vastaavan metodin kanssa.
SetFullCriteria: toimii analogisesti dbrDbFull_c -luokan vastaavan metodin kanssa.
GetChosenTable: palauttaa sen taulun nimen, jonka täyttöaste määrää käsiteltävän tietokantaosan täyttöasteen. Tällöin tietokantaosaa on valvottava ja ainakin yhdelle sen taululle on oltava laskettuna käytettyjen rivien lukumäärä; muussa tapauksessa metodi palauttaa 0:n (tyyppinä const char *).
GetDbPartId: palauttaa käsiteltävän tietokantaosan identifikaation.
GetNextTable: palauttaa vuorotellen peräjälkeen jokaisen tähän tietokantaosaan kuuluvan valvottavan taulun.
ContTables: tällä metodilla voidaan kysyä, sisältääkö käsiteltävä tietokantaosa yhtään valvottavaa taulua.
IsCalculated: tällä metodilla voidaan kysyä, seurataanko käsiteltävän tietokantaosan tilannetta vai ei.
IsAnalyzed: palauttaa arvon DBR_TRUE, jos tietokantaosan jonkin taulun käytetyt rivit on selvitetty spyanamx.sh -skriptillä; muutoin arvon DBR_FALSE.
GetLastUpdTime: palauttaa sen ajankohdan, jolloin tietokantaosalle laskettiin viimeksi täyttöaste pohjautuen spyanamx.sh -skriptin käyttöön. Jos kantaosan eri tauluille on ajettu ko. skripti eri ajankohtina, sisältää paluuarvo vanhimman tällaisen ajankohdan. Paluuarvon tyyppi on const char * ja se sisältää osoitteen objektin yksityiseen datajäsenpuskuriin, jota ei ole syytä mennä luokan ulkopuolelta päivittämään. Jos kantaosan millekään taululle ei ole laskettu täyttöastetta kyseisellä skriptillä, palautetaan osoite merkkijonoon "000000000000". Palautettavan ajankohdan formaatti on yyyymmddhhmm.
dbrTableFull_c -luokka kuvaa tietokannan yksittäisen valvottavan taulun täyttöastetta. dbrTableFull_c -luokan objektia luotaessa tiedetään sen nimi ja maksimikoko sekä käytettävän dbrGsmDbInfo_c -objektin osoite, joista saadaan parametrit konstruktorille. Käytännössä DBRMUI-sovellus luo tällaisen olion jokaista GSM_DB_INFO -taulussa mainittua taulua kohden, jos vastaavan DBRMUI_ENABLE sarakkeen arvo on 1 ja missään konfigurointitiedostossa ei ko. taulun valvontaa ole kielletty.
dbrTableFull_c -luokan attribuuttien merkitykset ovat seuraavat:
*dbrGsmDbInfo_p: käyttö analoginen luokkien dbrDbFull_c ja dbrDbPartFull_c vastaavien attribuuttien kanssa.
tableId: taulun nimi SQL-kannassa.
size: taulun maksimikoko riveinä.
usedRows: taulun käytettyjen rivien lukumäärä hetkellä, jolloin viimeksi kutsuttiin tämän luokan UpdUsedRows -metodia.
prcntFullness: taulun prosentuaalinen täyttöaste hetkellä, jolloin viimeksi kutsuttiin luokan UpdUsedRows -metodia.
isCalculated: indikaattori sille, seurataanko kyseisen taulun täyttöastetta vai ei.
isAnalyzed: indikaattoriattribuutti, joka kertoo, onko tämän taulun käytettyjen rivien lukumäärä laskettu spyanamx.sh -skriptillä (arvo on tällöin DBR_TRUE) vai ei (arvo on tällöin DBR_FALSE).
lastUpdTime: sisältää ajankohdan, jolloin taulun käytettyjen rivien lukumäärä laskettiin viimeksi. Ajankohdan formaatti on: yyyymmddhhmm. Jos tätä ei ole tapahtunut kertaakaan, sisältää merkkijonon "000000000000".
Vastaavasti dbrTableFull_c -luokan menetelmät sisältävät seuraavat piirteet:
konstruktori: konstruktorilla on viisi parametria: tietokantayhteys (tyyppiä dbrGsmDbInfo_c), taulun nimi (char *), koko (long) ja käytettyjen rivien lukumäärä (long) sekä ajankohta, jolloin käytettyjen rivien lukumäärä laskettiin viimeksi (char *). Nämä tiedot sijoitetaan luokan ao. yksityisiin datajäseniin. Loput yksityiset datajäsenet alustetaan (prcntFullness, isAnalyzed, lastUpdTime) sopivilla alkuarvoilla. Lopuksi kysytään globaalilta maskioliolta (*dbrMask_p), seurataanko tämän taulun täyttöastetta ja tämä tieto viedään luokan yksityisen datajäsenen isCalculated arvoksi.
destruktori: ei nykyisellään tee mitään.
UpdUsedRows: laskee taulun käytettyjen rivien lukumäärän tietokannan sisällön perusteella mikäli taulun täyttöastetilannetta tarkkaillaan. Jos metodin ainoan parametrin refreshOnly arvona on DBR_TRUE, haetaan ainoastaan GSM_DB_INFO -taulusta löytyvä valmiiksi laskettu käytettyjen rivien lukumäärä. Jos parametrin arvona on DBR_FALSE, lasketaan kyseinen arvo ensiksi GSM_DB_INFO -tauluun spyanamx.sh
-skriptillä ja sen jälkeen toimitaan kuten edellä kun refreshOnly
-parametrin arvona oli DBR_TRUE. Mikäli refreshOnly == DBR_TRUE -tapauksessa havaitaan, että taulun käytettyjen rivien lukumäärää ei ole laskettu, asetetaan mm. isAnalyzed-attribuutti DBR_FALSE -arvoon. Tämän objektin yksityisen datajäsenen lastUpdTime arvoksi päivitetään se ajankohta, jolloin taululle viimeksi laskettiin käytettyjen rivien lukumäärä. Jos ko. laskentaa ei ole suoritettu, päivittyy ko. jäsenen arvoksi "000000000000". Samassa yhteydessä päivitetään myöskin yksityisen datajäsenen prcntFullness arvo; erityisesti jos tauluun mahtuvien rivien lukumäärä on 0 saa tämä datajäsen arvon 100.
GetPrcntFullness: palauttaa viimeksi lasketun täyttöasteen prosentteina, jos taulun täyttöastetilannetta seurataan ja taulun käytettyjen rivien lukumäärä on joskus laskettu. Muussa tapauksessa palautetaan -1.0.
GetUsedRows: palauttaa viimeksi lasketun taulun käytettyjen rivien lukumäärän, jos taulun täyttöastetilannetta seurataan ja käytettyjen rivien lukumäärä on joskus laskettu. Muussa tapauksessa palauttaa -1:n.
GetTableId: palauttaa taulun nimen.
GetSize: palauttaa taulun maksimikoon riveinä.
IsCalculated: palauttaa tiedon siitä, seurataanko ko. taulun täyttymistä vai ei.
IsAnalyzed: palauttaa DBR_TRUE:n, jos taulun käytettyjen rivien lukumäärä on ainakin kerran laskettu spyanamx.sh -skriptillä; muutoin palautetaan arvo DBR_FALSE.
GetLastUpdTime: palauttaa viimeisen ajankohdan, jolloin taululle laskettiin käytettyjen rivien lukumäärä spyanamx.sh -skriptillä. Paluuarvo on osoite objektin yksityiseen datajäsenpuskuriin (tyyppinä const char *), joten ko. puskuria ei ole syytä päivittää luokan ulkopuolelta. Ajankohdan formaatti on yyyymmddhhmm. Jos taululle ei ole kertaakaan laskettu käytettyjen rivien lukumäärää, palautetaan osoite merkkijonoon "000000000000".
3.1.2. Konfigurointi-/profiililuokka
Konfigurointi- ja profiilitietojen käsittelemiseksi tehdään luokka dbrConfProf_c, jonka oliomallikuvaus on seuraavanlainen (layout syistä luokan menetelmät on esitetty attribuuttien oikealla puolella - konfiguraatio- ja profiilitiedoston ero on kerrottu tarkemmin luvussa 2.1.1.):

Luokkarajapintaan on vaikuttanut voimakkaasti luvussa 2.1.1. kuvattu konfigurointitiedostojen evaluointiperiaate. Luokan attribuutit sisältävät tarkemmin seuraavia asioita (osa attribuuteista on luokan sisäisiä metodeita, joten olisi ehkä parempi puhua luokan yksityisistä jäsenistä):
*dbConf_p: osoittaa tietueeseen, jossa on tallessa tietokantaa koskevat konfigurointitiedostoista löytyneet tiedot,
*dbPartsConf_p: osoittaa tauluun, jonka kukin alkio osoittaa yhden tietokantaosan konfigurointitiedot sisältävään tietueeseen. Jokaista OMC tietokannan tietokantaosaa varten on ko. taulussa varattu alkio,
*tableConf_p: linkitetty lista niiden taulujen konfigurointitiedoista, joihin on viitattu jostain konfigurointitiedostosta,
GetProfData: lukee konfigurointitiedot profiilitiedostosta väliaikaiseen tietorakenteeseen, josta ne evaluoinnin jälkeen viedään lopullisiin konfigurointitietorakenteisiin (nämä ovat juuri nuo kolme edellä lueteltua). Evaluointia ei tehdä tässä metodissa. Jos profiilitiedostoa ei ole, väliaikaista tietorakennetta ei myöskään rakenneta. Profiilitiedostoa haetaan hakemistosta $HOME/conf, missä conf on itse asiassa symbolinen linkki profiilitiedostojen tallennuspaikkaan (tästä on kerrottu tarkemmin esim. poladmmx-sovelluksen dokumenteissa),
GetGlobConfData: lukee konfigurointitiedot globaalista konfigurointitiedostosta väliaikaiseen tietorakenteeseen jatkoprosessoitavaksi tämän luokan metodeilla kuten GetProfData:kin tekee. Samoin jos tiedostoa ei löydy, mitään väliaikaista tietorakennetta ei allokoida. Globaalia konfigurointitiedostoa haetaan aluksi OMCCONFPATH -ympäristömuuttujan ilmaiseman polkunimilistan varrelta, ja jos sieltä ei löydy, niin sitten oletuspaikasta, joka on: /usr/local/NokiaOMC/conf/global,
*prevGlobConfPathAndName_p: osoitin merkkijonoon, joka sisältää aiemmin luokan metodilla GetGlobConfData luetun globaalin konfigurointitiedoston nimen polkuineen. Tämä yksityinen muuttuja tarvitaan, jotta vastaavalla SaveGlobConf -metodilla osattaisiin tallentaa ko. tiedosto samaan paikkaan, mistä se on viimeksi luettu,
GetUserConfData: tiedot käyttäjäkohtaisesta konfigurointitiedostosta luetaan väliaikaiseen tietorakenteeseen jatkoprosessoitavaksi kuten metodien GetProfData ja GetGlobConfData tapauksissakin tehdään. Jos ko. tiedostoa ei löydy, myöskään kyseistä tietorakennetta ei allokoida. Käyttäjäkohtainen konfigurointitiedosto sijaitsee $HOME:n ilmaisemassa hakemistossa ja on nimeltään dbrmuimx.cf. Myöskin profiili-/globaali konfigurointitiedosto on nimeltään dbrmuimx.cf,
EvalProf: jos profiilitiedostosta luettiin aiemmin luokan metodilla GetProfData joitain tietoja väliaikaiseen tietorakenteeseen, tämän metodin avulla ko. tiedot siirretään ns. evaluointitietorakenteeseen, johon loppujen lopuksi muodostuvat lopulliset konfigurointitiedot. Evaluointitietorakenteen osia allokoidaan tässä metodissa vain jos siihen on tarvetta eli jos osaan liittyviä tietoja löydettiin profiilitiedostosta. Evaluointitietorakenteen allokoitujen osien ne kentät, joihin tiedot tulevat globaalista/käyttäjän konfigurointitiedostosta, asetetaan "alustamattomiin" arvoihin. Tämän luokan sisäisiä Eval-metodeita kutsutaan järjestyksessä: EvalProf, EvalGlobConf ja EvalUserConf - tällä tavoin saadaan konfigurointitiedot evaluoitua oikein,
SearchDbPartInd: palauttaa sen tietokantaosan evaluoidut konfigurointitiedot sisältävän taulualkion indeksin, jonka nimi annetaan metodille ASCII-merkkijonona. Jos kyseistä alkiota ei löydy, palauttaa
-1:n,
SearchFreeDbPartInd: jos tietokantaosien evaluoidut konfigurointitiedot sisältävästä taulusta löytyy vapaa alkio, sen indeksi palautetaan. Muutoin palautetaan -1,
SearchTable: etsii taulujen evaluoidut konfigurointitiedot sisältävästä listasta sen taulun tiedot, jonka nimi annetaan metodille parametrina (palauttaa siis osoitteen). Jos ko. taulun konfigurointitietoja ei listasta löydy, palauttaa 0:n,
SearchLastTable: palauttaa taulujen evaluoidut konfigurointitiedot sisältävän listan viimeisen alkion. Jos lista on tyhjä, palauttaa 0:n,
EvalGlobConf: jos globaalista konfigurointitiedostosta luettiin aiemmin metodilla GetGlobConfData konfigurointitietoja, sijoitetaan nämä niiden väliaikaisesta varastorakenteesta konfigurointitietojen evaluointirakenteeseen. Jos konfigurointitietoja ei ollut, evaluointitietorakenne ei tältä osin muutu. Jos evaluointitietorakenteesta puuttuu joitain osia, joita koskevia globaaleja konfigurointitietoja luettiin, allokoidaan nämä osat tässä metodissa - näiden osien profiilista luettuja konfigurointitietoja sisältäviin kenttiin sijoitetaan tällöin "alustamattomat" arvot,
EvalFollow: metodille annetaan johonkin DBRMUI:n tarkkailemaan resurssiin liittyvät Follow-attribuutin arvot profiilitiedostosta sekä globaalista ja käyttäjän konfigurointitiedostosta ja metodi palauttaa resurssiin liittyvän sovelluksessa voimassa olevan Follow-attribuutin arvon. Ts. metodi evaluoi mainittujen kolmen follow-määrityksen yhteisvaikutuksen. Jos jotain follow-arvoa ei ko. tiedostosta löytynyt, silloin ko. parametrin arvo on "alustamaton" arvo. Evaluoinnissa huomioidaan profiiliasetuksen rajoittava luonne ja se, että mahdollisen rajoituksen puitteissa globaali asetus evaluoidaan ennen käyttäjäkohtaista asetusta,
EvalUserConf: jos käyttäjäkohtaisessa konfigurointitiedostossa oli konfigurointiasetuksia, ne viedään väliaikaisesta tietorakenteesta evaluointitietorakenteeseen. Tarvittaessa allokoidaan lisää osia evaluointitietorakenteeseen, mikäli käyttäjäasetukset näin vaativat ja vastaavia asetuksia ei ollut profiilissa eikä globaalissa konfigurointitiedostossa - tässä tapauksessa profiili- ja globaalit konfigurointiasetukset asetetaan "alustamattomiin" arvoihin. Koska tätä Eval-metodia kutsutaan viimeiseksi, evaluoidaan sen sisällä kaikista konfigurointitiedostoista löytyneiden konfigurointiasetusten lopulliset arvot asetettavaksi voimaan sovelluksessa. Lisäksi metodissa suoritetaan evaluointirakenteessa konfigurointitietoihin liittyvää täydennystä: jos joku konfigurointiasetus oli mainittu ainoastaan profiilissa, on tämä asetus täydennettävä voimaan lopulliseksi asetukseksi kyseisen konfigurointiattribuutin osalta,
DeleteEvalMem: tällä metodilla vapautetaan kaikki evaluointitietorakenteet muistista. Evaluointirakenne allokoidaan sovelluksen dynaamisesta muistista (ns. heap:sta), jolloin ne on käytön jälkeen syytä vapauttaa viemästä muistia,
CompleteEvalData: täydentää evaluointitietorakenteita kahdella tavalla: jos on olemassa sellainen tietokantaosa, jonka tauluihin liittyy konfigurointiasetuksia muttei itse osaan, metodi luo evaluointitietorakenteen myös itse osaa varten, jossa kaikki muut attribuutit sisältävät "alustamattoman" arvon paitsi tietokantaosan nimi. Jos johonkin tauluun tai tietokantaosaan oli asetuksia jossain konfigurointitiedostossa muttei itse tietokantaan ollut mitään asetuksia, luo metodi evaluointirakenteen myöskin itse tietokantaa varten, jossa kaikkien attribuuttien arvot ovat "alustamattomia". Metodi on viimeinen konfigurointiin liittyvä, jota kutsutaan ennenkuin konfigurointiluokalta voidaan alkaa kyselemään eri konfigurointiasetusten arvoja. Tämän jälkeen evaluointitietorakenne on riittävän valmis, jotta siitä voidaan alkaa kyselemään konfiguroituja attribuuttiasetuksia,
EvalConf: Eval-metodien korkeamman tason rutiini, joka niputtaa yhteen EvalProf-, EvalGlobConf- ja EvalUserConf -metodien kutsut em. järjestyksessä ja lopulta kutsuu CompleteEvalData-metodia. Periaatteessa metodi evaluoi eri konfigurointitiedostojen lukemisien yhteydessä syntyneiden väliaikaisten tietorakenteiden konfigurointiattribuuttien arvot lopullisiksi sovelluksen konfigurointiasetuksiksi. Metodin alussa mahdolliset aikaisemmin evaluoidut konfigurointiasetukset tyhjätään. Lopuksi konfigurointitiedostojen luvun yhteydessä syntyneiden väliaikaisten tietorakenteiden varaama dynaaminen muisti vapautetaan tarpeettomana, koska konfigurointiasetukset ovat nyt muualla tallessa,
NoConfObjects: palauttaa DBR_TRUE:n, jos konfigurointiobjektilla ei ole olemassa mitään evaluoituja tietorakenteita, muutoin DBR_FALSE:n. Tällä metodilla voidaan siis tarkistaa, saiko sovellus mitään konfigurointiasetuksia eri konfigurointitiedostoista,
FindFirstTableInDbPart: palauttaa osoittimen ensimmäiseen sellaiseen taulua koskevaan evaluoituun konfigurointitietorakenteeseen, jossa itse taulu kuuluu parametrina annettuun tietokantaosaan. Jos tällaista rakennetta ei löydy taulujen evaluoidut konfigurointitiedot sisältävästä listasta, palauttaa 0:n,
FindNextTableInDbPart: kukin tämän metodin kutsu palauttaa seuraavan aiemmin FindFirstTableInDbPart -kutsun yhteydessä spesifioituun tietokantaosaan kuuluvan taulun evaluoidut konfigurointitiedot listasta tauluja koskevia evaluoituja konfigurointitietoja. Jos tällaista rakennetta ei löydy, palauttaa 0:n. Yhden FindFirstTableInDbPart- ja monen FindNextTableInDbPart -kutsun avulla on mahdollista käydä läpi kaikki johonkin tietokantaosaan konfigurointitiedostoissa konfiguroidut taulut,
NoDbPartConf: palauttaa DBR_TRUE:n, jos parametrina annettua tietokantaosaa ei ole konfiguroitu missään konfigurointitiedostossa eli evaluoituja konfigurointiasetuksia ei ko. osalle ole olemassa - muussa tapauksessa palauttaa arvon DBR_FALSE. Koska tätä metodia ennen sovelluksessa kutsutaan metodia CompleteEvalData, DBR_TRUE
-paluuarvon tapauksessa ei myöskään ko. osaan liittyviä tauluja ole konfiguroitu missään em. tiedostoissa,
wasErrInConstr: indikaattorimuuttuja, joka sisältää DBR_TRUE:n, jos viimeksi ajetussa konstruktorikutsussa tapahtui virhe, muutoin sisältö on DBR_FALSE,
EvalConf2File: kirjoittaa evaluoidut konfigurointiasetukset tiedostoon. Parametrina annetaan aukaistun konfigurointitiedoston kahva ja sen nimi. Metodin avulla saadaan siis talteen yhteen konfigurointitiedostoon sovelluksen lopullinen konfigurointitilanne (oletusarvojen yli tehdyt määritykset), jotta sovellusta voitaisiin ajaa samoin asetuksin uudestaan yhden konfigurointitiedoston avulla,
*prevTableInDbPart_p: apuosoitin, jonka avulla metodit FindFirstTableInDbPart ja FindNextTableInDbPart saadaan pelaamaan yhteen. Sisältää osoittimen juuri aiemmin löydettyyn ao. tietokantaosaan kuuluvan taulun evaluoituihin konfigurointitietoihin tai jos edellisellä kerralla ei kyseistä rakennetta enää löytynyt, sisältää 0:n,
prevDbPart: tähän muuttujaan otetaan talteen FindFirstTableInDbPart
-metodille annettu tietokantaosa, jotta metodissa FindNextTableInDbPart osattaisiin hakea samaan tietokantaosaan kuuluvien taulujen evaluoituja konfigurointitietoja,
*prevTableInAsk_p: jos metodeilla AskFollowVal ja AskNextFollowVal halutaan kysyä kaikkien konfiguroitujen taulujen follow-attribuutin arvoja, pidetään tässä osoitinmuuttujassa tallessa viite juuri aiemmin kysytyn taulun follow-tietoon, jotta lista taulujen evaluoituja follow-attribuutin arvoja osattaisiin läpikäydä oikein,
prevDbPartInAsk: jos metodeilla AskFollowVal ja AskNextFollowVal halutaan kysyä kaikkien konfiguroitujen tietokantaosien follow
-attribuuttien arvot, pidetään tässä muuttujassa tallessa indeksi juuri aiemmin kysytyn tietokantaosan evaluoituun follow-tietoon (nämä tiedot ovat tallessa siis taulukossa), jotta kaikki tietokantaosat saataisiin läpikäytyä,
resTypeInAsk: tässä muuttujassa pidetään tallessa AskFollowVal
-metodille parametrina annetun resurssin tyyppi (= tietokanta, tietokantaosa, taulu), jotta seuraavassa AskNextFollowVal-metodissa osattaisiin käsitellä juuri samaa resurssityyppiä.
Luokan dbrConfProf_c julkiset metodit ovat puolestaan seuraavat:
konstruktori: luokan yksityiset datajäsenet (dbConf_p, dbPartsConf_p, tableConf_p, prevGlobConfPathAndName_p, wasErrInConstr, prevTableInDbPart_p, prevDbPart, prevTableInAsk_p, prevDbPartInAsk) alustetaan sopivilla arvoilla. Lopuksi kutsutaan luokan julkista Configure() -metodia. Jos konstruktorin ajossa tapahtui virhe, sopiva virhekoodi asetetaan globaaliin dbrErrItem_p -virheolioon, indikaattorimuuttuja wasErrInConstr saa arvon DBR_TRUE ja konstruktorista palataan välittömästi kutsujan koodiin. Jos luokkaa käyttävä sovellus käännetään siten että DEBUG -define on määritelty, tulostetaan konfigurointiasetukset lopuksi stdout:iin.bv
destruktori: tässä metodissa kutsutaan luokan yksityistä DeleteEvalMem() -metodia, jotta konfigurointiasetusten evaluonnissa varattu dynaaminen muisti saadaan vapautettua. Lisäksi jos luokan yksityiselle datajäsenelle prevGlobConfPathAndName_p:lle oli varattu tilaa dynaamisesta muistista tämä tila vapautetaan.
WasErrInConstructor: tällä metodilla voidaan kysyä, onnistuiko edeltävä luokan konstruktorin kutsu vai ei,
Configure: konfigurointiasetukset luetaan ensin profiilitiedostosta, sitten globaalista konfigurointitiedostosta ja viimeiseksi käyttäjän konfigurointitiedostosta. Lopuksi kaikki em. asetukset evaluoidaan lopullisiksi sovelluksen konfigurointiasetuksiksi, joita voidaan kysyä sitten alla luetelluilla Ask-metodeilla. Tällä hetkellä Configure kutsuu seuraavia yksityisiä edellä lueteltuja metodeita seuraavassa järjestyksessä: GetProfData, GetGlobConfData, GetUserConfData ja EvalConf.
AskFollowVal: palauttaa follow-attribuutin arvon ja resurssin nimen ensimmäiselle sisäänmenoparametrin resType tyyppiä olevalle resurssille evaluoiduista follow-attribuuttilistoista. Jos evaluoitua follow-asetusta ei ko. tyyppiä olevalle resurssille löydy, nimen osalta palautetaan tyhjä merkkijono ja follow-attribuutin osalta sen oleturarvo,
AskNextFollowVal: jatketaan follow-attribuutin arvon ja resurssin nimen hakua evaloiduista follow-attribuuttilistoista käyttäen samaa resurssityyppiä kuin edellisessä AskFollowVal-kutsussa. Jos enää ei löydy yhtään ko. kriteerit täyttävää follow-attribuutin arvoa, palautetaan follow-attribuutin oletusarvo sekä tyhjä merkkijono resurssin nimenä. AskFollowVal ja AskNextFollowVal -metodeilla voitaisiin kysellä esimerkiksi kaikkien niiden taulujen follow-attribuuttien arvot, jotka on määritelty jossain konfigurointitiedostossa,
AskCleanUpFilePath: palauttaa parametrina annettuun tietokantaosaan liittyvän tietokantasiivoushakemiston. Jos tällaista ei ole asetettu missään konfigurointitiedostossa, palauttaa ko. hakemiston oletusarvon. Metodin paluuarvo on DBR_TRUE, jos jos ko. hakemisto oli kiinnitetty jossain konfigurointitiedostossa, muutoin DBR_FALSE,
AskDatabaseBackupPrg: palauttaa voimassaolevan tietokantavarmistusohjelman nimen. Jos tämä oli mainittu jossain konfigurointitiedostossa, metodin paluuarvo on DBR_TRUE, muutoin DBR_FALSE,
AskDatabaseCheckInterval: palauttaa voimassaolevan tietokannan toiminnan seuraamisvälin sekunteina referenssiparametrissa. Jos ko. arvo oli kerrottu jossain konfigurointitiedostossa, itse metodi palauttaa DBR_TRUE:n, muutoin DBR_FALSE:n,
SaveProf: tallettaa voimassaolevat konfigurointiasetukset profiilitiedostoon. Tallennus käy päinsä ainoastaan, jos ohjelman käynnistäjä kuuluu sysop-ryhmään. Jos profiilitiedostohakemistossa on jo valmiina DBRMUI-sovelluksen profiilitiedosto, siitä tehdään varakopio nimelle dbrmuimx.cf~ ennenkuin uusi tiedosto kirjoitetaan vanhan profiilin päälle,
SaveGlobConf: tallettaa voimassaolevat sovelluksen konfigurointiasetukset globaaliin konfigurointitiedostoon. Tallennus tapahtuu vain, jos tätä metodia käyttävän sovelluksen on käynnistänyt sysop-ryhmään kuuluva käyttäjä. Mikäli tämän luokan GetGlobConfData-metodilla ei ole luettu kertaakaan globaalia konfigurointitiedostoa, tiedosto kirjoitetaan ensimmäiseen sellaiseen hakemistoon $OMCCONFPATH -polkunimilistan varrella, minne käyttävällä sovelluksella on kirjoitusoikeus. Jos tällaista hakemistoa ei löydy, käytetään sitten globaalin konfigurointitiedoston oletushakemistoa, joka on /usr/local/NokiaOMC/conf/global. Jos taas globaali konfigurointitiedosto on luettu aiemmin tämän luokan metodilla, kirjoitetaan se samaan hakemistopaikkaan, mistä se luettiin. Vanhasta globaalista konfigurointitiedostosta tehdään varakopio nimelle dbrmuimx.cf~ ennen kirjoitusta,
SaveUserConf: kirjoittaa sovelluksen voimassaolevat konfigurointiasetukset käyttäjän konfigurointitiedostoon tämän kotihakemistoon. Ennen kirjoitusta mahdollisesta vanhasta käyttäjän konfigurointitiedostosta tehdään varakopio nimelle dbrmuimx.cf~.
3.1.3. Tietojen näyttämiseen liittyvät rajoitukset toteuttava luokka
Luokan dbrMask_c avulla voidaan sovelluksessa kysellä, seurataanko jonkun resurssin (= tietokanta, tietokantaosa, taulu) täyttöastetta vai ei. Luokan oliokaavioesitys on seuraava:

Luokan attribuuttien merkitys on seuraava (osa attribuuteista on datajäseniä ja osa yksityisiä metodeita):
*myGsmDbInfo_p: osoitin omaan tietokantakäsittelyn hoitavaan objektiin. Tietokantakäsittely sisältää mm. GSM_DB_INFO -taulun sisältämien tietojen lukua ja tietokantataulujen käytettyjen rivien lukumäärän selvitystä,
*confProf_p: osoitin sovelluksessa käytettyyn globaaliin konfigurointiobjektiin. Tämä annetaan dbrMask_c -luokan objektille parametrina. confProf_p -objektiviitteen avulla kysellään luokan sisällä eri konfigurointitiedostoista löytyneitä follow-attribuutin arvoja,
dbDisabled: indikaattorimuuttuja, joka kertoo onko tietokannan täyttöastetilanteen seuranta sovelluksessa kielletty (= DBR_TRUE tällöin) vai sallittu (= DBR_FALSE),
dbPartsDisabled: taulukko indikaattorimuuttujia, jotka kuvaavat kutakin tietokantaosaa kohti, seurataanko sen täyttöastetilannetta (= DBR_FALSE) vai eikö (= DBR_TRUE),
dbPartsTablesCnt: sisältää sovelluksen valvomien taulujen lukumäärän tietokantaosakohtaisesti,
AllChildrenDisabled: yksityinen metodi, joka palauttaa DBR_TRUE:n, jos parametrina annetun resurssin (parametreina itse asiassa resurssin nimi ja tyyppi) kaikki lapsiresurssit ovat konfigurointien tms. syiden vuoksi ei-seurattavia täyttöasteensa suhteen. Muutoin metodi palauttaa DBR_FALSE:n,
wasErrInConstr: indikaattorimuuttuja, joka kertoo sen, tapahtuiko konstruktorin ajossa joku virhe (= DBR_TRUE tässä tapauksessa) vai ei (= DBR_FALSE),
TableDisabled: yksityinen metodi, joka palauttaa DBR_TRUE:n, jos parametrina annettu taulu kuuluu ei-seurattavien joukkoon täyttöasteensa suhteen (parametrina itse asiassa ko. taulun nimi); muutoin metodi palauttaa DBR_FALSE:n,
*tablesDisabled_p: lista tauluja (= niiden nimiä), jotka on jollain tavoin konfiguroitu ei-seurattavien joukkoon täyttöasteensa suhteen,
Luokan julkiset menetelmät ovat seuraavat:
konstruktori: tässä metodissa tehdään seuraavat asiat:
1. Luodaan olion sisäinen tietokantayhteysolio (tyyppinä dbrGsmDbInfo_c) *myGsmDbInfo_p, ja sen tietokantayhteys avataan OpenDb() -metodin kutsulla.
2. Konstruktorin parametrina annettu konfigurointiolioviite viedään luokan asianomaisen yksityisen datajäsenen arvoksi.
3. Konfigurointiolioviitettä hyväksi käyttäen selvitetään, seurataanko tietokannan/tietokantaosien/taulujen täyttöasteita ja nämä tiedot viedään olion ao. yksityisten datajäsenien arvoiksi.
4. Lopuksi tauluun dbPartsTablesCnt[] lasketaan kaikkien tietokantaosien valvottavien taulujen lukumäärät. Nämä saadaan *myGsmDbInfo_p -olion GetTableCntInDbPart() -metodin avulla.
Jos konstruktorin ajossa tapahtuu joku virhe, asetetaan virheeseen liittyvä koodi globaalille virheoliolle *dbrErrItem_p:lle, indikaattorimuuttuja wasErrInConstr saa arvon DBR_TRUE ja konstruktorista palataan välittömästi kutsujan koodiin. Jos virhettä ei tapahtunut, muuttujan wasErrInConstr arvona on DBR_FALSE.
destruktori: tässä metodissa deallokoidaan lista tablesDisabled_p (sisältää ne valvottavat taulut, joiden täyttöasteita ei seurata). Samoin yksityinen kantayhteys tietokantaan suljetaan ja kyseinen kantayhteysolio - *myGsmDbInfo_p - tuhotaan.
WasErrInConstructor: tämän metodin avulla tarkistetaan, tapahtuiko edeltävän konstruktorikutsun ajossa virhe (palauttaa tällöin DBR_TRUE:n) vai ei (palauttaa DBR_FALSE:n),
IsCalculated: metodille annetaan kaksi parametria: resurssin tyyppi (= tietokanta, tietokantaosa, taulu) ja sen nimi, ja metodi palauttaa tiedon siitä, seurataanko ko. resurssin täyttöastetta sovelluksessa (palauttaa tällöin DBR_TRUE:n) vai ei (palauttaa DBR_FALSE:n),
GetGsmDbInfo_p: palauttaa luokan yksinään käyttämän dbrGsmDbInfo_c -luokan tyyppisen objektin viitteen kutsujalleen. Tämä on tarpeen esimerkiksi jos ulkoa päin halutaan tilapäisesti sulkea kyseisen objektin tietokantayhteys.
Yksittäiseen resurssiin liittyvän seurantatiedon evaluointi tehdään seuraavan algoritmin mukaisesti:
1. Jos resurssilla on olemassa isäresurssi ja sitä ei seurata täyttöasteensa puolesta, ei myöskään käsiteltävän resurssin täyttöastetta seurata,
2. Jos kohta 1. ei antanut vastausta resurssin seuraamistilanteeseen, käsitellään resurssin omaa follow-attribuutin asetusta. Jos se on DBR_FALSE, on vastaus jälleen selvä: resurssin täyttöastetilannetta ei seurata,
3. Jos kohdat 1. ja 2. eivät antaneet vastausta resurssin seuraamistilanteeseen, katsotaan, ovatko kaikkien resurssin lapsiresurssien follow-attribuuttien arvot DBR_FALSE:ja tai onko näitä lapsiresursseja 0 kappaletta. Jos jompikumpi em. ehdoista tai molemmat täyttyy, ei käsiteltävän resurssin täyttöastetilannetta seurata,
4. Jos kohdat 1., 2. ja 3. eivät antaneet vastausta resurssin täyttöastetilanteen seuraamiseen, sitä seurataan.
3.1.4. GSM_DB_INFO -taulun käsittelyn ja muun tietokantaoperoinnin toteuttava luokka
Luokan dbrGsmDbInfo_c palveluiden avulla hoidetaan DBRMUI-sovelluksen tarvitsemat seuraavat tietokantaoperaatiot: sovelluksen valvoman taulun maksimikoon ja käytettyjen rivien lukumäärän selvitys sekä GSM_DB_INFO -taulun sisältämien tietojen luku ja päivitys.

Luokan yksityiset datajäsenet ja menetelmät ovat seuraavat:
*dbConn_p: osoitin wdbmgr_c -luokan objektiin, joka toteuttaa OMC-sovelluksien tietokantarajapinnan Oracle-kantaan.
gsmDbInfoRow: tämä muuttuja sisältää viimeksi haetun rivin tiedot GSM_DB_INFO -taulusta.
nextGsmDbInfoRow: tähän muuttujaan haetaan talteen valmiiksi viimeksi haettua GSM_DB_INFO -taulun riviä seuraava rivi kannasta.
EmptyGsmDbInfoRow: yksityinen metodi, jonka avulla voidaan tyhjätä GSM_DB_INFO -taulun rivin tiedot sisältävä muuttuja. Tämä muuttuja annetaan metodille referenssiparametrina.
CopyGsmDbInfoRow: yksityinen metodi, jonka avulla voidaan kopioida GSM_DB_INFO -taulun rivin tiedot sisältävä rakenne toiseen samanlaiseen rakenteeseen.
GetGsmDbInfoRow: jos tälle yksityiselle metodille on annettu parametrin tableId arvona merkkijono, haetaan GSM_DB_INFO -taulusta rivi, joka sisältää taulun tableId tiedot. Jos ko. merkkijonoparametriosoitin on 0, haetaan GSM_DB_INFO -taulusta sen "ensimmäinen" rivi ja osoitinparametrin indicator_p osoittama arvo osoittaa haun onnistumisen seuraavasti: negatiivinen arvo osoittaa epäonnistumisen, nolla osoittaa sen, ettei yhtään riviä löytynyt, 1 osoittaa, että yksi rivi löytyi ja enempää ei sitten löydykään ja vihdoin 2 osoittaa, että yksi rivi löytyi tällä kutsulla ja lisää rivejä on luvassa yksityisen metodin FetchGsmDbInfoNextRow() -kutsuilla. Metodilla on myöskin kolmas parametri: onlyDbrmuiEnabled. Jos sillä on arvo DBR_TRUE, metodi käsittelee GSM_DB_INFO -taulusta vain ne rivit, joiden DBRMUI_ENABLE sarakkeen arvo on 1, muutoin käsitellään ko. taulun kaikki rivit. Tämä liittyy siihen, että DBRMUI-sovellukselle valvottavia tauluja ovat vain ne, jotka ovat GSM_DB_INFO -taulussa mainittu ja joiden DBRMUI_ENABLE kentän arvo on 1. Toisaalta SPYMAN sovellus käsittelee kaikki GSM_DB_INFO -taulun rivit, joissa on tyystin toiset ...ENABLE-sarakkeet päällä. tableId-parametrin oletusarvo on 0 ja onlyDbrmuiEnabled -parametrin oletusarvo on DBR_FALSE. Jos haetun rivin sarakkeilla USED_ROWS ja TIME_STAMP on NULL-arvot, tulee kannasta noudetuksi tällöin arvot -1 ja "000000000000" kyseisille kentille.
Jos GSM_DB_INFO -taulusta lähdettiin tällä metodilla hakemaan useampia rivejä ne tulevat palautetuiksi seuraavien kenttien arvojen mukaisessa nousevassa järjestyksessä: P.NE_TYPE, P.MEAS_TYPE ja LENGTH(P.MEAS_TYPE_NAME), missä P viittaa tauluun P_PM_TABLES. Siis niiden mittaustietokantaosaan kuuluvien taulujen tiedot, jotka kuuluvat johonkin mittaustyyppiin, tulevat palautetuiksi kyselyssä tässä järjestyksessä. Ideana on saada esitettyä mittaustyyppien nimet käyttöliittymän listoissa NMS:n standardijärjestyksessä.
FetchGsmDbInfoNextRow: tällä yksityisellä metodilla haetaan GetGsmDbInfoRow -metodilla aloitetun kyselyn vastauksena tulevia seuraavia rivejä GSM_DB_INFO -taulusta. Metodilla on yksi parametri: indicator_p -osoitin, jonka osoittaman arvon tulkinta on täsmälleen sama kuin GetGsmDbInfoRow -metodin yhteydessä.
isDbConnected: indikaattorimuuttuja, joka ilmaisee, onko luokan objektilla istunto auki kantaan vai ei. Tämän luokan metodi OpenDb pistää tämän muuttujan "päälle" ja metodi CloseDb pois.
GetLastTableId: palauttaa viimeksi GSM_DB_INFO -taulusta haetun rivin tableId -tiedon.
errItemAllocatedHere: indikaattori sille, allokoitiinko globaali virhekäsittelyolio tämän luokan metodien sisällä vai ei. Jos allokoitiin, luokan destruktorissa se myös vapautetaan. Tämä liittyy SPYMAN:in tarpeisiin käyttää kyseistä luokkaa ja sen virhekäsittelyoliota ilman että aivan toisaalla DBRMUI:n luokissa tehtävää virhekäsittelyolion varaamista suoritetaan.
wasErrInConstr: indikaattorimuuttuja sille, tapahtuiko konstruktorin ajossa virhe (sisältää tällöin DBR_TRUE:n) vai ei (sis. DBR_FALSE:n).
Luokan ulkoiset menetelmät ovat seuraavat:
konstruktori: olion yksityiset gsmDbInfoRow- ja nextGsmDbInfoRow -merkkijonopuskurit tyhjätään, yksityiset datajäsenet isDbConnected ja dbConn_p alustetaan sopivilla arvoilla. Mikäli globaalia virhekäsittelyoliota dbrErrItem_p ei ole vielä allokoitu dynaamisesta muistista tehdään allokointi tämän metodin lopussa ja allokoidun olion ShowLocation() -metodia kutsutaan. Jos virhekäsittelyolio jouduttiin tässä metodissa allokoimaan, olion yksityinen datajäsen errItemAllocatedHere saa arvon DBR_TRUE; muutoin sen arvo on DBR_FALSE. Mikäli konstruktorin ajossa sattui joku virhe, ao. virheen koodi asetetaan virhekäsittelyolioon, indikaattori wasErrInConstr saa arvon DBR_TRUE ja konstruktorista palataan välittömästi kutsujan koodiin. Mikäli virhekäsittelyolion allokointi dynaamisesta muistista epäonnistui, tulostetaan tästä virheilmoitus stderr:iin, koska virhekäsittelypalvelu ei ole vielä käytössä; myös tällöin päivitetään wasErrInConstr:in arvoa.
destruktori: jos tämän olion konstruktorissa allokoitiin globaali virhekäsittelyolio dbrErrItem_p, deallokoidaan se tässä metodissa.
WasErrInConstructor: palauttaa DBR_TRUE:n, jos viimeisessä konstruktorikutsussa tapahtui jokin virhe, muutoin DBR_FALSE:n.
OpenDb: avaa yhteyden Oracle-tietokantaan. Jos parametrilla useUnixLogin on arvo DBR_TRUE, käytetään avauksessa Unix-käyttäjätunnusta, jolloin salasanaa ei tarvita. Jos em. parametrilla on arvo DBR_FALSE, logataan kantaan sisään OMC:n tunnuksilla. Lisäksi ympäristömuuttujan DBR_DB_UID asetuksella voidaan nämä käyttäjätunnukset sivuuttaa: jos ko. muuttuja sisältää jonkin arvon, käytetään sitä tunnus/salasanaparina kantaan logattaessa. useUnixLogin -parametrin oletusarvo on DBR_FALSE.
GetTableSize: palauttaa parametrina annetun taulun maksimikoon riveinä. Kolmas parametri - onlyDbrmuiEnabled - kertoo sen, käsitelläänkö GSM_DB_INFO -taulusta vain ne rivit, joiden DBRMUI_ENABLE sarakkeen arvona on 1 (arvo on tällöin DBR_TRUE), vaiko kaikki rivit (arvo on DBR_FALSE); oletusarvo tälle parametrille on DBR_FALSE.
GetTableUsedRows: palauttaa ensimmäisessä parametrissa annetun taulun käytettyjen rivien lukumäärän toisessa parametrissa. Tietokantayhteys on oltava avattuna OpenDb()-metodilla tätä metodia kutsuttaessa. Viidennen refreshOnly -nimisen parametrin semantiikka on seuraava: jos sillä on arvo DBR_TRUE, taulun käytettyjen rivien lukumäärä haetaan ainoastaan GSM_DB_INFO -taulusta, jonne se on ehkä joskus aikaisemmin laskettu. Kyseisen laskennan ajankohta palautetaan tämän metodin kolmannessa lastUpdTime_p -nimisessä parametrissa (tyyppi char *; ajankohdan formaatti on yyyymmddhhmm). Neljäs parametri lastUpdTimeSize (int) kertoo kutsujan koodissa *lastUpdTime_p -puskurille varattujen tavujen lukumäärän. Mikäli lastUpdTime_p -pointterissa annettiin 0-osoite, ei kutsuja ole silloin aikaleimasta kiinnostunut eikä sitä liioin palauteta (tämä on itse asiassa ko. parametrin oletusarvo jota vastaava lastUpdTimeSize-parametrin oletusarvo on 0!). Jos refreshOnly -parametrin arvo on DBR_FALSE, lasketaan ensiksi käsiteltävän taulun käytettyjen rivien lukumäärä GSM_DB_INFO -tauluun skriptillä spyanamx.sh, joka samalla päivittää GSM_DB_INFO -tauluun myös laskenta-ajankohdan. Tämän jälkeen jatketaan kuten refreshOnly == DBR_TRUE -tapauksessa. refreshOnly -parametrin oletusarvo on DBR_TRUE vasteaikasyistä. Mikäli metodia kutsuttiin refreshOnly -parametrin arvolla DBR_TRUE ja taulun käytettyjen rivien lukumäärää ei ole tähän mennessä laskettu GSM_DB_INFO -tauluun palautetaan -1 käytettyjen rivien lukumääränä ja laskenta-ajankohtana merkkijono "000000000000" tästä metodista. Mikäli tämän metodin suoritus onnistui, palautetaan kutsujalle paluuarvona OK; muutoin palautetaan joku virhekoodi.
GetNextGsmDbInfoRow: tällä metodilla voidaan hakea peräjälkeisillä kutsuilla kaikki rivit GSM_DB_INFO -taulusta. 1. parametri - getFirstRow - määrittelee sen, haetaanko ko. taulusta ensimmäistä riviä (arvo on tällöin DBR_TRUE) vaiko ensimmäisen rivin seuraajia (arvolla DBR_FALSE). Toinen parametri on osoitin integeriin ja nimeltään indicator_p. Sen tulkinta on täsmälleen sama kuin yksityisten metodien GetGsmDbInfoRow ja FetchGsmDbInfoNextRow. Kolmas parametri on nimeltään onlyDbrmuiEnabled, ja jos sen arvo on DBR_TRUE, käsitellään GSM_DB_INFO -taulusta vain ne rivit, joiden DBRMUI_ENABLE sarakkeen arvo on 1, muutoin kaikki rivit; oletusarvo tälle parametrille on DBR_FALSE.
GetTableCntInDbPart: palauttaa valvottavien taulujen lukumäärän parametrina annetussa tietokantaosassa. Jos toisen parametrin - onlyDbrmuiEnabled:in - arvo on yksi, käsitellään GSM_DB_INFO
-taulusta vain ne rivit, joissa DBRMUI_ENABLE -sarakkeella on arvo yksi, muutoin kaikki rivit; oletusarvo tälle parametrille on DBR_FALSE.
TableIsInGSM_DB_INFO: tämä metodi palauttaa DBR_TRUE:n, jos parametrina annetun taulun nimi on mainittu GSM_DB_INFO -taulussa, muutoin DBR_FALSE:n. Jos toisen parametrin - onlyDbrmuiEnabled:in - arvo on DBR_TRUE, käsitellään GSM_DB_INFO -taulusta vain ne rivit, joiden DBRMUI_ENABLE -sarakkeen arvo on 1, muutoin kaikki rivit; oletusarvo tälle parametrille on DBR_FALSE. Kantayhteyden on oltava avattuna tätä metodia kutsuttaessa.
CloseDb: tietokantayhteys Oracle-kantaan suljetaan tässä metodissa.
GetDbConn: palauttaa osoittimen wdbmgr_c -luokan olioon, jota tämä luokka käyttää tietokantaoperaatioiden tekemiseen.
GetTableParameters: palauttaa GSM_DB_INFO -taulusta viimeksi luetun rivin tauluparametrit -osion referenssiparametrissa.
GetAlarmParameters: palauttaa GSM_DB_INFO -taulusta viimeksi luetun rivin parametrina annettuun hälytystasoon liittyvät tiedot referenssiparametrissa.
GetActionParameters: palauttaa GSM_DB_INFO -taulusta viimeksi luetun rivin toimintaosion referenssiparametrissa.
UpdateAlarmStatus: päivittää parametrina annetun taulun parametrina annettuun hälytystasoon liittyvän tilatiedon GSM_DB_INFO -taulun ao. riville.
GetErrItem: palauttaa osoittimen käytettyyn virhekäsittelyolioon. Tämä piirre on jälleen tehty SPYMAN-sovelluksen tarpeisiin, jotta se voi noukkia tarvitsemansa virhekoodit ja virhetekstit käyttöönsä.
RunSpyAnaSilent: käynnistää spyanamx.sh -skriptin ajon taululle, jonka nimi annetaan metodille parametrina. spyanamx.sh -skriptin oikeudet tarkistetaan aluksi metodin dbrGsmDbInfo_c::OkToExecuteByUser() avulla - tarkistuksesta kerrotaan tarkemmin ko. metodin kuvauksen yhteydessä. Ko. skripti laskee taulun käytettyjen rivien lukumäärän GSM_DB_INFO -tauluun ja päivittää samalla ajoajankohtansa saman taulun käsiteltävään tauluun liittyvään TIME_STAMP -kenttään. Jos taulun nimeä ei ole annettu (0-osoite), ajetaan ko. skripti kannan kaikille valvottaville tauluille. Informaatiota ajosta tulostetaan vain komentolokiin ja itse spyanamx.sh -ohjelmaa ajetaan quiet-moodissa. spyanamx.sh -skripti ajetaan system() -systeemikutsun välityksellä. spyanamx.sh -skripti komennetaan käsittelemään vain niitä tauluja, joita vastaavat DBRMUI_ENABLE -sarakkeiden arvot ovat ykkösiä. spyanamx.sh -skriptiltä mahdollisesti palautuva virhekoodi muunnetaan sen omaan virhekoodiavaruuteen, jotta virhedialogiin saadaan oikea virheteksti.
RunSpyAnaNonSilent: käynnistää spyanamx.sh -skriptin ajon taululle, jonka nimi annetaan metodille parametrina. spyanamx.sh -skriptin oikeudet tarkistetaan aluksi metodin dbrGsmDbInfo_c::OkToExecuteByUser() avulla - tarkistuksesta kerrotaan tarkemmin ko. metodin kuvauksen yhteydessä. Ko. skripti laskee taulun käytettyjen rivien lukumäärän GSM_DB_INFO -tauluun ja päivittää samalla ajoajankohtansa saman taulun käsiteltävään tauluun liittyvään TIME_STAMP -kenttään. Jos taulun nimeä ei ole annettu (0-osoite), ajetaan ko. skripti kannan kaikille valvottaville tauluille. Informaatiota ajosta tulostetaan sekä komentolokiin että sovelluksen pääikkunan viestialueelle. spyanamx.sh -skripti ajetaan popen() - pclose() -systeemikutsujen välityksellä globaalin funktion StartSomePrg() avulla. spyanamx.sh -skripti komennetaan käsittelemään vain niitä tauluja, joita vastaavat DBRMUI_ENABLE -sarakkeiden arvot ovat ykkösiä.
OkToExecuteByUser: tarkistaa, että toisena parametrina annetulla käyttäjällä (char *) on oikeus suorittaa ensimmäisenä parametrina annettu ohjelma (char *). Jos käyttäjäparametrina annetaan 0, käytetään ruid:ia. Ohjelmaa etsitään nykyisestä ${PATH}:sta. Ohjelman suojausbittien tulee olla 2500 ja ryhmän sama kuin nykyinen rgid.
3.1.5. PDARCH-kirjaston palvelut liittävä luokka
dbrPdaInterf_c -luokka on nimensä mukaan rajapintaluokka PDARCH-kirjaston palveluihin. PDARCH-kirjasto huolehtii PM-tietokantaosan siivouksesta. Luokan oliomallikuvaus on seuraava:

dbrPdaInterf_c -luokan attribuutit (= yksityiset datajäsenet ja metodit) ovat seuraavat:
archivParamsList: lista verkkoelementtejä ja niihin liittyviä mittaustyyppejä, jotka halutaan antaa siivouskriteereinä kirjastolle. Listan kukin alkio sisältää tarkemmin ottaen seuraavat tiedot: neType, systemId, intId ja measType. Tämä lista rakennetaan ennen kuin se välitetään PDARCH:lle listoista MOIObjectsList ja measTypesList kombinoimalla vastaavat verkkoelementit ja niihin liittyvät mittaustyypit listan alkioiksi. Edellä mainitut kaksi listaa muodostetaan taas ohjelman käyttöliittymässä PM-tietokantaosan siivoukselle asetettujen kriteerien nojalla,
MOIObjectsList: sisältää DBRMUI-sovelluksen käyttöliittymässä MOI-selaajalla valitut verkkoelementit. Nämä valitaan PM-tietokantaosan siivousnäytöllä. Yhden elementin tiedot ovat seuraavat: neType, systemId ja intId,
measTypesList: lista DBRMUI:n käyttöliittymän PM-tietokantaosan siivousnäytöllä valittuja mittaustyyppejä. Listan yksi alkio sisältää seuraavat tiedot: neType ja measType,
startDateInNum: DBRMUI:n käyttöliittymän PM-tietokantaosan siivousnäytön alkuaikakriteerin asetus talletetaan tähän muuttujaan numeerisessa muodossa,
stopDateInNum: DBRMUI:n käyttöliittymän PM-tietokantaosan siivousnäytön loppuaikakriteerin asetus talletetaan tähän muuttujaan numeerisessa muodossa,
timeInterval: tähän kerätään käyttöliittymässä annetut alku-/loppuaikakriteerit ASCII-muodossa annettavaksi parametrina PDARCH:lle siivouksen suorittamiseksi,
dataType: tähän muuttujaan talletetaan käyttöliittymässä annettu kriteeri mittaustyypin tyypille annettavaksi PDARCH:lle siivouksen suorittamiseksi. Mahdollisia arvoja ovat: raw data, daily summary, weekly summary ja monthly summary,
dbVersionNbr: tähän talletetaan tietokantaversionumero annettavaksi PDARCH:lle. Nykyään arvolla ei ole merkitystä ja ohjelmassa se on 1,
operation: tähän muuttujaan talletetaan käyttöliittymässä annettu siivousoperaation tyyppi annettavaksi parametrina PDARCH-kirjastolle. Mahdollisia arvoja ovat: copy, copy & clean ja clean,
doIfEmpty: tässä muuttujassa ylläpidetään tieto siitä, tehdäänkö siivousarkistotiedosto myöskin siinä tapauksessa, että kannan tauluista ei löydy yhtään riviä sinne laitettavaksi eli tiedoston sisältö on efektiivisesti tyhjä. Tämä tieto menee myöskin PDARCH:lle parametrina ja nykyään DBRMUI-sovellus laittaa doIfEmpty:n aina päälle,
storePlace: tässä merkkijonomuuttujassa on PM-tietokantaosan siivousarkistotiedostojen hakemistopolku. Muuttuja välitetään suoraan PDARCH-kirjastolle parametrina ja DBRMUI-sovellus kaivaa sen yleensä konfigurointitiedostoistaan (jos näissä ei ole sitä mainittu, käytetään sitten oletushakemistoa, joka on nykyisellään /tmp),
ConstructFinalCleanUpList: rakentaa PDARCH:lle parametrina annettavan listan verkkoelementeistä ja niitä vastaavista mittaustyypeistä, jotka on käyttöliittymässä annettu siivouskriteereinä. PDARCH:in ko. parametrilistassa olevien alkioiden tietosisältö on seuraava: neType, systemId, intId ja measType,
pdaPMArchiv_p: osoitin PM-tietokantaosan siivouksesta huolehtivaan objektiin. Tämän objektin toteutus on PDARCH-kirjaston sisäinen asia,
wasErrInConstr: indikaattorimuuttuja, joka kertoo sen, onnistuiko tämän luokan konstruktorin ajo (= DBR_FALSE) vai eikö (= DBR_TRUE),
StubStoreArchFile: stub-toteutus varsinaisesta siivouksesta huolehtivasta *pdaPMArchiv_p -objektin vastaavasta metodista. Tämän yksityisen metodin kutsurajapinta on ihan sama kuin oikean siivousmetodinkin, mutta toteutuksessa ainoastaan tulostetaan kaikki saadut parametrit stdout:iin. Tätä käytetään pääasiassa testauksessa kun ollaan kiinnostuneita tarkistamaan parametrien oikea välitys suorittamatta varsinaista siivousta.
Luokan julkiset metodit ovat puolestaan seuraavat:
konstruktori: olion yksityisen datajäsenen timeInterval kentät startDate ja stopDate alustetaan NULL:eiksi.
destruktori: kutsuu olion yksityistä metodia DelPDAParams(), jonka avulla siivousta varten dynaamisesta muistista varatut erilaiset listat ja tietorakenteet vapautetaan. Tarkemmin ym. metodin toiminnasta on kerrottu jatkossa tämän luokan oliomallin kuvauksen yhteydessä.
wasErrInConstructor: tämän metodin avulla voidaan tarkistaa, epäonnistuiko edellinen konstruktorin ajo vai ei. Jos ajo epäonnistui, metodi palauttaa DBR_TRUE:n, muutoin DBR_FALSE:n,
AddMOIObject: lisää parametreina saadut verkkoelementin tiedot (= neType, systemId ja intId) listaan MOIObjectsList. Käyttö: kun käyttäjä valitsee käyttöliittymässä uuden verkkoelementin MOI-selaajassa lisättäväksi siivouskriteereihin, talletetaan tämän metodin avulla ko. verkkoelementti käytettäväksi varsinaisissa siivouskriteereissä PDARCH-kirjastolle (vaatii ensin metodin ConstructFinalCleanUpList kutsun, jotta MOIObjectList:sta kaikki alkiot viedään aikaisemmin kuvatun evaluoinnin jälkeen archivParamsList:iin - ks. metodin ConstructFinalCleanUpList selostusta),
AddMeasType: lisää parametrina annetun mittaustyypin (parametreina itse asiassa neType ja measType) listaan measTypesList. Tästä listasta sitten rakennetaan listan MOIObjectsList avulla lista archivParamsList, joka varsinaisesti annetaan PDARCH:lle parametrina - tämä on kuvattu tarkemmin edeltävissä metodien/attribuuttien kuvauksissa. Käyttö sovelluksessa: kun käyttäjä valitsee PM -tietokantaosan siivousnäytöllä kriteeriksi jonkun mittaustyypin, talletetaan se tämän metodin avulla käytettäväksi siivouksessa myöhemmin,
DelPDAParams: vapauttaa siivousta varten rakennettujen listojen (archivParamsList, MOIObjectsList, measTypesList) varaaman dynaamisen muistin sekä rakenteen timeInterval varaaman dynaamisen muistin. Tätä metodia on syytä kutsua siivouksen jälkeen, jotta seuraavan siivouksen yhteydessä ei turhaa dynaamista muistia jäisi alta vapauttamatta ja listat olisivat sitä varten kunnossa,
SetStartDate: siivouskriteerien alkuajankohta asetetaan numeerisessa muodossa rakenteeseen startDateInNum. Parametrit ovat: year, month, day, hour ja min, ja jos jonkun parametrin arvo on -1, niin tällöin rakenteen ao. kenttään ei kosketa,
SetStopDate: siivouskriteerien loppuajankohta asetetaan numeerisessa muodossa rakenteeseen stopDateInNum. Parametrit ovat: year, month, day, hour ja min, ja jos jonkun parametrin arvo on -1, niin tällöin rakenteen ao. kenttään ei kosketa,
FormatStartDate: aiemmin metodin SetStartDate avulla annettu numeerinen siivouskriteerien alkuajankohta formatoidaan ASCII -muotoon annettavaksi parametrina PDARCH-siivoukselle. Formatointiin vaikuttaa käyttöliittymässä voimassaoleva siivouskriteerien mittauksien tyyppi (= raw data, daily summaries, weekly summaries, monthly summaries) se. vastaavat formaatit ovat: yyyymmddhhmm, yyyymmdd, yyyy
FormatStopDate: aiemmin metodin SetStopDate avulla annettu numeerinen siivouskriteerien loppuajankohta formatoidaan ASCII -muotoon annettavaksi parametrina PDARCH-siivoukselle. Formatointiin vaikuttaa käyttöliittymässä voimassaoleva siivouskriteerien mittauksien tyyppi (= raw data, daily summaries, weekly summaries, monthly summaries) se. vastaavat formaatit ovat: yyyymmddhhmm, yyyymmdd, yyyy
SetDataType: käyttöliittymässä annettu siivouskriteerien mittausten tyyppi otetaan talteen tällä metodilla annettavaksi PDARCH-siivoukselle,
SetDbVersionNbr: PDARCH-siivousmetodi vaatii parametriksi myöskin tietokannan versionumeron, joka voidaan syöttää tällä metodilla. Käytännössä tällä tiedolla ei nyt (8.12.93) tehdä mitään, joten sovellus syöttää siihen vakio 1:n,
SetOperation: DBRMUI:n käyttöliittymän PM -siivouslomakkeen operaatiotyyppi (= copy, copy & clean, clean) syötetään tällä metodilla käytettäväksi PDARCH-siivouksessa,
GetOperation: palauttaa viimeksi SetOperation -metodilla asetetun operaation,
SetDoIfEmpty: PDARCH-siivousmetodi vaatii doIfEmpty-tiedon parametrina, joka syötetään tällä metodilla käytettäväksi siivouksessa. Asia on selostettu tarkemmin yksityisen muuttujan doIfEmpty kuvauksen yhteydessä,
SetStorePlace: siivousarkistotiedoston varastointipaikka (= hakemistopolku) syötetään tällä metodilla käytettäväksi PDARCH-siivouksessa. Asia on selostettu tarkemmin yksityisen muuttujan storePlace kuvauksen yhteydessä,
StartCleanup: tällä metodilla käynnistetään varsinainen PDARCH-siivous käyttäen luokan objektille Set-metodeilla annettuja siivousparametreja. Kääntäjän USE_PDARCH direktiivillä on mahdollista määritellä, tehdäänkö todellinen tietokantasiivous vai kutsutaanko vain StubStoreArchFile -metodia, joka tulostaa siivouskriteeriparametrit stdout:iin eikä tee muuta - tällöin oikeata siivousta ei siis tehdä.
PDARCH -kirjaston StoreArchFile() -metodin kutsun ajaksi poistetaan erityisesti SIGCHLD -signaalin käsittelijä, jotta ko. metodin sisällään tekemät system()-kutsut eivät palauttaisi virhestatusta aiheuttaen samalla errno -systeemimuuttujan arvon asetuksen.
Koska käyttäjä voi keskeyttää varsinaisen siivouksen, on tämä metodi varautunut siihen se. käyttäjälle näytetään asiasta varoitusikkuna ja sama varoitus menee sovelluksen virhelokiin. Metodilla on kolme parametria: 1. parametri kertoo siivouksen aikaisen Working-ikkunan isäikkunan widget:in ja se on käytössä vain, jos moduli käännetään USE_PDARCH -direktiivillä, 2. parametri on integer-tyyppinen referenssiparametri errInPDARCH, joka kertoo sen, tapahtuiko PDARCH -siivouspalvelun sisällä joku virhe (tällöin arvo on DBR_TRUE, muutoin DBR_FALSE) ja 3. parametri on myöskin integer-tyyppinen referenssiparametri wasCancelled, joka kertoo sen, keskeytettiinkö PDARCH-siivousoperaatio painamalla sen Working-ikkunan Cancel-nappia (arvo on tällöin DBR_TRUE) vai ei (arvona DBR_FALSE). Jos siivous mentiin keskeyttämään, tilanne ei ole tämän metodin kannalta virhe.
Jos sovellus käännetään ilman että käytetään direktiiviä USE_PDARCH (eli tehdään ns. stub-siivous), ei siihen myöskään tarvitse välttämättä linkata PDARCH-kirjastoa.
3.1.6. Työkaluluokka PM-tietokantaspesifisten asioiden käsittelyyn
dbrPMTools_c -luokka sisältää työkaluja PM tietokantaspesifisten asioiden käsittelyyn tietokannassa. Luokan oliomallikuvaus on seuraava:

Luokan attribuuttien merkitykset ovat seuraavat:
*myGsmDbInfo_p: osoitin dbrGsmDbInfo_c -luokan tyyppiseen olioon. Yksi tälläinen olio allokoidaan tämän luokan konstruktorissa yksityistä tietokantayhteyttä varten,
*measTables_p: osoitin listaan, jonka kukin alkio sisältää seuraavat tiedot: mittaustyypin nimi, ko. mittaustyyppiin kannassa kuuluvien valvottavien taulujen täysinäisimmän taulun käytettyjen rivien lukumäärä, em. tauluista täysinäisimmän täyttöaste prosentteina, em. taulujen recount:ien vanhin aikaleima ja osoitin kaikkien ko. mittaustyyppiin kuuluvien valvottavien taulujen täyttöasteobjekteihin (luokan dbrTableFull_c instansseja). Tämän listan tarkoitus on sisältää mittaustyyppikohtaisesti siihen kuuluvien valvottavien taulujen täysinäisimmän taulun käytettyjen rivien lukumäärää, ko. tauluista täysinäisimmän täyttöaste prosentteina ja mittaustyyppiin kohdistuneen recount:in aikaleima näytettäväksi DBRMUI-sovelluksen graafisessa käyttöliittymässä käyttäjälle,
*nextMeasTablesInfos_p: apumuuttuja, joka osoittaa saman listan alkioita, jonka alkupäätä osoittaa *measTables_p. Tämän muuttujan avulla ylläpidetään tieto siitä, mikä alkio pitää seuraavan kerran palauttaa kutsujalle metodeista GetFirstMeasTypeTablesData/GetNextMeasTypeTablesData,
*measTypeInfos_p: osoitin OMC:n kaikki mittaustyypit sisältävään listaan. Lista konstruoidaan taulun P_PM_TABLES sisällön perusteella ja listan kukin alkio sisältää seuraavat kentät: neType, measType, measTypeName ja dataType,
*nextMeasTypeInfos_p: osoittaa jotain alkiota *measTypeInfos_p:n osoittamassa listassa. Tätä käytetään apuna metodien GetFirstMeasTypeNameInDataType/GetNextMeasTypeNameInDataType toteutuksessa. Osoitin on tarpeen, jotta ko. metodit osaavat palauttaa vuoronperään jokaisen alkion em. listasta,
wasErrInConstr: indikaattorimuuttuja, jossa pidetään yllä tieto siitä, tapahtuiko edeltävässä konstruktorin ajossa virhe vai ei,
FindMeasTypeNode: yksityinen metodi, joka palauttaa listan measTables_p sen alkion, jossa mittaustyypin nimi on sama kuin parametrina annettu. Jos tällaista alkiota ei löydy, palautetaan NULL.
Luokan julkiset metodit ovat seuraavat:
konstruktori: seuraavat asiat tehdään tässä konstruktorissa:
1. Olion yksityiset datajäsenet measTables_p, nextMeasTables_p, measTypeInfos_p, nextMeasTypeInfos_p ja wasErrInConstr alustetaan sopiviin alkuarvoihin.
2. Olion yksityinen tietokantayhteysolio - *myGsmDbInfo_p - luodaan ja yhteys tietokantaan avataan sen OpenDb() -metodin avulla.
3. Seuraavaksi käydään lävitse mittaustietokantaosan kaikki tämän sovelluksen valvomat taulut, joille on laskettu käytettyjen rivien lukumäärä ainakin kerran ja niiden pohjalta rakennetaan valvottavien mittaustyyppien lista. Tämä tehdään sillä ehdolla, että mittauskantaosaa kuvaava täyttöasteobjekti on aiemmin allokoitu ohjelmassa. Tarkemmin ottaen jokaista valvottavaa PM-taulua kohden tehdään seuraavaa:
jos taulun täyttöastetta ei seurata tai taululle ei ole laskettu käytettyjen rivien lukumäärää kertaakaan, ohitetaan seuraavat askeleet,
jos taulu ei kuulu mihinkään mittaustyyppiin, ohitetaan seuraavat askeleet,
jos parhaillaan käsiteltävien taulujen mittaustyyppejä sisältävästä listasta *measTables_p ei löydy juuri nyt käsiteltävän taulun mittaustyyppiä, tätä tyyppiä vastaava alkio luodaan listaan. Alkion mittaustyypin nimeksi kopioidaan parhaillaan käsiteltävän taulun mittaustyypin nimi. Joka tapauksessa tämän vaiheen lopussa on tiedossa listasta *measTables_p se alkio, joka sisältää parhaillaan käsiteltävän taulun mittaustyypin nimen.
löydetyn mittaustyyppialkion sisältämän taululistan *tableFulls_p perään lisätään parhaillaan käsiteltävän taulun täyttöastetiedot.
4. Kun edellisessä vaiheessa rakennettiin valmiiksi lista *measTables_p, kutsutaan nyt luokan julkista metodia UpdMeasTypeUsedRows(), joka nimensä mukaisesti laskee valvottavien mittaustyyppien täyttöasteet niihin kuuluvien taulujen täyttöasteiden perusteella. Metodia kutsutaan siten, että minkään mittaustyyppiin kuuluvan valvottavan taulun käytettyjen rivien lukumäärää ei lähdetä selvittelemään tietokantasisällön pohjalta. Tämä perustuu siihen, että DBRMUI -sovelluksessa ko. lukumäärät lasketaan kerran ainoastaan GSM_DB_INFO -taulun sisällön perusteella kun globaali olio *dbrDbFull_p (luokkana dbrDbFull_c) luodaan. Näin vältetään turhat samojen asioiden uudelleenlaskennat ja samalla sovelluksen käynnistysaika saadaan pienemmäksi.
5. Lopuksi rakennetaan lista *measTypeInfos_p, joka sisältää kaikki taulussa P_PM_TABLES mainitut mittaustyypit. Listassa kukin mittaustyyppi on vain yhteen kertaan ja lista-alkioon otetaan mukaan seuraavat tiedot: mittaustyyppiin liittyvä verkkoelementin tyyppi, mittaustyypin numero, mittaustyypin virallinen nimi sekä mittaustyypin datatyyppi (= raw data/daily summary/weekly summary/monthly summary). Listaan mittaustyypit lisätään seuraavien järjestyskriteerien mukaisesti (kriteerien keskinäinen järjestys on merkitsevä): nouseva verkkoelementtinumerojärjestys, nouseva mittaustyyppinumerojärjestys sekä mittaustyypin virallisen nimen pituuden mukainen nouseva järjestys. Jos esimerkiksi kahteen mittaustyyppiin liittyvä verkkoelementtinumero on sama, sovelletaan silloin seuraavaa järjestyskriteeriä em. kriteerilistasta. Viimeisen kriteerijärjestyksen nojalla saadaan mm. seuraavat mittaustyypit seuraavaan järjestykseen:
"BSC Traffic Measurement",
"BSC Traffic Measurement, Daily Summary",
"BSC Traffic Measurement, Weekly Summary",
"BSC Traffic Measurement, Monthly Summary".
eli sopivasti juuri siihen mittaustyyppijärjestykseen kuin NMS- sovellusten käyttöliittymissä on sovittu noudatettavan.
Jos konstruktorin suorituksessa tulee virhe, asetetaan siihen liittyvä virhekoodi globaaliin virheolioon *dbrErrItem_p, indikaattorimuuttuja wasErrInConstr saa arvon DBR_TRUE ja konstruktorista palataan välittömästi kutsuvaan koodiin. Mikäli konstruktorin ajo onnistuu, asetetaan wasErrInConstr -indikaattorimuuttujaan arvo DBR_FALSE.
destruktori: seuraavat konstruktorissa dynaamisesta muistista varatut tietorakenteet deallokoidaan:
1. lista *measTables_p kaikkine alkioineen. Myöskin jokaiseen alkioon liittyvä lista *tableFulls_p deallokoidaan.
2. lista *measTypeInfos_p.
3. yksityinen tietokantayhteysolio *myGsmDbInfo_p. Ennen deallokoimista tämän olion yhteys tietokantaan suljetaan CloseDb() -metodin kutsulla.
WasErrInConstructor: palauttaa DBR_TRUE:n, jos edeltävässä konstruktorin ajossa tapahtui virhe, muutoin DBR_FALSE:n.
GetPMTablesMeasType: palauttaa parametrina annettuun PM tietokantaosaan kuuluvaan tauluun liittyvän mittaustyypin. Jos ko. taulu ei kuulu mihinkään mittaustyyppiin, palautetaan mittaustyypin nimenä tyhjä merkkijono.
UpdMeasTypeUsedRows: measTables_p -listan jokaiseen mittaustyyppiin kuuluvien valvottavien taulujen käytettyjen rivien lukumäärät lasketaan tietokannan sisällön perusteella ja näistä täysinäisimmän taulun käytettyjen rivien lukumäärä sekä ko. taulun täyttöaste prosentteina päivitetään ao. listan kulloinkin käsiteltävään mittaustyyppialkioon vuoronperään. Metodilla on kaksi parametria: updTablesUsedRows ja refreshOnly. Jos updTablesUsedRows -parametrilla on arvo DBR_TRUE, toimitaan kuten edellä on kuvattu eli jokaisen mittaustyypin valvottavien taulujen käytettyjen rivien lukumäärät selvitetään tietokannasta. Jos taas parametrilla on arvo DBR_FALSE, ei taulujen täyttöastetietoja lähdetä uudelleen laskemaan vaan käytetään näiden tietojen vanhoja arvoja, jotka on esim. DBRMUI -sovelluksessa laskettu kun globaali *dbrDbFull_p -olio luotiin (tämän luokkana on dbrDbFull_c). Toinen parametri määrittelee sen, kuinka taulujen käytettyjen rivien lukumäärät selvitetään tietokannasta, jos ensimmäisen parametrin arvon perusteella taulujen käytettyjen rivien lukumääriä kerran lähdetään selvittelemään (1. parametrin arvo on tällöin DBR_TRUE). Jos refreshOnly -parametrin arvo on DBR_TRUE, taulujen käytettyjen rivien lukumäärät ainoastaan kopioidaan GSM_DB_INFO -taulun ao. kentistä; jos arvona on DBR_FALSE, lasketaan taulujen käytettyjen rivien lukumäärät näihin kenttiin ensiksi spyanamx.sh -skriptillä. Mittaustyypin täyttöastetietojen aikaleima käsitellään samoin kuin luokan dbrDbPartFull_c -tapauksessa.
GetFirstMeasTypeTablesData/GetNextMeasTypeTablesData: näiden metodien avulla käydään läpi lista measTables_p alusta loppuun ja parametreissa palautetaan kulloinkin käsiteltävään alkioon liittyvät tiedot - nämä on kuvattu tarkemmin edellä yksityisen datajäsenen measTables_p kuvauksen yhteydessä. Jos listasta vielä löytyi vuorossa oleva alkio, palauttaa kutsu DBR_TRUE:n, muutoin DBR_FALSE:n.
GetFirstMeasTypeNameInDataType/ GetNextMeasTypeNameInDataType: näillä metodeilla voidaan hakea listasta measTypeInfos_p kaikki parametrina annettuun mittaustyypin tyyppiin (= raw, day, week, month) kuuluvat mittaustyypit ja niihin liittyvät verkkoelementin tyypit. Kun lista on läpikäyty, palautetaan ko. metodeista paluuarvo DBR_FALSE, muutoin DBR_TRUE.
measTypeName2MeasType: muunnosmetodi, jolla saadaan mittaustyypin nimen perusteella palautettua sen numero. Vastaava verkkoelementin tyyppi palautetaan myös. Jos mittaustyypin nimeä ei vastaa mikään koodi, palautetaan paluuarvona -1 ja verkkoelementin tyypin arvona on myös -1.
GetGsmDbInfo_p: palauttaa osoittimen luokan yksinään käyttämään dbrGsmDbInfo_c luokan mukaiseen instanssiin. Tätä tarvitaan mm. siihen, jos ulkoa päin halutaan sulkea tämän luokan yksityisesti käyttämän dbrGsmDbInfo_c tyyppisen objektin tietokantayhteys.
FetchMeasTypesTablesFullInfoByMeasType: hakee parametrina annetun mittaustyypin viimeksi lasketut täyttöastetiedot. Näitä ovat: niiden mittaustyypin valvottavien taulujen, joille on laskettu käytettyjen rivien lukumäärä, näistä lukumääristä se, joka kuuluu ko. mittaustyypin täysinäisimmälle taululle, mittaustyypin täysinäisimmän valvottavan taulun, jolle on laskettu käytettyjen rivien lukumäärä, täyttöaste prosentteina sekä täyttöasteen laskenta-ajankohta; viimeisen parametrin semantiikka on sama kuin esim. luokan dbrDbPartFull_c aikaleimajäsenen. Metodi palauttaa arvon DBR_FALSE, jos ko. mittaustyyppiä ei löydetä; muutoin arvon DBR_TRUE. Täyttöastetiedot lasketaan tässä yhteydessä mittaustyypille uudelleen tauluolioiden täyttöasteiden perusteella.
3.1.7. Virhekäsittelyluokka
Luokan dbrError_c metodeilla hoidetaan DBRMUI -sovelluksen virhetilanteiden käsittely ja varoitusten antaminen. Se on rakennettu errItem_c -luokan tarjoamien virhekäsittelypalveluiden päälle, jotta virhekäsittelykutsuista saataisiin mahdollisimman kompaktit sovelluskoodissa. Luokan oliomallikuvaus on seuraava:

Luokan dbrError_c attribuutit ovat seuraavat:
dbrErrWinOKCallback: callback-olio virheikkunan OK-napin callback-metodeita varten. Olio sisältää kaksi callback-metodia: toisen kutsu aiheuttaa hallitun poistumisen ohjelmasta ja toisen ei aiheuta mitään toimintaa. Edellistä käytetään virhetilanteessa ja jälkimmäistä, kun on tarve antaa ohjelmassa käyttäjälle varoitus jostain asiasta,
*widgetPointerStack: X/Motif -widgeteistä muodostuva pino, jota käytetään isäwidgetien hallintaan virheikkunalle. Nykyisellään tästä pinosta käytetään täsmälleen yhtä alkiota, joka sisältää sovelluksen pääikkunan shell-widgetin.
Kaikki attribuutit ovat luokka-attribuutteja.
Vastaavasti luokan operaatiot ovat seuraavat:
PushParentWidget: em. widget-pinoon sijoitetaan uusi alkio pinon päällimmäiseksi,
PopParentWidget: widget-pinon päältä poistetaan yksi alkio,
HandleWarningError: tätä metodia kutsutaan, kun ohjelman suorituksessa on havaittu tilanne, jonka perusteella pitäisi antaa joko virheilmoitus tai varoitus. Metodilla on 6 kiinteää parametria:
1. code on virhetilanteen koodi. Koodit on lueteltu tiedostossa wer01040.h,
2. *file_p sisältää sen virheen esiintymispaikan lähdekooditiedoston,
3. line sisältää virheen esiintymispaikan rivinumeron *file_p tiedostossa,
4. myMethod sisältää virheen esiintymispaikan metodin/funktion,
5. argCntAfterFormatStr kertoo seuraavan parametrin jälkeen olevien parametrien lukumäärän,
6. *formatStringOrOnlyArgument_p sisältää formatointimerkkijonon C-kielen printf() -funktion tapaan. Kuitenkin ainoa sallittu formatointimerkki nykyisellään on %s, joka tarkoittaa siis merkkijonoa. Tämän parametrin ja seuraavien mahdollisten parametrien avulla voidaan välittää virheeseen liittyviä yksityiskohtaisempia tietoja.
Mikäli HandleWarningError -metodia kutsutaan ensimmäisen kerran virheen esiinnyttyä on toiminta seuraava: errItem_c luokan mukaiseen objektiin *dbrErrItem_p asetetaan virhekoodiksi code ja Details-tekstiksi 6. parametrin mukaan formatoitu merkkijono, jossa siis käytetään 6. parametria ja sen jälkeen mahdollisesti seuraavia parametreja. Jos globaali errno-systeemimuuttuja on kutsuhetkellä nollasta poikkeava, siihen liittyvä selitysteksti tai sen arvo katenoidaan myöskin Details-tekstiin. *dbrErrItem_p olion Location tiedoksi asetetaan parametreina annetut tiedosto, rivinumero, luokka/metodi sekä siihen katenoidaan myöskin ajettavan ohjelman nimi. Käyttöjärjestelmän kellonaika asetetaan em. olion kellonaikaleimaksi. Jos tätä metodia kutsuttiin sellaisella virhekoodin arvolla, joka kuuluu varoitusten arvoalueeseen, ei tämän metodin kutsukertojen lukumäärää seurata toistaiseksi, joka aiheuttaisi kyseisen metodin toiminnan muutosta toisella kutsukerralla (tällöin lähdettäisiin rekisteröimään kutsupinoa).
Virhetilanteessa toisella kutsukerralla aiheutuu seuraavaa toimintaa: kutsupinon yhden alkion tiedot rekisteröidään Details-tekstiin katenoimalla sen perään seuraavat tiedot: tiedosto, rivinumero ja luokka/metodi.
Joka tapauksessa HandleWarningError palauttaa paluuarvonaan sille parametrina annetun virhekoodin.
WriteErrorInfosAndMaybeExit: kirjoittaa aiemmin HandleWarningError -metodin avulla rekisteröidyt virheeseen/varoitukseen liittyvät tiedot virhelokiin ja jos tälle luokalle on ehditty asettaa joku isäwidget virheikkunan luomiseksi, kirjoitetaan vastaavat tiedot myös luotavaan virheikkunaan lukuunottamatta aikaleimaa, prosessin numeroa sekä Location-tietoja (errItem_c -luokan olioille tämä on oletuskäyttäytyminen). Mikäli ko. isäwidget:iä ei ole ehditty asettaa, luodaan metodissa väliaikainen isäwidget, jotta edelleen voidaan luoda virheikkuna ja näyttää tiedot siinä. Tämä tehdään kylläkin vain, jos metodin parametrin infoToStderr arvo on nolla, muutoin samat asiat kirjoitetaan stderr:iin. Käytännössä näin tehdään ainoastaan silloin, kun sovellus ei ole ehtinyt avata X/Motif:in näyttöä virheen jo tapahtuessa eli sovelluksen toiminnan hyvin alussa. Mikäli tälle metodille oli parametrina annetun exitFlag:in arvona DBR_TRUE, tehdään hallittu poistuminen sovelluksesta, muutoin asetettu *dbrErrItem_p olion virhekoodi nollataan ja poistutaan metodista - jälkimmäinen toiminta tapahtuu varoitustilanteessa.
Näitä dbrError_c -luokan metodeita ei kutsuta suoraan sovelluskoodista, vaan väliin on tehty makroja käyttäen siisti kutsurajapinta, joka mahdollistaa sen, että virheen esiinnyttyä tarvitsee kutsua vain yhtä makroa sopivin argumentein ja virhe on rekisteröitynyt edellä kuvatun luokan mukaiselle virheoliolle. Edellä kuvatut metodit ovat kaikki static-tyyppisiä, joten kuvattua virheoliota ei tarvitse ohjelmassa lainkaan allokoida, vaan metodit ovat heti sovelluksen käytettävissä. Voidaan ajatella, että DBRMUI-ohjelmalla on koko elinaikansa käytössään yksi globaali dbrError_c -luokan mukainen virheolio.
Virheluokan makrokutsut on sijoitettu tiedostoon dbrcommon__mx.h. Siellä on esimerkiksi muotoa DBR_ERROR
Samassa header-tiedostossa on muotoa DBR_WARNING
Header-tiedostossa on myöskin muotoa DBR_ERROR_EXIT
Monimutkaisen oloisen virhekäsittelyn eräs keskeinen idea on ollut se, että virhetapauksessa heti sen havainnon jälkeen kutsutaan DBR_ERROR
DBR_WARNING
3.2. MVC-mallin view-osaan liittyvät keskeisimmät oliomallit
DBRMUI-sovelluksen käyttöliittymä on maalattu XDesigner-käyttöliittymämaalaustyökalulla. Tämän jälkeen työkalun avulla on generoitu kunkin dialogin ns. create-funktio, jossa luodaan asianomaiset widgetit ja joitakin niihin liittyviä attribuutteja asetetaan (kaikki create-funktiot ovat tiedostossa dbrguimx.c - ks. dbrmuimx.mak -tiedostosta sen käsittelyä käännöksen yhteydessä). Loput attribuuttiasetukset viedään työkalusta generoituun X:n resurssitiedostoon (tmp.rf), joka sisällytetään sovelluksen dbrmuimx.srf -resurssitiedostoon editoimalla sitä. Viimeksi mainittu tiedosto täytyy vielä katenoida eri kirjastojen resurssitiedostoihin sovelluksen lopullisen resurssitiedoston rakentamiseksi (nimeltään dbrmuimx.rf - ks. resurssitiedoston rakentamista make-tiedostosta).
Käyttöliittymän layout-piirteitä pidetään yllä edelleen XDesigner:in käyttöliittymäkuvaustiedostoissa (dbrguimx.xd ja dbrmearow__mx.xd). Edellisestä kuvaustiedostosta on aina muutosten jälkeen syytä generoida sekä create-funktiot että se osuus lopullisesta resurssitiedostosta, joka tulee XDesigner-kuvauksesta. Jälkimmäisestä kuvaustiedostosta generoidaan ainoastaan C-koodi - tästä kerrotaan tarkemmin kappaleessa 3.7. XDesigner:in versiosta 3 lähtien on syytä generoida aina C-koodia.
Callback-modulia (dbrguiCB___mx.cc) sen sijaan pidetään yllä itse käsin sen jälkeen kun se on ensimmäisen kerran generoitu. Samoin pidetään yllä käsin create-funktioiden prototyypit esittelevää tiedostoa dbrguimx.h - ko. tiedosto muuttuu hyvin harvoin ja XDesigner:in generoimana siellä ei ole meille tarpeellisia headereita inkludattuna.
3.2.1. DBRMUI-sovelluksen dialogiluokat
DBRMUI-sovelluksen graafista käyttöliittymää varten on tehty periaatteessa aina yksi luokka per yksi dialogi-ikkuna. Kyseiseen dialogiin liittyvä erityiskäsittely on kätketty ko. luokan metodeihin. Seuraavassa esitellään luettelonomaisesti kunkin luokan oliomallikuvaus, lyhyt kuvaus luokan metodeista sekä yleisesti luokan tarkoitus.
3.2.1.1. Luokka dbrGuiTools_c
Luokka dbrGuiTools_c toimii sovelluksen model-osan olioiden luojana ja deallokoijana. Luokan oliomallikuvaus on seuraava:

Luokan luokkametodit ovat seuraavat:
PreGuiActions: sovelluksen model-osan oliot luodaan tässä metodissa. Esim. seuraavat objektit luodaan tässä metodissa: komentolokiolio, konfigurointiolio, GSM_DB_INFO -taulua käsittelevä olio, maskiolio, kaikki täyttöasteoliot ja PM -tietokantaosan käsittelyn hoitava olio. GSM_DB_INFO -taulua käsittelevän olion avulla luodaan myöskin yksi yhteys tietokantaan.
AfterGuiActions: kaikki metodissa PreGuiActions() luodut oliot deallokoidaan tässä metodissa. Samoin em. metodissa luotu yksi tietokantayhteys katkaistaan.
3.2.1.2. Luokka dbrPMCleanUp_c
Luokka dbrPMCleanUp_c kätkee sisälleen dialogiin "Measurement Database Cleanup" liittyvän käsittelyn. Dialogissa asetetaan erilaisia PM tietokantaosan siivoukseen liittyviä kriteereitä ja lopuksi siivous käynnistetään.
Luokan oliomallikuvaus on seuraava:

Luokan yksityiset jäsenet ovat seuraavat:
wasErrInConstr: indikaattorimuuttuja (samalla myöskin luokkamuuttuja) konstruktorissa tapahtuvaa mahdollista virhettä varten,
AddObjClass: luokkametodi, jolla ylläpidetään dialogin Managed Objects -osassa näkyvien objektien luokkia. Tällä metodilla uusi objektiluokka lisätään näkyvissä olevien objektien sisältämien luokkien muodostamaan listaan. Jos lisättävä luokka on jo kyseisessä listassa, ko. luokan referenssilaskuria kasvatetaan yhdellä listassa.
NeTypeInMOISelection: luokkametodi, jonka avulla voidaan selvittää onko parametrina annetun objektiluokan edustajia dialogin Managed Objects -osassa. Palauttaa DBR_TRUE:n, jos on, muutoin DBR_FALSE:n.
DeleteObjClassList: luokkametodi, jolla tyhjätään dialogin Managed Objects -osassa olevien objektien sisältämien luokkien käsittämä lista.
MOISelList_p: luokkalista, joka sisältää MOI-dialogissa viimeksi valitut objektit.
AddUniqObj: luokkametodi, joka lisää parametreina annetun objektin ja sen scrolled list -esityksen näistä koostuvaan listaan SelMOIItemsInPMCleanUpList_p. Kyseisessä listassa on kullakin hetkellä kaikkien dialogiosan Managed Objects sisältämien objektien tiedot.
ObjAlreadyInWin: luokkametodi, joka selvittää sen, jos sille parametrina annettu objektin scrolled list -esitys on jo listassa SelMOIItemsInPMCleanUpList_p vai ei. Jos objekti löytyy ko. listasta, metodi palauttaa DBR_TRUE:n, muutoin DBR_FALSE:n. Tämän metodin avulla voidaan siis selvittää, josko Managed Objects -dialogiosassa on jo jonkun objektin tiedot, jolloin niitä ei tarvitse ko. osaan viedä toistamiseen.
Luokan julkiset jäsenet ovat seuraavat:
konstruktori: luokan datajäsenet sekä käyttöliittymäoliot alustetaan. Erityisesti tehdään seuraavat asiat:
1. Tarvittavat widgetit luodaan dialogia varten,
2. From- ja To-aikakentät alustetaan käyttöjärjestelmän nykyisellä kellonajalla,
3. Yleiskäyttöisen luokan moiHandlerWi_c mukainen olio luodaan. Ko. olio parametroidaan näyttämään vain luokkiin BSC/HLR/MSC kuuluvia objekteja ja dbrPMCleanUp_c::MoiSelectCB() -metodi asetetaan callback-funktioksi MOI-dialogista palattaessa. Kyseisessä metodissa voidaan sitten selvittää tehdyt valinnat.
4. Kaksi luokan polScrolledList_c mukaista oliota - dbrPMCleanUp_c::polScrolledList_p ja dbrPMCleanUp_c::measTypesList_p - luodaan. Ensimmäinen niistä hoitaa Managed Objects -dialogiosan scrolled list -käsittelyn ja toinen vastaavasti mittaustyypeistä koostuvan dialogiosan scrolled list -käsittelyn.
5. Luokan dbrPdaInterf_c mukainen olio dbrPMCleanUp_c::dbrPdaInterf_p luodaan PM tietokantaosan siivousta varten. Olio alustetaan seuraavasti:
operaatio = "Copy",
siivoushakemisto haetaan konfigurointimäärityksistä,
siivousaikarajat asetetaan käyttöjärjestelmän nykyisestä
kellonajasta,
siivottavan tiedon tyyppi = "Raw",
tietokannan versio = 1,
siivoustiedostot tehdään myös silloin kuin siivottavaa tietoa on 0 riviä kannassa.
destruktori: konstruktorissa dynaamisesta muistista varatut oliot vapautetaan. Näitä ovat: MOI-dialogikäsittelijä, MOI-dialogikäsittelijästä poissuljettujen objektiluokkien lista, molemmat scrolled list -käsittelijäobjektit, MOI-dialogissa viimeksi valittujen objektien lista, objekteista ja niiden scrolled list -esityksistä dialogissa koostuva lista, Managed Objects -osassa näytettyjen objektien luokista muodostuva lista sekä PDARCH-siivouskirjastoa varten tehty välittäjäobjekti.
wasErrInConstructor: metodi, joka palauttaa tiedon siitä, tapahtuiko viimeksi ajetun konstruktorin yhteydessä virhe (palauttaa tällöin DBR_TRUE:n) vai ei (palauttaa DBR_FALSE:n).
SelMOIItemsInPMCleanUpList_p: lista, joka sisältää alkioinaan dialogin Managed Objects scrolled list -alueella näkyvät objektit ja niiden tekstiesitykset ko. alueella.
DeleteObj: tuhoaa SelMOIItemsInPMCleanUpList_p -listasta sen alkion, jonka scrolled list -esitys Managed Objects -alueella dialogissa on sama kuin parametrina annettu. Palauttaa DBR_TRUE:n, jos kriteerin mukainen alkio löytyi ja poistettiin listasta, muutoin DBR_FALSE:n.
DeleteObjClassItem: luokkametodi, joka poistaa listasta MOIDiffObjClassNode_p parametrina annetun objektiluokan. Jos löydetyn alkion referenssilaskurin arvo on ykköstä suurempi, laskurin arvoa ainoastaan vähennetään yhdellä. Jos laskurin arvo on yksi, niin tällöin koko alkio poistetaan listasta. Mikäli listasta löytyi poistettava alkio, palauttaa metodi arvon DBR_TRUE, muutoin arvon DBR_FALSE.
widgets: tietue, joka sisältää kaikkien dialogissa käsiteltävien widgettien osoitteet.
dbrPMRealFromTime/dbrPMRealToTime: merkkijonotaulukoita, joissa ylläpidetään dialogin From-/To-aikakenttien arvoja.
dbrMOIHandlerWi_p: luokkamuuttuja, joka sisältää luokan sisällä luotavan MOI-dialogiolion osoitteen.
objClassNotShownList: luokkalista, joka sisältää ne objektiluokat, joiden edustajia ei näytetä MOI-dialogin scrolled list -alueella.
MOIDiffObjClassNode_p: luokkalista, joka sisältää ne objektiluokat, joiden edustajia on "Measurement Database Cleanup" -dialogin Managed Objects -alueella näkyvillä. Listan kukin alkio sisältää sekä objektiluokan että siihen liittyvän referenssilaskurin. Laskurin arvo kertoo sen, kuinka monta kyseisen luokan objektia näkyy dialogin Managed Objects -alueella.
polScrolledList_p: luokkamuuttuja, joka osoittaa dialogin Managed Objects scrolled list -käsittelijään. Käsittelijä on toteutettu polalbmx.a -kirjastossa helpottamaan scrolled list -käsittelyä. Kyseinen käsittelijä siis luodaan tämän luokan sisällä.
measTypesList_p: analoginen polScrolledList_p -olio-osoittimen kanssa; nyt vain käsittely kohdistuu mittaustyyppien scrolled list -alueeseen.
dbrPdaInterf_p: luokkaosoitin luokan dbrPdaInterf_c mukaiseen olioon, jolla varsinainen siivous aktivoidaan. Ks. edellä luokan dbrPdaInterf_c kuvausta (kappale 3.1.5.).
UpdMeasTypeList: luokkametodi, jolla päivitetään dialogin mittaustyypit esittävään scrolled list -alueeseen ne mittaustyypit, jotka edustavat parametrina annettua mittaustyypin tyyppiä (= 'R'(aw)/'D'(ay)/'W'(eek)/'M'(onth)) ja joihin liittyvien objektiluokkien edustajia on dialogin Managed Objects -alueella. Samalla luokkamuuttujan dbrPMCleanUp_c::measTypesListSelItemCnt sisältö nollataan, koska tämän listan uudelleen rakentamisen jälkeen ei mitään mittaustyyppiä voi olla heti valittuna. Samalla dialogin "OK"-napin tila asetetaan insensitiiviseksi, koska siivouskriteerit eivät ole valideja (yhtään mittaustyyppiä ei ole valittuna) ja kehoitus valita mittaustyyppejä kirjoitetaan sovelluksen viestialueelle.
GetFromTimeLabel: metodi, jolla dialogin From-aikakentän arvo haetaan parametrina annettuun merkkijonotaulukkoon. Jos haku onnistui, palauttaa metodi arvonaan DBR_TRUE:n, muutoin DBR_FALSE:n.
UpdFromTimeLabel: metodi, jolla viedään sille parametrina annettu aika-arvo (merkkijono) dialogin From-aikakentän arvoksi.
GetToTimeLabel/UpdToTimeLabel: näiden metodien toiminnat ovat täysin analogiset metodien GetFromTimeLabel/UpdFromTimeLabel toimintojen kanssa - kohde dialogissa on nyt vain To-aikakenttä.
ZeroTimePart: metodi, jonka avulla aikakenttä muuttujasta dbrPMRealFromTime (jos parametrin isFrom arvo on DBR_TRUE)/dbrPMRealToTime (jos parametrin isFrom arvo on DBR_FALSE) nollataan arvoon "00:00". Jos metodin parametrin zeroAlsoDay arvo on DBR_TRUE, nollataan myöskin päivän arvo käsiteltävästä aikamerkkijonosta, jolloin se saa arvokseen "01".
GetDateTimeInInt: metodi, jonka avulla saadaan muuttujasta dbrPMRealFromTime (jos parametrin isFrom arvo on DBR_TRUE)/dbrPMRealToTime (jos parametrin isFrom arvo on DBR_FALSE) tekstimuotoinen aikaleima hajotettua integer-tyyppisiin komponentteihinsa. Nämä komponentit (year, month, day, hour, min) ovat metodin referenssiparametreja.
MoiSelectCB: luokkakäsittelijä, johon tullaan välittömästi, kun MOI-dialogissa tehdyt objektivalinnat on kuitattu hyväksytyiksi ko. dialogissa. Tässä käsittelijässä huolehditaan mm. seuraavista asioista:
1. Lista valituista objekteista noudetaan *dbrMOIHandlerWi_p - oliolta.
2. Jokaista valittua objektia kohden tehdään seuraavaa:
Objektin tietojen pohjalta muodostetaan sen scrolled list -riviesitys dialogia varten,
Jos muodostettu scrolled list -rivi ei vielä ollut dialogissa näytettynä, tehdään seuraavaa:
scrolled list -rivi lisätään alueelle aakkosjärjestyksessä,
Objektin luokka lisätään dialogissa näytettävien objektien luokkien luokkakirjanpitoon (lista
MOIDiffObjClassNode_p),
Objektin tiedot/scrolled list -esitys lisätään listaan SelMOIItemsInPMCleanUpList_p,
Tieto Managed Objects -alueella olevien scrolled list -rivien yhteislukumäärästä päivitetään ajan tasalle,
Mittaustyyppejä sisältävä scrolled list -alue päivitetään ajan tasalle lisätyn objektin luokan mukaisesti.
3.2.1.3. Luokka dbrDBBackUp_c
Luokka dbrDBBackUp_c on tehty lähinnä tietokantavarmistuksen varmistusdialogia varten. Luokan oliomallikuvaus on seuraava:

Luokan ulkoiset jäsenet ovat seuraavat:
konstruktori: luo varmistusdialogin tietokantavarmistuksen ottamiselle ja päivittää tiedon dialogiwidgetistä globaalille *dbrHelpAtom_p -avustusoliolle.
destruktori: ei tee nykyisellään mitään.
widgets: tietue, joka sisältää varmistusdialogin sisältämien sovelluksessa käytettyjen widgettien osoitteet.
3.2.1.4. Luokka dbrDBRecount_c
Luokka dbrDBRecount_c on tehty tietokannan täyttöasteen uudelleenlaskennan working-dialogia varten. Luokan oliomallikuvaus on seuraava:

Luokan ulkoiset jäsenet ovat seuraavat:
konstruktori: luo working-dialogin tietokannan täyttöasteen uudelleenlaskentaa varten.
destruktori: ei tee nykyisellään mitään.
widgets: tietue, joka sisältää working-dialogin sisältämien sovelluksessa käytettyjen widgettien osoitteet.
3.2.1.5. Luokka dbrDatabaseShell_c
Luokka dbrDatabaseShell_c sisältää sovelluksen ylimmän tason dialogin käsittelyn. Luokan oliomallikuvaus on seuraavanlainen:

Luokan yksityiset jäsenet ovat seuraavat:
wasErrInConstr: indikaattorimuuttuja, jonka sisältö osoittaa, tapahtuiko viimeisessä konstruktoriajossa virhe (arvo on tällöin DBR_TRUE) vai ei
(arvona DBR_FALSE).
SetAlarmPrcntScrollbarValue: hälytyskantaosan täyttöaste viedään pääikkunan hälytysosan scrollbar:in leveydeksi, jos ko. kantaosaa seurataan ja vähintään yhdelle sen valvottavalle taululle on laskettu sen käyttämien rivien lukumäärä (kantaosaobjekti on täytynyt olla allokoitu tätä ennen dynaamisesta muistista!). Sovellus käyttää scrollbar:ja tällä tavoin pylväsdiagrammien simulointiin. Jos kantaosaa ei seurata tai millekään sen valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää, asetetaan scrollbar:in leveydeksi 100 jolloin se täyttää koko sille varatun tilan.
SetMeasPrcntScrollbarValue: toimii täysin analogisesti metodin SetAlarmPrcntScrollbarValue() kanssa - käsiteltävä tietokantaosa on nyt vain mittaustietokantaosa.
SetAlarmTimeLabelValue: jos hälytyskantaosaobjekti on allokoitu, sen tilannetta seurataan ja recount on tehty sille ainakin kerran, päivitetään hälytyskantaosan viimeisen recount:in aikaleima päädialogi-ikkunaan. Muussa tapauksessa ko. widget poistetaan näytöltä.
SetAlarmCountLabelValue: pääikkunan hälytyskantaosan Count-kentän arvoksi viedään hälytyskantaosan tämän sovelluksen valvomien taulujen käyttämien rivien lukumääräristä se, joka kuuluu kantaosan täysinäisimmälle valvottavalle taululle. Näin tehdään vain jos hälytyskantaosan jollekin valvottavalle taululle on laskettu käytettyjen rivien lukumäärä ainakin kerran ja ko. tietokantaosan täyttöastetilannetta seurataan ja ko. kantaosaobjekti on allokoitu; muutoin Count-kenttä unmanagoidaan dialogista.
SetMeasTimeLabelValue: toimii täysin analogisesti metodin SetAlarmTimeLabelValue() kanssa; toiminnan kohteena on nyt vain mittaustietokantaosa.
SetMeasCountLabelValue: toiminta on täysin analoginen metodin SetAlarmCountLabelValue() kanssa - nyt toiminnan kohteena on vain mittaustietokantaosa.
SetAlarmPrcntLabelValue: pääikkunan hälytyskantaosan prosentuaaliseksi täyttöasteeksi asetetaan ko. kantaosan täyttöasteen prosentuaalinen arvo. Näin menetellään vain, jos ko. kantaosan ainakin yhdelle valvottavalle taululle on laskettu käytettyjen rivien lukumäärä ja kantaosan täyttöastetilannetta seurataan ja kantaosaa kuvaava objekti on allokoitu; muutoin prosentuaalinen täyttöastekenttä unmanagoidaan dialogista.
SetMeasPrcntLabelValue: toiminta täysin analoginen metodin SetAlarmPrcntLabelValue() kanssa - toiminnan kohteena on nyt vain mittaustietokantaosa.
SetMeasTypeLabelValue: pääikkunan mittauskantaosan mittaustyyppitekstiksi asetetaan sen mittaustyypin tekstiesitys, johon ko. kantaosan täysinäisin valvottava taulu kuuluu. Jos täysinäisin taulu ei kuulunut mihinkään mittaustyyppiin, teksti "No measurement type" tulee näytölle. Jos kantaosan täyttöastetilannetta ei seurata tai millekään sen valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää tyhjätään tämä kenttä dialogissa - samoin tehdään, jos ko. tietokantaosaa kuvaavaa objektia ei ole allokoitu.
SetAlarmLabelValue: jos hälytyskantaosan täyttöastetta seurataan ja sen ainakin yhdelle valvottavalle taululle on laskettu käytettyjen rivien lukumäärä sekä hälytyskantaosaa kuvaava objekti on allokoitu, tulostetaan teksti "Alarms" hälytyskantaosan täyttöastetta kuvaavaan alueeseen pääikkunassa. Muussa tapauksessa ko. teksti tyhjätään dialogissa.
SetMeasCountTitleLabelValue: Mittauskantaosan Count -otsikkokentän tekstiksi päädialogi-ikkunassa sijoitetaan joku seuraavista teksteistä: "Count:", "No tables monitored!", "Fullness information not followed!" tai "Fullness information not counted!". Ensimmäinen vaihtoehto tulostetaan silloin kun tämän tietokantaosan täyttöastetilannetta seurataan ja ainakin yhdelle sen valvottavista tauluista on laskettu käytettyjen rivien lukumäärä GSM_DB_INFO -tauluun. Jos tietokantaosassa ei ole yhtään valvottavaa taulua, tulostetaan toinen vaihtoehto. Jos tietokantaosan täyttöastetilannetta ei seurata, tulostetaan kolmas tekstivaihtoehto ja viimeistä vaihtoehtoa käytetään silloin kun yhdellekään tämän tietokantaosan valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää.
SetAlarmCountTitleLabelValue: täysin analoginen SetMeasCountTitleLabelValue() -metodin kanssa sillä erotuksella että nyt käsitellään hälytyskantaosaan liittyvää aluetta pääikkunassa.
unMapAlarmScrollbar: indikaattorimuuttuja, joka kertoo, onko tarve pistää pääikkunan hälytyskantaosan scrollbar-widgetti näkymättömäksi (arvo on tällöin DBR_TRUE). Näin menetellään jos kyseisen kantaosan täyttöastetilannetta ei jostain syystä seurata. Muuttujalle tuli tarve sen vuoksi, että päätös siitä, ettei täyttöastetta näytetä scrollbar:ssa tehdään sovelluksessa eri aikaan kuin itse scrollbar:in näkymättömäksi laittaminen on mahdollista.
unMapMeasScrollbar: indikaattorimuuttuja, joka kertoo, onko tarve pistää pääikkunan mittauskantaosan scrollbar-widgetti näkymättömäksi (arvo on tällöin DBR_TRUE). Näin menetellään jos kyseisen kantaosan täyttöastetilannetta ei jostain syystä seurata. Muuttujalle tuli tarve sen vuoksi, että päätös siitä, ettei täyttöastetta näytetä scrollbar:ssa tehdään sovelluksessa eri aikaan kuin itse scrollbar:in näkymättömäksi laittaminen on mahdollista.
Luokan julkiset jäsenet ovat seuraavat:
konstruktori: mm. seuraavat asiat hoidetaan tässä metodissa:
pääikkunaan kuuluvat widgetit luodaan,
globaali *dbrHelpAtom_p -helpolio luodaan,
tietokannan varmistusmenuvalinta asetetaan sensitiiviseksi, jos sovelluksen käynnisti joku sysop-ryhmään kuuluva; muutoin ko. valinta asetetaan insensitiiviseksi,
hälytys/mittauskantaosaan kuuluvat alueet päänäytöllä päivitetään laskettujen täyttöastetietojen mukaisiksi.
destruktori: ei toistaiseksi tee mitään.
WasErrInConstructor: tällä metodilla voidaan kysellä, tapahtuiko viimeisessä konstruktorin ajossa virhe. Palattaa DBR_TRUE:n, jos tapahtui, muutoin DBR_FALSE:n.
widgets: tietue, joka sisältää pääikkunan sisältämien ohjelmassa käsiteltävien widgettien osoitteet.
measDatabase_p: osoitin "Measurement Database" -dialogin sisältävään luokkaan.
PMCleanUp_p: osoitin "Measurement Database Cleanup" -dialogin sisältävään luokkaan.
DBBackUp_p: osoitin tietokantavarmistuksen varmistusdialogin sisältävään luokkaan.
DBRecount_p: osoitin tietokannan täyttöasteen uudelleenlaskennan working-dialogin sisältävään luokkaan.
StartMainWindow: tämä metodi tulostaa X-serverin näytölle sovelluksen pääikkunan sekä luovuttaa kontrollin X-ikkunointijärjestelmän tapahtumakäsittelijälle. Ennen X-tapahtumankäsittelijän starttaamista tehdään myöskin seuraavat asiat:
1. Jos aiemmin on jo tehty päätös, ettei hälytystietokantaosan/mittaustietokantaosan täyttöastetta ole syytä näyttää scrollbar:ina, tehdään ko. scrollbar:lle X:n unmap.
2. Motif -window-managerin pääikkunaan liittyvän standardivalikon Close-valinta ohjataan kutsumaan sovelluksen exit-rutiinia (dbrExitCB()).
3. OMC:n starttauspalvelulle ilmoitetaan, että tämä sovellus käynnistyi ongelmitta.
4. Mikäli sovellus on käännetty käyttäen kääntäjädirektiiviä SHOW_START_TIME, käyttöjärjestelmän kellonaika tulostetaan tässä vaiheessa stderr:iin. Sovelluksen käynnistymisaikaa voidaan tällöin tutkia käynnistämällä sovellus seuraavasti:
date; dbrmuimx;
stderr:iin tulostuvien kahden käyttöjärjestelmäkellonaikojen erotus on mainittu käynnistymisaika.
ManageMeasDatabase: tämä metodi näyttää "Measurement Database" -dialogin. Jos ko. dialogin sisältävän luokan dbrMeasDatabase_c mukaista oliota ei ohjelmassa ollut aikaisemmin allokoitu, allokoidaan sellainen aivan tämän metodin alussa.
ManagePMCleanUp: nimensä mukaisesti tämä metodi managoi "Measurement Database Cleanup" -dialogin. Jos dialogin sisältävää luokan dbrPMCleanUp_mukaista oliota ei ohjelmassa ole vielä allokoitu, tehdään se tämän metodin aivan alussa. Samassa yhteydessä ko. dialogin tarpeelliset kentät alustetaan (nykyisellään mittaustyyppilista).
ManageDBBackUp: tämä metodi managoi tietokantavarmistuksen varmistusdialogin. Jos ko. dialogin sisältävän luokan dbrDBBackUp_c mukaista oliota ei ohjelmassa ollut aikaisemmin allokoitu, allokoidaan sellainen aivan tämän metodin alussa.
ManageDBRecount: managoi tietokannan täyttöasteen uudelleenlaskennan working-ikkunan. Jos kyseistä ikkunaa ei ole allokoitu, allokoidaan sellainen tämän metodin alussa luomalla luokan dbrDBRecount_c mukainen olio.
PutMsgStr: tulostaa metodille parametrina annetun merkkijonon sovelluksen pääikkunan viestialueelle. Teksti pakotetaan X-serverin näytölle heti.
SetPMFullnessValues: pääikkunan mittaustietokannan täyttöasteeseen liittyvien widget:ien arvot päivitetään täyttöastetilanteen mukaisiksi. Jos ko. tietokantaosan täyttöastetta ei seurata tai millekään sen valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää unmanagoidaan näytöltä "Others"-nappi ja täyttöasteen indikoiva scrollbar.
SetFMFullnessValues: toimii analogisesti metodin SetPMFullnessValues() kanssa - käsittelyn kohteena on nyt vain hälytyskantaosa. Jos kantaosan täyttöastetta ei seurata tai millekään sen valvottavalle taululle ei ole laskettu käytettyjen rivien lukumäärää unmanagoidaan näytöltä täyttöasteen indikoiva scrollbar.
3.2.2. Mittaustyypin täysinäisyyden ikkunassa esittävä luokka
Luokka dbrMeasDatabase_c sisältää sovelluksen dialogiin "Measurement Database" liittyvän käsittelyn. Luokan oliomallikuvaus on seuraava:

Luokan yksityiset jäsenet ovat seuraavat:
measTypeFullNodes_p: linkitetty lista GUI-olioita, joista kukin sisältää yhden mittaustyypin täyttöastetiedon vierityspalkkiesityksenä, käytettyjen rivien lukumäärätietona (lukumäärä on siis mittaustyypin kaikkien taulujen käytettyjen rivien yhteislukumäärä) ja prosenttiesityksenä. GUI-oliossa on myöskin mukana mittaustyypin nimi. GUI-olio kuuluu luokkaan dbrGuiMeasTypeFull_c, josta on kerrottu jäljempänä kappaleessa 3.2.2.1.
wasErrInConstr: indikaattorimuuttuja, joka kertoo sen, tapahtuiko viimeisessä tämän luokan olion konstruktoriajossa virhe vai ei.
Luokan julkiset jäsenet ovat seuraavat:
widgets: sisältää osoittimet luokan olion kaikkiin käsiteltäviin widgeteihin.
konstruktori: luo dialogin kaikki widgetit, päivittää help-olion tuntemaa widget-hierarkiaa juuri luotujen widgettien tiedoilla ja rakentaa lopuksi listan *measTypeFullNodes_p, joka siis sisältää sovelluksen seuraamien mittaustyyppien täyttöastetietojen GUI esitykset. Listan rakentamisessa käytetään apuna luokan dbrPMTools_c metodeita GetFirstMeasTypeTablesData() / GetNextMeasTypeTablesData(), jotka palauttavat siis valvottavien mittaustyyppien täyttöastetiedot. Objektin yksityinen datajäsen wasErrInConstr päivitetään kertomaan siitä, onnistuiko konstruktorin ajo (arvona tällöin DBR_FALSE) vai ei (arvona tällöin DBR_TRUE). "Measurement Database" -dialogin (= top level shell) Motif window managerin minimize-toiminnallisuus poistetaan samassa yhteydessä.
WasErrInConstructor: kyselymetodi, jolla saadaan tieto siitä, onnistuiko tämän olion viimeinen konstruktorin ajo vai ei,
SetMeasTypesFullnessValues: valvottavien mittaustyyppien täyttöasteet päivitetään dialogiin tauluille viimeksi laskettujen täyttöastetietojen nojalla.
destruktori: ei tee mitään nykyisellään.
3.2.2.1. Luokka dbrGuiMeasTypeFull_c
Luokka dbrGuiMeasTypeFull_c tehtiin sisältämään yhden mittaustyypin täysinäisyyden esitykseen liittyvät graafiset oliot. Itse asiassa luokan dbrMeasDatabase_c sisältämä lista *measTypeFullNodes_p sisältää alkioinaan tämän luokan mukaisia olioita. Luokan oliomallikuvaus on seuraava:

Luokan yksityiset jäsenet ovat seuraavat:
dbrMeasTypeName: widget, joka sisältää mittaustyypin tekstiesityksen.
dbrMeasValueBar: widget, joka on mittaustyypin täysinäisyyttä kuvaava scrollbar-esitys.
dbrMeasValueCount: widget, joka sisältää mittaustyypin Count-kentän arvon tekstiesityksen.
dbrMeasValuePros: widget, joka sisältää mittaustyypin prosentuaalisen täyttöasteen tekstiesityksen.
XDesignerCreateMeasTypeFullObject: metodi, joka luo yhden mittaustyypin täysinäisyyden esityksessä käytetyt käyttöliittymäoliot. Näitä olioita ovat: mittaustyypin nimen label-esitys, mittaustyypin täysinäisyyden scrollbar-esitys sekä prosenttiesitys label:ina, label "Count:" sekä Count-kentän arvon esitys label-tekstinä. Nimen alun "XDesigner" -teksti johtuu siitä, että GUI-esitys on maalattu XDesigner-sovelluksella, josta maalatun esityksen perusteella generoitiin ns. "create"-funktio. Tämä metodi sisältää tmp.c -tiedostoon generoidun koodin ainoan create-funktion lähtien widget-hierarkian ensimmäisestä form:sta (siis alussa luotava application shell widget poistetaan ennen koodin käyttöä!); tälle form:lle pitää isäwidgetiksi antaa metodille parametrina annettu parent-widget. tmp.c -tiedoston generoinnista on kerrottu tarkemmin kappaleessa 3.7.
Luokan julkiset jäsenet ovat seuraavat:
konstruktori: saa parametrina isäwidgetin, mittaustyypin nimen tekstimuodossa, Count-kentän arvon long:ina, prosentuaalisen täyttöasteen double-muodossa sekä aikaleiman merkkijono-osoittimena - aikaleima on muotoa yyyymmddhhmm. Näitä parametreja käyttäen tekee seuraavat toimenpiteet:
1. Yksityiseen datajäseneen measTypeName otetaan talteen konstruktoriparametrina annettu ao. arvo,
2. Luo kaikki tarvittavat widgetit luokan yksityistä "create"-funktiota kutsumalla (XDesignerCreateMeasTypeFullObject()). Tätä toimenpidettä varten tarvitaan sitä isäwidgettiä.
3. Mittaustyypin nimi sijoitetaan ao. label-widgetin arvoksi.
4. Täyttöaste prosentteina sijoitetaan sitä esittävän scrollbar-widgetin slider-osuuden leveydeksi. Jos täyttöaste on yhtä prosenttia pienempi, se pyöristetään yhdeksi. Samoin jos täyttöaste on 100 prosenttia suurempi, täyttöaste pyöristetään 100 prosenttiin.
5. Count-arvo sijoitetaan tekstimuodossa sitä esittävän widgetin arvoksi.
6. Prosentuaalinen täyttöaste sijoitetaan sitä esittävän widgetin arvoksi.
7. Aikaleima sijoitetaan sitä esittävän widgetin arvoksi.
destruktori: nykyisellään tämän luokan destruktorissa ei tehdä mitään toimenpiteitä.
SetMeasTypeFullnessValues: päivittää parametrina saamansa mittaustyypin täyttöasteeseen liittyvät tiedot dialogiin. Parametreja ovat: mittaustyypin valvottavien taulujen käytettyjen rivien lukumääristä se (long), joka kuuluu täysinäisimmälle mittaustyyppiin kuuluvalle valvottavalle taululle, mittaustyypin prosentuaalinen täyttöaste (double) ja vanhin aikaleima niiden taulujen käytettyjen rivien laskentojen aikaleimoista, joita valvotaan ja jotka kuuluvat tähän mittaustyyppiin. Viimeisen parametrin tyyppi on char * ja formaatti yyyymmddhhmm. Dialogissa päivitettävät widgetit ovat: suhteellista täyttöastetta indikoiva scrollbar, Count:in arvokenttä, prosentuaalista täyttöastetta varten luotu kenttä sekä kenttä, johon aikaleima sijoitetaan.
GetMeasTypeName: palauttaa tähän olioon liittyvän mittaustyypin nimen.
3.3. Muut sovelluksen apuluokat ja -funktiot
3.3.1. Käteviä työkalumetodeita sisältävä luokka
Luokka dbrTools_c sisältää pääosin pieniä käteviä työkalufunktioita muiden luokkien käyttöön. Luokan oliomallikuvaus on seuraavanlainen:

Luokan julkiset luokkametodit ovat seuraavat:
Name2DbPart: metodille annetaan parametrina tietokantaosan tekstiesitys ja metodi palauttaa ko. osan enumerated-tyyppisen arvon paluuarvonaan (paluuarvon tyyppi on dbrDbPart_t). Jos kyseisen nimistä tietokantaosaa ei ole olemassa, palautetaan arvo NO_PART.
TablesDbPart: palauttaa sen tietokantaosan enumerated-arvon, johon kuuluvan taulun nimi annetaan metodille parametrina. Jos parametrina annettu taulu ei kuulu mihinkään tietokantaosaan, palautetaan arvo NO_PART.
ExpandOMCCONFPATH: metodille annetaan kolme parametria: omcconfpath_p -merkkijono-osoitin, expandBuffer -merkkijonotaulukon alkuosoite ja kyseisen taulukon koko expandBufferSize. Metodi laajentaa omcconfpath_p -parametrin osoittaman polkunimilistan se. listan jokainen komponentti (':'-merkkien välissä oleva teksti) on validi polkunimi. Laajennus tapahtuu samalla semantiikalla kuin Bourne Shell:in PATH-ympäristömuuttujan käsittely: vierekkäisten ':'-merkkien väliin lisätään '.'-nykyhakemistoviittaus ja jos polkunimilista alkaa/loppuu ':'-merkkiin, niin tällöin sen alkuun/loppuun lisätään myöskin nykyhakemiston merkiksi '.'-merkki. Jotta kyseinen laajennus vietäisiin loppuun saakka, on expandBuffer -taulukossa oltava riittävästi tilaa - tila varataan tässä tapauksessa metodin kutsujassa. Mikäli laajennoksen aikana havaitaan tämän tilan loppuvan kesken, keskeytetään laajennos ja expandBuffer:ssa palautetaan alkuperäinen omcconfpath_p -merkkijono.
TableBelongsToDbPart: metodille annetaan kaksi parametria: tietokantaosa dbPart ja taulun nimi name_p (merkkijono-osoitin). Metodi palauttaa arvon DBR_TRUE, jos parametrina annettu taulu (sen nimi on parametri) kuuluu dbPart -parametrin ilmaisemaan tietokantaosaan. Muussa tapauksessa metodi palauttaa arvon DBR_FALSE. Jos dbPart -parametrin arvo on NO_PART, tulkinta on se ettei mikään taulu kuulu tietokantaosaan NO_PART eli paluuarvo on DBR_FALSE.
DbPart2Name: tämän metodin toiminta on käänteinen metodin Name2DbPart toimintaan nähden eli tietokantaosan enumerated-arvon perusteella (ainoa parametri) palautetaan osoite ko. tietokantaosan nimeen. Itse nimi sijaitsee modulin yksityisessä merkkijonotaulukossa, joten sitä ei pidä käyttävän koodin puolella mennä muuttamaan vaan ainoastaan luku on paikallaan.
3.4. Callback-funktiot ja niissä käytetyt apufunktiot
Seuraavassa taulukossa on listattu luettelonomaisesti kaikki sovelluksen callback-funktiot. Ne on generoitu XDesigner-käyttöliittymänmaalaustyökalusta normaaleiksi C-funktioiksi ja ne sijaitsevat modulissa dbrguiCB___mx.cc. Tässä yhteydessä callback-funktioiden toimintaa ei dokumentoida tarkemmin - modulissa oleva lähdekoodi toimikoon tarkempana dokumenttina.
| Callback-funktio | Widget, johon sidottu | Toiminta |
| dbrBackUpStartCB | tietokantavarmistuksen varmistusdialogin "Start"-nappi | Käynnistää NMS:n tietokannan varmistuksen Offline-serverille. |
| dbrBackUpCancelCB | tietokantavarmistuksen varmistusdialogin "Cancel"-nappi | Jos varmistusta ei vielä ole aloitettu, poistaa dialogin näytöltä. Muutoin asetetaan tilamuuttujalle CancelWasGivenToDBBackUp arvo DBR_TRUE, jotta muualla voitaisiin keskeyttää varmistus. |
| dbrBackUpHelpCB | tietokantavarmistuksen varmistusdialogin "Help"-nappi | Näyttää kontekstisensitiivisen help-tekstin. |
| dbrBackupCB | pääikkunan menubar:in "Database"-menun "Online backup..."-valinta | Managoi tietokantavarmistuksen varmistusdialogin. |
| dbrPMCleanUpCB | pääikkunan menubar:in "Database"-menun "Cleanup > Measurements..."-valinta | Managoi mittaustietokantaosan siivouskriteerien asetusdialogin. |
| ExitActionsCB | sovelluksesta poistumisen varmistusdialogin "OK"-nappi | Aiheuttaa hallitun poistumisen sovelluksesta. |
| dbrExitCB | pääikkunan menubar:in "Database"-menun "Exit"-valinta | Aiheuttaa hallitun poistumisen sovelluksesta. |
| dbrWatchCB | pääikkunan menubar:in "Display"-menun "Watch"-valinta | Aiheuttaa sovelluksen siirtymisen tietokannan toimivuuden tarkkailumoodiin (toggle -tyyppinen moodi) |
| dbrOthersCB | pääikkunan mittaustietokantosa-alueen "Others..."-nappi | Aiheuttaa "Measurement Database" -dialogin avaamisen näytölle. |
| dbrDBRestoreStartCB | sitomaton | Ei toimintaa |
| dbrRestoreCancelCB | sitomaton | Ei toimintaa |
| dbrRestoreHelpCB | sitomaton | Ei toimintaa |
| dbrMeasDBCloseCB | "Measurement Database" -dialogin "Close"-nappi | Poistaa "Measurement Database" -dialogin näytöltä. |
| dbrMeasDBHelpCB | "Measurement Database" -dialogin "Help"-nappi | Näyttää kontekstisensitiivisen help-tekstin. |
| dbrCommandTypeCB | "Measurement Database Cleanup" -dialogin "Command Type"-valikko | Asetetaan mittaustietokantaosan siivouksen operaatiotyyppi. |
| FileCB | "Measurement Database Cleanup" -dialogin "Media"-valinta | Ei tee nykyään mitään. |
| SetFromDateTimeCB | "Cleanup Starting Time" -dialogin "OK"-nappi | From-ajan asetusdialogin aika-arvo asetetaan mittaustietokantaosan siivouskriteerien alkuajaksi. |
| SetToDateTimeCB | "Cleanup Ending Time" -dialogin "OK"-nappi | To-ajan asetusdialogin aika-arvo asetetaan mittaustietokantaosan siivouskriteerien loppuajaksi. |
| dbrTimeSetToCB | "Measurement Database Cleanup" -dialogin "To"-ajan "Set..."-nappi | Aktivoi näytölle To-ajan asetusdialogin. |
| dbrTimeSetFromCB | "Measurement Database Cleanup" -dialogin "From"-ajan "Set..."-nappi | Aktivoi näytölle From-ajan asetusdialogin. |
| dbrPMAddMOCB | "Measurement Database Cleanup" -dialogin "Add..."-nappi | Aktivoi näytölle Managed Object Instance -valintadialogin, josta voidaan valita verkkoelementtejä siivouskriteereiksi. |
| dbrPMRemoveMOCB | "Measurement Database Cleanup" -dialogin "Remove"-nappi | Poistaa valitun verkkoelementin mittaustietokantaosan siivouskriteeriasetuksista. |
| ActualCleanUpCB | mittaustietokantaosan siivouksen varmistusdialogin "Yes"-nappi | Käynnistää mittaustietokantaosan siivouksen annettujen kriteerien nojalla. |
| ActualCleanUpCancelCB | mittaustietokantaosan siivouksen varmistusdialogin "No"-nappi | Mittaustietokantaosan siivousta annetuilla kriteereillä ei käynnistetä vaan palataan edelleen siivousdialoginäytölle. |
| dbrPMOKCB | "Measurement Database Cleanup" -dialogin "OK"-nappi | Mittaustietokantaosaa lähdetään siivoamaan annettujen kriteerien nojalla kysyen ensin mahdollisen vahvistuksen siivoukselle. |
| dbrPMCancelCB | "Measurement Database Cleanup" -dialogin "Cancel"-nappi | Mittaustietokantaosan siivousta annetuilla kriteereillä ei käynnistetä vaan palataan takaisin pääikkunaan. |
| dbrPMHelpCB | "Measurement Database Cleanup" -dialogin "Help"-nappi | Näyttää kontekstisensitiivisen help-tekstin. |
| dbrPMToggleRawCB | "Measurement Database Cleanup" -dialogin "Raw"-toggle | Mittaustietokantaosan siivous kohdistetaan "raaka dataan". |
| dbrPMToggleDayCB | "Measurement Database Cleanup" -dialogin "Day"-toggle | Mittaustietokantaosan siivous kohdistetaan päivittäisiin yhteenvetoihin. |
| dbrPMToggleWeekCB | "Measurement Database Cleanup" -dialogin "Week"-toggle | Mittaustietokantaosan siivous kohdistetaan viikottaisiin yhteenvetoihin. |
| dbrPMToggleMonthCB | "Measurement Database Cleanup" -dialogin "Month"-toggle | Mittaustietokantaosan siivous kohdistetaan kuukausittaisiin yhteenvetoihin. |
| PMMOListCB | "Measurement Database Cleanup" -dialogin "Managed Objects" -scrolled lista | Ei tee nykyisellään mitään. |
| dbrTypeSelectionCB | "Measurement Database Cleanup" -dialogin "Measurement Type" -scrolled lista | Tarkistetaan, onko verkkoelementti-/mittaustyyppikriteerien asetus järkevä. |
| dbrRefreshChoiceCB | päädialogin sekä "Measurement Database" -dialogin valintalistapalkin valintalistan "Display" valinta "Refresh" | Laskee valvottavien taulujen täyttöasteet uudelleen GSM_DB_INFO -taulun sisällön perusteella ja päivittää tulokset pääikkunan/"Measurement Database" dialogin widgetteihin. |
| dbrRecountYesCB | Recount:in vahvistusdialogin "Yes"-nappi | Toimii samoin kuin dbrRefreshChoiceCB() sillä erolla, että kunkin valvottavan taulun täyttöastelaskennassa käytetty taulun käytettyjen rivien lukumäärä lasketaan ensiksi GSM_DB_INFO -tauluun spyanamx.sh -skriptillä ja sen jälkeen edetään kuten dbrRefreshChoiceCB():ssa. Operaation aikana käyttäjälle näytetään working-dialogi-ikkunaa. |
| dbrRecountNoCB | Recount:in vahvistusdialogin "No"-nappi | Ei tee nykyisellään mitään |
| dbrRecountChoiceCB | päädialogin sekä "Measurement Database" -dialogin valintalistapalkin valintalistan "Display" valinta "Recount" | Kysyy käyttäjältä vahvistuksen sille, haluaako tämä todellakin Recount:in ajettavaksi vai ei. Tämän vahvistusdialogin callback:it ovat sitten edellä luetellut dbrRecountYesCB() / dbrRecountNoCB(). |
Em. callback-funktioiden toteutuksissa on käytetty apuna joitakin samaan moduliin kirjoitettuja funktioita, jotka luetellaan seuraavassa taulukossa - edelleen paras dokumentti niiden yksityiskohtaiseen toimintaan on tiedoston dbrguiCB___mx.cc sisältämä lähdekoodi.
| Funktio | Toiminta |
| GetDBBackUpPid | Palauttaa tietokantavarmistusprosessin prosessinumeron sen lukkotiedostosta ${ORACLE_HOME}/DBBACK.lck. |
| dbrInterruptDBBackUp | Lähettää interrupt-signaalin tietokantavarmistusprosessille, jonka prosessinumero on annettu funktiolle parametrina. |
| StartSomePrg | Käynnistää tietokantavarmistusohjelman/spyanamx.sh -skriptin 2. funktiolle annettavan prog-nimisen parametrin arvon perusteella taustaprosessiksi ja ko. ohjelman tulostus ohjataan pääikkunan viestialueeseen. Ajettava ohjelma annetaan funktiolle 1. prgName -nimisenä merkkijonoparametrina. Tietokantavarmistusohjelman tapauksessa siihen liittyvän working-dialogin "Cancel"-napin painallusta tarkkaillaan, jotta varmistusohjelman suoritus voitaisiin tarvittaessa keskeyttää. spyanamx.sh -ohjelman tapauksessa siltä mahdollisesti palautuva virhekoodi muunnetaan sen omaan virhekoodiavaruuteen oikean virhetekstin tulostamiseksi virhedialogiin. Samoin toimitaan tietokantavarmistusohjelman dbbackmx.sh tapauksessa. |
| DBIsOn | Tietokantaan suoritetaan testikysely, jonka onnistumisen perusteella päätellään, onko tietokanta päällä vai ei. |
| timeOutProc | X:n TimeOut-funktio, jota siis kutsutaan asetetun timer:in lauetessa. Tämä timeOutProc-funktio tarkistaa konfiguroitavin väliajoin, onko tietokanta päällä. Tarkistus tapahtuu vain jos toggle "Watch" pääikkunan menubar:in "Display"-valikossa on päällä. |
| TimeContentsOK | "Measurement Database Cleanup" -dialogin From-/To-aikakenttien arvojen järkevyystarkastusfunktio. |
| TimesCheck | "Measurement Database Cleanup" -dialogin From-/To-aikakenttien arvojen ylemmän tason järkevyystarkastusfunktio, joka kutsuu funktiota TimeContentsOK() ja tämän antaman vastauksen perusteella kertoo mahdollisesta virheestä aika-arvoissa dialogin ao. widgettien arvoissa (esim. sovelluksen viestialueella). |
| SetFromToDateTime | Tällä funktiolla kaivetaan "Cleanup Starting Time"/"Cleanup Ending Time" -dialogissa asetettu aika-arvo tämän sovelluksen tietoon. |
| dbrTimeSetFromTo | Tästä funktiosta käynnistetään dialogi "Cleanup Starting Time"/"Cleanup Ending Time", jonka aika-arvo alustetaan vastaavasta From-/To-aikakentän arvosta dialogista "Measurement Database Cleanup". |
| CheckSelectedMOSandMeasTypes | Tarkistaa, onko "Measurement Database Cleanup" -dialogissa tehty validit valinnat verkkoelementti-/mittaustyyppikriteereille ja asettaa tämän mukaisesti ao. widgettien arvoja (esim. "OK"-napin sensitiivisyyttä). |
3.5. DBRMUI:n käyttämät ympäristömuuttujat
DBRMUI:n koodissa on käytetty seuraavia ympäristömuuttujia:
| Ympäristömuuttuja | Merkitys |
| HOME | Viittaa käyttäjän kotihakemistoon. Käyttäjäkohtaista konfigurointitiedostoa haetaan täältä. |
| OMCCONFPATH | Polkunimilista, jonka varrelta haetaan DBRMUI -sovelluksen globaalia konfigurointitiedostoa. |
| DBR_DB_UID | Sisältää login-tiedot tietokantaan muodossa |
| ORACLE_HOME | Oracle käyttäjän kotihakemisto. Tietokannan varmistusskripti dbbackmx.sh muodostaa tänne lukkotiedostonsa, jota DBRMUI yrittää lukea, jos käyttäjä haluaa tietokantavarmistuksen peruuttamista sen ajon jo alettua. |
3.6. DBRMUI-käännöksessä käytetyt define-muuttujat
DBRMUI:n käännöskomennossa voidaan käyttää seuraavia define-symboleita:
| Define | Merkitys |
| DEBUG | Jos tämä define on määritelty käännösrivillä, tiedostossa dbrdebug___mx.h olevat DEBUG-makrot kääntyvät mukaan koodiin, jolloin "-d" -komentorivioptiolla ohjelma saadaan tulostamaan debug-informaatiota etenemisestään. Debug-tulostuksen määrää voidaan kontrolloida myöskin ko. optiolla lisäämällä sen perään numero - tästä on kerrottu tarkemmin kappaleessa 4. |
| "_H"-loppuiset | Näitä käytetään jokaisessa header-tiedostossa estämään niiden inkludaamisen moneen kertaan lähdekoodissa. Definen alku johdetaan suoraan ao. headertiedostonimestä; esim. dbrgsmdbinfmx.h -tiedostossa on käytössä define DBRGSMDBINFMX_H. |
| MOD_TEST | DBRMUI -binääriin käännetään mukaan modulitestausta tukevia piirteitä, jos tämä define on asetettu. Näitä piirteitä ovat: dynaamisen muistin kulutuksen tulostus stdout:iin ohjelman alussa/lopussa, käyttäjän kotihakemisto päätellään ensisijaisesti HOME-ympäristömuuttujan arvosta, virheen satuttua tiedot siitä tulostetaan stderr:iin virhedialogi-ikkunan sijaan ja dbrWmtMemoryUsage() -muistinkulutusmittarifunktio käännetään mukaan. |
| INTEG_TEST | DBRMUI -binääri käännetään siten, että sille voidaan tehdä integrointitestaus. Sama versio menee myöskin SYTE:een/asiakkaalle. Mm. seuraavia asioita tehdään, jos tämä define on voimassa käännösaikana: real uid muutetaan ohjelman alussa root:ksi, virhetilanneinformaatio kirjoitetaan virhedialogi-ikkunaan ja sopivilla komentorivioptioilla ohjelma saadaan tulostamaan dynaamisen muistin kulutus sen ajon alussa/lopussa. |
| USE_PDARCH | Jos tämä define on käännösaikana voimassa, käytetään DBRMUI -sovelluksen ajoaikana PDARCH-kirjaston palveluita PM-tietokantaosan siivouksessa. Muutoin vain tulostetaan siivoukselle asetetut parametrit stdout:iin siivouksen aktivoinnissa, mutta mitään todellista siivousta ei suoriteta. |
| XT_REVISION | Kontrolloi sitä, mitä X Toolkit versiota vasten DBRMUI -ohjelman lähdekoodit käännetään. Define asetetaan voimaan X:n header-tiedostoissa ja DBRMUI:n lähdekoodin puolella sitä ainoastaan testataan. |
| SHOW_START_TIME | Jos dbrmuimx käännetään tämä define päällä, näyttää sovellus käynnistyessään koneen kellonajan muodossa: Thu Apr 7 11:30:42 1994 Sovellus tulostaan em. kellonajan juuri ennen XtAppMainLoop()-kutsua, jossa lähdetään käsittelemään käyttäjätapahtumia. Sovelluksen käynnistymisen kesto saadaan siten esim. seuraavalla komentojonolla: date; dbrmuimx; laskemalla tulostuvien kellonaikojen erotuksen. |
3.7. XDesigner -ohjelman käytöstä
DBRMUI:n käyttöliittymän widget-hierarkiaa, niiden sisäistä layout:ia sekä resurssimäärityksiä ylläpidetään XDesigner -käyttöliittymätyökalulla. Jos näitä asioita halutaan muuttaa, täytyy käyttöliittymäkuvaustiedosto dbrguimx.xd ensin kuitata ulos jäistä $RCSTREE/image/dbrmui/RCS -hakemistosta co -l -komennolla. Tämän jälkeen XDesigner -ohjelman saa käyntiin päivityksiä varten komennolla:
XDesigner dbrguimx.xd &
Tarkempia ohjeita ko. ohjelman käytöstä saa sen käyttöohjeesta.
Muutosten jälkeen pitää XDesigner:sta generoida ns. create_ -funktiot C-koodina. Koodiin tulevat asiat on määritelty itse kuvaustiedostoon. Generoitu koodi tulee puolestaan tiedostoon dbrguimx.c, jota dbrlib-alijärjestelmän make-tiedosto osaa käsitellä. Generoidussa koodissa luodaan halutut widget-hierarkiat halutuilla resurssimäärityksillä.
Samoin muutosten jälkeen tulee generoida uusi resurssitiedosto. Tähän tiedostoon tulevat asiat on myöskin konfiguroitu valmiiksi itse kuvaustiedostoon. Nykyisellään resurssitiedoston nimi on tmp.rf, joka tulee editorilla lisätä dbrmuimx.srf -resurssitiedosto-osaan sille varattuun paikkaan (tämä selviää katselemalla ko. tiedostoa jollain tiedoston sisällön selaajalla).
dbrguimx.h -tiedostossa ylläpidetään itse käsin yllä mainittujen create_ -funktioiden prototyyppejä. Jos näihin tulee muutoksia generoidun koodin puolella, pitää samat asiat muuttaa käsin myös tähän tiedostoon - käytännössä näin tapahtuu hyvin harvoin vaikka käyttöliittymään tehtäisiin XDesigner:lla paljon muutoksia. Syynä tämän tiedoston käsin ylläpitoon on se, ettei se XDesigner:in tuottamana inkludoi tarvittavia omia lähdekoodiheadereita.
Callback-funktioita pidetään myöskin yllä itse käsin tiedostossa dbrguiCB___mx.cc. Tämä generoitiin ns. stub-versiona kerran XDesigner:sta ja otettiin sen jälkeen omaan ylläpitoon. Luonnollisesti käyttöliittymäkuvauksessa mainitut callback-funktiot tulee löytyä tästä modulista ja niiden profiilien on myöskin täsmättävä.
XDesigner-kuvaustiedostossa dbrmearow__mx.xd pidetään yllä "Measurement Database" -dialogin yhden mittaustyypin GUI-esitystä. Ko. esitys sisältää mittaustyypin nimen, sen täysinäisyyden scrollbar-esityksen, viimeisen recount:in aikaleiman, "Count:"-vakiotekstin, count:in arvon sekä prosentuaalisen täyttöasteen. Kuvauksesta generoidaan yksinomaan C-koodi tiedostoon ${HOME}/work/dbrlib/tmp.c - kuvaustiedostossa on nimittäin määritelty, että kaikki GUI-attribuuttiasetuksetkin generoidaan koodiin resurssitiedoston sijaan. tmp.c -tiedostoon generoidun koodin hyödyntämisestä sovelluksessa kerrotaan tarkemmin kappaleessa 3.2.2.1. luokan dbrGuiMeasTypeFull_c metodin XDesignerCreateMeasTypeFullObject() kuvauksen yhteydessä.
3.8. DBRMUI-toteutukseen implementoidut skriptit
Skripti dbrshstbackmx.sh on tehty sitä varten, että sen avulla muutetaan ruid oracle:ksi tietokantavarmistuksen ajaksi. Ko. operaation aikana sen tulostama teksti ohjataan sekä lokitiedostoon että stdout:iin tulostettavaksi DBRMUI:ssa edelleen sen viestialueelle. Tämä välittäjäskripti tarkistaa myöskin sen, että siitä käynnistettävän skriptin oikeudet ovat kunnossa.
DBRMUI käyttää tietokantavarmistukseen dbbackmx.sh -skriptiä, joka kuuluu DBBACK-alijärjestelmään ja on dokumentoitu siten ko. alijärjestelmän dokumentaatiossa.
Taulun käytettyjen rivien lukumäärän selvittämiseen DBRMUI käyttää spyanamx.sh -skriptiä, joka on dokumentoitu SPYMAN-alijärjestelmän dokumentaatiossa. spyanamx.sh -skriptiä ei tarvitse ajaa oracle-käyttäjänä, vaan se käynnistetään DBRMUI:sta suoraan root-tunnukselta ${PATH}:in varrelta.
4. TOIMINTOJEN KUVAUS
DBRMUI-sovellus käynnistetään OMC:n Top Level User Interface:n Utils-valikosta. Tässä yhteydessä DBRMUI:lle voidaan välittää käynnistysparametreja kertomalla ne GUIMAN:in käyttäjäryhmäprofiileissa. Seuraavat parametrit ovat mahdollisia:
1. -d[
• 0: ei jäljitystulosteita,
• 5 aiheuttaa saman määrän tulostusta kuin pelkkä -d -optio eli normaalin määrän (siis 5 on jäljityksen oletustaso),
• tasolla 1 tulostetaan jäljitystietoja hyvin vähän ja tasolla 9 kaikkein eniten.
'd'-merkin tilalla voidaan myöskin käyttää vastaavaa isokirjaimista merkkiä 'D'.
4.1. Käyttöliittymä
DBRMUI:n käyttöliittymä on kuvattu erillisessä dokumentissa /2/. T3 -toimituksiin toteutetaan ensisijaisesti tietokannan siivouspiirre ja täyttöastekatselu - jos aikaa jää, niin toteutetaan myöskin muut jatkossa esitettävät tietokantaoperoinnit.
Käyttöliittymä pohjautuu X- ja Motif-kirjastojen palveluihin. Suurin osa käyttöliittymästä on normaaleja valikkoja ja lomakkeita - tietokantaosien täyttöasteet kuvataan toistaiseksi vierityspalkkien avulla.
4.2. Toiminnot
4.2.1. Tietokantaoperointi
DBRMUI:n tärkein toimintokokonaisuus on järjestelmässä olevien erilaisten tietokannan osien tilankäytön seuranta ja tarvittaessa siivousoperaatioiden suorittaminen. OMC:n tietokanta voidaan jakaa karkeasti mittaus-, hälytys-, konfiguraatio- sekä objektit-osiin. DBRMUI:n päädialogi-ikkunassa tietokannan viimeisin tilanvaraustilanne näytetään T3-toimituksissa hälytys- ja mittaustietokantaosiin liittyen.
DBRMUI:lla voidaan siivota OMC-järjestelmän tietokantaa, vaikka tämä ei sijaitsisikaan fyysisesti samalla koneella (SQL*Net -yhteys). Tässä tapauksessa hajautuksen hallinnasta huolehtii käytettävä tietokannan hallintajärjestelmä. Tietokantavarmistus on kuitenkin tehtävä nykyisellään tietokantapalvelinkoneella. Valvottavien taulujen käytettyjen rivien lukumäärän laskenta spyanamx.sh -skriptillä voidaan kylläkin teknisesti suorittaa myöskin verkon takaa, mutta luotettavuuden kannalta tämäkin palvelu kannattanee konfiguroida siten, että operaation suorittamiseksi pitää sovellusta ajaa tällöin tietokantapalvelimella. Esim. tietokantavarmistusohjelmalle dbbackmx.sh voidaan käyttää käynnistysargumenttia "-s", joka tarkoittaa, että varmistus lähtee käyntiin ainoastaan tietokantaserverkoneella ja muilla koneilla ko. ohjelma palauttaa virhestatuksen.
DBRMUI kirjoittaa toiminnastaan tapahtumia OMC-työaseman komentolokiin WCLLIB:in palveluita käyttäen. Tässä yhteydessä käytetään tilannekohtaista harkintaa, mitkä tapahtumat on syytä kirjata lokiin. T3-toimituksissa lokipalveluna käytetään ainoastaan käyttöjärjestelmän syslog-palvelua - WCLLIB:in ISO Log-palvelua ei toistaiseksi käytetä.
Tietokantaoperointeihin liittyvät yleisesti seuraavat toiminnot:
1) tietokannan osien siivous arkistotiedostoiksi. T3 -toimitukseen mennessä siivous toteutetaan ainoastaan mittaustietokantaosalle,
2) tietokannan osiin palautus arkistotiedostoista. Tätä piirrettä ei toistaiseksi toteuteta sovellukseen,
3) siivousarkistotiedostojen verifiointi. Tätä piirrettä ei toteuteta sovellukseen, koska käytettävä tietokannan hallintajärjestelmä Oracle ei tue moista piirrettä,
4) tietokantavarmistukset,
5) tietokannan tilan lähes reaaliaikainen seuranta.
Tietokantasiivous
Koska esimerkiksi GSM-verkossa suoritettavat mittaukset tuottavat paljon tietokannan mittausosaan talletettavia tapahtumia, on kannan ko. osaa syytä siivota kannan tauluille varatun tilan täyttymisen estämiseksi. Siivousoperaatiota käynnistettäessä DBRMUI kysyy käyttäjältä kriteereitä, joiden pohjalta kannan mittausosan tauluista poistetaan rivejä. Kysyttävät kriteerit ovat paljolti tietokantaosakohtaisia mikäli muitakin kantaosia otetaan siivouksen piiriin.
Siivouksen ja samalla myöskin arkistosta palautuksen osalta DBRMUI toimii tavallaan käyttöliittymänä eri sovellusryhmien tietokantasiivousta varten tuottamille ohjelmille/luokille. Käyttöliittymässä kysyttävät asiat muunnetaan siivousohjelmien/-luokkien parametreiksi ja siivousohjelmalta puolestaan saatu paluustatus muutetaan käyttäjälle ymmärrettäväksi ilmoitukseksi. Kutsurajapinta kullekin tietokannan osan siivoukselle sovitaan asianomaisen sovellusryhmän kanssa erikseen. Jatkossa rajapintaa koskevia asioita on käsitelty tietokannan mittausosan tarpeista lähtien, koska tämä kannan osa on rakenteellisesti ja siivoustarpeiden osalta monimutkaisin. Lisäksi mittaustietokantaosan siivous toteutetaan sovellukseen ensiksi kaikista mahdollisista siivouksista. Samalla pyritään antamaan muille sovellusryhmille esimerkki, jonka mukaan toimia ja samassa yhteydessä pyritään ratkaisemaan jo valmiiksi mahdollisimman monia muiden kantaosien siivouksen yhteydessä mahdollisesti eteen tulevista ongelmista.
Tietokannan mittausosan tapauksessa käyttäjältä kysytään seuraavia kriteereitä siivoukselle:
mittaustyyppi kysytään käyttäjälle ymmärrettävässä formaatissa esim. BSC Handover Measurement -mittaus. Käyttäjä voi valita samanaikaisesti myös useita mittaustyyppejä taikka vaikkapa kaikki mittaustyypit, joita näytöllä on "Measurement Type" -scrolled listassa valittavana. Riippuen "Measurement Database Cleanup" -dialogin togglen raw/day/week/month valinnasta on mittaustyyppilistassa valittavana ainoastaan "raaka dataa", päivittäisiä yhteenvetoja, viikottaisia yhteenvetoja taikka kuukausittaisia yhteenvetoja. Lisäksi riippuen siivouskriteereiksi poimituista verkkoelementeistä ainoastaan näihin liittyviä mittaustyyppejä voidaan valita listasta.
aikaväli esimerkiksi muodossa yyyymmddhhmm - yyyymmddhhmm "raakadatan" tapauksessa. Tämä aikaleimaväli menee itse asiassa siivousluokalle siivousparametriksi; käyttäjältä asiaa kysytään graafisessa päivämäärän/kellonajan asetusdialogissa. Muiden mittaustyyppien kohdalla aika- arvot välitetään seuraavissa muodoissa käyttöliittymästä siivousluokalle:
- day: yyyymmdd,
- week: yyyy----mm--; tämä tarkoittaa sitä että minuuttikentässä välitetään viikon numero PDARCH-kirjastolle,
- month: yyyymm.
Siis toistaiseksi käyttöliittymässä on minuuttikentässä syötettävä myöskin viikon numero.
verkkoelementit tähän voidaan valita GSM-verkon mitkä tahansa BSC- /HLR-/MSC-luokkiin kuuluvat verkkoelementit. Valinta tehdään yleiskäyttöisen "Managed Object" -dialogin avulla.
kopiointityyppi kertoo sen, onko kysymyksessä pelkkä kopiointi kannasta, vaiko tyhjätäänkö kannasta kopioidut rivit samalla ao. tauluista kopioinnin jälkeen. Tässä yhteydessä on mahdollista määritellä myöskin, että ao. rivit poistetaan kannasta muttei kopioida mihinkään. Oletusarvo operaatiolle on kopiointi, koska se on käyttäjän kannalta turvallisin vaihtoehto.
tallennuspaikka kertoo minkä nimiseen hakemistoon talletukset tehdään;
yhden siivouksen aikana voi nimittäin syntyä useita siivousarkistotiedostoja. Siivoushakemisto luetaan konfigurointitiedostoista; jos niissä siivouspaikkaa ei ole määritelty, viedään siivoustulokset oletusarvoisesti /tmp -hakemistoon. Varsinaisen yksittäisen siivoustiedostonimen osalta sovelletaan seuraavaa nimeämiskäytäntöformaattia: <verkkoelementin tyyppi> . <verkkoelementin systeemitunniste> . <mittaustyyppi> . <alkuaika> . <loppuaika> .
Varsinaisia siivousarkistotiedostoja muodostuu siivoushakemistoon niin monta kappaletta kuin saadaan kombinoimalla valitut verkkoelementit niitä vastaaviin valittuihin mittaustyyppeihin.
Mittaustietokantaosan siivouksen toteutus on kuvattu tarkemmin lähteessä /6/.
Em. tiedostonimikäytäntö on tietokantaosakohtainen. Lisäksi on huomioitava, että siivouksen yhteydessä saattaa syntyä käsiteltävän tietokantaosan osalta useita siivousarkistotiedostoja.
Tiedostoon siivoamisen tapauksessa DBRMUI-sovellus ei ota kantaa siihen, mitä arkistotiedostolle tapahtuu sen luomisen jälkeen. Jos se halutaan nauhalle talteen, on homma hoidettava käsin Unix:in komentotulkista.
Tietokannan varmistus
On-line tietokannan varmistus voidaan suorittaa vastaavaan Off-line kantaan. OMC:n Top Level User Interface voi olla käynnissä varmistuksen aikana. On-line -varmistuksen tapauksessa käynnistetään samainen skripti, joka huolehtii Off-line kantaan varmistuksista cron:sta käsin kerran vuorokaudessa.
Verkkotietokannan tilan seuranta
Tietokantasiivoukseen liittyy läheisesti OMC:ssä olevien eri tietokannan osien tilankäytön seuranta. DBRMUI:ssa operaattori voi seurata tietokannan osien lähes reaaliaikaisia täyttöasteita graafisten esitysten avulla. Käyttäjä näkee toistaiseksi hälytys- ja mittaustietokantaosien täyttöasteet kuvakkeina; täyttöaste perustuu puhtaasti tauluille arvioituun maksimaaliseen käytettyjen rivien lukumäärään verrattuna taulun viimeksi laskettuihin käytettyihin riveihin. Kunkin tietokannan osan täyttöastemittari kertoo ko. osan täysinäisimmän taulun viimeksi lasketun tilanteen. Toiminta perustuu oleellisesti GSM_DB_INFO -taulun tietojen oikeellisuuteen. Tietokannan yksittäiseen tauluun mahtuvien rivien lukumäärä lasketaan spysizmx.sh -skriptillä (skriptin toiminta on kuvattu tarkemmin dokumentissa /3/).
Täyttöastelaskennassa käytetyt valvottavien taulujen käytettyjen rivien lukumäärät lasketaan GSM_DB_INFO -tauluun valmiiksi DBRMUI -sovelluksen käyttöön spyanamx.sh -skriptillä cron:sta käsin - spyanamx.sh -skriptin käynnistysajat selviävät omc-käyttäjän cron-tiedostosta. Sovelluksesta voidaan myöskin käynnistää näiden käytettyjen rivien uudelleenlaskenta kaikille valvottaville tauluille tai ainoastaan kopioida nämä valmiiksi lasketut arvot uudestaan sovelluksen käyttöön. Käyttöliittymässä kunkin täyttöastetiedon yhteydessä esitetään myöskin ajankohta, jolloin täyttöasteeseen liittyvät valvottavien taulujen käytettyjen rivien lukumäärät laskettiin viimeksi GSM_DB_INFO -tauluun spyanamx.sh -skriptillä.
Ohjelman pääikkunan Watch-togglevalinnalla voidaan ohjelma viedä myöskin moodiin, jossa se aika ajoittain tarkistaa tietokannan päälläolon. Tulos tarkistuksesta esitetään pääikkunassa.
4.3. Ohjelman dynaaminen malli
Ohjelman dynaamista mallia ei tässä yhteydessä esitetä. Dynaamista käyttäytymistä esiintyy ohjelmassa erityisesti seuraavissa toiminnoissa:
Mittaustietokantaosan siivouskriteerit on ensin asetettava ja sitten päästään siivoamaan. Lisäksi "Copy & Clean"- ja "Clean" -operaatioissa kysytään asialle vahvistus.
Mittaustietokantaosan siivousnäytön "OK"-nappi on insensitiivinen, jos siivouskriteereissä on jotain vialla. Esimerkiksi annetut aika-arvot voivat olla keskenään ristiriidassa taikka verkkoelementtejä/mittaustyyppejä ei ole valittu riittävästi.
Sovelluksella on myöskin kaksi tilaa sen suhteen, seurataanko tietokannan päälläoloa vai ei (Watch-toggle).
Sovelluksen ja siihen liittyvän Help-sovelluksen keskinäinen toiminta.
spyanamx.sh -skriptin ja DBRMUI -sovelluksen yhteistoiminta - edellisen on täytynyt laskea valvottavien taulujen käytettyjen rivien lukumäärät GSM_DB_INFO -tauluun jotta jälkimmäinen voisi niitä sieltä käyttää.
5. TIETOLIIKENNERATKAISUT
Ei varsinaisia tietoliikenneratkaisuja. Jatkossa WCLLIB:in ISO Log-piirre käyttää hyväkseen tietoliikennettä, mutta se ei näy tämän sovelluksen sisäisessä implementaatiossa.
5.1. Muut prosessin ulkoiset liittymät
Mikäli tietokantasiivousoperaatiot toteutetaan erillisinä ohjelmina, tulee DBRMUI:hin luonnollisesti kutsurajapinnat näihin ohjelmiin. Kutsun yhteydessä välitetään sopivat siivousparametrit ohjelmille ja ohjelmien paluustatukset tarkistetaan kutsusta palattaessa DBRMUI:ssa. Toinen vaihtoehto siivousoperaatioiden toteuttamiseksi on käyttää C++:n luokka-abstraktiota.
Tietokannan varmistus/valvottavien taulujen käytettyjen rivien lukumäärän laskenta suoritetaan nykyisellään erillisillä shell-script -ohjelmilla. Ensin mainittu ohjelma käynnistetään dbrmuimx-sovelluksen lapsiprosesseiksi Unix:in popen()-pclose() -mekanismia käyttäen ja viimeksi mainittu ohjelma käynnistetään joko system() -systeemikutsulla (dbrGsmDbInfo_c::RunSpyAnaSilent()) tai popen() -systeemikutsulla (dbrGsmDbInfo_c::RunSpyAnaNonSilent()) myöskin DBRMUI:n lapsiprosessiksi.
6. TIETOVARASTOT
6.1. Relaatiotietokannan käyttö
Tietokantaosien täyttymisasteen hallintaan DBRMUI-sovellus käyttää kannassa olevaa GSM_DB_INFO -taulua. Sen kukin rivi kuvaa yhden mahdollisesti valvottavan taulun tietoja ja rivin TABLE_SIZE -sarake kertoo tauluun mahtuvan maksimirivimäärän. Tämä lasketaan spysizmx.sh -ohjelmalla (tarkemmin dokumentissa /3/). Saman rivin sarake USED_ROWS kertoo taulun käytettyjen rivien lukumäärän, joka on laskettu ajankohtana, joka on rekisteröity saman rivin TIME_STAMP -sarakkeeseen.
dbrmuimx-sovellus valvoo niitä tauluja, jotka on GSM_DB_INFO -taulussa mainittu ja joita kuvaavien rivien DBRMUI_ENABLE -sarake sisältää arvon 1. Tätä joukkoa voidaan vieläkin pienentää konfigurointitiedostomäärityksillä, mutta tätä ei suositella käytettäväksi T3 asiakastoimituksissa.
Ajon aikana DBRMUI käyttää valvottavan taulun käytettyjen rivien lukumäärätietona oletusarvoisesti GSM_DB_INFO -tauluun valmiiksi spyanamx.sh -skriptillä laskettua arvoa (skriptin toiminnasta löytyy tarkempaa tietoa lähteestä /5/) - samainen skripti rekisteröi ajoajankohtansa ao. rivin TIME_STAMP -kenttään. Vertaamalla laskettua käytettyjen rivien lukumäärää rivien maksimilukumäärään saadaan selville ko. taulun lähes reaaliaikainen täyttöaste. Tietokantaosakohtaisesti näytetään käyttäjälle osan pahiten täyttyneen taulun tilanne viimeiseltä sen käytettyjen rivien lukumäärän laskemisajankohdalta. Sovelluksen sisällä lasketaan myöskin koko tietokannan täyttöaste samalla periaatteella, mutta toistaiseksi tätä ei näytetä käyttäjälle käyttöliittymässä.
Sovelluksen käsittelemät mittaustyypit haetaan mittaustietokantaosan taulusta P_PM_TABLES. Lähinnä sovellus on kiinnostunut kunkin mittaustyypin numerosta, nimestä, tyypistä (= raw/day/week/month) ja siihen liittyvästä verkkoelementtiluokasta. Viimeisen tiedon nojalla voidaan "Measurement Database Cleanup" -dialogissa valitut verkkoelementit yhdistää niitä vastaaviin mittaustyyppeihin.
6.2. Omien tiedostojen käyttö
DBRMUI:n käyttäytymistä voidaan säädellä sekä käyttäjäryhmäkohtaisen profiilitiedoston että globaalin/käyttäjäkohtaisen konfigurointitiedoston avulla. Näiden kaikkien syntaksi ja semantiikka ovat samat. Eroina ko. tiedostojen käsittelyille ovat seuraavat asiat:
Kuka voi muuttaa niiden sisältöjä.
Ketä niissä mainitut asetukset koskevat.
Miten niiden asetukset asetetaan voimaan.
Käyttäjäkohtaista konfigurointitiedostoa voi käyttäjä itse muuttaa käsin jollain ASCII-editorilla. Globaali konfigurointitiedosto on ainoastaan OMC:n System Operator -käyttäjän muutettavissa. Profiilitiedosto on myöskin vain System Operator:in muutettavissa.
Konfiguraation asetus ohjelmaa käynnistettäessä tapahtuu siten, että ensin asetetaan globaalit konfiguroinnit voimaan ja heti tämän jälkeen käyttäjäkohtaiset, jos niitä on (myöskin globaali konfigurointitiedosto voi puuttua). Ennen konfigurointien voimaanastumista asetetaan voimaan profiilitiedoston asetukset käyttäjän ryhmän perusteella. Profiilitiedoston asetukset ovat siinä mielessä rajoittavia, että jos profiilissa esimerkiksi kerrotaan, ettei seurata jonkin tietokantaosan tilannetta, ei tätä asetusta pystytä globaalissa/käyttäjäkohtaisessa konfigurointitiedostossa kumoamaan. Kappaleessa 2.1.1. on kerrottu, missä mikin em. tiedostoista sijaitsee.
Alla on esimerkki siitä, mitä tietoja käyttäjäkohtaisessa konfigurointitiedostossa voisi olla - itse asiassa ao. esimerkissä on lueteltu kaikki mahdolliset entryt, mitä tiedostoihin voi kirjoittaa, mutta osa niistä on vain kommentoitu ulos määrityksistä. Samasta esimerkistä selviää myöskin käytetyt avainsanat ja syntaksi.
# ***********************************************************************
#
# $RCSfile$
#
# ***********************************************************************
#
# $Author$
#
# Copyright (c) Nokia Telecommunications 1991, 1992, 1993
# ***********************************************************************
#
# This is just a model configuration file for dbrmuimx-application.
#
# ***********************************************************************
#
# $Log$
#
# ***********************************************************************
#
# $Id$
#
# ***********************************************************************
(database
# (database_part
# (name FM)
# (table
# (name F_ALARM)
# (follow TRUE)
# )
# )
(database_part
(name PM)
(cleanup_file_path /tmp)
# (follow TRUE)
)
# (follow TRUE)
(database_backup_prg "${OMCROOT}/lib/script/dbrshstbackmx.sh \
${OMCROOT}/lib/script/dbbackmx.sh -s -v' /tmp/dbrmuimx.backup")
# It is possible to use environment variables in DB
# backup program name in the form:
# ${VARIABLE_NAME}. They are expanded in the parsing
# phase. If the variable is not defined, then it is
# replaced by empty string ("").
# (database_check_interval 300)
# DB check interval is in seconds!
)
"database_backup_prg" -avainsanalla alkava rivi on poikkeuksellisesti katkaistu MS-Word -ohjelman rajoituksista johtuen, mutta todellisuudessa niissä kerrotut asiat tulee olla samalla rivillä.
Samoja asioita kuin mitä em. esimerkissä oli lueteltuna voi olla myös profiilissa/globaalissa konfigurointitiedostossa. Ko. tiedoston selaus ja jäsennys hoidetaan lex:in ja yacc:in avulla. Tiedostoihin saattaa tulla jatkossa lisää asetuksia.
Lex:in vaatimat selausmääritykset ovat tiedostossa dbrconfig__mx.lex ja Yacc:in vaatimat jäsennysmääritykset tiedostossa dbrconfig__mx.y. Yacc:sta C++-koodi generoidaan siten että samalla generoituu tiedosto y.tab.h, jossa on define-määritykset symbolisille token-nimille.
Tiedostossa dbrconfig__mx.y on lisäksi useita konfigurointitiedoston jäsentämisessä apuna käytettyjä globaaleita/staattisia funktioita, joiden toiminta selviää ao. kommenteista ja katselemalla vastaavaa koodia em. tiedostossa.
DBRMUI:ssa on käytössä NMS-sovelluksissa yleisesti käytetty Help-toteutus. Tähän liittyvät kontekstitiedosto (.hco), indeksitiedostot (.hin) ja help-tiedostot (.hlp) löytyvät jäädytettyinä dbrmui-alijärjestelmän RCS-versionhallintahakemistosta. Samasta hakemistosta löytyy myöskin sovelluksen ikoniin liittyvä bitmap-tiedosto dbrmuimx.bm.
7. YLLÄPITOVINKIT
7.1. Profiili-/konfigurointitiedostojen formaatin muuttaminen
Koska näiden tiedostojen rakenne on kuvattu lex- ja yacc-spesifikaatioina, on niiden syntaksin muuttaminen erityisen helppoa. Lex-kuvaus kuvaa selattavat alkiot ja yacc-kuvaus kieliopin. Tärkeintä on huolehtia siitä, että yacc:in sisältämästä koodista tehdään oikein jäsennettyjen tietojen tallennus lopuksi ao. sovellusluokkiin ko. tietojen eri formaatit huomioiden.
7.2. Käytettyjen tietokantataulujen rakenteiden muutokset
Jos DBRMUI-sovelluksen käyttämiin tauluihin lisätään uusia sarakkeita tai ko. tauluista poistetaan sarakkeita, joita DBRMUI ei käytä, ei sovelluksen koodiin tarvitse koskea lainkaan. Tämä johtuu siitä, että kaikissa sovelluksen "SELECT"-lauseissa luetellaan eksplisiittisesti ne kentät, joita halutaan ohjelman muuttujiin lukea.
8. JATKOKEHITYSIDEAT
8.1. Meas.DB -dialogin ikonoinnista ja skrollausaskeleesta
T5 IT:stä on tullut otsikon mainitsemiin asioihin liittyen kaksi NOK-virhettä:
| From itest11@tre.tele.nokia.fi Wed Sep 7 15:28 EET 1994 Date: Wed, 7 Sep 1994 15:28:14 +0300 Message-Id: <199409071228.paa22690@hera.tele.nokia.fi> To: bugs-NNSYS@tre.tele.nokia.fi Cc: bugs-interest@tre.tele.nokia.fi, akontiai@tre.tele.nokia.fi Subject: NOK state report from IT-lab From: akontiai@tre.tele.nokia.fi Reply-To: akontiai@tre.tele.nokia.fi Responsible : NNSYS Release : T4.3-12_GDFE Project : DEFE IT T4 Test set : Other Error Test case : E013 Minimize doesn't work correctly Erroneous block : dbrmui Error source : WS Description: Tested 1994.09.07 15:28:14 by akontiai with status: NOK. When Measurement Database dialog is open and Database Functions application is minimized, the Measurement Database dialog is not minimized. |
| From itest11@tre.tele.nokia.fi Wed Sep 7 14:39 EET 1994 Date: Wed, 7 Sep 1994 14:39:50 +0300 Message-Id: <199409071139.oaa17294@hera.tele.nokia.fi> To: bugs-NNSYS@tre.tele.nokia.fi Cc: bugs-interest@tre.tele.nokia.fi, akontiai@tre.tele.nokia.fi Subject: NOK state report from IT-lab From: akontiai@tre.tele.nokia.fi Reply-To: akontiai@tre.tele.nokia.fi Responsible : NNSYS Release : T4.3-12_GDFE Project : DEFE IT T4 Test set : Other Error Test case : E012 Should scroll bar really work this way? Erroneous block : dbrmui Error source : WS Description: Tested 1994.09.07 14:39:48 by akontiai with status: NOK. I believe, that scrolling in Measurement Database dialog works incorrectly. Now, clicking to arrow (in both ends) and the area between arrows scroll the list of table information same way. However I believe, that it should work like: 1. clicking an arrow scrolls "one table" up or down. 2. clicking the area between arrows scrolls "windowful of tables". |
8.2. Meas. DB -dialogin scrollbar:in nuolinäppäinten käyttäytymisestä
Nykyisellään painettaessa nuolinäppäintä Meas. DB -dialoginäytön pystysuorasta scrollbar:sta tapahtuu vierittäminen koko ikkunallisen kerrallaan. Olisi toivottavaa, että vieritettävän alueen koko olisi yhden mittaustyypin täyttöastetietojen varaama tila.
Asian voi ratkaista kahdella hyvinkin työläällä tavalla:
1. Luovutaan ko. scrollbar:in automaattiominaisuuksien käytöltä (automatic scrolling policy) ja otetaan itse kiinni kaikki ko. scrollbar:iin kohdistuvat tapahtumat ja huolehditaan scrollauksesta. Tällöin pitää esim. laskea itse scrollbar:in slider-osan leveys.
2. Käytetään apuna M. Myllymäen widget-browser -luokkaa, jossa itse asiassa näytetään dialogissa n. kpl scrollattavia widgettejä peräjälkeen. Toiminta perustuu siihen, että mitään piilossa olevia widget:ejä ei ole vaan näytettävien widgettien tekstisisällöt vaihtuvat skrollauksen yhteydessä. Tätä piirrettä käytetään esim. Alarm History -sovelluksessa. Asiakkaalle näytettävä scrollbar ei itse asiassa ole mikään oikea Motif-scrollbar vaan sitä simuloimaan tehty oma toteutus.
8.3. Printtauspalvelun käyttöönotto DBMUI:ssa
Tästä asiasta on päällä seuraava "jatkokehitysidea"-VISE:
| Failure Report Number: 39320 Treatment: N 8.4. Week-moodin sisällyttäminen Day-Time Setting -dialogiinTästä on päällä yksi meidän sisäinen VISE (Fault Report nbr. 27048) ja yksi asiakas-VISE (Fault Report nbr. 39195). 8.5. Näytettävien verkkoelementtityyppien konfigurointiNykyinen versio DBRMUI:sta ei osaa näyttää MOI Browser selaajassa muita kuin tyyppiä BSC, MSC ja HLR olevia verkkoelementtejä. SM-OS:llä on tarve käyttää näiden sijaan tyyppejä DX220, DX210 ja DXRSU. Tähän tehdään aluksi sellainen välttävä ratkaisu että sovellus näyttää näiden kaikkien tyyppien mukaisia verkkoelementtejä. Ratkaisu olettaa että SM-OS käyttää vain tyyppejä DX220, DX210 ja DXRSU ja me vain tyyppejä BSC, MSC ja HLR. Näin sama sovellus toimii halutulla tavalla molemmissa ympäristöissä. Elegantimpi ratkaisu tähän olisi määritellä sallitut verkkoelementtityypit profiilitiedostossa. Tähän vaadittava työmäärä on välttävään ratkaisuun nähden moninkertainen. Profiilitiedostossa voisi olla seuraavankaltainen entry: (cleanup_object_classes "BSC MSC HLR") Ratkaisu eliminoisi mahdollisuuden näyttää vääränlaisia verkkoelementtejä jossakin ympäristössä. Esim. SM-OS:n olorin-koneen kannassa on nykyään BSC-tyyppisiä objekteja jostain kumman syystä. Toisaalta tässä ratkaisussa sama geneerinen sovellusrunko käy edelleen. 8.6. Selektiivinen/automaattinen RecountNäihin ominaisuuksiin liittyy IT-labrasta T6 integrointitestauksessa saatu NOK E022. Sen mukaan DBRMUI:ssa pitäisi olla seuraavat ominaisuudet: Recount voitaisiin kohdistaa yhteen tauluun. Siivouksen jälkeen tehtäisiin Recount automaattisesti tai konfirmaatiodialogin kautta. Jälkimmäisen ominaisuuden voisi tehdä konfiguroitavaksi s.e. profiilitiedostossa olisi attribuutti recount_after_cleanup, jolle olisi seuraavat arvot mahdollisia: NO, YES, CONFIRM. Recount:ia ei tietenkään ole järkevää tehdä Copy-operaation jälkeen. 8.7. Main OMC -konseptin vaatimat muutoksetMain OMC eroaa tavallisesta OMC:sta DBRMUI:n kannalta siten, että Main OMC:ssä ei ole lainkaan PM-tauluja. Jotta DBRMUI saataisiin toimimaan ko. installaatiossa järkevästi tarvitaan ainakin seuraavat muutokset sovellukseen: 1. PM cleanup -dialogia ei saada auki jolloin PM kantaa ei pysty sovelluksesta siivoamaan. Tämä voitaisiin sanoa profiilitiedostossa seuraavasti:
(measurement_cleanup "NO") # Other possible value is YES! 2. Sovellus kykenee toimimaan myös ilman P_PM_TABLES taulua. Tästä voi aiheutua jonkin verran työtä koska kaikki keskeiset sovelluksen SQL-lauseet viittaa tähän tauluun. Profiilitiedostoa voitaisiin käyttää tässä hyväksi siten että sieltä löytyisi entry: (Main_OMC "NO") # Other possible value is YES! joka itse asiassa tekee tarpeettomaksi kohdassa 1. esitetyn entryn eli tämä entry konfiguroisi sekä kohdan 1. että kohdan 2. Sovelluksen SQL-lauseet täytyy rakentaa huomioiden tämän entryn arvon. Kohdan 2. toteuttaminen voitaisiin sivuuttaa, jos Main OMC:n tietokantaan luodaan tyhjä P_PM_TABLES -taulu jonka rakenne on oikean P_PM_TABLES -taulun mukainen. Tällöin sovellus toimii jo nyt oikein. 8.8. Sovelluksen starttivaiheen nopeuttaminenTätä voisi tutkia quantify-työkalulla tarkemminkin. Jo nyt on tiedossa seuraava tapa saada starttia nopeammaksi: kun luokan dbrDbPartFull_c mukaisen olion konstruktorissa luodaan GSM_DB_INFO -taulun sisällön pohjalta lista ko. tietokantaosan sisältämistä tauluobjekteista (luokan dbrTableFull_c mukaisia) on näiden tauluobjektien konstruktoreissa turhaa tarkistaa onko ko. taulu GSM_DB_INFO -taulussa mainittuna. Näin kuitenkin tapahtuu koska konstruktorista dbrTableFull_c kutsutaan metodia dbrMask_c::IsCalculated() ko. taululle, joka puolestaa kutsuu metodia dbrMask_c::TableDisabled(), jonka sisällä tässä tapauksessa kutsutaan turhaan metodia dbrGsmDbInfo_c::TableIsInGSM_DB_INFO(). Ratkaisuna ongelmaan on lisätä ylimääräinen parametri IsInGSM_DB_INFO konstruktoriin dbrTableFull_c(); ko. parametrin oletusarvo on (boolean_t)F eli pyritään säilyttämään vanha toiminnallisuus ennallaan. Ko. parametrin arvo kuljetetaan sitten aina metodiin dbrMask_c::TableDisabled() asti, joka arvon perusteella käy tsekkaamassa taulun olemassaolon GSM_DB_INFO -taulussa tai jättää sen väliin. Optimoidussa softassa IsInGSM_DB_INFO:lle annetaan siis arvo (boolean_t)T kun taulun olemassaolo GSM_DB_INFO -taulussa tiedetään varmasti. 9. HYLÄTYT TOTEUTUKSET9.1. Täydellisen UIL:n (=User Interface Language) toteutusJotta siivouskriteerilomake olisi mahdollisimman dynaaminen ja konfiguroitavissa tiedoston avulla, tulee ko. tiedoston kuvata lomake melko täydellisesti. Miten esimerkiksi sanotaan se, että yksi kriteeri on verkkoelementtitunnusjoukko, joka voidaan valita verkkoelementtiselaajan avulla. Ehkä voitaisiin kuvata, että tässä kohden käyttöliittymää on nappi, jonka kautta selaaja käynnistyy, mutta koska selaaja itse on hyvin meidän tarpeisiin räätälöity, miten se kuvattaisiin. Eräs mahdollisuus olisi kertoa UIL-kuvauksessa tässä yhteydessä vain funktionimi, jonka kutsu aktivoi selaajan ja tuloksena palautuu joukko verkkoelementtien systeemitunnisteita. Homma menee joka tapauksessa vaivalloiseksi näin nopean aikataulun puitteissa. Alkuvaiheessa UIL piirrettä ei käytetä hyväksi toteutuksessa lainkaan. 9.2. DBKEEP-sovelluksen käyttöSeuraavassa on esitetty, miten DBKEEP-taustasovellus suunniteltiin integroitavan DBRMUI:hin käyttäen Unix:in socket:eihin perustuvaa tietoliikennepalvelua. Koska DBKEEP:iä ei koskaan toteutettu, kaikki sen käyttöön pohjautuvat suunnitelmat menevät hylättyjen toteutusten piikkiin. DBKEEP:llähän oli tarkoitus valvoa tietokannan päälläoloa ja kohdistaa siihen managerointioperaatioita (tietokannan alas-/ylösajo, tietokannan uudelleenkäynnistys). DBRMUI kommunikoi DBKEEP:iin päin käyttäen hyväkseen Unix:in socket-kommunikointirajapintaa (tarkemmin myöhemmin). Seuraavassa esitetään tämän socket-pohjaisen kommunikoinnin tavallisimmat sanomasekvenssit tapahtumakaavioina. Mahdollisia virhetilanteita ei ole kuvattu kaavioissa. Tarkempi kuvaus kyseisestä protokollasta löytyy kappaleesta 9.3., josta löytyvät myös käytettyjen sanomien sisältöjen/formaattien kuvaukset. Jos DBRMUI lähettää komentosanoman DBKEEP:lle eikä halua siihen vastetta (tarkemmin myöhemmin), voidaan tapahtuvaa sanomanvaihtoa kuvata seuraavalla tapahtumakaaviolla:
Jos taas DBRMUI haluaa vasteen DBKEEP:ltä tietokantaoperaation onnistumisesta, voidaan sanomanvaihtoa kuvata seuraavalla tapahtumakaaviolla:
Socket-pohjaista kommunikointia DBKEEP:iin päin ei esitetä tässä tilakaaviona ratkaisun yksinkertaisuuden vuoksi. 9.3. Ohjelman lähettämien/vastaanottamien sanomien kuvauksetKoska DBRMUI:n toteutuksen yhteydessä hylättiin koko DBKEEP-konseptin käyttö, on suunnitellut sanomaformaatit siirretty tämän dokumentin varsinaisesta suunnitteluosuudesta tähän hylättyjen toteutusten luetteloon. 9.3.1. DBKEEP:lle/ltä lähetettävien/vastaanotettavien sanomien kuvauksetDBKEEP:iin päin kommunikointi hoidetaan Unix:in socket-palvelua käyttäen. Socket-tietoliikennerajapinta tarjoaa mm. luotettavan sanomien järjestyksen takaavan kaksisuuntaisen yhteyden Unix-prosessien välille tavujonojen lähettämiseksi. Palvelua on tällöin käytettävä ns. Stream-moodissa (eikä siis Datagram-moodissa). DBKEEP:lle lähetettävän komentosanoman muoto on seuraava:
missä vaste = (unsigned char)0 = vastetta ei haluta sanomako- mentoon, (unsigned char)1 = vaste halutaan komentoon, vaste kertoo käynnistetyn operaation onnistumi- sen, sanomakomento = "SHUTDOWN" tai "SHUTDOWN IMMEDIATE" tai "SHUTDOWN ABORT" tai "STARTUP" tai "RESTART" (kaikki em. merkkijonot päättyvät loppu-NULL:iin). Jos viimeksi lähetetyn komentosanoman vaste-kenttä oli (unsigned char)1, on DBKEEP:ltä odotettavissa toiminnan loputtua onnistumissanoma, jonka muoto on seuraava:
missä onnistumisstatus = tyypiltään int. 0 tarkoittaa, että toimenpide onnistui, 0:sta poikkeavat arvot raportoivat epäonnistumisesta (virhekoodit sovitaan DBKEEP:in tekijän kanssa), onnistumisteksti = esim. "OK" tai "SHUTDOWN COMPLETED". NULL:iin loppuva mv. merkkijono, joka voidaan tarvit- taessa näyttää käyttäjälle. Voisi olla esimerkiksi suoraan tietokannan hallintajärjestelmältä saatu ilmoitus operaa- tion päätyttyä.
Tietokannan alasajo voidaan siis suorittaa kahdella tavalla: 1. DBKEEP:lle lähetetään alasajosanoma ilman vastepyyntöä ja ollaan tyytyväisiä (vaikka alasajo ei olisikaan vielä käynnistynyt), 2. tehdään kuten kohdassa 1., mutta vastekentän arvo onkin nyt 1. Tällöin DBRMUI alkaa odottelemaan DBKEEP:ltä alasajon valmistumissanomaa, joka kertoo varsinaisen operaation onnistumisen. Ensimmäisen vaihtoehdon tapauksessa voidaan olla varmoja vain siitä, että DBKEEP vastaanotti alasajokomennon - jälkimmäisessä tapauksessa saadaan lisäksi jotain tietoa siitä, miten varsinaisessa alasajossa kävi. 9.4. Oman protokollan toteutus DBKEEP:iin päinKoska HP-UX:n verkkopalvelut sisältävät socket-kirjastorutiinikutsut, jotka takaavat luotettavan kommunikoinnin kahden Unix-prosessin välillä, hylätään WNELIB:iin pohjautuva epäluotettava sanomanvälitys DBKEEP:iin päin. Siltä varalta, että WNELIB:in käyttöä joudutaan tulevaisuudessa uudelleenarvioimaan, on tähän pohjautuva ratkaisuehdotus kirjattu seuraavissa luvuissa. Jälkikommenttina todettakoon, että koko DBKEEP-sovelluksen käyttö on hylätty DBRMUI:n toteutusvaiheessa. 9.4.1. Ohjelman dynaaminen malli WNELIB:iä käytettäessä Tässä ratkaisuehdotelmassa DBRMUI kommunikoi DBKEEP:iin päin käyttäen hyväkseen WNEMGR:in sanomanvälityspalvelua ja erityistä protokollaa, jonka tavallisimmat sekvenssit kuvataan tässä tapahtumakaavioina. Kaavioissa ei ole kuvattu mahdollisia virhetilanteita. Tarkempi kuvaus kyseisestä protokollasta löytyy kappaleesta 9.4.2.1., josta löytyvät myös käytettyjen sanomien sisältöjen/formaattien kuvaukset. Jos DBRMUI lähettää komentosanoman DBKEEP:lle eikä halua siihen vastetta (tarkemmin myöhemmin), voidaan tapahtuvaa sanomanvaihtoa kuvata seuraavalla tapahtumakaaviolla:
Jos taas DBRMUI haluaa vasteen DBKEEP:ltä tietokantaoperaation onnistumisesta, voidaan sanomanvaihtoa kuvata seuraavalla tapahtumakaaviolla:
9.4.1.1. DBKEEP-protokollan esitys tilakaavionaWNELIB:iin pohjautuva kommunikointi DBKEEP-taustasovellukseen toteutetaan WNEMGR:n tietoliikennepalveluita käyttäen ja näiden palveluiden päälle rakennetaan oma pieni protokolla, jonka kuvaus tilakaavion avulla on seuraavanlainen (DBKEEP-protokolla on kuvattu tarkemmin luvussa 9.4.1.):
Kuvaan ei ole merkitty toimintaa eri virhetilanteissa, jottei siitä tule liian monimutkaista. Sen sijaan virhetilanteet kuvataan seuraavassa sanallisesti: Merkittäköön eri tiloja seuraavasti: A = Message Building and Sending, B = Ack Waiting, C = Ack Checking, D = Ack Checking and Completion Waiting, E = Final Response Handling. Tällöin eri tiloissa mahdollisesti vastaantulevat virheet ovat seuraavat: A: - lähetys ei onnistu: i) paluustatus indikoi fataalia virhettä => ilmoitus "Sanomapalvelu nurin" ja poistutaan ohjelmasta, ii) virhe ei ole fataali ja lähetyskertojen lkm < MAX_LÄHETYSKERTOJEN_LKM => yritetään uusintalähetystä, iii) virhe ei fataali mutta lähetyskertojen lkm >= MAX_LÄHETYSKERTOJEN_LKM => ilmoitus "Ei yhteyttä DBKEEP:iin" ja poistutaan ohjelmasta. B: - ajastin laukeaa ilman että saadaan kuittausta: i) lähetysyrityksiä < MAX_LÄHETYSKERTOJEN_LKM => mene A-kohtaan lähettään uudestaan, ii) lähetysyrityksiä >= MAX_LÄHETYSKERTOJEN_LKM => ilmoitus "Tietokanta menee ehkä alas" ja poistutaan ohjelmasta. - receive epäonnistuu: i) fataali virhe => toimitaan kuten edellisessä kohdassa ii), ii) ei fataali virhe & vastaanottoyritysten lukumäärä < MAX_VASTAANOTTOKERTOJEN_LKM => yritä uudestaan receive:ä, iii) ei fataali virhe & vastaanottoyritysten lukumäärä >= MAX_VASTAANOTTOKERTOJEN_LKM => toimitaan kuten kohdassa i).
C: - ack on väärä (kohdistuu johonkin muuhun sanomaan tai täysin puppua): mennään A-kohtaan lähettämään uudelleen. D: - ack:in tarkastuksessa virhe: toimitaan kuten kohdassa C. - receive-operaatio epäonnistuu: i) fataali virhe => ilmoitus "DBKEEP vastaanotti komentosanoman, muttei komennon valmistumisesta ole mitään tietoa" ja poistutaan ohjelmasta, ii) ei fataali virhe & receive_lkm < MAX_VASTAANOTTOKERTOJEN_LKM => yritetään uudelleen receive:ä, iii) ei fataali virhe & receive_lkm >= MAX_VASTAANOTTOKERTOJEN_LKM => toimitaan kuten edellisessä i) -kohdassa. E: - response-tarkistus osoittaa, että jotain meni pieleen alasajossa: statuksen perusteella käyttäjälle annetaan ao. ilmoitus. Ei tarkoita välttämättä, että kantaa ei saatu alas, vaan voi olla luonteeltaan varoitus. - response-ack:in lähetys epäonnistuu: i) fataali virhe => ilmoitus "En onnistu kuittaan vastetta DBKEEP:lle, kanta kuitenkin alhaalla" ja poistutaan ohjelmasta, ii) ei fataali virhe ja lähetyskertojen lkm < MAX_LÄHETYSKERTOJEN_LKM => yritä lähettää response-ack uudestaan, iii) ei fataali virhe & lähetyskertojen lkm >= MAX_LÄHETYSKERTOJEN_LKM => toimitaan kuten edeltävässä i) -kohdassa.
Kunkin virheen käsittelyssä oletetaan, että protokolla on toiminut tähän mennessä oikein tai tapahtuneista virheistä on kyetty toipumaan ja jatkamaan näin kommunikointia. Edellä kuvatut ilmoitukset eivät luonnollisestikaan ole niitä, joita annetaan käyttäjälle, mutta ne on kirjoitettu sen vuoksi, että ne pyrkivät antamaan informaatiota tilanteesta protokollan/tietokantaoperaation kannalta. 9.4.2. Tietoliikenneratkaisut WNELIB:iä käytettäessäDBRMUI käyttää WNEMGR:iin pohjautuvia tietoliikennepalveluita kommunikoidessaan DBKEEP-taustasovelluksen kanssa WNELIB:in avulla. DBKEEP-sovellushan huolehtii kannan varsinaisista alas-/ylös-/uudelleenkäynnistysajoista. Tähänkin jälkikommenttina todettakoon, että koko DBKEEP-konsepti on toistaiseksi hylätty käytettäväksi NMS:ssä. 9.4.2.1. DBKEEP:lle/ltä lähetettävien/vastaanotettavien sanomien kuvauksetSeuraava kuvaus liittyy hylätyn DBKEEP-konseptin wnemgr:in päälle suunniteltuun kommunikointiin. DBKEEP:iin päin kommunikointi hoidetaan WNELIB/WNEMGR:n palveluita käyttäen. Koska ko. palvelut eivät takaa sanoman häiriötöntä saapumista vastaanottajalle, tehdään DBRMUI:hin/DBKEEP:iin pieni protokolla, joka takaa sen, että kaikki DBRMUI:n DBKEEP:lle lähettämät sanomat menevät perille täsmälleen yhteen kertaan järjestyksessä. Lisäksi DBKEEP voi olla varma siitä, että sen lähettämä toimenpiteen onnistumissanoma menee perille DBRMUI:lle (tarkemmin jatkossa). Käytännössä tämä tarkoittaa kuittausmenettelyn ja sanomalaskurin käyttöönottoa. DBKEEP:lle lähetettävän komentosanoman muoto WNEMGR:ään pohjautuvassa kommunikoinnissa on seuraava:
missä sanoman numero = unsigned int väliltä 0 - UINT_MAX (määritelty /usr/include/limits.h:ssa), pyörähtää UINT_MAX:sta takaisin 0:aan, vaste = (unsigned char)0 = vastetta ei haluta sanomako- mentoon, (unsigned char)1 = vaste halutaan komentoon, vaste kertoo käynnistetyn operaation onnistumi- sen, sanomakomento = "SHUTDOWN" tai "SHUTDOWN IMMEDIATE" tai "SHUTDOWN ABORT" tai "STARTUP" tai "RESTART" (kaikki em. merkkijonot päättyvät loppu-NULL:iin). Vastaavasti DBKEEP vastaa komentosanomaan seuraavan muotoisella kuittaussanomalla:
missä viimeksi vastaanotetun komentosanoman numero = unsigned int. Kertoo viimeksi vastaanotetun komentosanoman numeron. Jos tässä kommunikointitavassa viimeksi lähetetyn komentosanoman vaste-kenttä oli (unsigned char)1, on DBKEEP:ltä odotettavissa toiminnan loputtua onnistumissanoma, jonka muoto on seuraava:
missä komentosanoman numero = paluustatuksen aiheuttaneen toimenpiteen käynnistyksen aiheuttaneen komentosanoman numero (unsigned int), onnistumissanoman numero = tyypiltään unsigned int. Periaate sama kuin komentosa- noman numeroinnissa, onnistumisstatus = tyypiltään int. 0 tarkoittaa sitä, että toimenpide onnistui; 0:sta poikkeavat arvot raportoivat epäonnistumisesta (virhekoodit sovitaan DBKEEP:in tekijän kanssa), onnistumisteksti = esim. "OK" tai "SHUTDOWN COMPLETED". NULL:iin loppuva mv. merkkijono, joka voidaan näyttää käyttäjälle. Voisi olla esimerkiksi suoraan tietokannan hallintajärjestelmältä saatu ilmoitus operaation päätyttyä.
Edelleen onnistuneesti vastaanotettu onnistumissanoma kuitataan DBKEEP:lle samoin kuin DBKEEP kuittaa komentosanoman DBRMUI:lle. Tietokannan alasajo voidaan siis suorittaa kahdella eri tavalla tämän kommunikointiratkaisun puitteissa: 1. DBKEEP:lle lähetetään alasajosanoma ilman vastepyyntöä, odotetaan kuittausta ja ollaan kuittauksen saatuamme tyytyväisiä (vaikka alasajo ei olisikaan vielä käynnistynyt), 2. tehdään kuten kohdassa 1., mutta vastekenttä onkin nyt arvoltaan 1. Tällöin DBRMUI kuittauksen saatuaan alkaa odottelemaan DBKEEP:ltä alasajon valmistumissanomaa ja kuittaa tämän takaisin DBKEEP:lle. Niinpä ensimmäisen vaihtoehdon tapauksessa voidaan varmistua vain siitä, että DBKEEP vastaanotti alasajokomennon - jälkimmäisessä tapauksessa saadaan lisäksi jotain tietoa siitä, miten varsinaisessa alasajossa onnistuttiin. Jos DBRMUI ei saa WNELIB:iin pohjautuvassa kommunikoinnissa lähettämäänsä sanomaan kuittausta tai jos saadun kuittauksen viimeksi vastaanotetun sanoman numero ei vastaa viimeistä lähetettyä sanomaa, suoritetaan kyseisen sanoman uudelleenlähetys. Näitä uudelleenlähetyksiä yritetään virhetilanteissa toistaa joku tietty määrä, jonka jälkeen luovutaan toivosta ja palautetaan jokin yhteyden toimimattomuutta indikoiva virhestatus ylemmille ohjelmistokerroksille. Sama periaate pätee DBKEEP:iin, kun se odottaa kuittausta onnistumissanomaan. 9.5. Hylätty käyttöliittymäsuunnitelmaKAIKKI TEKSTI TÄSTÄ ETEENPÄIN KUVAA DBRMUI:N ALKUPERÄISTÄ KÄYTTÖLIITTYMÄSUUNNITELMAA, JOHON ON TULLUT NIIN PALJON MUUTOKSIA, ETTÄ ALKUPERÄISET KÄYTTÖLIITTYMÄSIVUT ON KOPIOITU TÄHÄN SELLAISINAAN. DBRMUI:N NYKYINEN KÄYTTÖLIITTYMÄSUUNNITELMA ON KUVATTU ERILLISESSA DOKUMENTISSA. Kun DBRMUI-sovellus käynnistetään, avautuu näytölle seuraavanlainen ikkuna:
Pääikkunassa olevat ikonit kuvaavat kukin yhtä seurattavaksi valittua resurssia. Valinta määräytyy sekä käyttäjäryhmäkohtaisen profiilin että konfiguraatiotiedostojen pohjalta. Profiili rajoittaa seurattavaksi valittua joukkoa ryhmäkohtaisesti käyttäjän kannalta pysyvästi, mutta konfiguroinnin avulla käyttäjä voi lisäksi poistaa ja jälleen lisätä seurattavaksi valittuja resursseja profiilin asettamien rajoitusten puitteissa. Valinnan suorituksesta kerrotaan tarkemmin jatkossa käyttöliittymätoimintojen kuvauksen yhteydessä. Prosessien osalta DBRMUI:lla voidaan kuitenkin seurata ainoastaan WPMANA:lle valvottavaksi määriteltyjä sovelluksia/prosesseja. Yleisperiaatteena käyttöliittymässä on se, että valikosta valittu toimenpide kohdistuu hiirellä valittujen objekti-ikonien kuvaamiin resursseihin. Resurssin valinta tapahtuu osoittamalla hiiren kursorilla ko. ikonia ja näpäyttämällä hiiren vasemmanpuoleisinta nappia. Onnistuneen valinnan tuloksena ikonin ääriviivat paksunevat. Toinen samantyyppinen resurssi voidaan valita osoittamalla kursorilla ko. ikonia ja painamalla hiiren vasemmanpuoleisinta nappia ja pitämällä samanaikaisesti SHIFT-näppäintä pohjassa. Valinnat voidaan purkaa näpäyttämällä hiiren vasemmanpuoleisinta nappia sellaisessa kohdassa DBRMUI:n pääikkunaa, joka ei sisällä resurssi-ikonia. Lisäksi aiemmat valinnat kumoutuvat valitsemalla uusi ikoni hiiren pelkkää vasemmanpuoleisinta nappia käyttämällä (käytetään siis GUIMAN:in verkkoelementtikäsittelystä tuttua On-Off valintaa). Kaikki tietokannan osat/levyt/prosessit voidaan valita myös Action-valikon vastaavasta Select All -kohdasta (tarkemmin myöhemmin). Kunkin toiminnon alussa DBRMUI tarkistaa seuraavat valintoihin liittyvät ristiriitatilanteet ja antaa niistä virheilmoituksen käyttäjälle tai estää muutoin operaation käynnistämisen: 1. mitään ikonia ei ole valittu ja haluttu operaatio kohdistuisi johonkin/joihinkin ikonin osoittamaan/osoittamiin resurssiin/resursseihin, 2. valitut resurssit ovat väärää tyyppiä operaatioon nähden (valittu esim. joitakin levyjä ja yritetään käynnistää tietokannan siivous). Valittujen resurssien tyyppiin nähden sopimattomat operaatiot eivät ole aktivoitavissa vaan ne esitetään käyttöliittymässä harmaalla (yo. esimerkissä koko tietokantavalinta esitettäisiin harmaalla). Sovellus ei päästä valitsemaan yhtäaikaa eri tyyppisiä resursseja valintajoukkoon. Jos käyttäjä on valinnut esimerkiksi kaksi levyä ja aikoo lisätä seuraavaksi jonkin prosessin valittujen joukkoon, antaa DBRMUI käyttäjälle äänimerkin eikä valinta onnistu. Jos seurattavia resursseja kuvaavia ikoneita on pääikkunassa paljon, voi ikkuna käydä tällöin ahtaaksi. Tässä tapauksessa ikkunaan kiinnitetään tarvittava vaakasuora ja/tai pystysuora vierityspalkki. 9.5.1. Hylätyn käyttöliittymän toiminnotIkkunan ylälaidassa olevasta alasvetovalikosta voidaan aktivoida seuraavat toiminnot: Action:tästä valikosta voidaan valita toiminnot Select All Databases, Select All Disks, Select All Processes, Print ja Exit. Select All Databases -toiminnolla saadaan kaikki tarkkailtavana olevat tietokannan osat valittua mahdollista seuraavaa operaatiota varten. Select All Disks- ja Select All Processes -valinnat toimivat samalla tavoin; kohteena on nyt vain kaikki levyt/prosessit. Print tulostaa puolestaan sovelluksen pääikkunan sisällön LPDEST-ympäristömuuttujan ilmaisemalle kirjoittimelle, mikäli kyseinen muuttuja on asetettu; jos LPDEST:iä ei ole asetettu, menee tulostus järjestelmän oletuskirjoittimelle. Alkuvaiheessa tyydytään tulostamaan täyttöasteinformaatio tekstimuodossa kirjoittimelle - myöhemmin voidaan toteuttaa PostScript-/bittikarttatulostus erityyppisille kirjoittimille. Exit-toiminnolla päästään ulos DBRMUI -sovelluksesta. Database:sisältää toiminnot Cleanup, Restore, Verify, Shutdown, Startup, Backup ja Update. Cleanup:sta käynnistetään hiirellä valitun tietokannan osan siivous - vain yksi osa voi olla tällöin valittuna. Restore:sta käynnistetään puolestaan valittuun tietokannan osaan palautus; jälkimmäisessä tapauksessa kysytään palautustiedoston nimi täydellisenä. Myöskin palautuksessa vain yksi kannan osa voi olla kerrallaan valittuna. Verify:llä voidaan tarkistaa tietokantavarmistustiedoston oikeellisuus. Tällöin käyttäjältä kysytään varmistustiedoston täydellistä nimeä. Shutdown-vaihtoehdolla tietokanta voidaan ajaa alas ja Startup-toiminnolla jälleen ylös - tässä yhteydessä ennestään valituilla kannan osilla ei ole merkitystä. Backup:lla on mahdollista tehdä täydellisiä tietokantavarmistuksia kannasta (valinnoilla ei ole merkitystä). Update-toiminnolla lasketaan tietokannan osan täyttöaste ja tulos näytetään graafisessa osaa kuvaavassa ikonissa. Toiminto kohdistuu hiirellä valittuihin kannan osiin; mikäli mitään osaa ei ole valittuna, lasketaan kaikkien osien senhetkiset täyttöasteet. Kukin edellä mainittu toiminto on kuvattu tarkemmin luvussa 4.2.1. (Tietokantaoperointi). Disks:sisältää toiminnon Update. Toiminto laskee valittujen paikallisten/NFS -levyjen täyttöasteet ja laskennan tulos sijoitetaan graafisiin levyjä kuvaaviin ikoneihin. Mikäli toiminnon aktivointihetkellä mitään levyä ei ole valittu hiirellä, lasketaan kaikkien tarkkailtavien levyjen täyttöasteet. Processes:sisältää toiminnot Update ja Log. Edellisellä toiminnolla elvytetään työasemassa parhaillaan käynnissä olevien WPMANA:n valvomien prosessien perusteella niitä kuvaavat graafiset ikonit ajan tasalle. Jälkimmäisellä toiminnolla käynnistetään sovellus, jonka avulla voidaan katsella parhaillaan valitun prosessin komentolokiin tuottamia rivejä. Options:tämä valikko sisältää toiminnot Databases to watch, Disks to watch, Processes to watch, Configure, Store user configuration, Store global configuration ja Default configuration. Databases to watch -valinnan avulla voidaan yksityiskohtaisemmin määritellä, mitä tietokannan osia seurataan. Valinta tapahtuu valintalistaolion avulla, missä on kerrottu kaikki ne kannan osat, joita käyttäjällä on oikeus seurata. Kunkin tällaisen osan kohdalla käyttäjä voi valita, haluaako hän tämän osan mukaan seurattavien osien joukkoon vaiko ei. Disks to watch- ja Processes to watch -valintoihin pätevät nämä samat periaatteet - seurattavana ovat vain tällöin levyt/prosessit. Jälkimmäisten osalta voidaan myöskin määritellä, seurataanko resursseja verkon yli l. NFS-levyjä/toisen työaseman prosesseja. Configure-toiminnolla konfiguroidaan sovellus järjestyksessä käyttäjäryhmäkohtaiset profiilimääritykset, globaalit määritykset ja sitten käyttäjäkohtaiset. Store user configuration -valinnalla parhaillaan voimassa olevat asetukset kirjoitetaan käyttäjäkohtaiseen konfiguraatiotiedostoon. Store global configuration -valinnalla asetukset kirjoitetaan globaaliin konfiguraatiotiedostoon. Globaalia konfigurointia voi päivittää ainoastaan OMC:n System Operator - muille käyttäjille toiminto ei ole aktivoitavissa. Default configuration -valinnalla käynnissä oleva DBRMUI-sovellus konfiguroidaan kiinteisiin oletusarvoihin. Konfiguroinnista on kerrottu tarkemmin luvussa 2.1.1 (Konfigurointi ja oikeudet). Käyttäjäryhmäkohtaiset profiilitiedostot kirjoitetaan toistaiseksi editorilla Bourne Shell:in .profile -tiedoston tapaan. Profiilitiedostojen päivittäminen vaatii OMC:n System Operator -oikeuksia. Em. toiminnot voidaan aktivoida myös siten, että osoitetaan hiirellä valittua objektia ja painetaan hiiren oikeanpuoleisinta nappia. Tällöin näytölle ilmestyy valitun objektin viereen valikko, joka sisältää käsiteltävään objektiin liittyvät operaatiovalinnat. Tällöin esimerkiksi käyttäjän osoittaessa tietokannan mittausosaa kuvaavaa ikonia ilmestyy ko. ikonin viereen valikko, josta samat kantaoperaatiot voidaan käynnistää kuin alasvetovalikostakin. Mikäli samaan aikaan on valittuna useampia ko. tyyppiä olevia resursseja, kohdistuu operaatio näihin kaikkiin. Jos hiirellä osoitetun objektin kohdalla painetaan hiiren keskimmäistä nappia, avautuu objektin päälle ikkuna, jossa kerrotaan tekstuaalisessa muodossa objektiin liittyvä täyttöaste. Prosessi-ikonin kohdalla ikkunassa näytetään viimeisimmät prosessin tuottamista lokiriveistä. database cleanup -toiminnon aktivointi aiheuttaa valittuun tietokannan osaan liittyvän lomakkeen ilmestymisen DBRMUI:n pääikkunan päälle. Lomake sisältää kyseiseen kannan osaan liittyvien siivouskriteerien kyselykentät. DBRMUI-sovelluksen pääikkunassa seurataan ainoastaan On-line kannan osia. 9.6. Hylätty käyttöliittymän oliomalliSeuraava käyttöliittymän oliomalli liittyy oleellisesti luvussa 9.5. kuvattuun hylättyyn käyttöliittymäsuunnitelmaan ja siihen tosiasiaan, että sovelluksella voitaisiin seurata myöskin levyjen/prosessien tilaa. Kun nämä piirteet ovat oleellisesti muuttuneet, ei myöskään seuraavassa kuvattavalla oliomallilla ole mitään käyttöä. Seuraava kappale ja kuva on kopioitu vanhasta dokumentista sellaisinaan. DBRMUI:n käyttöliittymän oliomallissa kutakin resurssien oliomallin yksittäistä resurssiobjektia (tietokannan eri osia, levyjä ja prosesseja) vastaa ko. resurssia kuvaava ikoni. Ikkunaobjekti puolestaan kuvaa DBRMUI:n pääkäyttöliittymän ikkunaa. Käyttöliittymän oliomalli on seuraavanlainen:
9.6. Tietokannan käsittelyohjelmien tallennus tietokantaanTässä luvussa kuvattu piirre, missä tietokannan käsittelyyn liittyvät ohjelmat (siivous, alasajo, nosto, varmistus) olisi talletettu johonkin kannan tauluun on hylätty turhan monimutkaisuuden sekä vähäisen hyödyn vuoksi. Seuraava teksti on kuitenkin kopioitu alkuperäisestä suunnitteludokumentista. Tietokannan siivoukseen tarkoitettujen ohjelmien nimet selviävät myös kannasta. Tätä varten kantaan on perustettu GSM_DB_PROGS_INFO -taulu, jonka rakenne on seuraava:
Taulun sarake RESTORE_PRG kertoo kyseisen tietokantaosan siivousarkiston palautusohjelman nimen ja VERIFY_PRG arkiston verifiointiohjelman nimen. Kannan initialisoinnissa täytyy kyseinen taulu perustaa tyhjänä indekseineen ja sovellusryhmien insert-skriptien pitää päivittää taulun tiedot ajan tasalle. 9.7. UIL:n kehittäminen käyttöliittymän tiedostopohjaiseen konfigurointiinSeuraavassa on tarkasteltu tarkemmin luvussa 9.1. mainittua käyttöliittymän konfigurointia tiedoston avulla. Tässä yhteydessä hahmotellaan esimerkki tyypillisestä konfigurointitilanteesta ja sen jälkeen pohditaan ratkaisun tuomia hyviä ja huonoja puolia. Piirteen toteutus on kuitenkin hylätty projektisuunnitelmista sen tuomien vähäisten hyötyjen takia verrattuna piirteen vaatimaan työmäärään. Esimerkiksi tietokantasiivoukseen liittyen DBRMUI:n ajaman siivousskriptin nimi ja sen parametrit selviävät tietokannassa olevan GSM_DB_PROGS_INFO -taulun tietystä sarakkeesta. Sarake kertoo siivousohjelman absoluuttipolkunimen ja tietokantaosakohtaisen konfiguraatiotiedoston, joka määrittelee, mitä asioita käyttäjältä pitää kysyä ko. tietokantaosan siivouksen käynnistyksen yhteydessä. Em. siivouskonfiguraatiotiedoston formaatti voisi noudattaa LISP:stä tuttua rakennetta, joten esim. mittaustietojen tapauksessa ko. tiedoston sisältö olisi seuraavanlainen: (form PM (field meas_type (type obligatory) (label "Measurement type :") (format text) ) (fieldgroup time (type obligatory) (field start (label "Start time :") (format YYYYMMDDHHMM) ) (field end_time (label "End time :") (format YYYYMMDDHHMM) ) ) ) (field netw_elem (type optional) (label "Network element :") (format text) ) # ... jne. (tämä on kommenttirivi) ) Koska piirteen täydellinen toteutus merkitsee suurin piirtein oman UIL:n (User Interface Language) kehittämistä ja vaatisi siten useita miestyövuosia, pyritään em. konfiguraatiotiedostokäsittelystä tekemään mahdollisimman kevyt erityisesti toteutuksen alkuvaiheessa. Kun lisäksi toteutuksessa pitää ottaa varsin varhaisessa vaiheessa kantaa siihen, mitä ikkunointiobjekteja milläkin attribuuttiarvoilla (ikkunat dimensioineen, valikot riveineen jne.) käytetään, laajentaa tämä entisestään kieltä. Jos nämä piirteet jätetään toisaalta joidenkin heurististen algoritmien pääteltäväksi (esim. käyttöliittymäobjektien automaattinen sijoittelu ikkunaan/ikkunan dimensioiden automaattinen laskenta), vähenee itse kielen toteutuksen osuus, mutta ko. algoritmien tekeminen vaatisi oman työmääränsä. Toteutus on myöskin syytä pyrkiä irroittamaan mahdollisimman pitkälti omaksi luokakseen jota muutkin sovellukset voivat hyödyntää. 9.8. SELECT COUNT(ROWID) FROM ... -kyselyn käyttö Valvottavien taulujen käytettyjen rivien lukumäärää ei enää selvitetä otsikossa esitetyllä kyselyllä sovelluksen käynnistymisajan nopeuttamiseksi. Samoin minkään täyttöasteen uudelleenlaskenta ao. metodeilla (esim. UpdDbFullInfo() -metodilla) ei tee kantaan mainittua kyselyä. Samalla on tullut hylätyksi periaate, jonka mukaan DBRMUI -sovelluksen esittämät täyttöastetiedot tulisi olla reaaliaikaisia. |













No comments:
Post a Comment