/[edbsilon]/trunk/edbsilon/Tabellen/auto_create_oracle.py
ViewVC logotype

Annotation of /trunk/edbsilon/Tabellen/auto_create_oracle.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 49 - (hide annotations)
Tue Dec 7 13:58:55 2004 UTC (20 years ago) by silke
File MIME type: text/x-python
File size: 10573 byte(s)
Added command to create trigger to have a well defined ID

1 ludwig 23 # 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 ludwig 30 Folientabellen haben die Namen f<foliennr><_p oder _l oder _f>
34 ludwig 23 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 ludwig 24 F für Folientabelle mit Linien- oder Flächengeometrie
51     FP für Folientablle mit Punktgeometrie
52 ludwig 23 Z für Zusatzdatentabelle ohne Geometrie
53 ludwig 24 G für Zusatzdatentabelle mit Geometrie
54     GP für Zusatzdatentabelle mit Punktgeometrie"""
55 ludwig 23 self.Name = Name
56     self.Attribute = []
57 silke 49 self.Attribute.append(("objnr", "VARCHAR(7)"))
58     self.Attribute.append(("ogr_fid", "INTEGER"))
59 ludwig 24 if ArtderTabelle =="F" or ArtderTabelle == "FP" :
60 ludwig 23 self.Attribute.append( ("objart", "INTEGER" ) )
61     self.Attribute.append( ("aktualitaet", "VARCHAR(2)"))
62     self.Attribute.append( ("edatum", "DATE"))
63 ludwig 24 self.Attribute.append( ("geom", "MDSYS.SDO_GEOMETRY") )
64     if ArtderTabelle == "FP" :
65     self.Attribute.append( ("winkel", "INTEGER"))
66     elif ArtderTabelle == 'Z' or ArtderTabelle =='G'or ArtderTabelle=="GP":
67 ludwig 23 self.Attribute.append( ("artderinfo", "INTEGER") )
68     self.Attribute.append( ("kartentyp", "VARCHAR(2)" ))
69     self.Attribute.append( ("darstellungsart", "INTEGER" ))
70     if ArtderTabelle == "G":
71     self.Attribute.append( ("geom", "MDSYS.SDO_GEOMETRY") )
72 ludwig 24 elif ArtderTabelle == "GP":
73     self.Attribute.append( ("geom", "MDSYS.SDO_GEOMETRY") )
74     self.Attribute.append( ("winkel", "INTEGER") )
75 ludwig 23
76     def isin_Attribute(self, Attribut):
77     """sucht self.Attribute nach den Attribut durch:
78     1 falls vorhanden
79     0 sonst"""
80     for (Attname,dummy) in self.Attribute:
81     if Attname == Attribut:
82     return 1
83     return 0
84    
85     def append_Attribut(self, Atttupel):
86     """fügt ein Attributtupel der Form ( Attributsnamen, Attributsart) in
87     self.Attribute ein, wenn noch nicht vorhanden."""
88     if not self.isin_Attribute( Atttupel[0]) and Atttupel[0] != "":
89     self.Attribute.append( Atttupel )
90    
91     def get_Name(self):
92     """Gibt self.Name zurück"""
93     return self.Name
94    
95     def create_SQL(self):
96     """erzeugt das CREATE-SQL-Kommando und gibt es zurück"""
97     SQL_Kom ="CREATE TABLE "
98     SQL_Kom += self.Name
99     SQL_Kom += "\n ( "
100     Komma =0
101     for (Attname, Attart) in self.Attribute: #Attname für Attributname
102     if Komma ==1: #Attart für Attributsart
103     SQL_Kom += ","
104     SQL_Kom += "\n "
105     SQL_Kom += Attname
106     SQL_Kom += " "
107     SQL_Kom += Attart
108     Komma =1
109     SQL_Kom += "\n ); \n"
110     return SQL_Kom
111 ludwig 30
112     def erzeuge_Metadata_SQL(self):
113     """erzeugt die in die METADATA -Insert-SQL-Befehle und den
114     Index für diese Tabelle.
115     Dies muss man aendern, falls man die Indizes anpassen will."""
116     SQL_Kom = ""
117     if self.Name[-2:] in ['_p','_l','_f' ]:
118     # Anlegen der Metadaten
119     SQL_Kom = "INSERT INTO USER_SDO_GEOM_METADATA VALUES (\n '"
120     SQL_Kom += self.Name
121     SQL_Kom += "',\n'geom',\n"
122     SQL_Kom += "MDSYS.SDO_DIM_ARRAY( \n"
123 silke 49
124 ludwig 30 SQL_Kom += " MDSYS.SDO_DIM_ELEMENT( 'X', 3345000, 3440000, 0.001 ), \n"
125     SQL_Kom += " MDSYS.SDO_DIM_ELEMENT( 'Y', 5682322, 5754034, 0.001 ) \n"
126     SQL_Kom += "), NULL ); \n"
127     # Erzeugen des Indexes
128     SQL_Kom += "CREATE INDEX "
129     SQL_Kom += self.Name
130     SQL_Kom += "_idx"
131     SQL_Kom += " ON "
132     SQL_Kom += self.Name
133     SQL_Kom += "(geom) INDEXTYPE IS MDSYS.SPATIAL_INDEX; \n"
134     return SQL_Kom
135 silke 49
136     def erzeuge_Sequence_SQL(self):
137     """Erzeugt eine Sequence, der die ID einer
138     Tabelle automatisch weiterzählt"""
139    
140     seq_sql = """
141     CREATE SEQUENCE %s_seq
142     MINVALUE 1
143     MAXVALUE 999999999999999999999999999
144     START WITH 1
145     INCREMENT BY 1
146     CACHE 20;
147     """
148    
149     return seq_sql %self.Name
150    
151     def erzeuge_Trigger_SQL(self):
152     """Erzeugt eine Trigger, der die ID einer
153     Tabelle automatisch weiterzählt"""
154    
155     trigger_sql = """
156     create trigger %(name)s_trigger
157     before insert on %(name)s
158     for each row
159     begin
160     select %(name)s_seq.nextval into :new.ogr_fid from dual;
161     end;
162     /
163     """
164    
165     return trigger_sql %{'name':self.Name}
166    
167 ludwig 23 def name_in_tablist( Name):
168     """Schaut ob Name in einer Tabelle Tab in tablist der Name ist.
169     Gibt dann Tab zurück"""
170     for tab in tablist:
171     if Name == tab.get_Name():
172     return tab
173     return 0
174    
175 ludwig 35 def eintragen_Attribute( Name, Komma_split_5, Art):
176 ludwig 23 """Trägt die Attribute in die Tabellen ein und legt die Tabellen an, falls
177     noch nicht vorhanden"""
178     if not name_in_tablist(Name):
179     Tabobj =Tab( Name , Art)
180     tablist.append( Tabobj )
181     else:
182     Tabobj = name_in_tablist( Name)
183 ludwig 35 Attributlist = Komma_split_5.split(";")
184 ludwig 23 for n in range( len( Attributlist )/2):
185 ludwig 35 #print Name, Komma_split
186     if Attributlist[2*n+1] != "INTEGER":
187     Tabobj.append_Attribut( (Attributlist[2*n],
188 ludwig 23 "VARCHAR(" + Attributlist[2*n +1].strip()+")"))
189 ludwig 35 else:
190     Tabobj.append_Attribut( (Attributlist[2*n],
191     "INTEGER"))
192 ludwig 23
193     # Initialisierung der tablist.
194     tablist =[]
195     try:
196     quelle = open( sys.argv[1] , "r" )
197     Konf_satz_liste = quelle.readlines()
198     finally:
199     quelle.close()
200     for Konf_satz in Konf_satz_liste:
201     if Konf_satz[0] =='#':
202     continue
203     Komma_split = Konf_satz.split(",")
204     if len(Komma_split) != 6:
205     print "warning: Die Konfigurationsdatei könnte falsch sein" + str(Komma_split)
206     continue
207     if Komma_split[1] =="" and Komma_split[2] =="":
208 ludwig 30 Name = "f" + Komma_split[0]
209 ludwig 23 if "n" in Komma_split[4] and not name_in_tablist(Name):
210     tablist.append( Tab( Name ,"F"))
211     if "p" in Komma_split[4] and not name_in_tablist(Name+"_p"):
212 ludwig 24 tablist.append( Tab( Name+"_p" ,"FP"))
213 ludwig 23 if "l" in Komma_split[4] and not name_in_tablist(Name +"_l"):
214     tablist.append( Tab( Name+"_l" ,"F"))
215     if "f" in Komma_split[4] and not name_in_tablist(Name +"_f"):
216     tablist.append( Tab( Name+"_f" ,"F"))
217     elif Komma_split[3] == "":
218 ludwig 30 Name = "f" + Komma_split[0]
219 ludwig 35 # print Name
220 ludwig 23 if "n" in Komma_split[4]:
221 ludwig 35 eintragen_Attribute( Name , "kartentyp;2" ,"F")
222     eintragen_Attribute( Name , "darstellungsart;INTEGER" ,"F")
223     eintragen_Attribute( Name ,Komma_split[5], "F")
224     if "p" in Komma_split[4]:
225     eintragen_Attribute( Name + "_p" , "kartentyp;2" ,"FP")
226     eintragen_Attribute( Name + "_p", "darstellungsart;INTEGER" ,"FP")
227     eintragen_Attribute( Name + "_p" ,Komma_split[5],"FP")
228     if "l" in Komma_split[4]:
229     eintragen_Attribute( Name + "_l" , "kartentyp;2" ,"F")
230     eintragen_Attribute( Name + "_l", "darstellungsart;INTEGER" ,"F")
231     eintragen_Attribute( Name + "_l" ,Komma_split[5],"F")
232     if "f" in Komma_split[4]:
233     eintragen_Attribute( Name + "_f" , "kartentyp;2" ,"F")
234     eintragen_Attribute( Name + "_f", "darstellungsart;INTEGER" ,"F")
235     eintragen_Attribute( Name + "_f" ,Komma_split[5],"F")
236 ludwig 23 else:
237     Name = Komma_split[3]
238     if "n" in Komma_split[4]:
239 ludwig 35 eintragen_Attribute( Name ,Komma_split[5], "Z")
240     if "p" in Komma_split[4]:
241     eintragen_Attribute( Name+"_p" ,Komma_split[5],"GP")
242     if "l" in Komma_split[4]:
243     eintragen_Attribute( Name+"_l" ,Komma_split[5],"G")
244     if "f" in Komma_split[4]:
245     eintragen_Attribute( Name+"_f" ,Komma_split[5],"G")
246 ludwig 23
247 ludwig 30 SQL_Kom = ""
248     # Erzeugen der CREATE -Kommandos
249 ludwig 23 for tab in tablist:
250 ludwig 30 SQL_Kom += tab.create_SQL()
251     # Erzeugen der Metadaten und Index -Komandos
252     for tab in tablist:
253     SQL_Kom += tab.erzeuge_Metadata_SQL()
254 silke 49 SQL_Kom += tab.erzeuge_Sequence_SQL()
255     SQL_Kom += tab.erzeuge_Trigger_SQL()
256 ludwig 23 try:
257 silke 41 ziel = open( sys.argv[2] , "w" )
258 ludwig 23 ziel.write(SQL_Kom)
259     ziel.close()
260 silke 41 except:
261     print SQL_Kom
262 ludwig 23
263    
264    

Properties

Name Value
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26