sqlitefs 0.0.6

In-App Filesystem using SQLite
Documentation
// ------------------------------------------------------------------------
///
/// SQLite Query to create all needed tables
///
pub(crate) const CREATE_TABLE_QUERY: &str = "
CREATE TABLE IF NOT EXISTS SqliteFs
(
  id              INTEGER  NOT NULL UNIQUE,
  -- Name of the file
  name            TEXT     NOT NULL UNIQUE,
  -- holds information about the file type
  ftype           TEXT     NULL     DEFAULT NULL,
  -- rwx or what ever
  mode            INTEGER  NOT NULL DEFAULT 0,
  -- how often it is allowed to open the file
  max_open        INTEGER  NOT NULL DEFAULT 0,
  -- size in bytes
  size            INTEGER  NOT NULL DEFAULT 0,
  -- size in bytes of the compressed data
  size_compressed INTEGER  NULL     DEFAULT 0,
  -- compression level 0 (none) to 9 (best) and 6 as default compression level when compression is used
  compression     INTEGER  NOT NULL DEFAULT 0,
  -- Data as BLOB (Vec<u8>) compressed or not
  data            BLOB     NULL     DEFAULT NULL,
  -- Base64 encoded SHA-512 of the ucompressed data
  sha             TEXT     NULL     DEFAULT NULL,
  -- Base64 encoded SHA-512 of the compressed data
  sha_compressed  TEXT     NULL     DEFAULT NULL,
  -- TS of File creation
  created_at      DATETIME NOT NULL DEFAULT (datetime('now', 'localtime', 'subsec')),
  -- TS of last read of data
  read_at         DATETIME NOT NULL DEFAULT (datetime('now', 'localtime', 'subsec')),
  -- TS of last File write
  modify_at       DATETIME NOT NULL DEFAULT (datetime('now', 'localtime', 'subsec')),
  PRIMARY KEY (id AUTOINCREMENT)
);

CREATE TABLE IF NOT EXISTS SqliteFsMeta
(
  id         INTEGER  NOT NULL UNIQUE,
  version    TEXT     NOT NULL UNIQUE,
  -- MEMORY or PERSIST
  fs_type    TEXT     NOT NULL,
  created_at DATETIME NOT NULL UNIQUE DEFAULT (datetime('now', 'localtime', 'subsec')),
  PRIMARY KEY (id AUTOINCREMENT)
);

-- In-Memory only!
CREATE TEMP TABLE IF NOT EXISTS SqliteFsFileHandles
(
  -- UUID_V5(UUID_V7.now(), fname)
  fhandle    TEXT     NOT NULL UNIQUE,
  fid        INTEGER  NOT NULL,
  mode       INTEGER  NOT NULL,
  -- OPEN, CLOSED, DELETED, UNKNOWN
  status     TEXT     NOT NULL,
  created_at DATETIME NOT NULL DEFAULT (datetime('now', 'localtime', 'subsec')),
  PRIMARY KEY (fhandle),
  FOREIGN KEY (fid) REFERENCES SqliteFs (id)
);
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_DOES_FILE_EXIST: &str = "
SELECT
    id
FROM
    SqliteFs
WHERE
    name = $1;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_DELETE_FILE: &str = "
DELETE FROM
    SqliteFs
WHERE
    name = $1
RETURNING
    *;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_DELETE_DIR: &str = "
DELETE FROM
    SqliteFs
WHERE
    name
LIKE
    $1
RETURNING
    *;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_READ_DIR: &str = "
SELECT
    name
FROM
    SqliteFs
WHERE
    name
LIKE
    $1;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_FILE: &str = "
UPDATE SqliteFs SET
    read_at = datetime('now', 'localtime', 'subsec')
WHERE
    name = $1
RETURNING
    *;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_FILE_DATA: &str = "
UPDATE SqliteFs SET
    read_at = datetime('now', 'localtime', 'subsec')
WHERE
    name = $1
RETURNING
    compression, data;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_RENAME_FILE: &str = "
BEGIN TRANSACTION;

-- Step 1: Delete the entry with name if it exists
DELETE FROM
    SqliteFs
WHERE
    name = $2;

-- Step 2: Update the entry with name to have the new name
UPDATE
    SqliteFs
SET
    name = $2
WHERE
    name = $1;

COMMIT;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_WRITE_FILE: &str = "
INSERT OR REPLACE INTO SqliteFs
    (id, name, ftype, mode, max_open, size, size_compressed, compression, data, sha, sha_compressed, modify_at)
VALUES
    ((SELECT id FROM SqliteFs WHERE name = $1), $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, datetime('now', 'localtime', 'subsec'))
RETURNING *;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_INSERT_FILE: &str = "
INSERT INTO SqliteFs
    (name, ftype, mode, max_open, size, size_compressed, compression, data, sha, sha_compressed)
VALUES
    ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
RETURNING *;
";

// ------------------------------------------------------------------------

pub(crate) const QUERY_COPY_FILE: &str = "
INSERT OR REPLACE INTO SqliteFs
    (name, ftype, mode, max_open, size, size_compressed, compression, data, sha, sha_compressed)
SELECT
    $2, ftype, mode, max_open, size, size_compressed, compression, data, sha, sha_compressed
FROM
    SqliteFs
WHERE
    name = $1
RETURNING
    *;
";

// ------------------------------------------------------------------------

// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------

// ------------------------------------------------------------------------
///
/// SQLite Query to create a new file entry
///
/// Behavior:
///
pub(crate) const INSERT_FS_METADATA_QUERY: &str = "
INSERT INTO SqliteFsMeta
   (version, fs_type)
VALUES
    ($1, $2);
";