from __future__ import absolute_import import abc class Database(object): __metaclass__ = abc.ABCMeta FIELD_FILE_SHA1 = 'file_sha1' FIELD_SONG_ID = 'id' FIELD_SONGNAME = 'name' FIELD_LENGTH = 'length' FIELD_OFFSET = 'offset' FIELD_HASH = 'hash' # Name of your Database subclass, this is used in configuration # to refer to your class type = None def __init__(self): super(Database, self).__init__() def before_fork(self): """ Called before the database instance is given to the new process """ pass def after_fork(self): """ Called after the database instance has been given to the new process This will be called in the new process. """ pass def setup(self): """ Called on creation or shortly afterwards. """ pass @abc.abstractmethod def empty(self): """ Called when the database should be cleared of all data. """ pass @abc.abstractmethod def delete_unfingerprinted_songs(self): """ Called to remove any song entries that do not have any fingerprints associated with them. """ pass @abc.abstractmethod def get_num_songs(self): """ Returns the amount of songs in the database. """ pass @abc.abstractmethod def get_num_fingerprints(self): """ Returns the number of fingerprints in the database. """ pass @abc.abstractmethod def set_song_fingerprinted(self, sid): """ Sets a specific song as having all fingerprints in the database. sid: Song identifier """ pass @abc.abstractmethod def get_songs(self): """ Returns all fully fingerprinted songs in the database. """ pass @abc.abstractmethod def get_song_by_id(self, sid): """ Return a song by its identifier sid: Song identifier """ pass @abc.abstractmethod def insert(self, hash, sid, offset): """ Inserts a single fingerprint into the database. hash: Part of a sha1 hash, in hexadecimal format sid: Song identifier this fingerprint is off offset: The offset this hash is from """ pass @abc.abstractmethod def insert_song(self, song_name): """ Inserts a song name into the database, returns the new identifier of the song. song_name: The name of the song. """ pass @abc.abstractmethod def query(self, hash): """ Returns all matching fingerprint entries associated with the given hash as parameter. hash: Part of a sha1 hash, in hexadecimal format """ pass @abc.abstractmethod def get_iterable_kv_pairs(self): """ Returns all fingerprints in the database. """ pass @abc.abstractmethod def insert_hashes(self, sid, hashes): """ Insert a multitude of fingerprints. sid: Song identifier the fingerprints belong to hashes: A sequence of tuples in the format (hash, offset) - hash: Part of a sha1 hash, in hexadecimal format - offset: Offset this hash was created from/at. """ pass @abc.abstractmethod def return_matches(self, hashes, ads_filter): """ Searches the database for pairs of (hash, offset) values. hashes: A sequence of tuples in the format (hash, offset) - hash: Part of a sha1 hash, in hexadecimal format - offset: Offset this hash was created from/at. Returns a sequence of (sid, offset_difference) tuples. sid: Song identifier offset_difference: (offset - database_offset) """ pass def get_database(database_type='None'): # Default to using the mysql database database_type = database_type or "mysql" # Lower all the input. database_type = database_type.lower() for db_cls in Database.__subclasses__(): if db_cls.type == database_type: return db_cls raise TypeError("Unsupported database type supplied.") import dejavu.database_mem