• Rezultati Niso Bili Najdeni

Pretvorba PL/SQL izvorne kode v graf prehodov aplikacije

N/A
N/A
Protected

Academic year: 2022

Share "Pretvorba PL/SQL izvorne kode v graf prehodov aplikacije"

Copied!
57
0
0

Celotno besedilo

(1)

Univerza v Ljubljani

Fakulteta za raˇ cunalniˇ stvo in informatiko

Luka Bac

Pretvorba PL/SQL izvorne kode v graf prehodov aplikacije

DIPLOMSKO DELO

VISOKOˇSOLSKI STROKOVNI ˇSTUDIJSKI PROGRAM PRVE STOPNJE RA ˇCUNALNIˇSTVO IN INFORMATIKA

Mentor : doc. dr. Boˇstjan Slivnik

Ljubljana 2015

(2)
(3)

Rezultati diplomskega dela so intelektualna lastnina avtorja. Za objavljanje ali izkoriˇsˇcanje rezultatov diplomskega dela je potrebno pisno soglasje avtorja, Fakul- tete za raˇcunalniˇstvo in informatiko ter mentorja.

Besedilo je oblikovano z urejevalnikom besedil LATEX.

(4)
(5)

Fakulteta za raˇcunalniˇstvo in informatiko izdaja naslednjo nalogo:

Opis:

Poiˇsˇcite in realizirajte naˇcin pretvorbe izvorne kode spletne aplikacije, ki je na- pisana v programskem jeziku PL-SQL, v graf prehodov aplikacije. Svojo reˇsitev preizkusite na primeru izvorne kode spletne aplikacije eˇStudent.

Opis (angleˇski):

Design and implement a transformation of a web application source code written in PL-SQL programming language into the application transition graph. Test and evaluate your solution by applying it to eˇStudent source code.

(6)
(7)

Izjava o avtorstvu diplomskega dela

Spodaj podpisani Luka Bac, z vpisno ˇstevilko 63090412, sem avtor diplomskega dela z naslovom:

Pretvorba PL/SQL izvorne kode v graf prehodov aplikacije

S svojim podpisom zagotavljam, da:

• sem diplomsko delo izdelal samostojno pod mentorstvom doc. dr. Boˇstjana Slivnika,

• so elektronska oblika diplomskega dela, naslov (slov., angl.), povzetek (slov., angl.) ter kljuˇcne besede (slov., angl.) identiˇcni s tiskano obliko diplomskega dela,

• soglaˇsam z javno objavo elektronske oblike diplomskega dela na svetovnem spletu preko univerzitetnega spletnega arhiva.

V Ljubljani, dne 11. marca 2015 Podpis avtorja:

(8)
(9)

Zahvalil bi se rad mentorju Doc. Dr. Boˇstjanu Slivniku, ki se je tekom izdelave naloge zelo zavzel za korektnost, strokovnost in natanˇcnost. Prav tako gre zahvala tudi vsem, ki so me v ˇcasu mojega ˇstudija podpirali - predvsem starˇsem, bratu in prijateljem. Njihova moralna podpora, prijaznost in potrpeˇzljivost so mi bila vseskozi v oporo.

Zorz.

(10)
(11)

V spomin ˇcudovitemu oˇcetu, ki nas je vse navdal z globokim vedoˇzeljem.

(12)
(13)

Kazalo

Povzetek Abstract

1 Uvod 1

2 Pridobivanje izvorne kode 5

2.1 Restavriranje baze iz izvozne datoteke . . . 5 2.2 Izpis izvorne kode iz baze . . . 8

3 Format izhodnih podatkov 11

3.1 Leksikalna zgradba jezika PL/SQL . . . 11 3.2 Flex . . . 11 3.3 Graphviz . . . 17

4 Zdruˇzevanje v celoto 19

5 Rezultati 25

6 Sklepne ugotovitve 35

(14)
(15)

Seznam uporabljenih kratic

kratica angleˇsko slovensko

SQL Structured Query Language strukturirani povpraˇsevalni jezik za delo s podatkovnimi bazami PL/SQL Procedural Language / SQL proceduralna razˇsiritev za SQL HTML HyperText Markup Language jezik za oznaˇcevanje nadbesedila

JS Javascript programski jezik Javascript

ASM Atomic Section Model Atomiˇcni Model Odseka ATG Application Transition Graph Graf Prehodov Aplikacije CIM Component Interaction Model Model Interakcij Komponent Flex Fast lexical analyzer Hitri leksikalni analizator

(16)
(17)

Povzetek

Pri obratnem inˇzeniringu aplikacij je analitiku v pomoˇc pregledni graf funkcijskih klicev aplikacije. Prikazali smo delovanje razvite aplikacije, ki avtomatsko generira tak graf. Za njegovo predstavitev smo uporabili atomiˇcni model odseka (ASM) s pribliˇzkom grafa prehodov aplikacije (ATG). Aplikacija je bila razvita na primeru informacijskega sistema e-ˇStudent. Sistem temelji na podatkovni bazi proizvajalca Oracle, na voljo nam je bila izvozna datoteka baze, iz katere je bilo treba pridobiti izvorne datoteke s funkcijami, dinamiˇcnimi strukturami in procedurami v jeziku PL/SQL.

Najprej je bilo treba bazo restavrirati, nato pa iz nje izvleˇci izvorno kodo.

Za to kodo smo nato z odprtokodnim orodjem flex definirali potrebno leksikalno zgradbo jezika PL/SQL - v tem primeru predvsem opis funkcijskih klicev. Nato smo z uporabo dobljenega leksikalnega analizatorja generirali s programskim je- zikom Python tekstovno datoteko v formatu za opis grafov DOT. To datoteko smo z orodji iz paketa Graphviz pretvorili v grafe, ki nakazujejo, katere datoteke kliˇcejo katere funkcije, kar je v pomoˇc pri razumevanju strukture sistema. Te grafe smo poskusili narediti bolj berljive z dodatkom funkcij Javascript in stilov CSS za obarvanje povezav ter z izraˇcunom vhodne in izhodne stopnje vozliˇsˇc, s pomoˇcjo katere lahko izloˇcimo posamezna vozliˇsˇca.

Kljuˇcne besede: PL/SQL, Oracle SQL, atomiˇcni model odseka, graf prehodov aplikacije, model interakcij komponent, Flex, Graphviz, Python.

(18)
(19)

Abstract

A graph providing an overview of an application would serve the reverse engineer- ing effort well. We have walked through the workings of an application that was developed to automatically generate one such graph, which was represented by an Atomic Section Model with an approximation of its Application Targeted Graph.

The case-study for this application was the student information system e-ˇStudent.

This system uses an Oracle Database to host the data, while our effort only had access to a database dump from which to retrieve the PL/SQL source code in the form of functions, dynamic structures and procedures.

The first step was to restore the database itself, followed by scraping the source code into text files which were then analyzed using a lexical analyzer developed by the open source tool flex, in which we defined the required PL/SQL lexical structure, focused mainly on recognizing function calls. This output was then fed through a Python script that generated a file in the DOT format, describing the function calls of the individual input files. This was presented by rendering it into a graph with the open source graph visualization softwareGraphviz. These graphs were then made easier to read by injecting Javascript functions and CSS styles to enable highlighting of edges and vertices. In addition, the application calculates the in and out degree of each vertex, which can help the analyst in deciding to exclude certain vertices.

Keywords: PL/SQL, Oracle SQL, atomic section model, application transition graph, component interaction model, Flex, Graphviz, Python.

(20)
(21)

Poglavje 1 Uvod

Cilj obratnega inˇzenirstva je priti do globljega poznavanja subjekta, o katerem ni na voljo natanˇcne specifikacije. To nato omogoˇci replikacijo subjekta, njegovo nad- gradnjo, popravo ali integracijo z obstojeˇcimi sistemi ter formulacijo manjkajoˇce specifikacije.

Spletne aplikacije, kot aplikacije kateregakoli drugega tipa, lahko zastarijo, prvotni razvijalci aplikacije odidejo, znanje se tako ali drugaˇce porazgubi. Za vpo- gled v delovanje aplikacij in pridobivanje tega izgubljenega znanja lahko uporabimo obratno inˇzenirstvo. Pri tem bi bil v veliko pomoˇc pogled na aplikacijo od zgoraj navzdol, kar lahko doseˇzemo z gradnjo enega sploˇsnega ali veˇc specifiˇcnih grafov iz izvorne kode same.

Eden od naˇcinov predstavitve takih grafov je z atomiˇcnim modelom odseka (angl. Atomic Section Model - ASM)[4], ki je predstavljen z grafom prehodov aplikacije (angl. Application Transition Graph - ATG). ATG je usmerjen graf, ki je poslediˇcno sestavljen iz modelov interakcij komponent (angl. Component Inte- raction Model - CIM), njihovih povezav, spremenljivk, ki hranijo vsa moˇzna stanja predstavitvene plasti, in mnoˇzice vseh zaˇcetnih strani. Posamezen element CIM pa vsebuje mnoˇzico zaˇcetnih strani, ki ga naslavljajo, mnoˇzico atomiˇcnih odsekov, ki ga naslavljajo, izraz, ki opisuje strukturo strani, ter mnoˇzico vhodnih in izho- dnih povezav [slika 1.1]. V tej diplomski nalogi se bomo predvsem osredotoˇcili na avtomatsko generiranje pribliˇzka ATG, ki bo vseboval povezave med posameznimi vozliˇsˇci.

Tovrstne spletne aplikacije so lahko napisane z uporabo razliˇcnih tehnologij, 1

(22)

2 POGLAVJE 1. UVOD

Atomični odseki

Atomični model odseka

Graf prehodov aplikacije

Model interakcij komponent

Model interakcij komponent

Model interakcij komponent

Začetne strani Struktura strani

Vhodne in izhodne povezave

Slika 1.1: Prikaz elementov atomiˇcnega modela odseka.

od programskega jezika PHP in njegovih ogrodij kot sta Zend in Symfony, do programskega jezika C# in ogrodja ASP.NET ter programskega jezika Python in ogrodji kot sta Zope in Django, in podobno. Ta diplomska naloga se bo osredotoˇcila na obratno inˇzenirstvo spletnih aplikacij, ustvarjenih z Oracle jezikom PL/SQL, ki s klici procedur in funkcij dinamiˇcno ustvari stran v jeziku HTML. Primer take procedure PL/SQL, ki uporablja klic funkcije htp.p(rint) za izpis kode HTML je naslednji:

1 P R O C E D U R E " P R O C _ E X C E P T I O N _ I Z P I S "

2 (

3 v _ i m e P r o c e d u r e IN V A R C H A R 2 , 4 v _ o r a E r r o r IN V A R C H A R 2

5 ) 6 as

7 v _ a d m i n M a i l V A R C H A R 2 ( 1 0 0 ) ; 8 b e g i n

9

10 v _ a d m i n M a i l := F U N _ P A R ( ’ A D M I N _ M A I L ’) ; 11

12 htp . p ( ’ < CENTER > ’) ;

(23)

3

13 htp . p ( ’ < t a b l e b o r d e r = " 0 " c e l l p a d d i n g = " 0 " c e l l s p a c i n g

= " 0 " w i d t h ="350" > < tr > < td > < img b o r d e r = " 0 " src ="/

i m a g e s / e - s t u d e n t / p i k a . gif " w i d t h = " 1 " h e i g h t = " 1 "

v s p a c e ="5" > </ td > </ tr > </ table >

14 < t a b l e b o r d e r = " 0 " c e l l p a d d i n g = " 0 " c e l l s p a c i n g = " 0 "

w i d t h ="350" >

15 < tr >

16 < td b g c o l o r = " # 8 0 0 0 0 0 " w i d t h ="1" > < img b o r d e r = " 0 " src

="/ i m a g e s / e - s t u d e n t / p i k a . gif " w i d t h = " 1 " h e i g h t

="1" > </ td >

17 < td >

18 < t a b l e b o r d e r = " 0 " c e l l p a d d i n g = " 0 " c e l l s p a c i n g = " 0 "

w i d t h = " 1 0 0 % " >

19 < tr >

20 < td w i d t h = " 1 0 0 % " b g c o l o r = " # 8 0 0 0 0 0 " > & n b s p ; < f o n t c l a s s =" o k n o t e x t " > Napaka </ font > </ td >

21 </ tr >

22 < tr >

23 < td w i d t h = " 1 0 0 % " b g c o l o r = " # 8 0 0 0 0 0 " > < img b o r d e r

= " 0 " src ="/ i m a g e s / e - s t u d e n t / p i k a . gif " w i d t h

= " 1 " h e i g h t ="1" > </ td >

24 </ tr >

25 < tr >

26 < td w i d t h = " 1 0 0 % " >

27 < t a b l e b o r d e r = " 0 " c e l l p a d d i n g = " 3 "

c e l l s p a c i n g = " 0 " w i d t h = " 1 0 0 % " >

28 < tr >

29 < td w i d t h ="100%" > < f o n t c l a s s ="

i z b r a n o _ t e x t " > V s k l o p u ’||

v _ i m e P r o c e d u r e || ’ je pri <9 a > lo do n a p a k e . < br > < f o n t c o l o r ="# f f 0 0 0 0 " > ’||

v _ o r a E r r o r || ’ </ font > < br > P o s v e t u j t e se s < a h r e f =" m a i l t o : ’|| v _ a d m i n M a i l

|| ’" > s k r b n i k o m </ a > s i s t e m a . </ font > </

td >

30 </ tr >

31 </ table >

32 </ td >

33 </ tr >

34 < tr >

35 < td w i d t h = " 1 0 0 % " b g c o l o r = " # 8 0 0 0 0 0 " > < img b o r d e r

= " 0 " src ="/ i m a g e s / e - s t u d e n t / p i k a . gif " w i d t h

= " 1 " h e i g h t ="1" > </ td >

36 </ tr >

37 </ table >

(24)

4 POGLAVJE 1. UVOD

38 </ td >

39 < td b g c o l o r = " # 8 0 0 0 0 0 " w i d t h ="1" > < img b o r d e r = " 0 " src

="/ i m a g e s / e - s t u d e n t / p i k a . gif " w i d t h = " 1 " h e i g h t

="1" > </ td >

40 </ tr >

41 </ table > ’) ; 42

43 htp . p ( ’ </ CENTER > ’) ; 44

45 e x c e p t i o n

46 w h e n o t h e r s t h e n

47 htp . nl ;

48 htp . p ( ’ < f o n t c l a s s =" e r r o r t e x t " > N a p a k a v s k l o p u P R O C _ e x c e p t i o n _ i z p i s . </ font > ’) ;

49 end ;

Najprej je takˇsno kodo treba dobiti, ˇce je ˇse nimamo, zato bo prvo poglavje namenjeno pridobivanju izvorne kode iz izvozne datoteke in restavriranju podat- kovne baze. V naslednjem poglavju bo opisana uporaba odprto kodnega orodja flex, s katerim se definira potrebna leksikalna zgradba PL/SQL - v tem primeru predvsem opis funkcijskih klicev. Nato bo opisano, kako iz izhoda dobljenega leksi- kalnega analizatorja s programskim jezikomPythongeneriramo tekstovno datoteko v formatu za opis grafov DOT. Ta datoteka DOT se z orodji iz paketaGraphviz pretvori v grafe, ki so pribliˇzki ATG in kjer bo jedro posameznega elementa CIM vsebovalo le povezave elementov, ki se sklicujejo nanj, ter povezave na elemente, ki jih ta element sam kliˇce.

(25)

Poglavje 2

Pridobivanje izvorne kode

Najprej je treba pridobiti izvorno kodo PL/SQL v tekstovnih datotekah. ˇCe imamo sreˇco, da je originalna baza ˇse postavljena in deluje, lahko iz nje izvleˇcemo izvorno kodo in jo zapiˇsemo v tekstovne datoteke, te pa naknadno obdelamo. V naspro- tnem primeru, ˇce imamo na voljo le izvozno datoteko (angl. database dump), je treba bazo najprej restavrirati. V naˇsem testnem primeru baze e-ˇStudent smo dobili le datoteko vz64.dmp, ki je bila narejena z razliˇcico Oracle Database 9i.

2.1 Restavriranje baze iz izvozne datoteke

Preden lahko restavriramo stanje iz izvozne datoteke, je seveda treba naloˇziti po- datkovno bazo. Tako smo naloˇzili 64-bitno razliˇcico podatkovne bazeOracle Data- base Express Edition 11g Release 2. Ko je baza naloˇzena, zaˇzenemo preko ukazne vrstice SQL*Plus in se poveˇzemo na bazo kot uporabnik SYSTEM, ki je bil ustvar- jen ob naloˇzitvi podatkovne baze.

1 c o n n e c t S Y S T E M as S Y S D B A

Z imperativom as SYSDBA povemo, da se ˇzelimo povezati z administrator- skimi pravicami, ki jih bomo potrebovali za nekatere nadaljnje ukaze. Nato ustva- rimo shemo, v katero bomo restavrirali bazo. Pri bazi Oracle se z ustvaritvijo uporabnika ustvari tudi istoimenska shema. Temu uporabniku seveda dodelimo geslo (password), nato mu dodamo ˇse pravice, ki jih bo potreboval za dostop do baze (CONNECT), za ustvarjanje tabel in drugih struktur (RESOURCE), za

5

(26)

6 POGLAVJE 2. PRIDOBIVANJE IZVORNE KODE

uvoz baze (IMP FULL DATABASE) in za uporabo sistemskih knjiˇznic (EXE- CUTE CATALOG ROLE,SELECT CATALOG ROLE).

1 C R E A T E U S E R V Z 6 4 I D E N T I F I E D BY p a s s w o r d ; 2 G R A N T C O N N E C T TO V Z 6 4 ;

3 G R A N T R E S O U R C E TO V Z 6 4 ;

4 G R A N T I M P _ F U L L _ D A T A B A S E TO V Z 6 4 ; 5 G R A N T E X E C U T E _ C A T A L O G _ R O L E TO V Z 6 4 ; 6 G R A N T S E L E C T _ C A T A L O G _ R O L E TO V Z 6 4 ;

S tem sta uporabnik in shema pripravljena za uvoz podatkov. Na tem mestu ne preostane niˇc drugega, kot da poskusimo z uvozom. Razliˇcice od Oracle 10g naprej omogoˇcajo in priporoˇcajo uporabo orodij expdp inimpdp za izvoz in uvoz baze namesto starih orodij exp in imp, ki sta bili na voljo prej. Ta nabor novih orodij je hitrejˇsi, bolj zmogljiv in bolj fleksibilen; uvozni del bi sam na primer poskrbel za to, da bi ustvaril potrebne uporabnike in sheme, kar smo v prejˇsnjem koraku storili sami. Ker je bil v naˇsem testnem primeru izvoz baze narejen z razliˇcico Oracle 9i in tako s starim orodjemexp, moramo tudi mi narediti uvoz s starim orodjemimp, saj sta formata nezdruˇzljiva.

Pri nas se je hitro izkazalo, da je ob poskusu uvoza priˇslo do napak - izvoz je bil namreˇc narejen v znakovnem naboru EE8MSWIN1250. Oracle 9i je bil na voljo v dveh razliˇcicah, univerzalni in zahodnoevropski, slednja se je avtomatsko naloˇzila z znakovnim naborom EE8MSWIN1250. Oracle 11g pa je na voljo le v univerzalni razliˇcici, ki ima privzet znakovni nabor AL32UTF8. Na neskladje znakovnih naborov nas program za uvaˇzanje opozori. ˇCe poskusimo uvoziti s temi nastavitvami, naletimo na napake naslednjega tipa:

ORA - 1 2 8 9 9 : v a l u e too l a r g e for c o l u m n " V Z 6 4 "." APP "."

Z G _ M E J A " ( a c t u a l : 31 , m a x i m u m : 30)

Najprej smo poskusili napako zaobiti z nastavitvijo NLS LENGTH SEMAN- TICS na CHAR, kar bi pomenilo, da bi baza raˇcunala dolˇzino niza glede na ˇstevilo znakov, in ne glede na ˇstevilo bajtov, vendar to ni obrodilo sadov. Za pravilno reˇsitev se je izkazala zamenjava znakovnega nabora podatkovne baze.

Naslednje ukaze seveda zopet izvajamo z uporabnikom z administratorskimi pra- vicami, hkrati pa uporabimo omejeno sejo, da se prepriˇcamo, da ni povezanih drugih uporabnikov.

1 S H U T D O W N I M M E D I A T E ; 2 S T A R T U P M O U N T ;

(27)

2.1. RESTAVRIRANJE BAZE IZ IZVOZNE DATOTEKE 7

3 A L T E R S Y S T E M E N A B L E R E S T R I C T E D S E S S I O N ; 4 A L T E R D A T A B A S E O P E N ;

5 A L T E R D A T A B A S E C H A R A C T E R SET I N T E R N A L _ U S E E E 8 M S W I N 1 2 5 0 ; 6 S H U T D O W N ;

7 S T A R T U P R E S T R I C T ; 8 S H U T D O W N ;

9 S T A R T U P ;

Hkrati se moramo prepriˇcati, da ima shema dodeljenega dovolj prostora za uvoz podatkov, sicer lahko pride do naslednjih napak:

ORA - 0 1 6 5 3 : u n a b l e to e x t e n d t a b l e SYS . S O U R C E $ by 128 in t a b l e s p a c e S Y S T E M

V naˇsem primeru smo najprej poskuˇsali shemi vklopiti funkcijo autoextend, ki bi naˇceloma morala sama poskrbeti za to, da ima na voljo dovolj prostora, vendar je to delovalo ˇsele, ko smo roˇcno poveˇcali prostor. Najprej pogledamo, kje so datoteke tabelnih prostorov (angl. tablespace), nato jih poveˇcamo in priredimo uporabniku, ˇce mu ˇse niso bile prirejene, z naslednjimi ukazi:

1 S E L E C T t a b l e s p a c e _ n a m e , f i l e _ n a m e F R O M d b a _ d a t a _ f i l e s ; 2 A L T E R D A T A B A S E D A T A F I L E ’ C :\ o r a c l e x e \ app \ o r a c l e \ o r a d a t a \

XE \ U S E R S . DBF ’ R E S I Z E 500 M ;

3 A L T E R U S E R V Z 6 4 D E F A U L T T A B L E S P A C E u s e r s ;

Po teh spremembah uvoz za naˇse potrebe deluje. Kot reˇceno uporabimo orodje imp, ter mu z argumenti povemo, katero datoteko ˇzelimo uvoziti in v katero shemo jo ˇzelimo uvoziti ter da ˇzelimo opis postopka in morebitne napake shraniti v teks- tovno datoteko.

1 imp - f i l e =" v z 6 4 . dmp " - f r o m u s e r = V Z 6 4 - t o u s e r = V Z 6 4 - log = i m p o r t . log

Zdaj so v podatkovni bazi vsi podatki, funkcije, procedure in paketi, ki so bili definirani v izvozni datoteki. Nekateri proˇzilci (angl. trigger), omejitve (angl.

constraint), drugi tabelni prostori in uporabniki se sicer ˇse vedno niso prenesli in tudi povezave na druge podatkovne baze seveda ne delujejo. Vendar nas ta del restavriranja baze v naˇsem primeru ne zanima, saj imamo v bazi vse podatke, ki jih potrebujemo, in je ta del restavriranja baze zunaj obsega tega diplomskega dela.

(28)

8 POGLAVJE 2. PRIDOBIVANJE IZVORNE KODE

2.2 Izpis izvorne kode iz baze

Ni dovolj, da so podatki le v bazi - nekako jih je treba ˇse pridobiti iz nje. Izvorno kodo posamezne funkcije in procedure lahko dobimo v tabelidba source z ukazom:

1 S E L E C T t e x t F R O M d b a _ s o u r c e W H E R E n a m e = ’

P R O C _ G E N E R I R A J _ R O K _ V S I ’ AND T Y P E in ( ’ F U N C T I O N ’ , ’ P R O C E D U R E ’) O R D E R BY l i n e ;

Na podoben naˇcin lahko z uporabo funkcije DBMS METADATA.GET DDL do- bimo izvorno kodo paketov in dinamiˇcnih struktur, izbiramo pa iz posebne navi- dezne tabeleDUAL, ker sintaksa Oracle SQL zahteva, da vedno izbiramo iz neke tabele:

1 S E L E C T D B M S _ M E T A D A T A . G E T _ D D L ( ’ P A C K A G E _ B O D Y ’ , ’ D Y N _ A B O U T _ B O X ’) F R O M d u a l ;

Naˇse delo bi zaradi preglednosti olajˇsalo to, da bi bila vsaka funkcija, procedura in dinamiˇcna struktura v svoji tekstovni datoteki. Zato smo napisali skripto, ki zdruˇzuje veˇc funkcij in nam omogoˇca izpis izvorne kode vseh funkcij, procedur in paketov, katerih lastnik je izbrani uporabnik.

Za izpis izvorne kode funkcij in procedur z ukazomSPOOLsmo napisali funk- cijo v datoteko scrapeEntry.sql:

1 S P O O L & p r o g r a m _ d i r \ o u t p u t \ & 1 . . txt

2 S E L E C T t e x t F R O M d b a _ s o u r c e W H E R E n a m e = ’&1 ’ AND T Y P E in ( ’ F U N C T I O N ’ , ’ P R O C E D U R E ’) O R D E R BY l i n e ;

3 S P O O L OFF ;

Za izpis izvorne kode paketov pa funkcijo v datoteki scrapePackage.sql:

1 S P O O L & p r o g r a m _ d i r \ o u t p u t \ & 1 . . txt

2 S E L E C T D B M S _ M E T A D A T A . G E T _ D D L ( ’ P A C K A G E _ B O D Y ’ , ’&1 ’) F R O M d u a l ;

3 S P O O L OFF ;

Nato smo napisali krovno funkcijo allFiles.sql, ki kliˇce ti dve funkciji:

1 D E F I N E p r o g r a m _ d i r = C :\ U s e r s \ L u k a \ D e s k t o p 2 SET V E R I F Y OFF

3

4 P R O M P T = = = = = = = = c r e a t i n g s u b s c r i p t = = = = = = = = 5

6 - - t u r n off SQL f e e d b a c k 7 SET F E E D B A C K OFF

8 SET P A G E S I Z E 0 - - d i s a b l e h e a d e r / f e e d b a c k / bla

(29)

2.2. IZPIS IZVORNE KODE IZ BAZE 9

9 SET L I N E S I Z E 3 2 7 6 7 - - set l i n e l e n g t h to max

10 SET L O N G 9 9 9 9 9 9 9 9 9 - - S e t s m a x i m u m w i d t h ( in b y t e s ) for d i s p l a y i n g CLOB , LONG , N C L O B and X M L T y p e v a l u e s ; and for c o p y i n g L O N G v a l u e s

11 SET T R I M S P O O L ON - - t r i m t r a i l i n g s p a c e s 12

13 S P O O L & p r o g r a m _ d i r \ s u b s c r i p t . sql - - r e d i r e c t all o u t p u t to f i l e

14

15 S E L E C T D I S T I N C T ’ @ & p r o g r a m _ d i r \ s c r a p e E n t r y ’ , o b j e c t _ n a m e 16 F R O M d b a _ o b j e c t s

17 W H E R E o b j e c t _ t y p e IN ( ’ F U N C T I O N ’ , ’ P R O C E D U R E ’)

18 AND O W N E R = ’&1 ’;

19

20 S E L E C T D I S T I N C T ’ @ & p r o g r a m _ d i r \ s c r a p e P a c k a g e ’ , o b j e c t _ n a m e

21 F R O M d b a _ o b j e c t s

22 W H E R E o b j e c t _ t y p e IN ( ’ PACKAGE ’) 23 AND O W N E R = ’&1 ’;

24

25 S P O O L OFF ; 26

27 @ & p r o g r a m _ d i r \ s u b s c r i p t . sql 28

29 SET F E E D B A C K 6 30 SET P A G E S I Z E 66

V tej funkciji smo najprej s spremenljivkoprogram dir definirali mapo, v kateri so datoteke funkcij SQL, ki jih bomo klicali, vkljuˇcno z allFiles.sql. Na to spremen- ljivko se nato sklicujeta tudi funkciji scrapeEntry.sql in scrapePackage.sql. Ker ukaz SPOOL v bistvu preusmeri tekst rezultata naˇsih stavkov SQL v datoteko, je treba ta tekst najprej pravilno oblikovati, da bomo res dobili le izvorno kodo brez povratne informacije ukazov. Zato izklopimo vse tovrstne nastavitve, nasta- vimo dolˇzino vrstice in LONG tipov na najveˇcje moˇzne ter vklopimo nastavitev za odstranitev odveˇcnih presledkov. Ko smo to storili, zapiˇsemo dejanske ukaze za posamezno funkcijo, proceduro in paket v vmesno datoteko subscript.sql, ki je dejansko le nabor klicev funkcij scrapeEntry ali scrapePackage za posamezen element:

@C :\ U s e r s \ L u k a \ D e s k t o p \ s c r a p e E n t r y P R O C _ G E N E R I R A J _ R O K _ V S I

Na koncu ta funkcija izvede to vmesno datoteko.

(30)

10 POGLAVJE 2. PRIDOBIVANJE IZVORNE KODE

S tako pripravljenimi skriptami nam preostane le, da v SQL*Plus kliˇcemo krovno funkcijo allFiles.sql z argumentom uporabnika, ki je lastnik funkcij, proce- dur in paketov, ki jih ˇzelimo izvleˇci iz baze.

@C :\ U s e r s \ L u k a \ a l l F i l e s V Z 6 4

Tako se v mapioutput ustvarijo tekstovne datoteke z izvorno kodo.

(31)

Poglavje 3

Format izhodnih podatkov

3.1 Leksikalna zgradba jezika PL/SQL

Izvorne datoteke vsebujejo kodo PL/SQL. PL/SQL (angl. Procedural Langua- ge/SQL) je razˇsiritev jezika SQL, ki omogoˇca uporabo konstruktov postopkovnih jezikov, kot so spremenljivke, pogojni stavki in zanke v obliki funkcij, procedur in dinamiˇcnih struktur. Ker je treba kodo PL/SQL razˇcleniti in priti do funkcijskih klicev, je seveda najprej treba poznati leksikalno zgradbo jezika - katere leksikalne enote ima in kako so znakovno predstavljene. Tabeli 3.1 in 3.2 prikazujeta posa- mezne simbole in njihov pomen v jeziku. Poleg teh simbolov so, kot v klasiˇcnem jeziku SQL, uporabljeni tudi razliˇcni literali za tekst, ˇstevila, datume, ˇcasovne in- tervale; PL/SQL pa ponuja ˇse razˇsiritev za logiˇcne vrednosti (TRUE, FALSE, NULL).

3.2 Flex

Flex[1] (angl. fast lexical analyzer) je odprtokodno orodje, ki iz podane gramatike generira leksikalni analizator, ki za posamezno pravilo izvrˇsi uporabniˇsko kodo.

Tak leksikalni analizator, generiran z verzijo flex 2.5.35, smo uporabili za izluˇsˇcenje funkcijskih klicev iz izvorne kode, vendar je bilo najprej seveda treba prej opisano leksikalno zgradbo pretvoriti v sintakso, ki jo bo flex razumel, da bo lahko ustvaril naˇs analizator.

11

(32)

12 POGLAVJE 3. FORMAT IZHODNIH PODATKOV

Simbol Pomen

+ operator seˇstevanja

:= operator prirejanja

=> operator asociacije

% atribut

’ zaˇcetek/konec znakovnega niza

. komponente

|| operator konkatenacije

/ operator deljenja

** operator potenciranja ( zaˇcetek izraza ali seznama ) konec izraza ali seznama : indikator spremenljivke gostitelja , loˇcilo med elementi

<< zaˇcetek oznake

>> konec oznake

/* zaˇcetek veˇc-vrstiˇcnega komentarja

*/ konec veˇc-vrstiˇcnega komentarja

Tabela 3.1: Prvi del simbolov jezika PL/SQL in njihovi pomeni

(33)

3.2. FLEX 13

Simbol Pomen

* operator mnoˇzenja

” zaˇcetek/konec identifikatorja med narekovaji

.. operator razpona

= relacijski operator enakosti

<> relacijski operator neenakosti

!= relacijski operator neenakosti

˜= relacijski operator neenakosti ˆ= relacijski operator neenakosti

< relacijski operator manjˇse

> relacijski operator veˇcje

<= relacijski operator manjˇse ali enako

>= relacijski operator veˇcje ali enako

@ operator oddaljenega dostopa

- - enovrstiˇcni komentar

; stavˇcni terminator

- operator odˇstevanja ali negacije

Tabela 3.2: Drugi del simbolov jezika PL/SQL in njihovi pomeni

(34)

14 POGLAVJE 3. FORMAT IZHODNIH PODATKOV

Datoteka Flex je tako razdeljena na tri dele, od katerih je vsak loˇcen z znakoma

%%; ti deli so definicije, pravila in uporabniˇska koda. Obvezen del so naˇceloma le pravila, ostala dela pa sta neobvezna. Mi smo uporabili vse tri. Tako se v prvem delu, definicijah, na zaˇcetku poda izbor opcij za flex sam, sklice na knjiˇznice ter definicijo zaˇcetnih pogojev, ki bodo uporabljeni pri pravilih. Nato smo vse zgoraj navedene leksikalne elemente opisali z regularnimi izrazi, s ˇcimer smo dosegli, da lahko pri pravilih operiramo s temi leksikalnimi enotami in se nam ni veˇc treba ukvarjati z njihovo dejansko implementacijo. Naˇs opis jezika PL/SQL za potrebe orodja flex je naslednji:

1 % o p t i o n n o y y w r a p 2

3 % top {

4 # i n c l u d e < s t r i n g s . h >

5 } 6

7 % s S T A R T 8 % s B L O C K 9 % x C O M M E N T 10

11 P L U S \+

12 A S S I G N M E N T :=

13 A S S O C I A T I O N = >

14 A T T R I B U T E %

15 S T R I N G D E L I M ’

16 C O M P O N E N T \.

17 C O N C A T E N A T I O N \ | \ |

18 D I V I S I O N \/

19 E X P O N E N T I A T I O N \ * \ *

20 E X P R E S S I O N L E F T \(

21 E X P R E S S I O N R I G H T \)

22 H O S T V A R :

23 S E P A R A T O R ,

24 L A B E L L E F T < <

25 L A B E L R I G H T > >

26 C O M M E N T L E F T \ / \ *

27 C O M M E N T R I G H T \ * \ /

28 M U L T I P L I C A T I O N \*

29 Q U O T E D I D E N T D E L I M "

30 R A N G E \ . \ .

31 E Q U A L S =

32 N O T E Q U A L S ( < >) | ( ! = ) | ( ~ = ) | ( \ ^ = )

33 L E S S T H A N <

(35)

3.2. FLEX 15

34 G R E A T E R T H A N >

35 LEQ <=

36 GEQ >=

37 R E M O T E A C C E S S @

38 S I N G L E C O M M E N T - -

39 T E R M I N A T O R ;

40 M I N U S -

41

42 W H I T E S P A C E [ \ n \ r \ t \ f ]*

43 I D E N T I F I E R [ A - Za - z ][ A - Za - z0 -9 $ # _ ]*

44 I N T E G E R [+ -]?[0 -9]+

45 N U M B E R [ + - ] ? ( ( [ 0 - 9 ] + ( \ . [ 0 - 9 ] * ) ?)

| ( \ . [ 0 - 9 ] + ) ) ([ eE ] ? [ + - ] ? [ 0 - 9 ] + ) ? ( ? : [ f F d D ]?)

46 D A T E D A T E \ s

+ ’[0 -9]{4} -[0 -9]{2} -[0 -9]{2} ’

47 T I M E S T A M P T I M E S T A M P \ s

+ ’ [ 0 - 9 ] { 4 } - [ 0 - 9 ] { 2 } - [ 0 - 9 ] { 2 } \ s +

[ 0 - 9 ] { 2 } : [ 0 - 9 ] { 2 } : [ 0 - 9 ] { 2 } \ . [ 0 - 9 ] { 2 } ’

48 B O O L E A N (? i : t r u e | f a l s e | n u l l )

Temu sledijo dejanska pravila, katero akcijo naj leksikalni analizator proˇzi, ko naleti na doloˇcen, prej definiran, vzorec. Tu so uporabljeni tudi zaˇcetni pogoji - predvsem za preklop v stanje, v katerem zavrˇzemo vse, kar je vsebina komentarjev.

V tem delu je opisano tudi, kaj bo leksikalni analizator naredil, ko bo prepoznal funkcijski klic. V naˇsem primeru ga le izpiˇse, saj ga bomo v naslednjih korakih uporabili. Naˇsa pravila so naslednja:

49 %%

50 { C O M M E N T L E F T } B E G I N ( C O M M E N T ) ; 51 { S I N G L E C O M M E N T }.*

52 { I D E N T I F I E R }{ W H I T E S P A C E }{ E X P R E S S I O N L E F T } . * {

E X P R E S S I O N R I G H T }{ W H I T E S P A C E }{ T E R M I N A T O R } p r i n t f ("% s \ n

" , y y t e x t ) ;

53 < COMMENT >{ C O M M E N T R I G H T } B E G I N ( I N I T I A L ) ; 54 < COMMENT > . | \ n

55 .|\ n

Na koncu je ˇse del, ki vsebuje uporabniˇsko kodo. Tu predvsem malo izboljˇsamo uporabniˇsko izkuˇsnjo in omogoˇcimo ali uporabo programa brez argumentov, kjer bere iz standardnega vhoda, ali pa, da vhod predstavlja datoteka. Naˇs del z uporabniˇsko kodo je naslednji:

56 %%

57 int m a i n ( int argc , c h a r * a r g v []) {

(36)

16 POGLAVJE 3. FORMAT IZHODNIH PODATKOV

58 if ( a r g c == 2) {

59 y y i n = f o p e n ( a r g v [1] , " r ") ;

60 y y l e x () ;

61 f c l o s e ( y y i n ) ;

62 } e l s e if ( a r g c == 1) {

63 y y l e x () ;

64 } e l s e {

65 p r i n t f (" T h i s p r o g r a m can be run w i t h o u t an

a r g u m e n t for s t a n d a r d input , or a f i l e n a m e as an a r g u m e n t .\ n ") ;

66 r e t u r n -1;

67 }

68 }

(37)

3.3. GRAPHVIZ 17

3.3 Graphviz

Graphviz[3] je odprtokodni paket orodij, ki iz datoteke formata DOT generira graf na razliˇcne naˇcine. Uporabili smo razliˇcico Graphviz 2.38. Najprej definiramo, da gre za usmerjen graf, in mu doloˇcimo razliˇcne opcije, nato (glede na to ali ˇzelimo graf z gruˇcenjem ali ne) poimenujemo podgrafe in v njih poveˇzemo posamezna vozliˇsˇca z operatorjem ->. Ko je gruˇcenje vklopljeno, moramo zato, da imamo lahko veˇc vozliˇsˇc z enako oznako, tem vozliˇsˇcem doloˇciti ˇse, kateri gruˇci pripadajo, ter jim popraviti oznako na funkcijski klic sam. Vozliˇsˇce, ki je nevidno in se imenuje enako kot gruˇca, je interno in dejansko predstavlja gruˇco samo. Izsek datoteke DOT, ki jo generira naˇs program, ko je gruˇcenje izklopljeno, je naslednji:

1 s t r i c t d i g r a p h {

2 g r a p h [ c o m p o u n d = t r u e ];

3 " p r o c _ a n a l i z a _ p o l a g a n j a _ p r o f " - > " p r o c _ o b r o b a "

4 " p r o c _ a n a l i z a _ p o l a g a n j a _ p r o f " - > " p r o c _ o b r o b a _ e n d "

5 " f u n _ p r i j a v i _ n a _ k o l o k v i j " - > " f u n _ p a r n "

6 }

Izsek z gruˇcenjem pa je tak:

1 s t r i c t d i g r a p h {

2 g r a p h [ c o m p o u n d = t r u e ];

3 s u b g r a p h " c l u s t e r P R O C _ V S T A V I _ S K L E P " { 4 l a b e l = " P R O C _ V S T A V I _ S K L E P "

5 " p r o c _ v s t a v i _ s k l e p " [ l a b e l ="" s t y l e = i n v i s ] 6 " p r o c _ v s t a v i _ s k l e p | p r o c _ i z p i s _ s t a t u s a " - >

" c l u s t e r P R O C _ I Z P I S _ S T A T U S A "

7 " p r o c _ v s t a v i _ s k l e p | p r o c _ i z p i s _ s t a t u s a "

[ l a b e l =" p r o c _ i z p i s _ s t a t u s a "]

8 }

9 s u b g r a p h " c l u s t e r F U N _ D A T U M _ O D D A J E _ T E M E " { 10 l a b e l = " F U N _ D A T U M _ O D D A J E _ T E M E "

11 " f u n _ d a t u m _ o d d a j e _ t e m e " [ l a b e l ="" s t y l e = i n v i s ] 12 " f u n _ d a t u m _ o d d a j e _ t e m e | p r o c _ i z b i r a _ d a t u m a " - >

" c l u s t e r P R O C _ I Z B I R A _ D A T U M A "

13 " f u n _ d a t u m _ o d d a j e _ t e m e | p r o c _ i z b i r a _ d a t u m a "

[ l a b e l =" p r o c _ i z b i r a _ d a t u m a "]

14 }

15 [ . . . ]

16 }

(38)

18 POGLAVJE 3. FORMAT IZHODNIH PODATKOV

(39)

Poglavje 4

Zdruˇ zevanje v celoto

Zdaj, ko imamo generiran leksikalni analizator in definirano sintakso datoteke DOT, lahko podatke s katerimkoli programskim jezikom enostavno obdelamo in zdruˇzimo. Lahko bi si izbrali recimo lupino okolja Linux, vendar smo se v naˇsem primeru odloˇcili za Python[2].

1 i m p o r t os 2 i m p o r t sys

3 i m p o r t s u b p r o c e s s 4 i m p o r t g e t o p t 5

6 v e r b o s e = F a l s e 7 c l u s t e r = F a l s e 8 r e c u r s i v e = F a l s e 9 p r e t t y = F a l s e

10 s r c d i r = os . g e t c w d () 11 o u t p u t = " g r a p h "

12 ext = " . txt "

13 s p l i t t e r = " | "

14

15 try :

16 opts , a r g s = g e t o p t . g e t o p t ( sys . a r g v [1:] , " h c v r p s : e : o : t : " , [ " h e l p " , " c l u s t e r " , " v e r b o s e " , " r e c u r s i v e " ,

" p r e t t y " , " s o u r c e = " , " e x t e n s i o n = " , " o u t p u t = " , "

s p l i t t e r = " ])

17 e x c e p t g e t o p t . G e t o p t E r r o r :

18 p r i n t " V a l i d o p t i o n s : - h - - h e l p - c - - c l u s t e r - v - - v e r b o s e - r - - r e c u r s i v e - p - - p r e t t y - s - - s o u r c e - e

- - e x t e n s i o n - o - - output , - t - - s p l i t t e r "

19 sys . e x i t (1)

19

(40)

20 POGLAVJE 4. ZDRU ˇZEVANJE V CELOTO

20

21 for opt , arg in o p t s :

22 if opt in ( " - h " , " - - h e l p " ) :

23 p r i n t " V a l i d o p t i o n s : - h - - h e l p - c - - c l u s t e r - v - - v e r b o s e - r - - r e c u r s i v e - p - - p r e t t y - s - - s o u r c e - e - - e x t e n s i o n - o - - o u t p u t "

24 sys . e x i t (0)

25 e l i f opt in ( " - c " , " - - c l u s t e r " ) :

26 c l u s t e r = T r u e

27 e l i f opt in ( " - v " , " - - v e r b o s e " ) :

28 v e r b o s e = T r u e

29 e l i f opt in ( " - r " , " - - r e c u r s i v e " ) :

30 r e c u r s i v e = T r u e

31 e l i f opt in ( " - p " , " - - p r e t t y " ) :

32 p r e t t y = T r u e

33 e l i f opt in ( " - s " , " - - s o u r c e " ) :

34 if os . p a t h . i s d i r ( arg ) :

35 s r c d i r = arg

36 e l s e :

37 p r i n t " S p e c i f i e d s o u r c e d i r e c t o r y d o e s not e x i t or is not a d i r e c t o r y "

38 e x i t (1)

39 e l i f opt in ( " - e " , " - - e x t e n s i o n " ) :

40 ext = " . " + arg

41 e l i f opt in ( " - o " , " - - o u t p u t " ) :

42 o u t p u t = arg

43 e l i f opt in ( " - t " , " - s p l i t t e r " ) :

44 s p l i t t e r = arg

V prvem delu poskrbimo za uvoz knjiˇznic, nastavimo parametre na privzete vrednosti ter preberemo kateri argumenti so bili podani programu. Prepoznani argumenti so naslednji: -h ali –help za izpis pomoˇci uporabniku; -c ali –cluster, kjer posamezen element ni veˇc funkcijski klic, temveˇc skupina funkcijskih klicev, ki jih kliˇce element; -v ali –verbose za podroben izpis delovanja programa; -r ali –recursive da program upoˇsteva tudi funkcijske klice znotraj funkcijskih klicev; -p ali –pretty da program na koncu dobljeno datoteko svg olepˇsa za prijaznejˇsi prikaz v brskalniku - omogoˇci, da se posamezna vozliˇsˇca in njihove povezave obarvajo rdeˇce ob kliku ali prehodu z miˇsko; -s ali –source nastavi izvorno mapo; -e ali –extension nastavi konˇcnico vhodnih datotek; -o ali –output nastavi ime izhodnih datotek dot in svg; -t ali –splitter nastavi loˇcilo med skupino in elementom, ki ga uporablja –pretty.

(41)

21

45 c u r d i r = os . g e t c w d () 46 ls = os . l i s t d i r ( s r c d i r ) 47 e n t r i e s = [];

48

49 if v e r b o s e :

50 p r i n t ’ v e r b o s e set to : ’ , v e r b o s e 51 p r i n t ’ c l u s t e r set to : ’ , c l u s t e r 52 p r i n t ’ r e c u r s i v e set to : ’ , r e c u r s i v e 53 p r i n t ’ s o u r c e d i r e c t o r y set to : ’ , s r c d i r 54 p r i n t ’ i n p u t e x t e n s i o n set to : ’ , ext 55 p r i n t ’ o u t p u t f i l e set to : ’ , o u t p u t 56

57 for e n t r y in ls :

58 e n t r y N a m e = os . p a t h . s p l i t e x t ( e n t r y ) [0]

59 if os . p a t h . s p l i t e x t ( e n t r y ) [ 1 ] . l o w e r () == ext : 60 e n t r i e s . a p p e n d ( e n t r y ) ;

61 if v e r b o s e :

62 p r i n t ’ l e x i n g : ’ , e n t r y

63 l e x o u t = o p e n ( os . p a t h . j o i n ( srcdir , e n t r y N a m e + ’ . l e x o u t ’ ) , ’ w ’ )

64 s u b p r o c e s s . c a l l ([ ’ ./ l e x P L S Q L ’ , e n t r y ] , s t d o u t = l e x o u t )

65 l e x o u t . c l o s e ()

Nato izvedemo leksikalno analizo vseh datotek v nastavljeni izvorni mapi z nastavljeno konˇcnico, rezultat katere je datoteka .lexout s funkcijskimi klici za posamezno datoteko.

66 g r a p h = o p e n ( o u t p u t + ’ . dot ’ , ’ w ’ ) 67 g r a p h . w r i t e ( ’ s t r i c t d i g r a p h {\ n ’ )

68 g r a p h . w r i t e ( ’ \ t g r a p h [ c o m p o u n d = t r u e ];\ n ’ ) 69 for e n t r y in e n t r i e s :

70 if v e r b o s e :

71 p r i n t ’ g r a p h i n g ’ , s r c d i r + os . sep + e n t r y 72 s t r i n g = " "

73 e n t r y N a m e = os . p a t h . s p l i t e x t ( e n t r y ) [0]

74 i n p u t f i l e = o p e n ( os . p a t h . j o i n ( srcdir , e n t r y N a m e + ’ . l e x o u t ’ ) , ’ r ’ )

75 if c l u s t e r :

76 s t r i n g += " \ t s u b g r a p h \" c l u s t e r " + e n t r y N a m e . u p p e r () + " \" {\ n "

77 s t r i n g += " \ t \ t l a b e l = \" " + e n t r y N a m e . u p p e r () + " \"\ n "

78 for l i n e in i n p u t f i l e :

79 # f u n c t i o n c a l l s w i t h i n f u n c t i o n c a l l s

(42)

22 POGLAVJE 4. ZDRU ˇZEVANJE V CELOTO

80 s p l i t t e d = l i n e . s p l i t ( ’ ( ’ ) if r e c u r s i v e e l s e [ l i n e . s p l i t ( ’ ( ’ ) [ 0 ] ]

81 for n a m e in s p l i t t e d :

82 for e n t r y in e n t r i e s :

83 c o m p = os . p a t h . s p l i t e x t ( e n t r y ) [ 0 ] .

l o w e r ()

84 if n a m e . l o w e r () . e n d s w i t h ( c o m p ) :

85 s t r i n g += " \ t \ t \" " + e n t r y N a m e .

l o w e r () + s p l i t t e r + c o m p + " \"

- > " + ’ " c l u s t e r ’ + c o m p . u p p e r () + ’ "\ n ’

86 s t r i n g += " \ t \ t \" " + e n t r y N a m e .

l o w e r () + s p l i t t e r + c o m p + " \" [ l a b e l =\" " + c o m p . l o w e r () + "

\ " ] \ n "

87 s t r i n g += " \ t }\ n "

88 g r a p h . w r i t e ( s t r i n g ) 89

90 e l s e :

91 for l i n e in i n p u t f i l e :

92 # f u n c t i o n c a l l s w i t h i n f u n c t i o n c a l l s

93 s p l i t t e d = l i n e . s p l i t ( ’ ( ’ ) if r e c u r s i v e e l s e [ l i n e . s p l i t ( ’ ( ’ ) [ 0 ] ]

94 for n a m e in s p l i t t e d :

95 for e n t r y in e n t r i e s :

96 c o m p = os . p a t h . s p l i t e x t ( e n t r y ) [ 0 ] .

l o w e r ()

97 if n a m e . l o w e r () . e n d s w i t h ( c o m p ) :

98 s t r i n g += " \ t \" " + e n t r y N a m e .

l o w e r () + " \" - > \" " + c o m p + " \"\ n "

99 g r a p h . w r i t e ( s t r i n g ) 100 i n p u t f i l e . c l o s e ()

101

102 g r a p h . w r i t e ( " } " ) 103 g r a p h . c l o s e ()

Ko je leksikalna analiza zakljuˇcena, zaˇcnemo gradnjo usmerjenega grafa samega.

Vsaka datoteka s konˇcnico .lexout, ki jo je generiral leksikalni analizator, po vrsti- cah predstavlja vse funkcijske klice tiste funkcije, procedure ali dinamiˇcne strani, ki ji datoteka pripada. Tako program za vsako vrstico doda v graf povezavo od lastnice datoteke do funkcije, ki jo ta vrstica kliˇce - vendar le, ˇce je klicana funkcija med datotekami z izvorno kodo. ˇCe je bil podan parameter –clustered, potem bo

(43)

23

za vsako vhodno datoteko program ustvaril v grafu podgraf, v katerem bodo pred- stavljeni vsi funkcijski klici lastnice datoteke, vsak funkcijski klic pa ima povezavo na svoj podgraf.

104 if v e r b o s e :

105 p r i n t ’ r e n d e r i n g to : ’ + o u t p u t + ’ . svg ’

106 s u b p r o c e s s . c a l l ([ ’ fdp ’ , o u t p u t + ’ . dot ’ , ’ - T s v g ’ , ’ - o ’ + o u t p u t + ’ . svg ’ ])

S tem je graf konˇcan in zapisan v datoteki dot. Zdaj ga je treba izrisati za prika.

Za ta namen uporabimo modul Graphviz fdp, ki razporedi vozliˇsˇca po ”modelu vzmeti”. Rezultat je datoteka svg, ki jo lahko odpremo kar v spletnem brskalniku.

107 if p r e t t y :

108 if v e r b o s e :

109 p r i n t ’ p r e t t i f y i n g to : p r e t t y _ ’ + o u t p u t + ’ . svg ’ 110 i m p o r t p r e t t y s v g

111 p r e t t y s v g . p r e t t i f y ( o u t p u t + ’ . svg ’ , s p l i t t e r )

Ce je bil podan parameterˇ –pretty, bo program na koncu ustvarjeni datoteki svg dodal ˇse funkcije Javascript in stil CSS, ki skupaj omogoˇcajo, da se v brskalniku posamezna vozliˇsˇca in pripadajoˇce povezave ob dotiku z miˇskinim kazalcem ali klikom obarvajo rdeˇce, kar olajˇsa pregledovanje grafa v brskalniku.

(44)

24 POGLAVJE 4. ZDRU ˇZEVANJE V CELOTO

(45)

Poglavje 5 Rezultati

Potem ko smo uspeˇsno pridobili datoteke izvorne kode za vsako funkcijo, proceduro in dinamiˇcno strukturo v podmapo SOURCE, poˇzenemo naˇso skripto Python (ki mora seveda imeti dostop do vseh povezanih programov in skript) s parametri –verbose,–recursive,–pretty ter–source=SOURCE in–output=recursive fdp all: p y t h o n g e n A T G . py - vrp - s S O U R C E - o r e c u r s i v e _ f d p _ a l l

S tem se ustvari datoteka recursive fdp all.dot, ki predstavlja opis grafa pre- hodov aplikacije, hkrati se ta opis vizualno upodobi v obliki datoteke recursive fdp all.svg. Ti datoteki se, ker smo uporabili parameter –pretty nato ˇse dodata koda JS in stil CSS, ki skupaj omogoˇcata barvanje posameznih povezav in vo- zliˇsˇc, kar se shrani v datoteko s predponopretty . Tako pridobljeni graf aplikacije e-ˇStudent, ustvarjen s tem procesom, je prikazan na sliki 5.1. Vsako vozliˇsˇce na grafu predstavlja eno funkcijo, proceduro ali dinamiˇcno stran, medtem ko vsaka usmerjena povezava iz enega vozliˇsˇca na drugo predstavlja en klic izvora na ponor.

Ce bi vsako vozliˇˇ sˇce v grafu predstavljalo CIM z vsemi njegovimi elementi, se pravi ˇce bi vsakemu vozliˇsˇcu dodali zaˇcetno stran, ki ga naslavlja, atomiˇcne odseke, ki ga naslavljajo, ter izraz, ki opisuje strukturo strani (vhodne in izhodne povezave namreˇc ˇze imamo), potem bi dobili ATG, ki bi predstavljal ASM.

25

(46)

26 POGLAVJE 5. REZULTATI

Slika 5.1: Graf dobljen iz vseh funkcij, procedur in dinamiˇcnih struktur

(47)

27

Kot je razvidno, je graf kompleksen in teˇzko pregleden, saj vsebuje 885 vozliˇsˇc in 2223 povezav, med katerimi oˇcitno nekateri prevladujejo. Ob gradnji grafa sta se privzeto izraˇcunali tudi vhodna in izhodna stopnja posameznega vozliˇsˇca, katerih povpreˇcje znaˇsa 2.51. Ti sta predstavljeni vsaka na svojem grafu - prva z zapono

indeg na sliki 5.2 druga pa z zapono outdeg na sliki 5.3.

proc_exception_izpis

fun_pgid fun_par proc_form_footer proc_form_banner

proc_obroba

proc_obroba_end proc_javascript proc_izpis_statusa proc_izberi_delavec proc_izbira_datuma fun_ime_predmeta proc_vpisna_stevilka fun_leto_un_char proc_stud_leto fun_parn

proc_letnik fun_sol_leto fun_ime_vsi fun_predmet_kol fun_ime_skupine

proc_vip_letnik_vec fun_ime_delavca fun_par_vip_f fun_split proc_smer

proc_vrsta_vpisa proc_poisci_oceno

proc_nacin fun_izpisi_ime_delavec_pisarna proc_copyright fun_leto_un fun_sifranti_zapisi_iskanje

fun_vnesi_obvestilo proc_sifranti_dodaj fun_sol_leto_char fun_dinamicna_init

fun_dinamicna_dodaj proc_vip_all

fun_urlencode proc_delavec

fun_ime_studenta fun_txt_convert_iso_win

fun_ime_zavoda proc_vip_letnik

fun_zadnje_polaganje_izp fun_vpisi_vaje fun_check_grades proc_vip_between_dipl fun_vpisi_izpit

0 100 200 300 400 500 600 700

Slika 5.2: Graf petdesetih vozliˇsˇc z najviˇsjo vhodno stopnjo

Na grafih naˇsega primera se opazi, da vhodna stopnja izrazito izstopa pri prvih ˇstirih vozliˇsˇc, pri katerih je nad 100. Med temi prednjaˇci vozliˇsˇceproc exception izpis, temu sledijofun pgid,fun par terproc form footer, medtem ko izhodna stopnja ni pretirano velika - najveˇc povezav na druga vozliˇsˇca imata vozliˇsˇci fun vpisni list infun vpisni preveri podatke. Zdaj se mora uporabnik sam odloˇciti kaj bo s temi podatki storil - ali se bodo vozliˇsˇca z visokimi stopnjami kritiˇcno ovrednotila in

(48)

28 POGLAVJE 5. REZULTATI

fun_vpisni_list fun_vpisni_preveri_podatke dyn_diplome_dvig_teme dyn_napredovanje_pogoji dyn_izvajalci_brisanje proc_zapis_ustnih_rez_seznam dyn_razpis_kolokvijev dyn_vn_oc_pi proc_dynamic_page dyn_vnos_kon_ocen_seznam_prof dyn_pregled_prijav_studenta proc_obdelaj_student_pogoji_s proc_insert_vnos_kon_ocen_vpis dyn_predmetnik_vnos fun_prijavi_na_pi dyn_seznam_studentov_naslovi proc_frekvence_pregled proc_frekvence_vnos proc_zakljuci_ocene dyn_vnos_ocen_vpis

dyn_analiza_po_letniku dyn_vnos_ocen_kolokvija dyn_polaganje_vnaprej dyn_studijski_koledar dyn_delna_oc_dodajanje dyn_povp_ocene_stud_5

dyn_seznam_p dyn_rocne_prijave dyn_diplome_zagovor proc_obdelaj_student_pogoji dyn_analiza_konec_studij_sreds proc_sifranti_popravi dyn_izpis_opravljenih_izpitov

dyn_frekvence_pregled dyn_analiza_rangiranje

dyn_delna_oc_spreminjanje proc_zagovor_of proc_izpis_ocen_izpita dyn_pogoji_napredovanje_brisi dyn_prijava_na_kolokvij_prof dyn_podalsaj_abs dyn_seznam_studentov_obcina dyn_obvestila_za_kolokvij dyn_stanje_prepis proc_frekvence_izpis

dyn_analiza_ocen_studenti dyn_individualni_vnos_ocen

proc_sifranti_dodaj dyn_seznam_studentov_praksa dyn_predmetnik_spr

0 5 10 15 20 25

Slika 5.3: Graf petdesetih vozliˇsˇc z najviˇsjo izhodno stopnjo

vzela pod drobnogled, ali pa se bodo enostavno izloˇcila zgolj iz ˇzelje odkrivanja drugih zakonitosti, zavedati pa se seveda mora, da se s tem zabriˇse celotna slika aplikacije in graf lahko postane zavajajoˇc. Kot primer smo tu najprej predposta- vili, da je uporabnik pregledal funkcijoproc exception izpis in priˇsel do zakljuˇcka, da ta funkcija nima veˇcje povezave s samo logiko aplikacije. Zaradi tega jo je izloˇcil in ˇse enkrat ustvaril graf, ki je predstavljen na sliki 5.4 in ima 653 vozliˇsˇc in 1534 povezav, kar pomeni da je povpreˇcna stopnja vozliˇsˇc zdaj 2.35.

(49)

29

Slika 5.4: Graf dobljen iz vseh funkcij, procedur in dinamiˇcnih struktur.

Izkljuˇceno je bilo vozliˇsˇceproc exception izpis.

(50)

30 POGLAVJE 5. REZULTATI

Druga predpostavka bi bila, da se je uporabnik arbitrarno odloˇcil odstraniti vsa vozliˇsˇca s stopnjo, veˇcjo od 100, kar pomeni, da so bila v naˇsem primeru od- stranjena vozliˇsˇcaproc exception izpis,fun pgid,fun par inproc form footer. Nato je ponovno ustvaril graf, ki je predstavljen na sliki 5.5, in ima 617 vozliˇsˇc in 998 povezav. Tak graf je zavoljo povpreˇcne stopnje vozliˇsˇc 1.62, manj izredno poveza- nih vozliˇsˇc ter dodane funkcije oznaˇcevanja mnogo laˇzje pregledovati in raziskovati, ˇceprav, kot reˇceno, ne prikazuje veˇc stoodstotno verodostojne slike.

(51)

31

Slika 5.5: Graf dobljen iz vseh funkcij, procedur in dinamiˇcnih struktur.

Izkljuˇcena so vozliˇsˇca s stopnjo veˇcjo od 100.

(52)

32 POGLAVJE 5. REZULTATI

Ce je v naˇˇ sem programu vklopljen parameter gruˇcenja –cluster, so rezultati naˇceloma enaki, razlikuje se le njihova predstavitev. Zdaj je vsako vozliˇsˇce pred- stavljeno kot skupina, funkcijskih klicev, ki jih to vozliˇsˇce vsebuje, posamezna notranja vozliˇsˇca pa imajo nato povezave na skupine, ki jih predstavljajo. Razlika je ˇse ta, da so v tem primeru na grafu prikazane tudi skupine brez notranjih vo- zliˇsˇc, torej funkcije, procedure ali dinamiˇcne strukture brez klicev, s ˇcimer naraste ˇstevilo vozliˇsˇc na 959, ˇstevilo povezav pa ostane 2223.

Slika 5.6: Detajlni izsek grafa 5.7

(53)

33

Slika 5.7: Graf dobljen iz vseh funkcij, procedur in dinamiˇcnih struktur z vkljuˇcenim parametrom gruˇcenja.

(54)

34 POGLAVJE 5. REZULTATI

(55)

Poglavje 6

Sklepne ugotovitve

Ugotovili smo, da so spletne aplikacije in njihove funkcije, procedure in dinamiˇcne strukture zelo kompleksne in na prvi pogled neobvladljive, vendar se z naˇsim orod- jem in njemu podobnimi, da omogoˇciti pogled iz ptiˇcje perspektive in je tega, s posameznimi prijemi, kot je na primer dodajanje poudarkov, mogoˇce tudi neko- liko olajˇsati. Na primeru podatkovne baze e-ˇStudent smo pokazali, da je z naˇsim programom mogoˇce generirati za poljubno shemo PL/SQL graf klicev posameznih funkcij, procedur in dinamiˇcnih struktur, ki je pribliˇzek ATG. Temu bi sledilo razvrˇsˇcanje vozliˇsˇc grafa v gruˇce, vendar to ni veˇc tema te diplomske naloge.

Naˇceloma je program generiˇcen do te mere, da bo, ˇce imamo primerne vhodne podatke v njemu prijazni obliki (vsaka funkcija v svoji tekstovni datoteki), brez teˇzav deloval za poljuben programski jezik, ki ima podobno semantiko funkcij- skih klicev kot PL/SQL, oziroma je tako modularen, da lahko posamezne module uporabljamo samostojno ali jih tudi zamenjamo.

35

(56)

36 POGLAVJE 6. SKLEPNE UGOTOVITVE

(57)

Literatura

[1] Flex - fast lexical analyzer, dostopno na:

http://flex.sourceforge.net/

[2] Python

https://www.python.org/

[3] Graphviz

http://www.graphviz.org/

[4] Roˇzanc, I., Slivnik, B.: Using Reverse Engineering to Construct the Platform Independent Model of a Web Application for Student Information Systems.

Computer Science and Information Systems, Vol. 10, No. 4, 1557-1583. (2013)

37

Reference

Outline

POVEZANI DOKUMENTI

Vse kar nam ta metoda naredi je, da nam ustvari prvo razliˇ cico podatkovne baze s pomoˇ cjo SQL skripte, nad katero potem poˇ zenemo metodo onUpgrade(int, int), ki nam to nadgradi do

Zavarovanje podatkov zapisovalnika Iz aplikacije TraSens, ki je namenjena za spremljanje meritev, sicer ni mogoˇ ce spreminjati podat- kov na zapisovalniku, vendar lahko oseba, ˇ ce

Uporabnik lahko do podatkov temperaturnih senzorjev dostopa na veˇ c razliˇ cnih naˇ cinov, in sicer preko ˇ ze obstojeˇ ce lokalne baze, neposredno z uporabo MQTT protokola in

Kljuˇ cne besede: razvoj spletne aplikacije za naˇ crtovanje relacijske podat- kovne baze, podatkovna baza, konceptualni model, entitete, podatkovne re-

V naˇsem primeru so preko njega povezani stroji s streˇ zniki OPC DA in podatkovna baza Microsoft SQL spletne aplikacije za upravljanje z recepti, kar nam omogoˇ ca nalaganje

S pomočjo »SQL Server Analysis Services« lahko podatke znotraj naše podatkovne baze analiziramo in nato optimiziramo, kar nam prav tako olajša delo, saj ne

Uporabil sem tri vrste tehnologij programskega jezika Java (dinami č ne zahteve SQL, SQLJ ter shranjene procedure (angl. Stored Procedure) ter terogramski jezik PL/I.

Poleg podatkovne baze ERP sistema Microsoft Dynamics NAV, spletna trgovina uporablja še drugo relacijsko podatkovno bazo, ki sloni na strežniku Microsoft SQL Server 2008 Express