def initialize_database(path: util.PathLike, schema: SchemaLike, files: bool = False) -> None: """ Initialize a bare database directory at *path*. Initialization creates the directory at *path* if it does not exist, writes the schema, an deletes any existing files defined by the schema. .. warning:: If *path* points to an existing directory, all relation files defined by the schema will be overwritten or deleted. Args: path: the path to the destination database directory schema: the destination database schema files: if `True`, create an empty file for every relation in *schema* """ path = Path(path).expanduser() if isinstance(schema, (str, Path)): schema = read_schema(schema) path.mkdir(exist_ok=True) write_schema(path, schema) _cleanup_files(path, set(schema)) if files: for name in schema: path.joinpath(name).touch()
def __init__(self, path: util.PathLike = None, schema: tsdb.SchemaLike = None, encoding: str = 'utf-8') -> None: # Virtual test suites use a temporary directory if path is None: self._tempdir = tempfile.TemporaryDirectory() path = Path(self._tempdir.name) else: path = Path(path).expanduser() path.mkdir(exist_ok=True) # can fail if path is a file # Ensure test suite directory has a relations file if not path.joinpath(tsdb.SCHEMA_FILENAME).is_file(): if schema is None: raise ITSDBError( '*schema* argument is required for new test suites') elif isinstance(schema, (str, Path)): schema = tsdb.read_schema(schema) tsdb.write_schema(path, schema) super().__init__(path, autocast=False, encoding=encoding) self._data: Dict[str, Table] = {}
def write_database(db: Database, path: util.PathLike, names: Iterable[str] = None, schema: SchemaLike = None, gzip: bool = False, encoding: str = 'utf-8') -> None: """ Write TSDB database *db* to *path*. If *path* is an existing file (not a directory), a :class:`TSDBError` is raised. If *path* is an existing directory, the files for all relations in the destination schema will be cleared. Every relation name in *names* must exist in the destination schema. If *schema* is given (even if it is the same as for *db*), every record will be remade (using :func:`make_record`) using the schema, and columns may be dropped or `None` values inserted as necessary, but no more sophisticated changes will be made. .. warning:: If *path* points to an existing directory, all relation files defined by the schema will be overwritten or deleted. Args: db: Database containing data to write path: the path to the destination database directory names: list of names of relations to write; if `None` use all relations in the destination schema schema: the destination database schema; if `None` use the schema of *db* gzip: if `True`, compress all non-empty files; if `False`, do not compress encoding: character encoding for the database files """ path = Path(path).expanduser() if path.is_file(): raise TSDBError(f'not a directory: {path!s}') remake_records = schema is not None if schema is None: schema = db.schema elif isinstance(schema, (str, Path)): schema = read_schema(schema) if names is None: names = list(schema) # Prepare destination directory path.mkdir(exist_ok=True) write_schema(path, schema) for name in names: fields = schema[name] relation: Iterable[Record] = [] if name in db.schema: try: relation = db[name] except (TSDBError, KeyError): pass if remake_records: relation = _remake_records(relation, db.schema[name], fields) write(path, name, relation, fields, append=False, gzip=gzip, encoding=encoding) # only delete other files at the end in case db.path == path _cleanup_files(path, set(schema).difference(names))