-
Notifications
You must be signed in to change notification settings - Fork 0
/
ibe_ddl.py
160 lines (131 loc) · 4.29 KB
/
ibe_ddl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 2018-04-29 [!] TODO: use SQLAlchemy instead of bicycle engineering
# 2015-04-20 [!] TODO: use SQLAlchemy instead of bicycle engineering
# 2013.11.07 [+] Initial release, refactoring of ibsql2pgsql.py
#
#
#
def strip_statement(value):
value = value.replace(' ', ' ')
value = value.replace(' ;', ';')
value = value.strip()
return value
class Field:
def __init__(self, field_name, field_type, nullable, description):
self.name = field_name
self.data_type = field_type
self.nullable = nullable
self.description = description
def __str__(self):
if self.nullable:
return "{} {}".format(self.name.strip(), self.data_type.strip())
else:
return "{} {} not null".format(self.name.strip(), self.data_type.strip())
class Table:
def __init__(self, table_name, description):
self.name = table_name
self.description = description
self.fields = []
self.pk = None
self.fk = None
self.uk = None
self.x = None # indices (indexes)
# debug('>' + name + ': ' + self.description)
def __str__(self):
result = ''
#for field in fields:
# result += field.name + ' '
return self.name + result
def add_field(self, field_name, field_type, is_nullable, field_description):
self.fields.append(Field(field_name, field_type, is_nullable, field_description))
def add_pk(self, key_name, field_list):
self.pk = field_list
def add_fk(self, key_name, field_list, reference_table, reference_field_list, delete_rule, update_rule):
if self.fk is None:
self.fk = {}
self.fk[key_name] = [field_list, reference_table, reference_field_list, delete_rule, update_rule]
def add_uk(self, key_name, field_list):
if self.uk is None:
self.uk = {}
self.uk[key_name] = field_list
def add_index(self, index_name, field_list, order, is_unique):
if self.x is None:
self.x = {}
self.x[index_name] = [field_list, order, is_unique]
#
class Generator:
@staticmethod
def __owner_key(table, field):
return '{}::{}'.format(table, field).lower()
def __init__(self, name):
self.owners = []
self.name = name
def add_owner(self, table, field):
#self.owners.append(field + '@'+ table)
owner = self.__owner_key(table, field)
self.owners.append(owner)
def is_ownered_by(self, table, field):
for owner in self.owners:
if owner == self.__owner_key(table, field):
return True
return False
#
class Domain:
def __init__(self, domain_name, data_type, autoinc):
self.tabs = []
self.name = domain_name
self.data_type = data_type
self.autoinc = autoinc
class StoredProcedure:
def __init__(self, sp_name):
self.name = sp_name
self.pm_in = ''
self.pm_out = ''
self.body = []
class Trigger:
def __init__(self, tr_name):
self.name = tr_name
self.table = ''
self.place = ''
self.position = 0
self.body = []
class Schema:
def __init__(self):
self.generators = []
self.domains = []
self.tables = {} # hash!
self.views = []
self.triggers = []
self.procedures = []
self.data = []
self.host = ''
self.alias = ''
self.username = ''
self.password = ''
self.descriptionary = Descriptionary()
#
class Descriptionary:
def __init__(self):
self.descr = {}
def addtab(self, tab, descr):
self.descr[tab] = descr
#debug(tab + ': ' +descr)
def addfield(self, tab, field, descr):
key = tab + '-' + field
self.descr[key] = descr
#debug(key + ': ' + descr)
def table(self, tab):
if self.descr.get(tab) is not None:
#debug(tab + ': ' + self.descr[tab])
return self.descr[tab]
else:
return ''
def field(self, tab, field):
key = tab + '-' + field
if self.descr.get(key) is not None:
#debug(key + ': ' + self.descr[key])
return self.descr[key]
else:
return ''