Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libSQL WAL API #1788

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open

libSQL WAL API #1788

wants to merge 9 commits into from

Conversation

penberg
Copy link
Collaborator

@penberg penberg commented Oct 11, 2024

This pull request adds a WAL API to libSQL, which allows callers to read frames from a database WAL and apply them.

The purpose of this API is to allow syncing the frames of one database WAL onto another. Omitting error handling, here's how you implement database syncing:

static void sync_db(sqlite3 *db_primary, sqlite3 *db_backup){
  unsigned int max_frame;

  libsql_wal_frame_count(db_primary, &max_frame);
  libsql_wal_begin_commit(db_backup);
  for(int i=1; i<=max_frame; i++){
    char frame[4096+24];
    libsql_wal_get_frame(db_primary, i, frame, sizeof(frame));
    libsql_wal_insert_frame(db_backup, i, frame, sizeof(frame));
  }
  libsql_wal_end_commit(db_backup);
}

Fixes #200

@penberg penberg changed the title WAL API (wip) libSQL WAL API Oct 18, 2024
@penberg penberg force-pushed the wal-api branch 4 times, most recently from ab75b74 to 53a804e Compare October 24, 2024 09:56
@penberg penberg marked this pull request as ready for review October 24, 2024 09:57
SQLite unconditionally checkpoints when the last connection is closed to
a database. Let's add a libSQL extension API to give callers control
over that.
This patch adds a libsql_wal_frame_count() API that the caller can use
to determine how many frames there are in the WAL. You use the
libsql_wal_frame_count() API  together with the libsql_wal_get_frame()
API, added in another patch, to read the raw WAL frames from a database
and inject them into another WAL representing the copy of the database.
This adds a new xReadFrameRaw() function to the virtual WAL API, which
upper layers can use to fetch the full frame, including the page number,
that is useful for appending frames to a WAL.
This patch adds a libsql_wal_get_frame() API to read the raw WAL frame
from a database.

You can use the API as follows (omitting error handling) to obtain all
the WAL frames in a database:

```c
static int sync_db(sqlite3 *db_primary, sqlite3 *db_backup){
  unsigned int max_frame;

  libsql_wal_frame_count(db_primary, &max_frame);

  for(int i=1; i<=max_frame; i++){
    char frame[4096+24];

    libsql_wal_get_frame(db_primary, i, frame, sizeof(frame));
  }
}
```
```c
static void sync_db(sqlite3 *db_primary, sqlite3 *db_backup){
  unsigned int max_frame;

  libsql_wal_frame_count(db_primary, &max_frame);
  libsql_wal_begin_commit(db_backup);
  for(int i=1; i<=max_frame; i++){
    char frame[4096+24];
    libsql_wal_get_frame(db_primary, i, frame, sizeof(frame));
    libsql_wal_insert_frame(db_backup, i, frame, sizeof(frame));
  }
  libsql_wal_end_commit(db_backup);
}
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

libsql_inject_frames
1 participant