def Open(self, path=None, read_only=True, **unused_kwargs):
    """Opens the storage.

    Args:
      path (Optional[str]): path to the storage file.
      read_only (Optional[bool]): True if the file should be opened in
          read-only mode.

    Raises:
      IOError: if the storage file is already opened or if the database
          cannot be connected.
      OSError: if the storage file is already opened or if the database
          cannot be connected.
      ValueError: if path is missing.
    """
    if self._is_open:
      raise IOError('Storage file already opened.')

    if not path:
      raise ValueError('Missing path.')

    path = os.path.abspath(path)

    connection = sqlite3.connect(
        path, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)

    cursor = connection.cursor()
    if not cursor:
      return

    self._connection = connection
    self._cursor = cursor
    self._is_open = True
    self._read_only = read_only

    if read_only:
      self._ReadAndCheckStorageMetadata(check_readable_only=True)
    else:
      # self._cursor.execute('PRAGMA journal_mode=MEMORY')

      # Turn off insert transaction integrity since we want to do bulk insert.
      self._cursor.execute('PRAGMA synchronous=OFF')

      if not self._HasTable('metadata'):
        self._WriteStorageMetadata()
      else:
        self._ReadAndCheckStorageMetadata()

      if self.compression_format == definitions.COMPRESSION_FORMAT_ZLIB:
        data_column_type = 'BLOB'
      else:
        data_column_type = 'TEXT'

      for container_type in self._CONTAINER_TYPES:
        if not self._HasTable(container_type):
          if container_type == self._CONTAINER_TYPE_EVENT:
            query = self._CREATE_EVENT_TABLE_QUERY.format(
                container_type, data_column_type)
          else:
            query = self._CREATE_TABLE_QUERY.format(
                container_type, data_column_type)
          self._cursor.execute(query)

      self._connection.commit()

    last_session_start = self._CountStoredAttributeContainers(
        self._CONTAINER_TYPE_SESSION_START)

    last_session_completion = self._CountStoredAttributeContainers(
        self._CONTAINER_TYPE_SESSION_COMPLETION)

    # Initialize next_sequence_number based on the file contents so that
    # SQLTableIdentifier points to the correct attribute container.
    for container_type in self._REFERENCED_CONTAINER_TYPES:
      container_list = self._GetSerializedAttributeContainerList(container_type)
      container_list.next_sequence_number = (
          self._CountStoredAttributeContainers(container_type))

    # TODO: handle open sessions.
    if last_session_start != last_session_completion:
      logger.warning('Detected unclosed session.')

    self._last_session = last_session_completion
def Open ( self , path = None , read_only = True , ** unused_kwargs ) : if self . _is_open : raise IOError ( 'Storage file already opened.' ) if not path : raise ValueError ( 'Missing path.' ) path = os . path . abspath ( path ) connection = sqlite3 . connect ( path , detect_types = sqlite3 . PARSE_DECLTYPES | sqlite3 . PARSE_COLNAMES ) cursor = connection . cursor ( ) if not cursor : return self . _connection = connection self . _cursor = cursor self . _is_open = True self . _read_only = read_only if read_only : self . _ReadAndCheckStorageMetadata ( check_readable_only = True ) else : self . _cursor . execute ( 'PRAGMA synchronous=OFF' ) if not self . _HasTable ( 'metadata' ) : self . _WriteStorageMetadata ( ) else : self . _ReadAndCheckStorageMetadata ( ) if self . compression_format == definitions . COMPRESSION_FORMAT_ZLIB : data_column_type = 'BLOB' else : data_column_type = 'TEXT' for container_type in self . _CONTAINER_TYPES : if not self . _HasTable ( container_type ) : if container_type == self . _CONTAINER_TYPE_EVENT : query = self . _CREATE_EVENT_TABLE_QUERY . format ( container_type , data_column_type ) else : query = self . _CREATE_TABLE_QUERY . format ( container_type , data_column_type ) self . _cursor . execute ( query ) self . _connection . commit ( ) last_session_start = self . _CountStoredAttributeContainers ( self . _CONTAINER_TYPE_SESSION_START ) last_session_completion = self . _CountStoredAttributeContainers ( self . _CONTAINER_TYPE_SESSION_COMPLETION ) for container_type in self . _REFERENCED_CONTAINER_TYPES : container_list = self . _GetSerializedAttributeContainerList ( container_type ) container_list . next_sequence_number = ( self . _CountStoredAttributeContainers ( container_type ) ) if last_session_start != last_session_completion : logger . warning ( 'Detected unclosed session.' ) self . _last_session = last_session_completion
Opens the storage.

    Args:
      path (Optional[str]): path to the storage file.
      read_only (Optional[bool]): True if the file should be opened in
          read-only mode.

    Raises:
      IOError: if the storage file is already opened or if the database
          cannot be connected.
      OSError: if the storage file is already opened or if the database
          cannot be connected.
      ValueError: if path is missing.