All files / kernel-store/src/sqlite common.ts

100% Statements 4/4
100% Branches 2/2
100% Functions 1/1
100% Lines 4/4

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8722x                                                                                                                                                   22x               519x 18x      
export const SQL_QUERIES = {
  CREATE_TABLE: `
    CREATE TABLE IF NOT EXISTS kv (
      key TEXT,
      value TEXT,
      PRIMARY KEY(key)
    )
  `,
  CREATE_TABLE_VS: `
    CREATE TABLE IF NOT EXISTS kv_vatstore (
      vatID TEXT,
      key TEXT,
      value TEXT,
      PRIMARY KEY(vatID, key)
    )
  `,
  GET: `
    SELECT value
    FROM kv
    WHERE key = ?
  `,
  GET_NEXT: `
    SELECT key
    FROM kv
    WHERE key > ?
    LIMIT 1
  `,
  GET_ALL_VS: `
    SELECT key, value
    FROM kv_vatstore
    WHERE vatID = ?
  `,
  SET: `
    INSERT INTO kv (key, value)
    VALUES (?, ?)
    ON CONFLICT DO UPDATE SET value = excluded.value
  `,
  SET_VS: `
    INSERT INTO kv_vatstore (vatID, key, value)
    VALUES (?, ?, ?)
    ON CONFLICT DO UPDATE SET value = excluded.value
  `,
  DELETE: `
    DELETE FROM kv
    WHERE key = ?
  `,
  DELETE_VS: `
    DELETE FROM kv_vatstore
    WHERE vatID = ? AND key = ?
  `,
  DELETE_VS_ALL: `
    DELETE FROM kv_vatstore
    WHERE vatID = ?
  `,
  CLEAR: `DELETE FROM kv`,
  CLEAR_VS: `DELETE FROM kv_vatstore`,
  DROP: `DROP TABLE kv`,
  DROP_VS: `DROP TABLE kv_vatstore`,
  BEGIN_TRANSACTION: `BEGIN TRANSACTION`,
  BEGIN_IMMEDIATE_TRANSACTION: `BEGIN IMMEDIATE TRANSACTION`,
  COMMIT_TRANSACTION: `COMMIT TRANSACTION`,
  ABORT_TRANSACTION: `ROLLBACK TRANSACTION`,
  // SQLite's parameter markers (?, ?NNN, :name, @name, $name) can only be used
  // in places where a literal value is allowed. We can't bind identifiers
  // for table names, column names, or savepoint names. We use %NAME% as a
  // placeholder for the savepoint name.
  CREATE_SAVEPOINT: `SAVEPOINT %NAME%`,
  ROLLBACK_SAVEPOINT: `ROLLBACK TO SAVEPOINT %NAME%`,
  RELEASE_SAVEPOINT: `RELEASE SAVEPOINT %NAME%`,
} as const;
 
/**
 * The default filename for the SQLite database; ":memory:" is an ephemeral in-memory database.
 */
export const DEFAULT_DB_FILENAME = ':memory:';
 
/**
 * Check if a string is a valid SQLite identifier.
 *
 * @param name - The string to check.
 */
export function assertSafeIdentifier(name: string): void {
  if (!/^[A-Za-z_]\w*$/u.test(name)) {
    throw new Error(`Invalid identifier: ${name}`);
  }
}