1 |
# Copyright (C) 2004 by Intevation GmbH |
2 |
# Authors: |
3 |
# Ludwig Reiter <[email protected]> |
4 |
# |
5 |
# This program is free software under the GPL (>=v2) |
6 |
# Read the file COPYING coming with the software for details. |
7 |
|
8 |
"""Erzeugt automatisch CREATE-SQL-Kommandos aus dem Konfigurationsfile. |
9 |
Benötigt 2 Argumente : Quell-Konffile Ziel-SQLfile |
10 |
Beinhaltet Klasse Tab für Tabellen |
11 |
und Liste tablist für die verschiedenen Tabellenobjekte |
12 |
|
13 |
Liest eine Zeile des Konffiles und bearbeitet sie: |
14 |
Wenn Kommentar: |
15 |
nächste Zeile |
16 |
Wenn Folienspezifikation(d.h. nur Folie und Tabellenflags gesetzt): |
17 |
Wenn Folientabellen alle vorhanden |
18 |
nächste Zeile |
19 |
Sonst lege zusätzliche Tabellen an |
20 |
(d.h. Tab anlegen und in tablist appenden) |
21 |
Wenn BesondereInfospezifikation ohne Tabellenname: |
22 |
Gehe die Folientabellen in tabliste durch und lege die |
23 |
Attribute an, falls sie noch nicht vorhanden |
24 |
Wenn BesondereInfospezifikation mit Tabellenname: |
25 |
Wenn Tabelle noch nicht vorhanden: |
26 |
Lege Tabelle an und appende sie in tablist |
27 |
Wenn Attribute noch nicht vorhanden: |
28 |
Lege Attribute in der Tabelle an |
29 |
Nach diesen Durchlauf müssten alle anzulegenden Tabellen mit ihren |
30 |
Attributen in tablist als Tab-Objekte stehen |
31 |
Gehe tablist durch und erzeuge die SQL_Kommandos |
32 |
|
33 |
Folientabellen haben die Namen folie<foliennr><p oder l oder f> |
34 |
und mindestens die Attribute objnr, objart, aktualitaet, edatum, geom. |
35 |
|
36 |
anderen Tabellen haben mindestens die Attribute objnr, artderinfo, |
37 |
kartentyp, darstellungsart. |
38 |
""" |
39 |
|
40 |
import sys |
41 |
|
42 |
class Tab: |
43 |
"""Kontainer für den Tabellennamen und die Attribute + Art der Attribute |
44 |
einer Tabelle. Speichert dies solange bis alle Konfigurationsdateizeilen |
45 |
verarbeitet sind. Dann wird mit SQL_create die SQL -Create-Kommandos |
46 |
erzeugt.""" |
47 |
def __init__(self, Name, ArtderTabelle): |
48 |
"""Name ist der Name der Tabelle |
49 |
ArtderTabelle gibt an was für eine Tabelle erzeugt werden soll: |
50 |
F für Folientabelle |
51 |
Z für Zusatzdatentabelle ohne Geometrie |
52 |
G für Zusatzdatentabelle mit Geometrie""" |
53 |
self.Name = Name |
54 |
self.Attribute = [] |
55 |
self.Attribute.append( ("objnr", "VARCHAR(7)") ) |
56 |
if ArtderTabelle == "F": |
57 |
self.Attribute.append( ("objart", "INTEGER" ) ) |
58 |
self.Attribute.append( ("aktualitaet", "VARCHAR(2)")) |
59 |
self.Attribute.append( ("edatum", "DATE")) |
60 |
self.Attribute.append( ("geom", "MDSYS.SDO_GEOMETRY") ) |
61 |
elif ArtderTabelle in ['Z','G']: |
62 |
self.Attribute.append( ("artderinfo", "INTEGER") ) |
63 |
self.Attribute.append( ("kartentyp", "VARCHAR(2)" )) |
64 |
self.Attribute.append( ("darstellungsart", "INTEGER" )) |
65 |
if ArtderTabelle == "G": |
66 |
self.Attribute.append( ("geom", "MDSYS.SDO_GEOMETRY") ) |
67 |
|
68 |
def isin_Attribute(self, Attribut): |
69 |
"""sucht self.Attribute nach den Attribut durch: |
70 |
1 falls vorhanden |
71 |
0 sonst""" |
72 |
for (Attname,dummy) in self.Attribute: |
73 |
if Attname == Attribut: |
74 |
return 1 |
75 |
return 0 |
76 |
|
77 |
def append_Attribut(self, Atttupel): |
78 |
"""fügt ein Attributtupel der Form ( Attributsnamen, Attributsart) in |
79 |
self.Attribute ein, wenn noch nicht vorhanden.""" |
80 |
if not self.isin_Attribute( Atttupel[0]) and Atttupel[0] != "": |
81 |
self.Attribute.append( Atttupel ) |
82 |
|
83 |
def get_Name(self): |
84 |
"""Gibt self.Name zurück""" |
85 |
return self.Name |
86 |
|
87 |
def create_SQL(self): |
88 |
"""erzeugt das CREATE-SQL-Kommando und gibt es zurück""" |
89 |
SQL_Kom ="CREATE TABLE " |
90 |
SQL_Kom += self.Name |
91 |
SQL_Kom += "\n ( " |
92 |
Komma =0 |
93 |
for (Attname, Attart) in self.Attribute: #Attname für Attributname |
94 |
if Komma ==1: #Attart für Attributsart |
95 |
SQL_Kom += "," |
96 |
SQL_Kom += "\n " |
97 |
SQL_Kom += Attname |
98 |
SQL_Kom += " " |
99 |
SQL_Kom += Attart |
100 |
Komma =1 |
101 |
SQL_Kom += "\n ); \n" |
102 |
return SQL_Kom |
103 |
|
104 |
def name_in_tablist( Name): |
105 |
"""Schaut ob Name in einer Tabelle Tab in tablist der Name ist. |
106 |
Gibt dann Tab zurück""" |
107 |
for tab in tablist: |
108 |
if Name == tab.get_Name(): |
109 |
return tab |
110 |
return 0 |
111 |
|
112 |
def eintragen_Attribute( Name, Komma_split, Art): |
113 |
"""Trägt die Attribute in die Tabellen ein und legt die Tabellen an, falls |
114 |
noch nicht vorhanden""" |
115 |
if not name_in_tablist(Name): |
116 |
Tabobj =Tab( Name , Art) |
117 |
tablist.append( Tabobj ) |
118 |
else: |
119 |
Tabobj = name_in_tablist( Name) |
120 |
Attributlist = Komma_split[5].split(";") |
121 |
for n in range( len( Attributlist )/2): |
122 |
Tabobj.append_Attribut( (Attributlist[2*n], |
123 |
"VARCHAR(" + Attributlist[2*n +1].strip()+")")) |
124 |
|
125 |
# Initialisierung der tablist. |
126 |
tablist =[] |
127 |
try: |
128 |
quelle = open( sys.argv[1] , "r" ) |
129 |
Konf_satz_liste = quelle.readlines() |
130 |
finally: |
131 |
quelle.close() |
132 |
for Konf_satz in Konf_satz_liste: |
133 |
if Konf_satz[0] =='#': |
134 |
continue |
135 |
Komma_split = Konf_satz.split(",") |
136 |
if len(Komma_split) != 6: |
137 |
print "warning: Die Konfigurationsdatei könnte falsch sein" + str(Komma_split) |
138 |
continue |
139 |
if Komma_split[1] =="" and Komma_split[2] =="": |
140 |
Name = "folie" + Komma_split[0] |
141 |
if "n" in Komma_split[4] and not name_in_tablist(Name): |
142 |
tablist.append( Tab( Name ,"F")) |
143 |
if "p" in Komma_split[4] and not name_in_tablist(Name+"_p"): |
144 |
tablist.append( Tab( Name+"_p" ,"F")) |
145 |
if "l" in Komma_split[4] and not name_in_tablist(Name +"_l"): |
146 |
tablist.append( Tab( Name+"_l" ,"F")) |
147 |
if "f" in Komma_split[4] and not name_in_tablist(Name +"_f"): |
148 |
tablist.append( Tab( Name+"_f" ,"F")) |
149 |
elif Komma_split[3] == "": |
150 |
Name = "folie" + Komma_split[0] |
151 |
if "n" in Komma_split[4]: |
152 |
eintragen_Attribute( Name ,Komma_split) |
153 |
if "p" in Komma_split[4] and not name_in_tablist(Name+"_p"): |
154 |
eintragen_Attribute( Name+"_p" ,Komma_split,"F") |
155 |
if "l" in Komma_split[4] and not name_in_tablist(Name +"_l"): |
156 |
eintragen_Attribute( Name+"_l" ,Komma_split,"F") |
157 |
if "f" in Komma_split[4] and not name_in_tablist(Name +"_f"): |
158 |
eintragen_Attribute( Name+"_f" ,Komma_split,"F") |
159 |
else: |
160 |
Name = Komma_split[3] |
161 |
if "n" in Komma_split[4]: |
162 |
eintragen_Attribute( Name ,Komma_split, "Z") |
163 |
if "p" in Komma_split[4] and not name_in_tablist(Name+"_p"): |
164 |
eintragen_Attribute( Name+"_p" ,Komma_split,"G") |
165 |
if "l" in Komma_split[4] and not name_in_tablist(Name +"_l"): |
166 |
eintragen_Attribute( Name+"_l" ,Komma_split,"G") |
167 |
if "f" in Komma_split[4] and not name_in_tablist(Name +"_f"): |
168 |
eintragen_Attribute( Name+"_f" ,Komma_split,"G") |
169 |
|
170 |
SQL_Kom = "" |
171 |
for tab in tablist: |
172 |
SQL_Kom += tab.create_SQL() |
173 |
try: |
174 |
ziel = open( sys.argv[2] , "w" ) |
175 |
ziel.write(SQL_Kom) |
176 |
finally: |
177 |
ziel.close() |
178 |
|
179 |
|
180 |
|