-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsplit.py
More file actions
120 lines (98 loc) · 4.41 KB
/
split.py
File metadata and controls
120 lines (98 loc) · 4.41 KB
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
# -*- coding: utf-8 -*-
import sys
import os
import logging
import re
import glob
logging.getLogger().setLevel(logging.INFO)
def usage():
print('\n'.join([
f''
f'Usage: {os.path.split(sys.argv[0])[-1]} FILENAME [FOLDER_TO_SEARCH_AND_REPLACE]',
]))
def write_to_file(filename, data_lines, replace=False):
# removes empty lines in the end of file
while data_lines and not data_lines[-1].strip():
data_lines.pop()
if filename:
if os.path.isfile(filename) and not replace:
logging.error(f'File {filename} already exists.. skipped')
else:
if len(data_lines) == 0:
logging.warning(f'Empty script')
with open(filename, 'w', encoding='utf-8') as result:
result.writelines(data_lines)
return True
else:
logging.warning(f'No filename for ended script')
return False
def main():
if len(sys.argv) not in (2, 3):
logging.error('Incorect arguments number')
usage()
return 1
source_filename = sys.argv[1]
search_folder = sys.argv[2] if len(sys.argv) == 3 else None
if not os.path.isfile(source_filename):
logging.error(f'File "{source_filename}"" doesn''t exists')
return 2
create_pattern = re.compile(r'create\s+(?:or\s+alter\s+)?'
r'(procedure|trigger|table|sequence|generator|view|exception|index|domain)\s+'
r'([\w\$]+)')
with open(source_filename, encoding='utf-8') as src:
line_number, start_line = 0, 0
result_lines = []
result_filename, object_type, object_name = None, None, None
replace = False
for l in src.readlines():
formated_line = l.lower().strip()
create_match = create_pattern.match(formated_line)
if create_match:
object_type, object_name = create_match.groups()
prefix = {'procedure': 'prc',
'trigger': 'trg',
'table': 'tbl',
'sequence': 'seq',
'generator': 'seq',
'view': 'vw',
'exception': 'exc',
'index': 'idx',
'domain': 'dmn',
}.get(object_type, 'ukn')
# previous file hasn't written yet
if result_filename:
if write_to_file(result_filename, result_lines, replace):
logging.info(f'Script from lines {start_line}:{line_number}'
f' has been written into file {result_filename}')
result_lines = []
start_line = line_number
# get filename for current object
result_filename = f'{prefix}_{object_name}.sql'
replace = False
if search_folder:
search_pattern = os.path.join(search_folder, '**', result_filename)
search_result = glob.glob(search_pattern, recursive=True)
if (len(search_result) == 1):
result_filename = search_result[0]
replace = True
elif formated_line.startswith('set term ^ ;'):
logging.debug(f'The begining of new script has been reached in line: {line_number}')
if result_filename:
if write_to_file(result_filename, result_lines, replace):
logging.info(f'Script from lines {start_line}:{line_number}'
f' has been written into file {result_filename}')
result_filename = None
result_lines = []
start_line = line_number
elif formated_line.startswith('set term ; ^'):
logging.debug(f'The end of script has been reached in line: {line_number}')
result_lines.append(l)
line_number += 1
if result_filename:
if write_to_file(result_filename, result_lines, replace):
logging.info(f'Script from lines {start_line}:{line_number}'
f' has been written into file {result_filename}')
logging.info(f'Finished. Processed lines: {line_number}')
return 0
if __name__ == '__main__':
sys.exit(main())