text: from __future__ import absolute_import
  import abc
  
  import json
  with open("dejavu.cnf") as f:
      config = json.load(f)
  
  class Database():
      __metaclass__ = abc.ABCMeta
  
      FIELD_FILE_SHA1 = 'file_sha1'
      FIELD_SONG_ID = 'song_id'
      FIELD_SONGNAME = 'song_name'
      FIELD_OFFSET = 'offset'
      FIELD_HASH = 'hash'
      FIELD_COUNT = 'count'
      FIELD_RADIO_ID = 'radio_id'
      FIELD_RADIO_NAME = 'radio_name'
      FIELD_RADIO_URL = 'radio_url'
      FIELD_RADIO_SONG_ID = 'radio_song_id'
      FIELD_RADIO_SONG_DATETIME = 'listened_datetime'
      FIELD_RADIO_SONG_COMPANY = 'company'
      FIELD_RADIO_SONG_CONFIDENCE = 'confidence'
  
      # 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 insert_songs_count(self, song_name):
          pass
  
      @abc.abstractmethod
      def get_song_count_by_name(self, song_name):
          pass
  
      @abc.abstractmethod
      def update_song_count(self, song_name, count):
          pass
  
      @abc.abstractmethod
      def insert_radio_song(self, radio_name, song_name, company, confidence, datetime):
          pass
  
      @abc.abstractmethod
      def insert_radio(self, radio_name, radio_url):
          pass
  
      @abc.abstractmethod
      def update_radio_song_count(self, radio_name, song_name, count):
          pass
  
      @abc.abstractmethod
      def get_radio_song_count(self, radio_name, song_name):
          pass
  
      @abc.abstractmethod
      def get_radio_url(self, radio_name):
          pass
      
      @abc.abstractmethod
      def get_all_radio(self):
          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):
          """
          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 our default database handler
  if config.get("database_engine",None) == 'mongo':
      import dejavu.database_mongo
  else:
      import dejavu.database_sql
  