# SQLite3 Implementation for Turso This directory contains a Rust implementation of the SQLite3 C API. The implementation serves as a compatibility layer between SQLite's C API and Turso's native Rust database implementation. ## Purpose This implementation provides SQLite3 API compatibility for Turso, allowing existing applications that use SQLite to work with Turso without modification. The code: 1. Implements the SQLite3 C API functions in Rust 2. Translates between C and Rust data structures 3. Maps SQLite operations to equivalent Turso operations 4. Maintains API compatibility with SQLite version 3.42.0 ## Testing Strategy We employ a dual-testing approach to ensure complete compatibility with SQLite: ### Test Database Setup Before running tests, you need to set up a test database: ```bash # Create testing directory mkdir -p ../../testing # Create and initialize test database sqlite3 ../../testing/testing.db ".databases" ``` This creates an empty SQLite database that both test suites will use. ### 1. C Test Suite (`/tests`) - Written in C to test the exact same API that real applications use - Can be compiled and run against both: - Official SQLite library (for verification) - Our Rust implementation (for validation) - Serves as the "source of truth" for correct behavior To run C tests against official SQLite: ```bash cd tests make clean make LIBS="-lsqlite3" ./sqlite3-tests ``` To run C tests against our implementation: ```bash cd tests make clean make LIBS="-L../target/debug -lsqlite3" ./sqlite3-tests ``` ### 2. Rust Tests (`src/lib.rs`) - Unit tests written in Rust - Test the same functionality as C tests - Provide better debugging capabilities - Help with development and implementation To run Rust tests: ```bash cargo test ``` ### Why Two Test Suites? 1. **Behavior Verification**: C tests ensure our implementation matches SQLite's behavior exactly by running the same tests against both 2. **Development Efficiency**: Rust tests provide better debugging and development experience 3. **Complete Coverage**: Both test suites together provide comprehensive testing from both C and Rust perspectives ### Common Test Issues 1. **Missing Test Database** - Error: `SQLITE_CANTOPEN (14)` in tests - Solution: Create test database as shown in "Test Database Setup" 2. **Wrong Database Path** - Tests expect database at `../../testing/testing.db` - Verify path relative to where tests are run 3. **Permission Issues** - Ensure test database is readable/writable - Check directory permissions ## Implementation Notes - All public functions are marked with `#[no_mangle]` and follow SQLite's C API naming convention - Uses `unsafe` blocks for C API compatibility - Implements error handling similar to SQLite - Maintains thread safety guarantees of SQLite ## Contributing When adding new features or fixing bugs: 1. Add C tests that can run against both implementations 2. Add corresponding Rust tests 3. Verify behavior matches SQLite by running C tests against both implementations 4. Ensure all existing tests pass in both suites 5. Make sure test database exists and is accessible ## Status This is an ongoing implementation. Some functions are marked with `stub!()` macro, indicating they're not yet implemented. Check individual function documentation for implementation status.