# Module `onionr.coredb.daemonqueue`

Onionr - Private P2P Communication

Write and read the daemon queue, which is how messages are passed into the onionr daemon in a more direct way than the http api

Source code

    '''
        Onionr - Private P2P Communication

        Write and read the daemon queue, which is how messages are passed into the onionr daemon in a more
        direct way than the http api
    '''
    '''
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.

        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <https://www.gnu.org/licenses/>.
    '''
    import sqlite3, os
    from onionrplugins import onionrevents as events
    from onionrutils import localcommand, epoch
    from .. import dbfiles
    from onionrsetup import dbcreator

    def daemon_queue()->str:
        '''
            Gives commands to the communication proccess/daemon by reading an sqlite3 database

            This function intended to be used by the client. Queue to exchange data between "client" and server.
        '''

        retData = False
        if not os.path.exists(dbfiles.daemon_queue_db):
            dbcreator.createDaemonDB()
        else:
            conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
            c = conn.cursor()
            try:
                for row in c.execute('SELECT command, data, date, min(ID), responseID FROM commands group by id'):
                    retData = row
                    break
            except sqlite3.OperationalError:
                dbcreator.createDaemonDB()
            else:
                if retData != False:
                    c.execute('DELETE FROM commands WHERE id=?;', (retData[3],))
            conn.commit()
            conn.close()

        return retData

    def daemon_queue_add(command: str, data='', responseID: str =''):
        '''
            Add a command to the daemon queue, used by the communication daemon (communicator.py)
        '''

        retData = True

        date = epoch.get_epoch()
        conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
        c = conn.cursor()
        t = (command, data, date, responseID)
        try:
            c.execute('INSERT INTO commands (command, data, date, responseID) VALUES(?, ?, ?, ?)', t)
            conn.commit()
        except sqlite3.OperationalError:
            retData = False
            daemon_queue()
        conn.close()
        return retData

    def daemon_queue_get_response(responseID=''):
        '''
            Get a response sent by communicator to the API, by requesting to the API
        '''
        if len(responseID) == 0: raise ValueError('ResponseID should not be empty')
        resp = localcommand.local_command(dbfiles.daemon_queue_db, 'queueResponse/' + responseID)
        return resp

    def clear_daemon_queue():
        '''
            Clear the daemon queue (somewhat dangerous)
        '''
        conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
        c = conn.cursor()

        c.execute('DELETE FROM commands;')
        conn.commit()

        conn.close()

## Functions

`def clear_daemon_queue()`

  Clear the daemon queue (somewhat dangerous)

  Source code

      def clear_daemon_queue():
          '''
              Clear the daemon queue (somewhat dangerous)
          '''
          conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
          c = conn.cursor()

          c.execute('DELETE FROM commands;')
          conn.commit()

          conn.close()

`def daemon_queue()`

  Gives commands to the communication proccess/daemon by reading an sqlite3 database

  This function intended to be used by the client. Queue to exchange data between "client" and server.

  Source code

      def daemon_queue()->str:
          '''
              Gives commands to the communication proccess/daemon by reading an sqlite3 database

              This function intended to be used by the client. Queue to exchange data between "client" and server.
          '''

          retData = False
          if not os.path.exists(dbfiles.daemon_queue_db):
              dbcreator.createDaemonDB()
          else:
              conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
              c = conn.cursor()
              try:
                  for row in c.execute('SELECT command, data, date, min(ID), responseID FROM commands group by id'):
                      retData = row
                      break
              except sqlite3.OperationalError:
                  dbcreator.createDaemonDB()
              else:
                  if retData != False:
                      c.execute('DELETE FROM commands WHERE id=?;', (retData[3],))
              conn.commit()
              conn.close()

          return retData

`def daemon_queue_add(command, data='', responseID='')`

  Add a command to the daemon queue, used by the communication daemon (communicator.py)

  Source code

      def daemon_queue_add(command: str, data='', responseID: str =''):
          '''
              Add a command to the daemon queue, used by the communication daemon (communicator.py)
          '''

          retData = True

          date = epoch.get_epoch()
          conn = sqlite3.connect(dbfiles.daemon_queue_db, timeout=30)
          c = conn.cursor()
          t = (command, data, date, responseID)
          try:
              c.execute('INSERT INTO commands (command, data, date, responseID) VALUES(?, ?, ?, ?)', t)
              conn.commit()
          except sqlite3.OperationalError:
              retData = False
              daemon_queue()
          conn.close()
          return retData

`def daemon_queue_get_response(responseID='')`

  Get a response sent by communicator to the API, by requesting to the API

  Source code

      def daemon_queue_get_response(responseID=''):
          '''
              Get a response sent by communicator to the API, by requesting to the API
          '''
          if len(responseID) == 0: raise ValueError('ResponseID should not be empty')
          resp = localcommand.local_command(dbfiles.daemon_queue_db, 'queueResponse/' + responseID)
          return resp