class BookmarkDatabase(PersistenceLayer): """ A specific persistence layer implementation that uses a database in local storage. """ def __init__(self): self.table_name = "bookmarks" print("Start connection to database") self.db = DatabaseManager("bookmarks.db") print("Try to create a new table") self.db.create_table( self.table_name, { "id": "INTEGER PRIMARY KEY AUTOINCREMENT", "title": "TEXT NOT NULL", "url": "TEXT NOT NULL", "notes": "TEXT", "date_added": "TEXT NOT NULL", }, ) # All commands below are database-specific implementation for # each of the behaviors of the interface. def create(self, bookmark_data): self.db.add(self.table_name, bookmark_data) def list(self, order_by=None): return self.db.select(self.table_name, order_by=order_by).fetchall() def edit(self, criteria, new_data): self.db.edit(self.table_name, criteria, new_data) def delete(self, bookmark_id): self.db.delete(self.table_name, {"id": bookmark_id})
class Interpreter: def __init__(self): self._dbm = DatabaseManager() def interpret(self, line): expressions = [expression for expression in line.split(';') if expression] for expression in expressions: tokens = self._tokenize(expression) self._evaluate(tokens) def _tokenize(self, expression): return expression.replace('(', ' ( ').replace(')', ' ) ').replace('*', ' * ').replace(',', ' , ').split() def _evaluate(self, tokens): if (tokens[0].upper() == 'USE'): self._dbm.select_database(tokens[1]) elif (tokens[0].upper() == 'CREATE'): if (tokens[1].upper() == 'DATABASE'): self._dbm.create_database(tokens[2]) elif (tokens[1].upper() == 'TABLE'): self._dbm.create_table(tokens[2]) else: self._syntax_error() elif (tokens[0].upper() == 'DROP'): if (tokens[1].upper() == 'DATABASE'): self._dbm.drop_database(tokens[2]) elif (tokens[1].upper() == 'TABLE'): self._dbm.drop_table(tokens[2]) else: self._syntax_error() elif (tokens[0].upper() == 'RENAME'): if (tokens[1].upper() == 'DATABASE'): self._dbm.rename_database(tokens[2], tokens[3]) elif (tokens[1].upper() == 'TABLE'): self._dbm.rename_table(tokens[2],tokens[3]) else: self._syntax_error() elif (tokens[0].upper() == 'LIST'): if (tokens[1].upper() == 'TABLES'): self._dbm.list_tables() else: self._syntax_error() elif (tokens[0].upper() == 'CLOSE'): if (tokens[1].upper() == 'DATABASE'): self._dbm.close_database() else: self._syntax_error() elif (tokens[0].upper() == 'SELECT'): if (tokens[1] == '*'): print(self._dbm.select_all(tokens[3])) else: self._dbm.select_by_key(tokens[1], tokens[3]) elif (tokens[0].upper() == 'INSERT'): self._dbm.insert(tokens[2], tokens[4], tokens[7]) elif (tokens[0].upper() == 'UPDATE'): self._dbm.update_by_key(tokens[1], tokens[3], tokens[5]) elif (tokens[0].upper() == 'REMOVE'): if (tokens[1] == '*'): self._dbm.remove_all(tokens[3]) else: self._dbm.remove_by_key(tokens[1], tokens[3]) else: self._syntax_error() def _syntax_error(self): print("Error: Incorrect Syntax")