ToDo List
Implement DROP INDEX, ALTER TABLE, fully implement CREATE INDEX.
Sort out error handling for PARSEINT etc.
Work on improving/testing SQL code, browse schema, float I/O. Login.
Features
This crate supports two cargo features.
builtin
: Allows extra SQL builtin functions to be defined.max
: Exposes maximal interface, including all internal modules (default).
Examples
use rustdb::{SharedPagedData, SimpleFileStorage, WebQuery, Database, INITSQL};
use std::net::TcpListener;
use std::sync::Arc;
let sfs = Box::new(SimpleFileStorage::new(
"c:\\Users\\pc\\rust\\sftest01.rustdb",
));
let spd = Arc::new(SharedPagedData::new(sfs));
let apd = spd.open_write();
let db = Database::new(apd, INITSQL);
let listener = TcpListener::bind("127.0.0.1:3000").unwrap();
for tcps in listener.incoming() {
let mut tcps = tcps.unwrap();
let mut wq = WebQuery::new(&tcps); // Reads the http request from the TCP stream into wq.
let sql = "EXEC web.Main()";
db.run_timed(&sql, &mut wq); // Executes SQL, http response, SQL output, (status,headers,content) is accumulated in wq.
wq.write(&mut tcps); // Write the http response to the TCP stream.
db.save(); // Saves database changes to disk.
}
See here for more advanced example (Axum webserver with ARGON hash function).
General Design of Database
SortedFile stores fixed size Records in a tree of Pages. SortedFile is used to implement:
-
Variable length values ( which are split into fragments - see bytes module - although up to 15 bytes can be stored directly. ).
-
Database Table storage. Each record has a 64-bit Id.
-
Index storage ( an index record refers back to the main table ).
Pages have a maximum size, and are stored in CompactFile, which stores logical pages in smaller regions of backing storage.
When a page becomes too big, it is split into two pages.
Each page is implemented as a binary tree ( so there is a tree of trees ).