18 from sqlite3
import OperationalError
19 from threading
import Thread
21 from ..publish
import RideLogException, RideLogMessage
22 from ..spec.librarydatabase
import LibraryDatabase
23 from ..spec.libraryfetcher
import get_import_result
24 from ..spec.xmlreaders
import get_path, SpecInitializer
29 def __init__(self, database_name, spec_initializer=None):
43 except Exception
as err:
44 msg =
'Library import handling threw an unexpected exception'
56 library_database.create_database()
57 return library_database
64 if msg_type ==
'fetch':
66 elif msg_type ==
'insert':
68 elif msg_type ==
'create':
73 _, library_name, library_args, callback = message
74 keywords = self.
_fetch_keywords_fetch_keywords(library_name, library_args)
76 (library_name, library_args), keywords, callback)
81 library_name.replace(
'/', os.sep), os.path.abspath(
'.'))
83 except Exception
as err:
85 print(
'FAILED', library_name, err)
90 msg =
'Importing test library "%s" failed' % library_name
92 message=msg, exception=err, level=
'WARN').publish()
96 _, library_name, library_args, result_queue = message
97 keywords = self.
_fetch_keywords_fetch_keywords(library_name, library_args)
98 self.
_insert_insert(library_name, library_args, keywords,
99 lambda res: result_queue.put(res, timeout=3))
101 def _insert(self, library_name, library_args, keywords, callback):
102 self.
_database_database.insert_library_keywords(
103 library_name, library_args, keywords
or [])
104 self.
_call_call(callback, keywords)
107 self, library_key, keywords, callback):
108 db_keywords = self.
_database_database.fetch_library_keywords(*library_key)
110 if not db_keywords
or self.
_keywords_differ_keywords_differ(keywords, db_keywords):
112 library_key[0], library_key[1], keywords, callback)
114 self.
_database_database.update_library_timestamp(*library_key)
115 except OperationalError:
121 except Exception
as err:
122 msg =
'Library import callback threw an unexpected exception'
126 self.
_messages_messages.put((
'fetch', library_name, library_args, callback),
130 result_queue = Queue.Queue(maxsize=1)
132 (
'insert', library_name, library_args, result_queue), timeout=3)
134 return result_queue.get(timeout=5)
135 except Queue.Empty
as e:
137 .format(str(e))).publish()
141 self.
_messages_messages.put((
'create',), timeout=3)
144 self.
_messages_messages.put(
False, timeout=3)
147 if keywords1 != keywords2
and None in (keywords1, keywords2):
149 if len(keywords1) != len(keywords2):
151 for k1, k2
in zip(keywords1, keywords2):
152 if k1.name != k2.name:
158 if k1.arguments != k2.arguments:
160 if k1.source != k2.source:
This class represents a general purpose log message with a traceback appended to message text.
This class represents a general purpose log message.
def _handle_fetch_keywords_message(self, message)
def __init__(self, database_name, spec_initializer=None)
def _handle_message(self)
def _keywords_differ(self, keywords1, keywords2)
def _update_database_and_call_callback_if_needed(self, library_key, keywords, callback)
def fetch_keywords(self, library_name, library_args, callback)
def _fetch_keywords(self, library_name, library_args)
def _initiate_database_connection(self)
def _handle_insert_keywords_message(self, message)
def _call(self, callback, *args)
def get_and_insert_keywords(self, library_name, library_args)
def get_new_connection_to_library_database(self)
def _insert(self, library_name, library_args, keywords, callback)
def create_database(self)
def get_import_result(path, args)
def get_path(name, basedir)