Eindverslag bachelorproject Open source databaseondersteuning in TOPdesk Enterprise BSc-project (IN3700) bij TOPdesk
Namen: Remco Luitwieler 1159828 Tom Pesman 1128884 Datum: 4 juli 2007 Bedrijf: TOP Informatie Systemen B.V. Universiteit: Technische Universiteit Delft – Faculteit EWI Begeleiders: Roel Spilker (TOPdesk) Michel Fleur (TOPdesk) Hans-Gerhard Gross (TU Delft) Bernard Sodoyer (TU Delft)
Inhoudsopgave 1. Samenvatting .................................................................................................................................... 3 2. Organisatie......................................................................................................................................... 3 2.1 Inleiding ................................................................................................................................................................................... 3 2.2 Het bedrijf................................................................................................................................................................................ 3 2.3 Structuur binnen TOPdesk .................................................................................................................................................. 4 2.4 Totstandkoming project ...................................................................................................................................................... 4 2.5 De opdracht............................................................................................................................................................................. 5
3. Documenten ...................................................................................................................................... 6 3.1 Inleiding ................................................................................................................................................................................... 6 3.2 V-model .................................................................................................................................................................................... 6 3.3 Plan van aanpak ..................................................................................................................................................................... 6 3.4 Requirements Analysis Document ................................................................................................................................... 6 3.5 System Design Document ................................................................................................................................................... 7 3.6 Object Design Document .................................................................................................................................................... 7 3.7 Testplan .................................................................................................................................................................................... 7
4. Analyse ............................................................................................................................................... 8 4.1 TOPdesk Enterprise ............................................................................................................................................................... 8 4.2 Templates ................................................................................................................................................................................ 8
4.2.1 Database constraints ............................................................................................................................................................................. 10
4.3 MySQL ....................................................................................................................................................................................... 11 4.3.1 Matchen functionaliteiten ................................................................................................................................................................... 12
4.4 Integratie ................................................................................................................................................................................. 12
5. Ontwerp ............................................................................................................................................. 13 5.1 DatabaseTool .......................................................................................................................................................................... 13 5.2 Templates ................................................................................................................................................................................ 13 5.3 ExceptionTransformer ......................................................................................................................................................... 13 5.4 Testcases .................................................................................................................................................................................. 13
6. Implementatie ................................................................................................................................... 15 6.1 DatabaseTool .......................................................................................................................................................................... 15 6.1.1 Klassen ....................................................................................................................................................................................................... 15 6.1.2 Testcases ................................................................................................................................................................................................... 15
6.2 Templates ................................................................................................................................................................................ 15 6.2.1 Vereniging................................................................................................................................................................................................. 15 6.2.2 Datatypen ................................................................................................................................................................................................. 15 6.2.3 Template invullen ................................................................................................................................................................................... 16 6.2.4 Testcases ................................................................................................................................................................................................... 16 6.2.5 Problemen................................................................................................................................................................................................. 16
6.3 ExceptionTransformer ......................................................................................................................................................... 16 6.3.1 Testcases ................................................................................................................................................................................................... 16 6.3.2 Klasse.......................................................................................................................................................................................................... 17
6.4 Lege database aanmaken en bestaande database streamen ................................................................................... 17
7. Aanbevelingen ................................................................................................................................... 18 7.1 Inleiding ................................................................................................................................................................................... 18 7.2 DatabaseTool .......................................................................................................................................................................... 18 7.2.1 Transform exceptions............................................................................................................................................................................ 18 7.2.2 InsertCount ............................................................................................................................................................................................... 18 7.2.3 Create database en add user in templates opnemen .................................................................................................................. 18
7.3 nl.ogdsoftware.database.statements .............................................................................................................................. 18 7.3.1 Klassen strikter maken .......................................................................................................................................................................... 18 7.3.2 Batch AlterTable ...................................................................................................................................................................................... 18
7.4 nl.ogdsoftware.database.definition ................................................................................................................................. 18 7.5 nl.ogdsoftware.expression ................................................................................................................................................. 19 7.6 nl.ogdsoftware.tas.structure.............................................................................................................................................. 19 7.7 nl.ogdsoftware.database.exception.UniqueKeyConstraintViolatedException.................................................... 19 7.8 Buildsysteem........................................................................................................................................................................... 19 7.8.1 Upgrade Apache Ant .............................................................................................................................................................................. 19 7.8.2 Upgrade JUnit .......................................................................................................................................................................................... 19 7.8.3 Slagen build .............................................................................................................................................................................................. 19 7.8.4 Builden en testen .................................................................................................................................................................................... 19 7.8.5 JUnit report............................................................................................................................................................................................... 20 7.8.6 Javadoc....................................................................................................................................................................................................... 20
juni ’07
Bachelorproject IN3700
1
7.9 Alternatieve database .......................................................................................................................................................... 20 7.10 Indices .................................................................................................................................................................................... 20 7.10.1 Cleanstep ................................................................................................................................................................................................ 20 7.10.2 MySQL ...................................................................................................................................................................................................... 20
7.11 FULL JOIN ............................................................................................................................................................................... 20
8. Conclusie ............................................................................................................................................ 21 9. Literatuurlijst ..................................................................................................................................... 22 Bijlage A: Opdracht TOPdesk ................................................................................................................. 23 Bijlage B: Mapping Topdesk typen naar DBMS typen .......................................................................... 24
juni ’07
Bachelorproject IN3700
2
1. Samenvatting Gedurende het laatste kwartaal van de bachelorfase is deze afsluitende stage gepland hiervoor hebben wij het bedrijf TOPdesk gekozen, omdat de opdracht ons aanstond en het ons een leuk bedrijf leek. Dit bleek achteraf te kloppen en wij hebben deze stageperiode dan ook als prettig ervaren. Zoals we reeds bij software-engineering hadden geleerd in de kwartalen voorgaand aan het bachelorproject is het belangrijk eerst documenten te maken volgens een model. Eerst denken dan doen, wij hebben diverse documenten gemaakt om zo de code te leren kennen en een passende oplossing te bedenken. Tijdens de implementatiefase komen er toch vaak dingen boven water die men niet had voorzien, zo bleek het integreren van MySQL in de applicatie niet zo makkelijk. Dit kwam vooral door tekortkomingen van MySQL, gelukkig was onze opdracht niet alleen het integreren van MySQL, maar ook het maken van testklassen, dat dit ging lukken stond als een paal boven water en naar ons idee is dit ook ruimschoots gelukt. De opbouw van dit document is in grote lijnen zoals het project verlopen is. Er wordt verschillende keren verwezen naar andere meer technische documenten, maar in dit document wordt getracht inzicht te verschaffen in ons project voor zowel mensen van binnen als buiten de organisatie.
2. Organisatie 2.1 Inleiding Dit hoofdstuk beschrijft hoe het bedrijf TOP Informatie Systemen B.V. in elkaar zit en geeft achtergrondinformatie over het bedrijf. Tevens wordt hier het ontstaan van onze opdracht nader toegelicht.
2.2 Het bedrijf TOP Informatie Systemen B.V. (ofwel TOPdesk) gevestigd te Delft bestaat sinds 1997. Inmiddels werken er circa 220 mensen en zijn er behalve in Delft ook nog vestigingen in Kaiserslautern (Duitsland) en London (Engeland). De vestigingen in Duitsland en Engeland hebben als hoofdtaken advies en verkoop, de ontwikkelafdeling en helpdesk van de hele organisatie bevindt zich in Delft. Het bedrijf TOPdesk is in 1993 ontstaan uit de zusterorganisatie Operator Group Delft (OGD). OGD is een ICT-dienstverlener met een helpdesk, omdat er geen geschikte software was om de helpdesk te ondersteunen is er intern gewerkt aan een software oplossing wat uiteindelijk TOPdesk is geworden. Zoals meestal ontstond het product omdat er vraag was naar een makkelijke oplossing voor een probleem. TOPdesk biedt een makkelijke oplossing voor ICT-helpdesks van middelgrote tot grote bedrijven. TOPdesk maakt het mogelijk voor medewerkers van deze ICT-helpdesks om volgens ITILprocessen (Information Technology Infrastructure Library) te werken.
Figuur 1 Overzicht van de beheerscyclus, zoals deze door ITIL onderkend wordt.
juni ’07
Bachelorproject IN3700
3
ITIL bevordert procesmatig werken, dit zorgt voor kosten- en tijdsbesparing. In figuur 1 staat een plaatje van ITIL in TOPdesk. Een incident komt binnen bij incidentbeheer (hier worden de problemen centraal ingevoerd), vervolgens gaat het naar probleembeheer (structurele problemen worden hier herkend), vervolgens wijzigingsbeheer (voorbereiden, uitvoeren, controleren, gereedmelden), dan configuratiebeheer (bijhouden welke apparatuur er aanwezig, licenties), de problemen worden door probleembeheer aan de configuraties gekoppeld. Centraal binnen het proces staat de ‘Service Level Agreement’ (SLA), deze bevat afspraken over het aan te bieden serviceniveau van de dienstverlening (hoe lang mag een printer kapot zijn, bijvoorbeeld: maximaal vier uur). TOPdesk is leverbaar in drie varianten: Lite, Professional en Enterprise. De Lite versie is kleine bedrijven en de Enterprise is het neusje van de zalm qua functionaliteiten. TOPdesk heeft 2200 klanten in 30 landen. De meeste producten worden verkocht in respectievelijk: Nederland, Engeland, Duitsland en België.
2.3 Structuur binnen TOPdesk Binnen TOPdesk is grofweg de volgende structuur van toepassing:
Figuur 2 Organisatie TOPdesk
Binnen de organisatie heerst een prettige werksfeer en wordt informeel met elkaar omgegaan. Wij zaten voor de realisatie van ons project op de ontwikkelafdeling en kregen begeleiding van iemand uit het TOPdesk 4 team, dat zich bezig houdt met ontwikkeling van TOPdesk Enterprise 4.
2.4 Totstandkoming project TOPdesk Enterprise ondersteunde tot voor kort PostgreSQL, dit is een open source database, maar met de komst van de nieuwe versie 8.2 werkt deze niet meer met TOPdesk Enterprise. Er was al langer van klanten uit de vraag of MySQL niet ondersteund werd. Onder meer omdat MySQL open source is en er momenteel geen enkele open source database meer ondersteund wordt was dit een leuk project voor studenten, het is leerzaam en een goedkope oplossing voor TOPdesk. Tevens wilde men testklassen hebben om de opbouw van statements binnen TOPdesk Enterprise te controleren. Deze tests controleren de correctheid van de laag tussen de code en de verschillende databases. Met deze tests is het dus makkelijk te controleren of databases (nog steeds) ondersteund worden door TOPdesk Enterprise.
juni ’07
Bachelorproject IN3700
4
2.5 De opdracht De opdracht zoals wij die gekozen hebben van het BlackBoard van de TU Delft is bijgevoegd als Bijlage A Opdracht TOPdesk. Deze opdracht geeft een omschrijving van de organisatie en een korte beschrijving van de opdracht. Hieruit kwamen de volgende deelopdrachten naar voren: 1. Vooronderzoek doen naar open source databases (zie RAD Bijlage D Vooronderzoek) 2. Template maken voor gekozen database 3. Testomgeving maken 4. Tests maken voor templates, statements en DatabaseTool De onderzoeksvragen die hieruit voortkomen zijn: 1. Is het mogelijk een open source database te ondersteunen binnen TOPdesk Enterprise? 2. Hoe ziet een geschikte testomgeving eruit?
juni ’07
Bachelorproject IN3700
5
3. Documenten 3.1 Inleiding Dit hoofdstuk geeft een overzicht van de gemaakte documenten en hun inhoud het is raadzaam alle documenten bij de hand te hebben tijdens het lezen van dit verslag, want er wordt diverse keren naar verwezen.
3.2 V-model Om het proces inzichtelijk te houden, voor ons, de opdrachtgever en de begeleider van de TU hebben wij ervoor gekozen om het V-model te gebruiken. In figuur 3 staat het model en de op te leveren documenten en delen van het systeem. System Requirements Analyse
Operation
Plan van Aanpak
Geaccepteerd systeem Software Requirements Elicitation
Client Acceptance
Requirements Analysis Document
Getest systeem
Testplan
Requirements Analysis Requirements Analysis Document
System Integration & Test
Geïntegreerd systeem
Component Integration & Test
Preliminary Design
System Design Document
Geteste units
Detailed Design
Unit Test
Object Design Document
Sourcecode
Implementation
Figuur 3 Overzicht V-model en bijbehorende documenten
3.3 Plan van aanpak Beknopt document met oorsprong en beschrijving van het probleem en hoe wij het aan gaan pakken.
3.4 Requirements Analysis Document Eisen stellen aan de implementatie, voorstelling maken van de implementatie. Functionele en nietfunctionele eisen opstellen, use cases ten behoeve van tests en algemene indruk van de werking van het te maken systeem.
juni ’07
Bachelorproject IN3700
6
3.5 System Design Document De packages en hun functionaliteiten worden gespecificeerd. Hoe ziet het geheel eruit. Welke verdere overwegingen zijn er gemaakt, welke grenscondities gelden.
3.6 Object Design Document Specificatie van de componenten, uitleg welke keuzes er gemaakt zijn, onder andere performance gerelateerd. Klassen krijgen nu ook methoden, variabelen, attributen en de onderlinge hiërarchie wordt duidelijk.
3.7 Testplan Hierin worden de afwegingen met betrekking tot de tests uitgelegd en er worden eisen gesteld aan de manier en methode van testen.
juni ’07
Bachelorproject IN3700
7
4. Analyse 4.1 TOPdesk Enterprise TOPdesk Enterprise is volledig in Java geprogrammeerd, inmiddels zijn ze aangekomen bij versie 4, deze versie is volledig web-based. De sourcecode is vanaf de eerste versie tot nu steeds verder uitgegroeid, waardoor het nu een complex geheel is.
Figuur 4 Timeline TOPdesk historie
Doordat de code complex is hebben we eerst wat uitleg gekregen over hoe het ongeveer werkt, daarna hebben we zelf in de code gekeken en aan de hand daarvan wat vragen gesteld over hoe dingen met elkaar samenwerken. Tijdens het maken van het plan van aanpak liepen wij al tegen diverse problemen aan en beseften wij dat het handig is om direct al te weten hoe we het aan gingen pakken, om zo later problemen te voorkomen. Voor onze opdracht was het belangrijk om te weten hoe er nu met de diverse databases gecommuniceerd werd. Hoewel SQL een gestandaardiseerde taal is verschillen de implementaties per DBMS. Niet elk statement is bij elke database hetzelfde. TOPdesk gebruikt hiervoor een hiërarchie van templates.
4.2 Templates Templates zijn opgebouwd volgens bepaalde regels en zijn een op zichzelf staande taal, bijlage B Templatetaal van het Requirements Analysis Document bevat een uitleg van deze taal. Bij het starten van TOPdesk Enterprise worden de files samengevoegd en in niveaus ingedeeld. Zo wordt er een hiërarchie gecreëerd zie figuur 5, hierna volgt een stapsgewijze uitleg. Als eerste wordt de meest algemene template (translator.templates) ingelezen, daarna de sql-specifiekere template (translator_sql.templates), deze overschrijft eventueel aanwezige properties die reeds ingelezen waren. Vervolgens wordt de DBMS-specifieke (translator_sql_[db-specifiek].templates) template ingelezen en deze overschrijft ook weer reeds aanwezige properties mits ze in deze file staan. Zodoende ontstaat er een structuur die properties kan bevatten van alle drie de niveaus die wordt opgeslagen in het geheugen. Het maken van een statement binnen de TOPdesk code gebeurt door een statementobject te maken, dit statementobject wordt met behulp van de template vertaald naar een DBMS specifieke query. Hoe het maken van een statement precies in z’n werk gaat is hier verder niet relevant en wordt nauwkeuriger uitgelegd in het Requirements Analysis Document paragraaf 3.1.
juni ’07
Bachelorproject IN3700
8
Opdracht Inlezen templates
Stap 1 Inlezen
property.entity1=file1 property.entity2=file1 property.entity3=file1
Inlezen
property.entity3=file2 property.entity4=file2
Inlezen
property.entity2=file3 property.entity3=file3 property.entity5=file3
translator.templates
Stap 2 translator_sql.templates
Stap 3 translator_sql_[db-specifiek].templates
Resultaat property.entity1=file1 property.entity2=file3 property.entity3=file3 property.entity4=file2 property.entity5=file3 Figuur 5 Diagram inlezen templates
Om de juiste template te selecteren wordt bij de installatie van TOPdesk een properties file gecreëerd waarin staat welke database gebruikt wordt. Om bijvoorbeeld een connectie met de database te maken wordt vanuit het programma een statement gegenereerd, dit is een standaard statement van TOPdesk. Vervolgens staat er in elke DBMS-specifieke template wat de vertaling is per DBMS. Zo staat er dus in de MSSQL-template: connection.info.property.url.default-value=jdbc:sqlserver://host:1433 In de MySQL-template staat: connection.info.property.url.default-value=jdbc:mysql://host:3306/database We zien nu dus dat de aanroep bij beiden hetzelfde is (wat voor de ‘=’ staat) en de waarde (na de ‘=’) verschilt, zo is dit dus voor alle DBMS-specifieke zaken vastgelegd. Dit is handig, want als men nu een database toevoegt hoeft er voor de aanroep (in de java-code) niets te veranderen, het enige wat moet gebeuren is een template toevoegen. Voor het toevoegen van deze template is het handig om te weten of deze gaat werken, daarvoor hebben wij dus testklassen gemaakt. Dit is voor het toevoegen heel handig, want het opstellen aan de hand van de ‘Reference Manual’ van MySQL is behoorlijk moeilijk en zo is het snel te controleren of alle functionaliteiten werken. Anders moet dat via ‘trial and error’ en dat is tijdrovend en niet geheel waterdicht, want dan weet je niet of je alles gehad hebt. Zo hebben wij wel onze eerste versie van de template getest, hierover meer in 6.4 Lege database aanmaken en bestaande database streamen.
juni ’07
Bachelorproject IN3700
9
TOPdesk Deel van de TOPdesk applicatie die de database functionaliteit gebruikt
Statement generator
Inlezen templates
JDBC API’s Oracle
MSSQL
MSSQL 2005
HSQLDB
PostgreSQL
Database
Figuur 6 Overzichtsdiagram uitvoeren statement
In figuur 6 is te zien hoe het inlezen van de templates gebeurt in de huidige implementatie van de TOPdesk software. Om uit te zoeken welke zaken in de template van de nieuwe database dienen te staan hebben wij een programma geschreven dat de doorsnede zoekt tussen de templatefiles van de op dit moment ondersteunde databases (MSSQL2000, MSSQL2005 en Oracle). Hierin staan dus alle gegevens uit de templates van de ondersteunde databases en van de bovenliggende templates (algemeen en sql) die bij alle drie voorkomen (zie figuur 5). Dit zijn dus de minimale functionaliteiten die ook in de template van een nieuwe database dienen te staan. Uitgezocht dient dus te worden of deze voor de nieuwe database apart ingegeven moeten worden, omdat ze zich nu op niveau 3 of hoger bevinden, of dat ze gewijzigd dienen te worden, omdat ze zich nu op niveau 1 of 2 bevinden. Per gegeven constraint dient dit dus uitgezocht te worden in de ‘Reference Manual’ van de betreffende nieuwe database.
4.2.1 Database constraints Het is niet zomaar mogelijk elk DBMS toe te voegen, want deze hebben niet alle functionaliteiten die door TOPdesk gebruikt worden. Het is dus belangrijk eerst te weten welke functionaliteiten TOPdesk gebruikt en vervolgens controleren of deze ook door het DBMS ondersteunt worden. Vaak kan dit opgezocht worden in zogeheten ‘Reference Manuals’ van het DBMS. Welke functionaliteiten TOPdesk gebruikt kregen wij aangeleverd via een document dat reeds door iemand opgesteld was. Dit document was niet helemaal compleet, maar was een goede basis. De verschillende functionaliteiten gevraagd door TOPdesk Enterprise zijn te verdelen in de volgende categorieën: Transacties Datatypes Statements Resultaten aggregaat functies Constraint typen juni ’07
Bachelorproject IN3700
10
Special data en quoting Exceptions mapping
Transacties De belangrijkste eisen van TOPdesk is dat de database moet kunnen omgaan met transacties. Als een database dit niet kan dan is deze database niet geschikt voor gebruik met TOPdesk. Datatypen TOPdesk heeft een aantal typen in Java gedefinieerd die op de datatypen van de template worden gemapt, die vervolgens weer op de database gemapt moeten worden. Bijvoorbeeld de LONG in Java is een INT8 in de template en in de MSSQL database is dit een BIGINT. Statements De syntax en attributen van een statement kunnen per DBMS verschillen, dat een SELECT … FROM … in elke DBMS voorkomt is logisch, maar bij sommige is dit misschien anders. Wat voor TOPdesk ook belangrijk is is de nestingsdiepte van SELECT-statements. Resultaten aggregaat functies Wat gebeurt er als men het aantal elementen in een lege tabel opvraagt? Krijgt men een ‘0’ of een NULL. Constraint typen TOPdesk maakt gebruik van Primary en Foreign keys en bepaalde index-methoden. Voor de Foreign keys moeten minimaal de DELETE en RESTRICT constraints aanwezig zijn. Special data en quoting Hoe moet er gequote worden om gereserveerde woorden uit te sluiten, dit is erg belangrijk ook met het oog op de toekomst, want wat nu nog geen gereserveerd woord is kan dat in een nieuwere release van het product wel zijn. Welke karakters mogen niet in een string voorkomen bijvoorbeeld een quote teken in een string kan hem opeens afbreken, waardoor er een ongeldig statement ontstaat, of een verkeerd statement. Exceptions mapping De DBMS controleert altijd of een bepaalde query geldig en mogelijk is, wanneer dit niet het geval is zal er een foutmelding gegenereerd worden en geretourneerd worden aan de cliënt. Bijvoorbeeld wanneer een gebruiker met een verkeerd wachtwoord probeert in te loggen wordt er door de DBMS een foutmelding gegenereerd, deze foutmelding wordt door de JDBC-API teruggegeven aan TOPdesk en bestaat uit een vendorcode en een SQL-state. Deze combinaties staan voor bepaalde foutmeldingen. TOPdesk heeft een laag tussen de JDBC API’s en eigen exceptions gemaakt, deze laag vertaalt de verschillende foutmeldingen van de DBMS (vendorcode en SQL-state) naar de TOPdesk exceptions.
4.3 MySQL MySQL is een wijdverspreide open source database met meer dan 5 miljoen installaties wereldwijd. Het is erg populair omdat het in veel gevallen gratis is, veel functionaliteiten bevat en ook nog eens stabiel is. Op dit moment zijn er verschillende versies van MySQL beschikbaar: MySQL 5.0 Database Server – Community Edition Generally Available 5.0.37 MySQL 5.1 Database Server – Community Edition Bèta 5.1.17 MySQL 5.2 Database Server – Community Edition Alpha 5.2.3 Voor de analyse van de functionaliteit hebben wij gekozen voor de MySQL 5.0, want dit is een stabiele release, in een Bèta of Alpha release kunnen kinderziekten voorkomen. Van de connector zijn de volgende versies beschikbaar: MySQL Connector/J Generally Available 5.0.5 MySQL Connector/J Alpha 5.1.0 Ook voor de connector gebruiken we de Generally Available versie 5.0.5 om bovenstaande redenen. Via de website van MySQL is het mogelijk in de ‘Reference Manual’ te zoeken, hierin staat onder meer de syntax en attributen van statements. Het is dus zaak deze te matchen met de door TOPdesk Enterprise gewenste functionaliteiten. juni ’07
Bachelorproject IN3700
11
4.3.1 Matchen functionaliteiten Transacties MySQL werkt met verschillende storage-engines te weten: MyISAM en InnoDB. InnoDB is als enige transactioneel en daardoor zullen we deze storage-engine kiezen. Datatypen MySQL ondersteunt alle gangbare datatypen, we zullen de juiste mapping moeten bepalen, maar voorzien hierin geen problemen. Statements De syntax en attributen van een statement zijn in MySQL soms iets anders dan in andere DBMS, maar alle gangbare statements komen er in voor. Nestingsdiepte is wat onduidelijk in de documentatie, maar er staat dat we er van uit mogen gaan dat dit mogelijk is tot een redelijke diepte, dit zal dus in de orde van 100 liggen, maar hier zullen we wel op moeten testen. Resultaten aggregaat functies Het makkelijkste is om dit te proberen voor verschillende datatypen middels een testbestandje, het zal geen problemen veroorzaken, zolang er maar bekend is wat er gaat gebeuren. Constraint typen MySQL ondersteunt het gebruik van Primary en Foreign keys en heeft onder andere DELETE en RESTRICT als cascading opties. Functionele indexes worden door MySQL niet ondersteund, maar dit zal alleen problemen geven op niveau van performance. Het is dus belangrijk te weten hoe veelvuldig dit gebruikt wordt. Special data en quoting De gereserveerde woorden van MySQL zijn grotendeels gelijk aan die van andere databases. Quoting gebeurt met backticks ( ` ). Karakters die niet in een string mogen voorkomen zijn de backslash ( \ ), want deze geven aan dat er een bepaald karakter na komt. Exceptions mapping De vendorcodes en SQL states die MySQL genereert zijn nergens gedocumenteerd. Deze zullen we door middel van tests moeten achterhalen.
4.4 Integratie De tests die wij maken zullen altijd moeten slagen, want anders zou het betekenen dat een template incorrect is. Daarom is het handig om onze tests in de nachtelijke build te integreren, hierover meer in het Testplan. Gedurende ons project hebben wij gewerkt op een eigen SVN branch, dit is de volledige programmacode, maar wijzigingen zijn apart van de productieversie. Deze SVN branch moet later weer geïntegreerd (merge) worden met de productieversie. Wijzigingen in de bestaande code hebben wij dus expliciet aangegeven en goed gedocumenteerd, want deze integratie zal waarschijnlijk na onze stageperiode plaatsvinden.
juni ’07
Bachelorproject IN3700
12
5. Ontwerp 5.1 DatabaseTool Ontwerp voor de toevoeging van MySQL aan de DatabaseTool is vrij eenvoudig, dit komt door dat het programma ontworpen is om eenvoudig nieuwe DBMS toe te voegen. Door 3 abstracte klassen te ‘extenden’ kan er een nieuw DBMS toegevoegd worden. De klassen zijn de DatabaseHandler, SettingsManager en de GuiCreator zoals weergegeven in Figuur 7.
Figuur 7 DatabaseTool uitbreiding
5.2 Templates Voor de template van MySQL was het niet nodig om een ontwerp middels een diagram te maken, dit is namelijk een tekstfile die door de java.util.Properties wordt ingelezen. In de analysefase hebben we de vereiste regels opgezocht en deze gaan we bij de implementatiefase invullen met behulp van de ‘Reference Manual’ van MySQL.
5.3 ExceptionTransformer In 4.2.1 Database constraints onder het kopje exceptions mapping wordt er gesproken over een laag tussen de JDBC API en de TOPdesk applicatie om de SQLExceptions om te zetten naar TOPdesk exceptions. Deze SQLExceptions zijn niet voor elk DBMS het zelfde, daarom is er voor elk DBMS een eigen ExceptionTransformer geïmplementeerd. In de onderstaande figuur is te zien dat MSSQL zijn eigen ExceptionTransformer heeft, voor MySQL moet een MySQLExceptionTransformer worden gemaakt. De ExceptionTransformer voor MySQL is te maken door een ‘extends’ te maken van de JDBCExceptionTransformer.
Figuur 8 Uitbreiding ExceptionTransformer
5.4 Testcases Een belangrijk onderdeel van de opdracht is dat de bovenstaande implementaties voor MySQL en de bestaande DBMS getest moeten worden. Om deze structuur bij de implementatie goed te hebben kijken we nu al naar hoe we het testsysteem gaan opzetten. We willen dat elke testcase wordt gedraaid op elk DBMS die we vooraf specificeren. Daarom maken we gebruik van een geparametriseerde basisklasse, juni ’07
Bachelorproject IN3700
13
deze klasse zal een bestand inlezen waarin de te testen databases staan. Zie het ODD voor het ontwerp hiervan. De testcases zijn afgeleid van de use cases zoals gemaakt in het RAD. Tijdens het testen van ‚ALTER TABLE x ALTER COLUMN y‛ is het handig om niet alles te testen, want anders komen er heel veel overbodige tests. Daarom hebben wij ervoor gekozen om uit te zoeken welke wijzigingen van kolommen er momenteel plaatsvinden. Tijdens het starten van TOPdesk Enterprise worden alle Cleansteps (zie 6.4 Lege database aanmaken en bestaande database streamen voor uitleg van Cleansteps) doorlopen, daar hebben wij een stukje code voor gemaakt die kijkt welke ALTER COLUMNS er plaatsvinden en daar hebben we onze tests op gebaseerd. In de applicatie vinden geen ALTER TABLE statements plaats, dus hebben we alle tot nu toe gebruikte wijzigingen van kolommen in onze tests verwerkt.
juni ’07
Bachelorproject IN3700
14
6. Implementatie Door de onderlinge afhankelijkheden is de volgorde van implementatie erg belangrijk. Allereerst moet het mogelijk zijn om via de DatabaseTool databases en gebruikers aan te maken. Daarna een werkende template maken met de bijbehorende testcases. Als laatste de ExceptionTransformer maken, deze klasse zorgt voor de juiste omzetting van de foutmeldingen.
6.1 DatabaseTool De DatabaseTool is een applicatie die wordt gebruikt om TOPdesk Enterprise bij klanten te installeren. Alle DBMS die door TOPdesk Enterprise worden ondersteund zijn hierin opgenomen. Dit programma is zo opgebouwd dat er eenvoudig nieuwe DBMS toegevoegd kunnen worden, dit gebeurd door de onderstaande 3 klassen aan te maken en de DBMS specifieke eigenschappen hierin op te nemen.
6.1.1 Klassen Hieronder de klassen die geïmplementeerd moeten worden om MySQL ondersteuning toe te voegen aan de DatabaseTool. MySQLCreator extends GuiCreator Deze klasse zorgt er voor dat de GUI de juiste velden weergeeft om met een MySQL database te kunnen verbinden. MySQLDatabaseHandler extends DatabaseHandler Deze klasse bevat methoden om met de DBMS te verbinden en daar een database en een gebruiker aan te maken of te verwijderen. Ook zijn er 2 methoden om een database te valideren. MySQLSettingsManager extends SettingsManager Bevat de twee bovenstaande klassen, en heeft dus alle informatie om een verbinding met een DBMS op te zetten en daar de gevraagde bewerkingen op uit te voeren.
6.1.2 Testcases Om de werking van deze geïmplementeerde klassen te valideren hebben we 3 test klassen gemaakt. TestCreateDrop test of er een database met gebruiker aangemaakt kan worden en of deze database en gebruiker ook weer verwijderd kunnen worden. TestValidate maakt gebruik van de 2 valideer methoden van de DatabaseHandler. Voor de DatabaseTool is de DatabaseAlreadyExistsException een belangrijke exception, hiervoor is dan dus ook een testcase TestDatabaseAlreadyExistsException gemaakt. We hebben het ontwerp enigszins moeten aanpassen, omdat de DatabaseTool test zodanig verschilde van de ExceptionTransformer en Template tests konden de niet de RunBasicParameters klasse gebruiken. daarom hebben we een extra geparametriseerde basis klasse moeten maken, de RunDatabaseToolParameters klasse, zoals te zien is in het ODD.
6.2 Templates De templates zijn geen java sourcecode, maar ze zijn eigenlijk java.util.Properties files. Er is een vastgestelde volgorde van inlezen van de template files daardoor hebben ze een hiërarchische opbouw en ze hoeven niet volledig ingevuld te zijn. Zie voor meer uitleg 4.2 Templates.
6.2.1 Vereniging Op basis van een reeds bestaande jsp pagina (/tas/web/secure/test/template_view.jsp) hebben wij een eigen jsp gemaakt (/tas/web/secure/test/template_intersection.jsp) deze pagina kan voor de 3 belangrijkste databases de intersection geven van de template key waarden. Deze key waarden hebben we als requirements genomen voor het maken van de MySQL template, omdat we zo zeker wisten dat deze al voor andere databases specifiek waren (MSSQL 2005, Oracle en PostgreSQL).
6.2.2 Datatypen Een van de belangrijkste regels uit de templates zijn de datatype definities. Hier worden de TOPdesk datatypen (java String,Date,Integer) gemapt op de DBMS datatypen. We hebben de mapping van TOPdesk datatypen naar die van MSSQL, Oracle, PostgreSQL en HSQLDB bekeken om zo met behulp van de ‘Reference Manual’ van MySQL de juiste keuzes te maken voor onze mapping in de template. Zie Bijlage B: Mapping Topdesk typen naar DBMS typen. juni ’07
Bachelorproject IN3700
15
6.2.3 Template invullen De verkregen keys ingevuld met behulp van de ‘Reference Manual’ van MySQL. Zoals te zien in paragraaf ‘4.2 Templates’ zijn de templates hiërarchisch opgebouwd, daarom hebben we geprobeerd om zoveel mogelijk keys die in een hoger niveau goed staan deze niet in de MySQL template weer te overschrijven, tenzij het echt nodig was doordat er iets specifiek voor MySQL moest staan.
6.2.4 Testcases Om de werking van de template te valideren hebben we testcases gemaakt die zoveel mogelijk regels van de template file probeert te testen door allerlei statements te maken. Wat de precieze dekking is van het aantal geteste regels is moeilijk te omschrijven omdat het een textfile betreft, deze wordt ingelezen en in het geheugen bewaard, dus geautomatiseerd uitlezen (bijvoorbeeld met Clover) wat de dekking is kan niet. Wij hebben de meest gangbare statements gekozen om te testen. Deze zijn terug te vinden in het RAD. Omdat er geen documentatie is die specificeert wat de uitvoer moet zijn van verschillende statements, hebben we de uitvoer van MSSQL en Oracle als eis genomen en gezorgd dat MySQL hier aan voldoet (‘Function equivalence testing’). Van deze tests zijn use cases gemaakt die terug te vinden zijn in het RAD. Eisen aan de tests zijn terug te vinden in het Testplan ook vindt u hier een voorbeeldcode van een testklasse.
6.2.5 Problemen Tijdens het maken en testen van de template zijn we tegen diverse problemen aangelopen onder andere fouten in de code en fouten in de template. Deze waren na wat zoeken op te lossen, maar ook zijn we twee ‘tekortkomingen’ van MySQL tegengekomen die cruciaal zijn om de TOPdesk Enterprise applicatie te draaien. Dit zijn een grens van maximaal 64 indices/foreign keys. Ook is de zogenaamde ‘FULL JOIN’ niet geïmplementeerd. Totdat deze twee problemen opgelost zijn is het niet mogelijk om de TOPdesk applicatie met vertrouwen te draaien op MySQL. Voor een eventuele oplossing zie 7.10.2 MySQL en 7.11 FULL JOIN.
6.3 ExceptionTransformer Elke DBMS heeft zijn eigen specifieke ExceptionTransformer, deze klasse zorgt ervoor dat SQLExceptions van de JDBC API worden omgezet aan de hand van hun SQLStates en VendorCodes naar TOPdesk exceptions. TOPdesk Enterprise houdt rekening met deze TOPdesk exceptions en daarom is een goede mapping van belang.
6.3.1 Testcases Als eerste worden de testcases gemaakt, omdat de JDBC API pas de SQLStates en VendorCodes geeft als de exception plaatsvindt. Er is documentatie over de SQLStates en VendorCodes maar het is moeilijk om te voorspellen welke SQLState en VendorCode er teruggegeven gaat worden. Het leek ons dus makkelijker om de fouten te veroorzaken middels testcases en vervolgens in te vullen in de betreffende ExceptionTransformers, deze bleken niet voor alle reeds ondersteunde databases compleet te zijn. In Tabel 1 de lijst met exceptions waarvoor we testcases hebben gemaakt. Deze testcases hebben we ook opgenomen in ons voorstel voor nachtelijke tests. TestAuthenticationException TestDatabaseNetworkingException TestDatabaseResourceNameException TestDataFormatException TestDeleteConstraintException TestDuplicateIndexException TestForeignKeyConstraintViolatedException TestNoSuchColumnException TestNoSuchConstraintException TestNoSuchIndexException TestNoSuchTableException TestTransactionException TestUniqueKeyConstraintViolatedException
Inloggen met foutief wachtwoord/gebruikersnaam De verbinding met het DBMS wordt onderbroken Database niet gevonden Verschillende data-typen in bron en doel (b.v. subselect) Verwijderen van een record waar nog een voorwaarde aan zit Creatie dubbele index Secundaire sleutel voorwaarde overtreden Kolom bestaat niet Voorwaarde bestaat niet Index bestaat niet Tabel bestaat niet Transactie is reeds gecommit/rolled back Unieke sleutel regel is overtreden (creëeren dubbele waarde)
Tabel 1 Exceptions waarvoor testcases gemaakt zijn om de ExceptionTransformer te vullen.
juni ’07
Bachelorproject IN3700
16
6.3.2 Klasse MySQLExceptionTransformer extends JDBCExceptionTransformer Dit is de ExceptionTransformer voor MySQL, het enige wat er in deze file moet gebeuren is de methode transformSQLException implementeren.
6.4 Lege database aanmaken en bestaande database streamen Om het geheel te testen zijn er nog twee manieren om de nieuwe templates en ExceptionTransformer te testen. Dit is een ‘trial and error’ manier, want zekerheid over wat er allemaal getest wordt is er niet, want dat uitzoeken zou een project op zich zijn. De volgende drie stappen worden doorlopen: 1. Lege databasestructuur aanmaken 2. Cleansteps uitvoeren 3. Bestaande database streamen Na het foutloos doorlopen van deze stappen is er met een redelijke zekerheid te zeggen dat de template goed is. De eerste stap maakt een lege databasestructuur aan en test dus onder andere het maken van tabellen, sleutels en indexen. Stap twee doorloopt vervolgens alle cleansteps om zo de structuur van de database te creëren. Cleansteps is een benaming van TOPdesk voor bewerkingen in de databasestructuur tussen de verschillende bestaande versies (in onze branch zijn dit er 378). Hier worden bijvoorbeeld kolommen van naam of type veranderd of wordt er een extra sleutel aangemaakt. Er worden dus vooral de statements die wijzigingen uitvoeren op de structuur van de database getest. Er wordt weinig data in de tabellen gezet. Bij de derde manier worden cleanstep 0 tot en met cleanstep 12 doorlopen, de database heeft dan de structuur die overeenkomt met een TOPdesk versie 3 database. Vervolgens wordt er een bestaande TOPdesk versie 3 database geïmporteerd en daarna worden alle cleansteps weer doorlopen tot de laatste cleanstep zo ontstaat er een database geschikt voor TOPdesk versie 4. Na deze stappen is het mogelijk om TOPdesk Enterprise te starten en het programma te testen met SELECT, INSERT, DELETE en UPDATE statements. Door de grote verscheidenheid van statements die worden uitgevoerd tijdens het streamen is dit een goede oefening om te laten zien dat de template correcte statements bevat, maar het zegt uiteindelijk niets over statements die wel in de template staan maar mogelijk nooit gebruikt worden. Door te kijken welke statements er in de template staan en aan de hand daarvan tests te maken wordt uiteraard een zekerder resultaat geboekt.
juni ’07
Bachelorproject IN3700
17
7. Aanbevelingen 7.1 Inleiding Gedurende ons project hebben wij diep in de code gezeten en zijn wij veel van MySQL te weten gekomen, wij hebben alles gedocumenteerd waarvan wij dachten dat het op een andere manier beter zou kunnen, deze zaken hebben wij in dit hoofdstuk samengevat. Het zou dan ook een duidelijk beeld moeten geven van hoe ver wij zijn gegaan gedurende dit project.
7.2 DatabaseTool 7.2.1 Transform exceptions In DatabaseTool bestaat al de mogelijkheid om SQLExceptions om te zetten naar TOPdesk exceptions, maar dit werd nog niet gebruikt. Om de foutafhandeling in de DatabaseTool op dezelfde manier te laten verlopen als in de applicatie wordt dit zeker aangeraden, want de afhandeling van fouten is dan eenduidig. Voor het maken van tests is dit ook makkelijker, want er hoeft dan niet voor elke database een aparte test gemaakt te worden, doordat de foutmeldingen per DBMS verschillend zijn.
7.2.2 InsertCount In de file DataInserter.java de insertCount variabel maken, hij staat nu hardcoded op 100 ingesteld. Maar voor MySQL is de waarde 10000 een betere keuze dan 100. Het is beter om dit een DBMS specifieke instelling te maken en het dus in de strategy of in de DBMS specifieke SettingsManager te plaatsen.
7.2.3 Create database en add user in templates opnemen Statements zoals create database en add user statements opnemen in de templates, zodat direct vanaf het begin via de templates werkt. Dan is het mogelijk om daar tests van te maken en die op te nemen in com.topdesk.databasetest.queries. Momenteel worden deze namelijk via de DatabaseTool gegenereerd en dit is niet consistent met de manier van creëren van alle andere statements.
7.3 nl.ogdsoftware.database.statements 7.3.1 Klassen strikter maken AlterTable voert weinig tot geen checks uit op de wijzigingen die de programmeur met de klassen wil uitvoeren. Zo is het bijvoorbeeld mogelijk met AlterColumn om elk type kolom om te zetten naar elk ander type, iets wat in de praktijk onmogelijk is. Dit geldt ook voor CreateTable om minder los met het creëren van velden om te gaan.
7.3.2 Batch AlterTable AlterTable voert één substatement per keer uit, maar een aantal DBMS ondersteunt ook meerdere substatements per AlterTable statement, bijvoorbeeld drop column: ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d; In plaats van: ALTER TABLE t2 DROP COLUMN c; ALTER TABLE t2 DROP COLUMN d; Dit geeft onder MySQL een performance winst omdat MySQL dan maar een keer ‚copy to tmp table‛ uitvoert, vooral als er veel data in de tabel zit kan dit een erg kostbare bewerking zijn, omdat MySQL de tabel eerst kopieert naar een tijdelijke tabel voordat er wijzigingen op gedaan worden. Hier moet men wel goed opletten dat niet elk DBMS dit ondersteunt en dus in de template controleren of dit wel mogelijk is voor betreffend DBMS.
7.4 nl.ogdsoftware.database.definition Bepaalde combinaties van de constructor van FieldDef zijn niet zinvol voor bepaalde Typen. Zo kunnen er kolommen aangemaakt worden met DEFAULT NULL NOT NULL of een primary key die null mag zijn. Ons voorstel is FieldDef een exception te laten gooien als defaultValue null is en allowsNull false is. Dit probleem valt ook samen met nl.ogdsoftware.expression, zie7.5 nl.ogdsoftware.expression. juni ’07
Bachelorproject IN3700
18
7.5 nl.ogdsoftware.expression BooleanExpression heeft een NULL waarde, deze is verwarrend omdat in FieldDef wordt gekeken of defaultValue==null, maar hiermee wordt ook bedoeld BooleanExpression.NULL, en die wordt dus niet gevonden. Dus wij stellen voor om de NULL niet te gebruiken bij het aanmaken van een FieldDef. Zelfde probleem geldt ook voor DateExpression.NULL. Ze mogen niet gebruikt worden bij het definiëren van een veld, maar wel bij INSERT en UPDATE statements, dus weghalen is geen optie.
7.6 nl.ogdsoftware.tas.structure Voor bijvoorbeeld een altercolumn worden eerst de indices, uniques, en foreign keys weggehaald, dan de altercolumn uitgevoerd en daarna worden ze weer terug gezet. MySQL verwacht bij het weghalen een bepaalde volgorde (Foreign key, Unique, Index), andere DBMS maakt het niet zoveel uit. Het zou beter zijn om dit via één methode te laten gaan, dan gebeurt het altijd op dezelfde manier. Nu gebeurt het via verschillende methoden en soms zelfs dubbel.
7.7 nl.ogdsoftware.database.exception.UniqueKeyConstraintViolatedException De UniqueKeyConstraintViolatedException geeft momenteel een naam van de constraint terug, maar als er meerdere constraints aan de tabel zitten is onbekend welke naam er met de exceptie meegegeven gaat worden, daarom zou het beter zijn om dus meerdere constraintnames terug te geven. Actuele constructor: public UniqueKeyConstraintViolatedException( String constraintName, Throwable throwable, String message) Voorstel: public UniqueKeyConstraintViolatedException( Throwable throwable, String message, String... constraintNames)
7.8 Buildsysteem 7.8.1 Upgrade Apache Ant Als de testcases opgenomen worden in de build, moet Ant 1.6.5 naar Ant 1.7.0 wordt geüpgrade Dit is omdat pas vanaf versie 1.7.0 JUnit 4 wordt ondersteund. Wij hebben getest of de build nog goed werkt, en voor zo ver wij het hebben kunnen onderzoeken gaat dit nog goed.
7.8.2 Upgrade JUnit Upgrade van JUnit 4.1 naar JUnit 4.3, deze versie heeft support voor assertArrayEquals, een erg handige uitbreiding voor het vergelijken van arrays. Het is sowieso aan te raden de laatste versie te gebruiken van de 4 versie, omdat deze volledig herschreven is ten opzichte van 3.8 en dus nog enkele bugs kan bevatten.
7.8.3 Slagen build Op dit moment falen er meerdere testcases bij het builden, maar de build slaagt nog steeds, hierdoor vervaagt het nut van het maken van unittests. In onze SVN branch staan aangepaste build files die zorgen dat de build faalt bij het niet slagen van de unittests. Wij denken dat het zeker het overwegen waard is om de build te laten falen als er tests falen, dit verhoogt de druk om te zorgen dat de tests slagen.
7.8.4 Builden en testen Het huidige buildsysteem maakt per Eclipse project een JAR file en runt daarna de test op dat project. Het zou eenvoudiger zijn als eerst alle projecten worden gebuild, dan is het duidelijk dat de builds slagen. Vervolgens de JUnit tests builden en deze runnen op de geslaagde build JAR files. Zo kunnen er ook geen problemen ontstaan met afhankelijkheden van JUnit tests op verschillende Eclipse projecten.
juni ’07
Bachelorproject IN3700
19
7.8.5 JUnit report Op dit moment laat de build server alleen zien welke unittest faalt, maar hier staat geen enkele beschrijving bij. Door gebruik te maken van de Ant target ‘junitreport’ in het buildsysteem kunnen duidelijke status pagina’s van de JUnit tests gemaakt worden zodat fouten sneller opgespoord kunnen worden.
7.8.6 Javadoc Javadoc in buildsysteem integreren, bij de laatste build is dan de Javadoc aanwezig. De Javadoc wordt op dit moment niet tijdens de build gemaakt. Ook de code in de testmappen bevat Javadoc die erg handig kan zijn in combinatie met JUnit report om fouten op te sporen. Wij hebben een werkende Ant task toegevoegd om van alle Java code de Javadoc te genereren.
7.9 Alternatieve database We hebben ook nog gekeken naar Microsoft SQL Server 2005 Express Edition, om te kijken of deze ook bruikbaar is voor TOPdesk. De Express Edition heeft drie beperkingen waardoor het alleen interessant is voor kleine omgevingen: Maximale grootte ram geheugen gelimiteerd op 1 GB Maximale grootte database op schijf gelimiteerd op 4GB Maakt gebruik van maximaal 1 processor Naast de beperkingen zijn er ook een aantal voordelen: Werking is exact gelijk aan Microsoft SQL Server 2005, geen aanpassingen aan TOPdesk nodig Database kan worden geüpgrade naar Microsoft SQL Server 2005 als tegen de beperkingen wordt aangelopen Gratis te gebruiken Wij denken dat TOPdesk voor kleine klanten Microsoft SQL Server 2005 Express Edition kan aanbieden, als deze klanten uit deze versie zouden groeien, kunnen ze overstappen naar Microsoft SQL Server 2005.
7.10 Indices 7.10.1 Cleanstep In klasse Version0047 wordt op elke kolom een index aangemaakt. Dit is niet zo heel netjes, indices maak je aan om performance te verhogen door bepaalde kolommen sneller doorzoekbaar te maken. Nu moet er bijvoorbeeld bij een update, insert of delete alle 150 indices van de kolommen bijgewerkt worden, dit kan de performance niet ten goede komen. Wij denken dat het herzien van de plaatsing van de indices performance winst kan opleveren.
7.10.2 MySQL MySQL heeft standaard een limiet van 64 indices per tabel in de binary gecompileerd, als de cleansteps worden doorlopen loopt MySQL tegen deze beperking aan zie 7.10.1 Cleanstep. Een oplossing zou kunnen zijn dat je de limiet van de indices verhoogt naar 256 door te hercompileren met deze waarde. Dan doorloopt de DatabaseTool wel alle cleansteps, maar we hebben niet kunnen achterhalen wat voor impact dit nog meer heeft op MySQL. Het is dus maar de vraag of dit een verstandige keuze is.
7.11 FULL JOIN Binnen de TOPdesk code wordt er op één plaats gebruik gemaakt van een FULL JOIN, omdat MySQL geen ondersteuning biedt voor deze functie raden wij aan om deze te herschrijven in de code naar vereniging van een LEFT JOIN en een RIGHT JOIN (zie figuur 9), dit is in de template niet mogelijk omdat er bij een geneste FULL JOIN dan problemen optreden omdat er te weinig gegevens beschikbaar zijn (je moet dan dingen weten voordat ze bekend zijn).
Figuur 9 FULL JOIN
juni ’07
Bachelorproject IN3700
20
8. Conclusie De opdracht van ons bachelorproject betrof het proberen te implementeren van een open source database binnen de TOPdesk applicatie, daarvoor leek ons en de opdrachtgever MySQL het meest geschikt na een kort onderzoek. Tevens dienden we tests te maken om databasefunctionaliteit, templates, exceptions en de DatabaseTool te testen. Dit is handig voor alle databases om correcte werking te controleren. De ondersteuning van MySQL binnen TOPdesk is op dit moment niet haalbaar zonder ingrijpende wijzigingen in de code te doen ofwel een betere/uitgebreidere versie van MySQL af te wachten. Met de door ons gemaakte tests is het makkelijk te controleren of functionaliteit al ondersteund wordt en of bestaande templates nog correct zijn, dit geldt voor alle databases, mits er een server beschikbaar is om op te testen. Onze ervaring met deze stage bij TOPdesk is zeer positief, er heerst een prettige werksfeer en er is goede begeleiding. We hebben er veel opgestoken van onder meer de manier van werken in een grotere organisatie en het werken aan een groot project.
juni ’07
Bachelorproject IN3700
21
9. Literatuurlijst MySQL Reference manuals http://dev.mysql.com/doc/ Microsoft SQL Server http://www.microsoft.com/sql/default.mspx Inside SQL Server 2000, Kalen Delaney, 2001, ISBN: 0-7356-1129-7 (Reference manual) JUnit (unittest hulpprogramma) http://www.junit.org/ Ant (automatische build hulpprogramma) http://ant.apache.org/ SQLZoo (diverse SQL-queries online uitproberen) http://sqlzoo.net/
juni ’07
Bachelorproject IN3700
22
Bijlage A: Opdracht TOPdesk TOPdesk Sinds 1992 verkoopt het Delftse bedrijf TOPdesk het gelijknamige product TOPdesk. TOPdesk is een Service Management Tool en wordt veel gebruikt bij ICT-helpdesks. TOPdesk biedt onder andere ondersteuning voor de meeste ITIL processen, waarvan de belangrijkste Incident-, Probleem-, Configuratie-, Wijzigings- en Projectbeheer zijn. Het bedrijf is in 15 jaar gegroeid naar ongeveer 185 medewerkers die voornamelijk de ontwikkel-, test-, verkoop- en support afdelingen bemannen. TOPdesk heeft zo’n 3000 klanten in 30 verschillende landen. Door onze klanten worden ruim 1.000.000 werkplekken ondersteund. Ons nieuwste product heet TOPdesk Enterprise. TOPdesk Enterprise is een in Java geschreven webapplicatie, en maakt gebruik van diverse moderne database-systemen om zijn gegevens in te bewaren. De server kan worden geïnstalleerd op Windows en Linux, en heeft levert een luxe webinterface die toegankelijk is voor o.a. Firefox en Internet Explorer. Opdracht: Ondersteuning MySQL database TOPdesk Enterprise, ons nieuwste product, gebruikt SQL-databases om alle gegevens in te bewaren. Op dit moment is het mogelijk om hiervoor Microsoft SQL Server 2000, 2005, Oracle 9i, 10g, PostgreSQL 8 en HSQLDB te gebruiken. Van klanten krijgen we steeds vaker te horen dat zij graag MySQL willen gebruiken. De opdracht is onderzoeken of MySQL geschikt is om gebruikt te kunnen worden door TOPdesk Enterprise om de gegevens in op te slaan. Onderdeel van deze opdracht is het opleveren van een advies voor welke database-systemen TOPdesk zou moeten gaan ondersteunen en hoe het mogelijk is om te testen of een dergelijke database voldoende functionaliteiten biedt. -Roel Spilker Ontwikkeling TOPdesk Martinus Nijhofflaan 2, 2624 ES Delft Postbus 559, 2600 AN Delft T (015) 270 09 00 F (015) 257 52 56 W www.topdesk.com
juni ’07
Bachelorproject IN3700
23
Bijlage B: Mapping Topdesk typen naar DBMS typen TOPdesk boolean char currency date datetime float4 float8 int4 int8 serial4 serial8 text text_binary timespan varchar TOPdesk boolean char currency date datetime float4 float8 int4 int8 serial4 serial8 text text_binary timespan varchar
juni ’07
MSSQL bit nchar() collate Latin1_General_Bin money datetime datetime real float int bigint int identity bigint identity ntext image bigint nvarchar() collate Latin1_General_CI_AI_KS MySQL tinyint char() numeric(19,4) date datetime float double int bigint int auto_increment bigint auto_increment text blob bigint varchar()
Oracle number(1) char( char) number date date number number number number number number clob blob number varchar2( char)
HSQLDB bit char() decimal(19,4) date datetime float float int bigint int generated by default as identity bigint generated by default as identity longvarchar longvarbinary bigint varchar_ignorecase()
Bachelorproject IN3700
Postgre boolean char() numeric(19,4) date timestamp float4 float8 int4 int8 serial4 serial8 text bytea int8 varchar()
24