예제 #1
0
    def __check_for_command_completion(self, cmd):
        """Check for a delimiter at the end of user input.

    The end of the user input is scanned for a legal delimiter.
    If a delimiter is not found:
      - Input is not send to onecmd()
        - onecmd() is a method in Cmd which routes the user input to the
          appropriate method. An empty string results in a no-op.
      - Input is removed from history.
      - Input is appended to partial_cmd
    If a delimiter is found:
      - The contents of partial_cmd are put in history, as they represent
        a completed command.
      - The contents are passed to the appropriate method for execution.
      - partial_cmd is reset to an empty string.
    """
        if self.readline:
            current_history_len = self.readline.get_current_history_length()
        # Input is incomplete, store the contents and do nothing.
        if not cmd.endswith(ImpalaShell.CMD_DELIM):
            # The user input is incomplete, change the prompt to reflect this.
            if not self.partial_cmd and cmd:
                self.cached_prompt = self.prompt
                self.prompt = '> '.rjust(len(self.cached_prompt))
            # partial_cmd is already populated, add the current input after a newline.
            if self.partial_cmd and cmd:
                self.partial_cmd = "%s\n%s" % (self.partial_cmd, cmd)
            else:
                # If the input string is empty or partial_cmd is empty.
                self.partial_cmd = "%s%s" % (self.partial_cmd, cmd)
            # Remove the most recent item from history if:
            #   -- The current state of user input in incomplete.
            #   -- The most recent user input is not an empty string
            if self.readline and current_history_len > 0 and cmd:
                self.readline.remove_history_item(current_history_len - 1)
            # An empty string results in a no-op. Look at emptyline()
            return str()
        elif self.partial_cmd:  # input ends with a delimiter and partial_cmd is not empty
            if cmd != ImpalaShell.CMD_DELIM:
                completed_cmd = "%s\n%s" % (self.partial_cmd, cmd)
            else:
                completed_cmd = "%s%s" % (self.partial_cmd, cmd)
            # Reset partial_cmd to an empty string
            self.partial_cmd = str()
            # Replace the most recent history item with the completed command.
            # In order for it to be read from the history file, the \n has
            # to be escaped.
            if self.readline and current_history_len > 0:
                self.readline.replace_history_item(
                    current_history_len - 1,
                    completed_cmd.encode('string-escape'))
            # Revert the prompt to its earlier state
            self.prompt = self.cached_prompt
        else:  # Input has a delimiter and partial_cmd is empty
            completed_cmd = cmd
        return completed_cmd
예제 #2
0
  def __check_for_command_completion(self, cmd):
    """Check for a delimiter at the end of user input.

    The end of the user input is scanned for a legal delimiter.
    If a delimiter is not found:
      - Input is not send to onecmd()
        - onecmd() is a method in Cmd which routes the user input to the
          appropriate method. An empty string results in a no-op.
      - Input is removed from history.
      - Input is appended to partial_cmd
    If a delimiter is found:
      - The contents of partial_cmd are put in history, as they represent
        a completed command.
      - The contents are passed to the appropriate method for execution.
      - partial_cmd is reset to an empty string.
    """
    if self.readline:
      current_history_len = self.readline.get_current_history_length()
    # Input is incomplete, store the contents and do nothing.
    if not cmd.endswith(ImpalaShell.CMD_DELIM):
      # The user input is incomplete, change the prompt to reflect this.
      if not self.partial_cmd and cmd:
        self.cached_prompt = self.prompt
        self.prompt = '> '.rjust(len(self.cached_prompt))
      # partial_cmd is already populated, add the current input after a newline.
      if self.partial_cmd and cmd:
        self.partial_cmd = "%s\n%s" % (self.partial_cmd, cmd)
      else:
        # If the input string is empty or partial_cmd is empty.
        self.partial_cmd = "%s%s" % (self.partial_cmd, cmd)
      # Remove the most recent item from history if:
      #   -- The current state of user input in incomplete.
      #   -- The most recent user input is not an empty string
      if self.readline and current_history_len > 0 and cmd:
        self.readline.remove_history_item(current_history_len - 1)
      # An empty string results in a no-op. Look at emptyline()
      return str()
    elif self.partial_cmd: # input ends with a delimiter and partial_cmd is not empty
      if cmd != ImpalaShell.CMD_DELIM:
        completed_cmd = "%s\n%s" % (self.partial_cmd, cmd)
      else:
        completed_cmd = "%s%s" % (self.partial_cmd, cmd)
      # Reset partial_cmd to an empty string
      self.partial_cmd = str()
      # Replace the most recent history item with the completed command.
      # In order for it to be read from the history file, the \n has
      # to be escaped.
      if self.readline and current_history_len > 0:
        self.readline.replace_history_item(current_history_len - 1,
                                           completed_cmd.encode('string-escape'))
      # Revert the prompt to its earlier state
      self.prompt = self.cached_prompt
    else: # Input has a delimiter and partial_cmd is empty
      completed_cmd = cmd
    return completed_cmd
예제 #3
0
파일: shell.py 프로젝트: pombreda/conary-1
    def default(self, cmd):
        cmd = cmd.strip()

        if cmd == 'EOF':
            # EOF means exit.  print a new line to clean up
            print
            return True

        if not cmd.endswith(';'):
            cmd = self.multiline(cmd).strip()

        # if there are multiple statements on one line, split them up
        if ';' in cmd:
            # split up the command and execute each part
            complete, partial = cmd.split(';', 1)
            if partial:
                # if there are two or more commands, run the first
                self.default(complete + ';')
                return self.default(partial)

        if not cmd:
            # no sql, noop
            return False

        start = time.time()
        # execute the SQL command
        try:
            # a weak attempt to see if we have any %(keyword)s to expand
            if r'%(' in cmd:
                cmd = cmd % self.db.keywords
            self.cu.execute(cmd)
        except sqlerrors.DatabaseError, e:
            if len(e.args) > 1:
                print 'Error:', str(e.args[0])
            else:
                print 'Error:', str(e)
            return False
예제 #4
0
    def default(self, cmd):
        cmd = cmd.strip()

        if cmd == 'EOF':
            # EOF means exit.  print a new line to clean up
            print
            return True

        if not cmd.endswith(';'):
            cmd = self.multiline(cmd).strip()

        # if there are multiple statements on one line, split them up
        if ';' in cmd:
            # split up the command and execute each part
            complete, partial = cmd.split(';', 1)
            if partial:
                # if there are two or more commands, run the first
                self.default(complete + ';')
                return self.default(partial)

        if not cmd:
            # no sql, noop
            return False

        start = time.time()
        # execute the SQL command
        try:
            # a weak attempt to see if we have any %(keyword)s to expand
            if r'%(' in cmd:
                cmd = cmd % self.db.keywords
            self.cu.execute(cmd)
        except sqlerrors.DatabaseError, e:
            if len(e.args) > 1:
                print 'Error:', str(e.args[0])
            else:
                print 'Error:', str(e)
            return False