save
Function: save
saveThe save function ensures that all in-memory changes made to the database are persisted to disk. It updates the .table files for each table with the current state of their records and schema, making the changes permanent.
Declaration
void save();Functionality
Iterates Through Tables The function loops through all tables registered in the
tablesmap.Retrieves Table Schema It uses the
get_table_content_headermethod to extract the schema (header) of each table, which defines the column names and their corresponding data types.Appends Records to the Table File For each table:
Existing file content is read and preserved up to the header.
New records are appended to the file in a structured format, enclosed by square brackets (
[ ... ]).
Type-Safe Serialization Each record's values are serialized into the correct format based on their data type (
INT,DOUBLE,FLOAT,BOOL,STRING). Sensitive data (e.g., strings) is compressed before being written.Writes Back to the File After constructing the updated content, the function writes it back to the
.tablefile in the database directory.
Notes
The database must be open for this function to work. If the database is not open, the function will not execute.
This function modifies the
.tablefiles directly in the temporary working directory.Compression is applied to
STRINGdata for security purposes, reducing the risk of database compromise.The
savefunction does not affect other database files; it strictly operates on.tablefiles.
Example
Here’s a simple demonstration of how to use the save function:
#include "qic.h"
#include <iostream>
#include <unordered_map>
#include <any>
int main() {
data_base db;
// Open the database
std::filesystem::path dbPath = "mydatabase.db";
db.open_database(dbPath);
// Create a table and add some records
db.add_table("COMPANY", std::unordered_map<std::string, data_type>{
{"ID", INT},
{"NAME", STRING},
{"AGE", INT},
{"ADDRESS", STRING},
{"SALARY", DOUBLE}});
db.add_value("COMPANY", std::unordered_map<std::string, std::any>{
{"ID", std::any(1)},
{"NAME", std::any(std::string("Alice"))},
{"AGE", std::any(30)},
{"ADDRESS", std::any(std::string("123 Elm St"))},
{"SALARY", std::any(5000.0)}});
db.add_value("COMPANY", std::unordered_map<std::string, std::any>{
{"ID", std::any(2)},
{"NAME", std::any(std::string("Bob"))},
{"AGE", std::any(40)},
{"ADDRESS", std::any(std::string("456 Oak Ave"))},
{"SALARY", std::any(7000.0)}});
// Save all changes to the database
db.save();
// Close the database
db.close();
std::cout << "Changes saved and database closed successfully!" << std::endl;
return 0;
}Last updated