diff --git a/dbbot/reader/database_writer.py b/dbbot/reader/database_writer.py index 545b5ba..6e3e61c 100644 --- a/dbbot/reader/database_writer.py +++ b/dbbot/reader/database_writer.py @@ -1,4 +1,4 @@ -# Copyright 2013-2014 Nokia Solutions and Networks + # Copyright 2013-2014 Nokia Solutions and Networks # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,6 +16,10 @@ from sqlalchemy.sql import and_, select from sqlalchemy.exc import IntegrityError from dbbot import Logger +from sqlalchemy.dialects.mysql import LONGTEXT + +import traceback +import sys class DatabaseWriter(object): @@ -86,7 +90,7 @@ def _create_table_suites(self): Column('suite_id', Integer, ForeignKey('suites.id')), Column('xml_id', String(64), nullable=False), Column('name', String(256), nullable=False), - Column('source', String(1024)), + Column('source', String(256)), Column('doc', Text) ), ('name', 'source')) @@ -105,6 +109,7 @@ def _create_table_tests(self): Column('suite_id', Integer, ForeignKey('suites.id'), nullable=False), Column('xml_id', String(64), nullable=False), Column('name', String(256), nullable=False), + # Column('message', Text, nullable=False), Column('timeout', String(64)), Column('doc', Text) ), ('suite_id', 'name')) @@ -141,7 +146,7 @@ def _create_table_messages(self): Column('keyword_id', Integer, ForeignKey('keywords.id'), nullable=False), Column('level', String(64), nullable=False), Column('timestamp', DateTime, nullable=False), - Column('content', Text, nullable=False), + Column('content', LONGTEXT, nullable=False), Column('content_hash', String(64), nullable=False) ), ('keyword_id', 'level', 'content_hash')) @@ -184,10 +189,13 @@ def insert(self, table_name, criteria): def insert_or_ignore(self, table_name, criteria): try: self.insert(table_name, criteria) - except IntegrityError: + except IntegrityError as e: + # print(e) + # exc_type, exc_value, exc_tb = sys.exc_info() + # print(traceback.format_exception(exc_type, exc_value, exc_tb)) self._verbose('Failed insert to {table} with values {values}'.format(table=table_name, values=list(criteria.values()))) def close(self): self._verbose('- Closing database connection') - self._connection.close() + self._connection.close() \ No newline at end of file diff --git a/dbbot/reader/robot_results_parser.py b/dbbot/reader/robot_results_parser.py index b2fbdec..c95b690 100644 --- a/dbbot/reader/robot_results_parser.py +++ b/dbbot/reader/robot_results_parser.py @@ -86,7 +86,7 @@ def _parse_tag_stats(self, stat, test_run_id): self._db.insert_or_ignore('tag_status', { 'test_run_id': test_run_id, 'name': stat.name, - 'critical': int(stat.critical), + 'critical': 0, 'elapsed': getattr(stat, 'elapsed', None), 'failed': stat.failed, 'passed': stat.passed @@ -125,8 +125,8 @@ def _parse_suite_status(self, test_run_id, suite_id, suite): self._db.insert_or_ignore('suite_status', { 'test_run_id': test_run_id, 'suite_id': suite_id, - 'passed': suite.statistics.all.passed, - 'failed': suite.statistics.all.failed, + 'passed': suite.statistics.passed, + 'failed': suite.statistics.failed, 'elapsed': suite.elapsedtime, 'status': suite.status }) @@ -154,7 +154,7 @@ def _parse_test(self, test, test_run_id, suite_id): }) self._parse_test_status(test_run_id, test_id, test) self._parse_tags(test.tags, test_id) - self._parse_keywords(test.keywords, test_run_id, None, test_id) + self._parse_keywords(test.keywords, test_run_id, suite_id, test_id) def _parse_test_status(self, test_run_id, test_id, test): self._db.insert_or_ignore('test_status', { @@ -173,6 +173,7 @@ def _parse_keywords(self, keywords, test_run_id, suite_id, test_id, keyword_id=N [self._parse_keyword(keyword, test_run_id, suite_id, test_id, keyword_id) for keyword in keywords] def _parse_keyword(self, keyword, test_run_id, suite_id, test_id, keyword_id): + # print('parsing keyword') try: keyword_id = self._db.insert('keywords', { 'suite_id': suite_id, @@ -188,27 +189,48 @@ def _parse_keyword(self, keyword, test_run_id, suite_id, test_id, keyword_id): 'name': keyword.name, 'type': keyword.type }) - self._parse_keyword_status(test_run_id, keyword_id, keyword) - self._parse_messages(keyword.messages, keyword_id) - self._parse_arguments(keyword.args, keyword_id) - self._parse_keywords(keyword.keywords, test_run_id, None, None, keyword_id) + # print('parsing keyword done') + if keyword.status == 'FAIL': + self._parse_keyword_status(test_run_id, keyword_id, keyword) + + try: + if type(keyword.messages) is list: + print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%') + self._parse_messages(keyword.messages, keyword_id) + # self._parse_arguments(keyword.args, keyword_id) + self._parse_keywords(keyword.keywords, test_run_id, suite_id, test_id, keyword_id) + else: + print("No keyword called messages") + + except AttributeError as e: + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print(keyword) + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + pass def _parse_keyword_status(self, test_run_id, keyword_id, keyword): - self._db.insert_or_ignore('keyword_status', { - 'test_run_id': test_run_id, - 'keyword_id': keyword_id, - 'status': keyword.status, - 'elapsed': keyword.elapsedtime - }) + try: + self._db.insert_or_ignore('keyword_status', { + 'test_run_id': test_run_id, + 'keyword_id': keyword_id, + 'status': keyword.status, + 'elapsed': keyword.elapsedtime + }) + except: + pass def _parse_messages(self, messages, keyword_id): for message in messages: - self._db.insert_or_ignore('messages', { - 'keyword_id': keyword_id, 'level': message.level, - 'timestamp': self._format_robot_timestamp(message.timestamp), - 'content': message.message, - 'content_hash': self._string_hash(message.message) - }) + try: + if message.level == 'FAIL': + self._db.insert_or_ignore('messages', { + 'keyword_id': keyword_id, 'level': message.level, + 'timestamp': self._format_robot_timestamp(message.timestamp), + 'content': message.message, + 'content_hash': self._string_hash(message.message) + }) + except: + pass def _parse_arguments(self, args, keyword_id): for arg in args: @@ -224,4 +246,6 @@ def _format_robot_timestamp(timestamp): @staticmethod def _string_hash(string): - return sha1(string.encode()).hexdigest() if string else None + # return sha1(string.encode()).hexdigest() if string else None + return sha1(string.encode('utf-8')).hexdigest() if string else None +