summaryrefslogtreecommitdiff
path: root/day4/task3/db.py
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2019-04-17 20:12:14 +0400
committerAndrew <saintruler@gmail.com>2019-04-17 20:12:14 +0400
commit588cdffdc1f527fac5a7bdd934008882e3efc70d (patch)
tree81e3d82e17a8aa5b3e0097a09b179256c1f9d1d3 /day4/task3/db.py
parentce17eacde37c124abe07288ae1453b5b658f8ff2 (diff)
Ускорен поиск по логу
Diffstat (limited to 'day4/task3/db.py')
-rw-r--r--day4/task3/db.py54
1 files changed, 22 insertions, 32 deletions
diff --git a/day4/task3/db.py b/day4/task3/db.py
index 15eba02..f4cbd0b 100644
--- a/day4/task3/db.py
+++ b/day4/task3/db.py
@@ -1,4 +1,5 @@
import re
+import bisect
from datetime import datetime
f = open('otrs_error.log')
@@ -17,41 +18,30 @@ for line in lines:
date = datetime.strptime(match.group('date'), '%c')
module = match.group('module')
- db.append({
- 'date': date,
- 'type': match.group('type'),
- 'module': module,
- 'id': match.group('id'),
- 'text': match.group('text')
- })
+ db.append((date.hour, date.minute, date.second, module, line))
else:
print(f'Ошибка при разборе строки:\n{line}')
+db.sort()
+
+
def search_by_date(hour, minute=None, second=None, data=None):
- arr = []
- print(f'filtering by h={hour}, m={minute}, s={second}, data="{data}"')
- for err in db:
- if err['date'].hour == int(hour):
- if minute is not None:
- if second is not None:
- if err['date'].minute == int(minute) and err['date'].second == int(second):
- if data in err['module']:
- _ = err.copy()
- _['date'] = _['date'].ctime()
- arr.append(_)
- else:
- if err['date'].minute == int(minute):
- if data in err['module']:
- _ = err.copy()
- _['date'] = _['date'].ctime()
- arr.append(_)
-
- else:
- if data in err['module']:
- _ = err.copy()
- _['date'] = _['date'].ctime()
- arr.append(_)
-
- return arr
+ low = [hour]
+ high = [hour]
+ if minute is not None:
+ low.append(minute)
+ high.append(minute)
+
+ if second is not None:
+ low.append(second)
+ high.append(second + 1)
+ else:
+ high.append(60)
+ else:
+ high.append(60)
+
+ left = bisect.bisect_left(db, tuple(low))
+ right = bisect.bisect_left(db, tuple(high))
+ return [t[4] for t in db[left:right] if data in t[3]]