feat: Implement SQLite infrastructure layer for persistent storage#10
Open
cyrusagent[bot] wants to merge 1 commit intomainfrom
Open
feat: Implement SQLite infrastructure layer for persistent storage#10cyrusagent[bot] wants to merge 1 commit intomainfrom
cyrusagent[bot] wants to merge 1 commit intomainfrom
Conversation
This commit implements a complete SQLite persistence layer for the Logseq application,
providing durable storage for Page aggregates and their associated Block hierarchies.
## Changes
### Dependencies
- Added `rusqlite` 0.32 with bundled SQLite and JSON support to Cargo.toml
### Infrastructure Layer
- Created new `infrastructure/persistence` module with three components:
- `schema.rs`: Database schema initialization and migrations
- `sqlite_page_repository.rs`: SQLite implementation of PageRepository trait
- `mod.rs`: Module exports
### Database Schema
Implements a normalized relational schema with five tables:
- `pages`: Stores page metadata (id, title, timestamps)
- `blocks`: Stores block content and hierarchy (with parent_id foreign key)
- `block_children`: Junction table maintaining child order
- `urls`: Stores URLs extracted from block content
- `page_references`: Stores page references and tags
All tables include appropriate indexes and foreign key constraints with CASCADE delete.
### Repository Implementation
- `SqlitePageRepository`: Full implementation of PageRepository trait
- Supports in-memory and file-based databases
- Atomic transactions for all write operations
- Proper ordering of block insertion to satisfy foreign key constraints
- Complete serialization/deserialization of Page aggregates including:
- Hierarchical block structures
- URLs and page references
- Parent-child relationships
### Testing
- Comprehensive test suite with 11 tests covering:
- Schema initialization and idempotency
- CRUD operations (save, find, delete, update)
- Complex block hierarchies
- URL and page reference preservation
- Edge cases (non-existent records, etc.)
All 172 tests pass successfully.
## Technical Notes
- Block insertion uses two-pass strategy: first insert all blocks, then insert
child relationships to avoid foreign key constraint violations
- Blocks are sorted by indent level before insertion to ensure parents are
created before children
- Uses rusqlite's bundled feature for portability
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements a complete SQLite persistence layer for the Logseq application following the design outlined in PER-12. This provides durable, local-first storage for Page aggregates and their associated Block hierarchies.
Changes Made
1. Database Schema (
schema.rs)pages: Page metadata (id, title, timestamps)blocks: Block content with hierarchical parent_id referencesblock_children: Junction table for maintaining child orderurls: Extracted URLs from block contentpage_references: Page references and tags2. Repository Implementation (
sqlite_page_repository.rs)SqlitePageRepository: Complete implementation ofPageRepositorytraitDomainError3. Dependencies
rusqlitev0.32 with bundled SQLite for portability4. Testing
Test Results
All persistence tests pass, including:
test_block_hierarchy_preservedtest_urls_and_references_preservedtest_save_and_find_by_idtest_update_pageTechnical Highlights
block_childrentableQdrantVectorStoreNext Steps
🤖 Generated with Claude Code