67 Commits

Author SHA1 Message Date
1b35b0e261 readme fix 2 2019-07-23 12:10:18 -03:00
6ebc5dc584 readme fix 2019-07-23 12:09:44 -03:00
9ae07dac0a cleaned up imports and using directives 2019-07-23 12:05:40 -03:00
20648487f7 cleaned up imports and using directives 2019-07-23 12:03:49 -03:00
16a20ef6d3 commenting and doing some cleaning 2019-07-23 11:17:55 -03:00
ec089c66e7 id fix 2019-07-22 10:28:44 -03:00
ef607e7ffc cosmetic merge 2019-07-22 10:19:52 -03:00
aa52f96beb fixed customer role 2019-07-22 10:16:07 -03:00
8778a72c29 Merge branch 'outputfix' of AP-CT/Parkmanne into billing4real 2019-07-22 12:53:15 +00:00
f3061fe3bc +Edit f, +CLS 2019-07-22 09:51:47 -03:00
c256f5f589 ?? 2019-07-22 09:39:56 -03:00
23144deb04 intergration 2019-07-22 08:57:53 -03:00
e5d736eb9a working? 2019-07-22 08:48:17 -03:00
9a471428a6 works, fixed another db problem 2019-07-22 00:34:26 -03:00
3bf5b26c2b working now 2019-07-21 23:04:26 -03:00
914792948d Parktimes populated 2019-07-21 22:28:43 -03:00
e49b206df7 idk what 2019-07-21 22:21:09 -03:00
a54016340a sdf 2019-07-21 22:13:34 -03:00
b987a2eb78 db - address 2019-07-21 21:58:03 -03:00
03c40541a5 aaaaaaaaaaaa 2019-07-21 21:25:51 -03:00
79a6b9a1e0 Merge branch 'timefunctions' of AP-CT/Parkmanne into billing 2019-07-21 22:24:36 +00:00
ef5ae9dac8 bugfix interface.cpp/reportfuncts 2019-07-20 23:37:52 -03:00
8c2cbb8a11 Made report functions, monthly weekly for any month or week 2019-07-20 21:40:24 -03:00
a79081febf WIP reportgen 2019-07-20 20:32:47 -03:00
6706f6a58e timme functs, not incorporated yet 2019-07-20 10:33:19 -03:00
dafa1ab97a Menu with sub menu, revised the UI of the interface.cpp 2019-07-18 18:42:37 -03:00
cd2f723a04 implementation of admin added, animation commented out for faster testing and while loop added with exit in main() 2019-07-17 22:30:47 -03:00
0c06192f81 while loop in admin and exit 2019-07-17 10:26:22 -03:00
3eb00a0da9 Merge branch 'animation'
Adding animation, 2n try
2019-07-12 11:43:00 -03:00
1aa6a67ebc Merge branch 'animation' of AP-CT/Parkmanne into master 2019-07-10 11:57:30 +00:00
574092db34 Animation added 2019-07-08 20:46:19 -03:00
95b54f54ea Merge branch 'interface' of AP-CT/Parkmanne into master 2019-07-08 22:25:48 +00:00
ab5c685963 Changed minimum from 3.11 to 3.10, talking about cmake 2019-07-08 18:53:10 -03:00
5e2b91fda6 fixed buffer thing in input 2019-07-08 18:31:10 -03:00
312a27521c added telephone support 2019-07-08 17:57:09 -03:00
88b718105b Added some admin options 2019-07-07 15:15:51 -03:00
f5c18d27f3 Merge branch 'interface' of AP-CT/Parkmanne into master 2019-07-06 16:33:18 +00:00
3e594b946d added a park interface 2019-07-06 13:32:00 -03:00
d3ac836657 ammend parkspot to include vehicletype 2019-07-06 12:14:18 -03:00
70fcbc274b Fixing some stuff 2019-07-06 11:52:01 -03:00
01eb2d50a5 Added include graph 2019-07-02 15:56:10 -03:00
e3451369e6 Documentation added 2019-07-02 15:40:37 -03:00
99e509aa03 Documentation underway 2019-07-02 14:53:45 -03:00
f41ccf5257 idk this works for me I guess 2019-07-01 22:38:06 -03:00
5ff6670b3c working, but confused 2019-07-01 22:11:46 -03:00
9ae95aef1c almost done 2019-07-01 21:51:23 -03:00
601f6c92bc so far, still working 2019-07-01 21:18:52 -03:00
cf1cfdfd79 so far, working 2019-07-01 20:42:41 -03:00
5fa84e866f almost all internals done after i fix segfault 2019-07-01 14:23:15 -03:00
450ffc9588 WIP query functs 2019-07-01 11:04:35 -03:00
5f4a09d018 Merge branch 'sqlitecpp' of AP-CT/Parkmanne into master 2019-06-30 18:34:59 +00:00
431b22a102 Merge branch 'master' into sqlitecpp 2019-06-30 15:33:52 -03:00
96bce5d3f6 for merge resolution 2019-06-30 15:33:15 -03:00
db78ecd9cc Found cryptography library that was very easy to install.
Have hashing and verification functs ready.
2019-06-30 14:49:20 -03:00
0674aacbeb Merge branch 'refactor' of AP-CT/Parkmanne into sqlitecpp 2019-06-30 13:12:37 +00:00
c5763ed826 small bugfix 2019-06-30 05:32:01 -03:00
bf17b82c2e Added constructors to construct from db info
This is in no way finished. CHECK TODOs!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2019-06-30 00:37:18 -03:00
085cd5af08 heavily simplified imports and using directives 2019-06-29 23:22:58 -03:00
97ed3150ec can save to db 2019-06-29 22:48:49 -03:00
c058783a11 ALL objects can be saved to db now 2019-06-29 22:30:47 -03:00
0eee67d3d9 park time can be saved to db now 2019-06-29 21:50:36 -03:00
a606119626 WIP refractoring 2019-06-29 19:59:48 -03:00
79af252d8a CMakeLists.txt
for easy building
2019-06-29 18:43:56 +00:00
8160f84e20 db 2019-06-29 15:23:38 -03:00
85ba50c5d6 ?? 2019-06-26 22:20:06 -03:00
4294d4e68c Ya boi came through 2019-06-27 00:55:27 -03:00
6be7af0933 using lf instead crlf to decrease errors 2019-06-27 00:32:09 -03:00
33 changed files with 1884 additions and 1002 deletions

View File

@ -1,12 +1,22 @@
BasedOnStyle: LLVM BasedOnStyle: LLVM
IndentWidth: 4 IndentWidth: 4
#-------------
#--- cpp
Language: Cpp Language: Cpp
PointerAlignment: Left PointerAlignment: Left
ColumnLimit: 120 ColumnLimit: 100
AllowAllArgumentsOnNextLine: true AlignAfterOpenBracket: Align
BreakConstructorInitializersStyle : BCIS_AfterColon AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
BinPackArguments: false
BreakConstructorInitializers: BeforeColon
ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerAllOnOneLineOrOnePerLine: true
Cpp11BracedListStyle: true Cpp11BracedListStyle: true
IncludeBlocks: Regroup
#---

View File

@ -1,4 +1,6 @@
cmake_minimum_required(VERSION 3.14)
cmake_minimum_required(VERSION 3.10)
project(park) project(park)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
@ -9,11 +11,44 @@ include_directories(
) )
add_executable(park main.cpp data.cpp headers/data.h Customer.cpp headers/Customer.h Park_spot.cpp headers/Park_spot.h Park_time.cpp headers/Park_time.h) add_executable(park
main.cpp
target_link_libraries(park data.cpp
headers/data.h
encrypt.cpp
headers/encrypt.h
Customer.cpp
headers/Customer.h
Park_spot.cpp
headers/Park_spot.h
Park_time.cpp
headers/Park_time.h
Query.cpp
headers/Query.h
Interface.cpp
headers/Interface.h
)
if (UNIX)
target_link_libraries(park
SQLiteCpp SQLiteCpp
sqlite3 sqlite3
pthread pthread
dl dl
sodium
) )
elseif (MSYS OR MINGW)
target_link_libraries(park
SQLiteCpp
sqlite3
pthread
ssp
libsodium
)
endif()

View File

@ -1,100 +1,99 @@
#include "headers/Customer.h" #include "headers/Customer.h"
#include <iostream>
// constructors // constructors
Customer::Customer(string name_, Verhicle_type verhicle_, SQLite::Database& db): Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_,
name{name_}, verhicle{verhicle_}, int role_)
card_code{gen_cardcode()} : id{auto_increment_db() + 1},
{ name{name_},
id = auto_increment_db(db) + 1; password{hash_password(password_)},
save_db(db); vehicle{vehicle_},
telephone{telephone_},
role{role_} {
save_db();
} }
Customer::Customer(int id_, string name_, string card_code_, Verhicle_type verhicle_, vector<Park_time> instances) Customer::Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
: name{name_}, vector<Park_time> instances, string telephone_, int role_)
card_code{card_code_}, : id{id_},
verhicle{verhicle_}, name{name_},
park_instances{instances} password{password_},
{ vehicle{vehicle_},
park_instances{instances},
telephone{telephone_},
role{role_} {}
} // clock in/out methods
// ====================================================================================
// clock methods ====================================================================================
/* /*
creert een park_time object met start time= nu, en voegt t toe aan een vector. Create a p_time object with start=now and adds to vector
*/ */
void Customer::clock_in(int s_id) { void Customer::clock_in(int s_id) {
Park_time pt{id, s_id}; Park_time pt{id, s_id};
park_instances.push_back(pt); park_instances.push_back(pt);
} }
// edit de laatste park_time obj in de vector zodat de end_time = now. // edit last p_time object in park_instances so end=now
void Customer::clock_out(int s_id) { park_instances[park_instances.size() - 1].clock_out(id, s_id); } void Customer::clock_out(int s_id) {
park_instances[park_instances.size() - 1].clock_out(id, s_id);
// report gen
void Customer::gen_monthly() {
std::cout << "NAME: " << name << " card code: " << card_code << "\n";
std::cout << "-------------------------------------------------\n";
for (auto& i : park_instances) {
// TODO: need some logic to only include from this month
std::cout << i;
}
std::cout << "-------------------------------------------------\n\n";
} }
bool Customer::parked() {
if (!park_instances.size()) {
return false;
}
if ((park_instances[park_instances.size() - 1].duration)) {
// if duration of the last parktime == 0, meaning
// that the customer has not clocked out
return false;
} else {
return true;
}
}
int Customer::parked_at() { return park_instances[park_instances.size() - 1].spot_id; }
//================================================================================================ //================================================================================================
// functions that interact with the database // functions that interact with the database
void Customer::save_db(SQLite::Database& database) { void Customer::save_db() {
string statement{"insert into Customer values (, '', '', );"}; string statement{"insert into Customer values (, '', '', ,'', );"};
// after ( = 28) statement.insert(43, to_string(role));
statement.insert(38, std::to_string(int(verhicle))); statement.insert(41, telephone);
statement.insert(36, card_code); statement.insert(38, to_string(int(vehicle)));
statement.insert(36, password);
statement.insert(32, name); statement.insert(32, name);
statement.insert(29, "null"); statement.insert(29, to_string(id));
SQLite::Transaction transaction(database); SQLite::Transaction transaction(data::db);
database.exec(statement); data::db.exec(statement);
transaction.commit(); transaction.commit();
} }
void Customer::update_db(SQLite::Database& database) { void Customer::update_db() {
string statement = "UPDATE Customer SET name = \"\", card_code = \"\" where id = '';"; string statement =
statement.insert(58, std::to_string(id)); "UPDATE Customer SET name = '', password = '', "
statement.insert(44, card_code); "vehicle = '', telephone = '', role = '' where id = '';";
statement.insert(98, to_string(id));
statement.insert(84, to_string(role));
statement.insert(73, telephone);
statement.insert(57, to_string(int(vehicle)));
statement.insert(43, password);
statement.insert(28, name); statement.insert(28, name);
// std::cout << statement; TODO: set some logging here data::db.exec(statement);
database.exec(statement);
} }
void Customer::delete_db(SQLite::Database& database) { void Customer::delete_db() {
string statement = "delete from Customer where id= ;"; string statement = "delete from Customer where id= ;";
statement.insert(statement.length() - 2, std::to_string(id)); statement.insert(statement.length() - 2, to_string(id));
// std::cout << statement; SQLite::Transaction transaction(data::db);
SQLite::Transaction transaction(database); data::db.exec(statement);
database.exec(statement);
transaction.commit(); transaction.commit();
} }
int Customer::auto_increment_db(SQLite::Database& database) { int Customer::auto_increment_db() {
SQLite::Statement max_id(database, "select max(id) from Customer;"); SQLite::Statement max_id(data::db, "select max(id) from Customer;");
int id = 0; int id = 0;
max_id.executeStep(); max_id.executeStep();
id = max_id.getColumn(0); id = max_id.getColumn(0);
max_id.reset(); max_id.reset();
return id; return id;
} }
// random helpers=============================================================
std::mt19937 mt(time(0));
std::uniform_int_distribution<int> dist(65, 127);
string Customer::gen_cardcode() {
string code;
for (int i = 0; i < 20; i++) {
char letter = char(dist(mt));
code += letter;
}
return code;
}

442
Interface.cpp Normal file
View File

@ -0,0 +1,442 @@
#include "headers/Interface.h"
// I added it to pass spots, because the parking options need it to check where
// is free parking_spots is declared in main, and if i declare it
// liberal use of
// cin.ignore(10000, '\n');
// so it skips to the next newline, in essence clearing the cin buffer
void interface(vector<Park_spot>& spots) {
/*
string introduction = "P A R K M A N N E"; //logo animation, disable during testing
text_animation(introduction, 50);
*/
__label__ exit;
system("CLS");
cout << "\nWelcome to the parking system. Please login...";
int id;
string password;
cout << "\nEnter your id: ";
cin >> id;
cin.ignore(10000, '\n');
Customer c = query_customer_with_id(id);
cout << "\nEnter your password: ";
std::getline(cin, password);
while (!(verify_password(c.password, password))) {
cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n";
std::getline(cin, password);
if (password == "x")
goto exit;
}
if (query_role_customer(id) == 1) {
interface_admin(spots);
} else if (query_role_customer(id) == 0) {
interface_member(spots, c);
} else {
cout << "ERROR ROLE_INVALID!";
}
exit:;
}
void interface_member(vector<Park_spot>& spots, Customer& c) {
__label__ begin, exit;
cout << "\nLogged in succesfully!\n";
begin:
system("CLS");
cout << "Hello! " << c.name
<< ", please select an option:\n[1]Parking\n[2]Monthly report\n"
"[3]Edit information\n[4]Exit\n";
int option;
cin >> option;
cin.ignore(10000, '\n');
switch (option) {
case 1: {
park(c, spots);
break;
}
case 2: {
report_customer(c.id);
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break;
}
case 3: {
edit_information(c);
break;
}
case 4: {
cout << "Exiting...\n";
sleep_for(seconds(2));
goto exit;
break;
}
default:
break;
}
goto begin;
exit:;
}
void interface_admin(vector<Park_spot>& spots) {
__label__ begin, exit;
begin:
system("CLS");
cout << "\nWelcome to the admin interface\n";
cout << "\n[1] Reports & analytics";
cout << "\n[2] Parking spots";
cout << "\n[3] Make new user";
cout << "\n[4] Exit";
cout << "\nEnter option number: ";
int option;
cin >> option;
cin.ignore(10000, '\n');
switch (option) {
case 1: {
cout << "[1] See monthly report of ALL parking spots\n";
cout << "[2] See weekly report of ALL parking spots\n";
cout << "[3] See monthly report of a specific parking spot\n";
cout << "[4] See weekly report of a specific parking spot\n";
cout << "[5] See monthly report of a specific customer\n";
cout << "[6] See weekly report of a specific customer\n";
cout << "[7] Return\n";
cout << "Enter option number: ";
int option_1;
cin >> option_1;
cin.ignore(10000, '\n');
switch (option_1) {
case 1: {
report_all_spots();
break;
}
case 2: {
report_all_spots(true);
break;
}
case 3: {
report_single_spot();
break;
}
case 4: {
report_single_spot(true);
break;
}
case 5: {
report_customer(0);
break;
}
case 6: {
report_customer(0, true);
break;
}
case 7: {
goto begin;
break;
}
default:
break;
}
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break;
}
case 2: {
cout << "[1] See current status of parking spots\n";
cout << "[2] Make new parking spot\n";
cout << "[3] Return\n";
cout << "Enter option number: ";
int option_2;
cin >> option_2;
cin.ignore(10000, '\n');
switch (option_2) {
case 1: {
current_status_parkspots(spots);
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break;
}
case 2: {
new_parkspot(spots);
break;
}
case 3: {
goto begin;
break;
}
default:
break;
}
break;
}
case 3: {
system("CLS");
cout << "[1] Make new customer\n";
cout << "[2] Make new admin\n";
cout << "[3] Return\n";
cout << "Enter option number: ";
int option_3;
cin >> option_3;
cin.ignore(10000, '\n');
switch (option_3) {
case 1: {
new_customer();
break;
}
case 2: {
new_admin();
break;
}
case 3: {
goto begin;
break;
}
default:
break;
}
case 4: {
std::cout<<"Exiting...";
sleep_for(seconds(2));
goto exit;
break;
} break;
}
default:
break;
}
goto begin;
exit:;
}
// --------- individual things.
void park(Customer& c, vector<Park_spot>& spots) {
__label__ exit;
cout << "You have selected parking option.\n";
if (!(c.parked())) {
cout << "The following spots fit your vehicle and are available: \n";
for (Park_spot i : spots) {
if ((i.v_type == c.vehicle) & (i.taken == false)) {
cout << i.id << ", ";
}
}
cout << "\nWhere do you want to park? Or type [0] to exit.";
int parkID;
cin >> parkID;
if (!parkID)
goto exit;
cin.ignore(10000, '\n');
for (Park_spot& i : spots) {
if (i.id == parkID) {
if (confirm()) {
i.clock(c);
cout << "You have parked sucessfully!";
}
}
}
} else {
cout << "You are parked at spot " << c.parked_at()
<< ", do you want to clock out?\n[1] Yes\n[2] No";
int answer = 0;
cin >> answer;
cin.ignore(10000, '\n');
if (answer) {
query_parkspot_with_id(c.parked_at(), spots).clock(c);
cout << "You have sucessfully clocked out.";
} else {
cout << "OK, have a nice day.";
}
}
exit:;
}
void new_customer() {
int vtype;
string name;
string password;
string telephone;
int role = 0;
cout << "\nWhat's the name of the customer? ";
std::getline(cin, name);
cout << "\nWhat's the vehicle type? \n[1]Twowheeler\n[2] Fourwheeler\n";
cin >> vtype;
cin.ignore(10000, '\n');
cout << "What's the telephone number? +";
std::getline(cin, telephone);
cout << "\nWhat's the password? ";
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created with ID:" << newcustomer.id << "\n";
if (confirm())
newcustomer.update_db();
}
void new_admin() {
int vtype = 2; // revision required! Needs to be set to NULL
string name;
string password;
string telephone;
int role = 1;
cout << "\nWhat's the name of the admin? ";
std::getline(cin, name);
cout << "\nWhat's the telephone number? +";
std::getline(cin, telephone);
cout << "\nWhat's the password?";
std::getline(cin, password);
Customer newadmin{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created with ID=" << newadmin.id << "\n";
if (confirm())
newadmin.update_db();
}
void new_parkspot(vector<Park_spot>& spots) {
cout << "What type of parking spot? \n[1] Two-wheeler\n[2] Four-wheeler\n";
int vtype;
cin >> vtype;
cin.ignore(10000, '\n');
Park_spot newspot{Vehicle_type(vtype)};
if (confirm()) {
spots.push_back(newspot);
cout << "New parking spot sucessfully created.\n";
}
}
void edit_information(Customer& c)
{
string string0; int int0;
/*std::cout<<"\nInput to update name or press [0] to keep name:\n";
std::getline(cin,string0);
if (string0=="0");
else c.name=string0;*/
std::cout<<"\n Input to update vehicle to [1]Two-Wheeler,"
"[2]Four-Wheeler or press [0] to keep vehicle type:\n";
std::cin>>int0;
if (!int0);
else c.vehicle=Vehicle_type(int0);
cin.ignore();
std::cout<<"\n Input to update password or press [0] to keep current password:\n";
std::getline(cin,string0);
if (string0=="0");
else c.password=hash_password(string0);
std::cout<<"\n Input to update phone number or press [0] to keep current number:\n";
std::getline(cin,string0);
if (string0=="0");
else c.telephone=string0;
c.role=0;
if(confirm()){c.update_db();}
}
// time stuff-----------------------------------------------------
pair<int, int> create_month_period() {
std::time_t t = std::time(0);
std::tm* date = std::localtime(&t);
int month, year = 0;
cout << "Which month do you want a report on?[6 2018 for June 2018]\n";
cin >> month >> year;
date->tm_year = year - 1900;
date->tm_mday = 1;
date->tm_mon = month - 1;
pair<int, int> period;
period.first = mktime(date);
date->tm_mon = month;
period.second = mktime(date);
return period;
}
pair<int, int> create_week_period() {
std::time_t t = std::time(0);
std::tm* date = std::localtime(&t);
int day, month, year = 0;
cout << "Which month do you want a report on?[ 20 6 2018 for June 20th, 2018]\n";
cin >> day >> month >> year;
date->tm_year = year - 1900;
date->tm_mday = day;
date->tm_mon = month - 1;
date->tm_hour = 0;
date->tm_min = 0;
pair<int, int> period;
period.first = mktime(date);
period.second = period.first + 604800; // plus 7 days in seconds.
return period;
}
bool confirm(void) {
string ver;
std::cout << "\nAre you sure you want to commit these actions?"
"\n[No] Revert."
"\n[Yes] Commit.";
std::cin >> ver;
if (ver == "YES" | ver == "Yes" | ver == "yes")
{
std::cout<<"Succes! Changes Saved.";
sleep_for(seconds(1));
return true;
}
else
{
std::cout<<"No changes committed.";
sleep_for(seconds(1));
return false;
}
}
// ------------------------------ report stuff
void report_all_spots(bool weekly) {
pair<int, int> period;
if (weekly) {
period = create_week_period(); // remove the pair<int, int>
} else {
period = create_month_period(); // ^
}
cout << "working timeperiods: " << period.first << ", " << period.second; // DEBUG
reports_from_allparkspots(period); // TODO: namechange of reports_from_allparkspots in query?
}
void report_single_spot(bool weekly) {
cout << "Which parking spot would you like a report on?\n";
cout << "Parking spot ID: ";
int spotID;
cin >> spotID;
cin.ignore(10000, '\n');
pair<int, int> period;
if (weekly) {
period = create_week_period(); // remove the pair<int, int>
} else {
period = create_month_period();
}
reports_from_parkspot(spotID, period);
}
void report_customer(int customerID, bool weekly) {
// use report_customer(0) to make interactive
// so admin can call the interactive version, but customer can only call
// report_customer(own_cid)
if (!customerID) {
cout << "What customer do you want a report on? ID: ";
cin >> customerID;
}
pair<int, int> period;
if (weekly) {
period = create_week_period();
} else {
period = create_month_period();
}
reports_from_customer(customerID, period);
}

View File

@ -1,21 +1,69 @@
#include "headers/Park_spot.h" #include "headers/Park_spot.h"
Park_spot::Park_spot(int id_){ // constructors
parked = nullptr;
id = id_; Park_spot::Park_spot(Vehicle_type v_type_)
taken = false; : parked_customer{0}, id{auto_increment_db() + 1}, taken{false}, v_type{v_type_} {
save_db();
} }
// clock in en out, calls de juist(in/out) van de customer aan de hand van internal state van taken Park_spot::Park_spot(int id_, bool taken_, int parked, Vehicle_type v_type_)
void Park_spot::clock(Customer* c_customer){ : parked_customer{parked}, id{id_}, v_type{v_type_}, taken{taken_} {}
if (!taken){
parked = c_customer; // clock in en out, calls de correct customer.clock_x depending on internal state of the spot
void Park_spot::clock(Customer& c_customer) {
if (!taken) {
parked_customer = c_customer.id;
taken = true; taken = true;
parked->clock_in(id); c_customer.clock_in(id);
} update_db();
else{ } else {
taken = false; taken = false;
parked->clock_out(id); c_customer.clock_out(id);
parked = nullptr; parked_customer = 0;
update_db();
} }
} }
// --------------------- db functs
void Park_spot::update_db() {
string statement = "UPDATE Park_spot SET taken = '', customer_id = '' where id = '';";
statement.insert(63, to_string(id));
if (taken) {
statement.insert(49, to_string(parked_customer));
statement.insert(30, "1");
} else {
statement.insert(49, "NULL");
statement.insert(30, "0");
}
data::db.exec(statement);
}
void Park_spot::save_db() {
string statement{"insert into Park_spot values ( , , , );"};
statement.insert(36, to_string(int(v_type)));
statement.insert(34, "NULL");
statement.insert(32, "0");
statement.insert(30, to_string(id));
SQLite::Transaction transaction(data::db);
data::db.exec(statement);
transaction.commit();
}
void Park_spot::delete_db() {
string statement = "delete from Park_spot where id= ;";
statement.insert(statement.length() - 2, to_string(id));
SQLite::Transaction transaction(data::db);
data::db.exec(statement);
transaction.commit();
}
int Park_spot::auto_increment_db() {
SQLite::Statement max_id(data::db, "select max(id) from Park_spot;");
int id = 0;
max_id.executeStep();
id = max_id.getColumn(0);
max_id.reset();
return id;
}

View File

@ -1,45 +1,120 @@
#include"headers/Park_time.h" #include "headers/Park_time.h"
#include <iostream>
#include <ctime>
/*
initializes everything, id is auto incremented from what's stored in the db.
inmediately saves to db upon creation.
Also, this weird syntax is called an initializer list, and is the preffered
method of how to initialize members. It has a measurable performance increase
because it uses move semantics instead of copy semantics.
https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/
*/
Park_time::Park_time(int c_id, int s_id) Park_time::Park_time(int c_id, int s_id)
: customer_id { c_id } : customer_id{c_id},
, spot_id { s_id } spot_id{s_id},
, duration { 0 } duration{0},
, start { high_resolution_clock::now() } start{high_resolution_clock::now()},
{ id{auto_increment_db() + 1} {
save_db();
}
/*
this one initializes with data from the database. should only be used in the query
functions.
*/
Park_time::Park_time(int id_, int customer_id_, int spot_id_, int start_, int duration_)
: id{id_}, customer_id{customer_id_}, spot_id{spot_id_}, duration{duration_} {
start = time_point<system_clock>(seconds(start_));
end = time_point<system_clock>(seconds(start_ + duration_));
} }
void Park_time::clock_out(int c_id, int s_id) /*
{ simple checking if customer is clocking out at the right spot.
sets end(time of clocking out) and calculates the duration.
updates the info in the database.
*/
void Park_time::clock_out(int c_id, int s_id) {
if (c_id != customer_id) { if (c_id != customer_id) {
std::cout << "wrong customer id, you are at the wrong location"; cout << "wrong customer id, you are at the wrong location";
return; return;
} }
if (s_id != spot_id) { if (s_id != spot_id) {
std::cout << "Wrong spot id, you're at the wrong location"; cout << "Wrong spot id, you're at the wrong location";
return; return;
} }
if (!duration) { if (!duration) {
end = high_resolution_clock::now(); end = high_resolution_clock::now();
duration = duration_cast<seconds>(end - start).count(); // use mins later duration = duration_cast<seconds>(end - start).count(); // use mins later
update_db();
} else { } else {
std::cout << "Already clocked out. Something is wrong \n"; cout << "Already clocked out. Something is wrong \n";
} }
} }
std::ostream& operator<<(std::ostream& os, const Park_time& pt) {
std::ostream& operator<<(std::ostream& os, const Park_time & pt){
std::time_t start_ = system_clock::to_time_t(pt.start); std::time_t start_ = system_clock::to_time_t(pt.start);
std::time_t end_ = system_clock::to_time_t(pt.end); std::time_t end_ = system_clock::to_time_t(pt.end);
os << "- - - - - - - - - - - - - - - - - - - -\n"; os << "- - - - - - - - - - - - - - - - - - - -\n";
os << "Customer # " << pt.customer_id << "at parking spot " << pt.spot_id << "\n";
os << "Clocked in :" << std::ctime(&start_); os << "Clocked in :" << std::ctime(&start_);
os << "clocked out : " << std::ctime(&end_); os << "clocked out : " << std::ctime(&end_);
os << "duration : " << pt.duration << "\n"; float dur_h = pt.duration / 3600.0;
os << "duration : " << dur_h << " h\n";
os << "- - - - - - - - - - - - - - - - - - - -\n"; os << "- - - - - - - - - - - - - - - - - - - -\n";
return os; return os;
} }
// mostly a helper function to ease the conversion from timepoint to int
// for storing in the db
int Park_time::start_to_int() {
auto start_to_epoch = start.time_since_epoch();
auto start_value = duration_cast<seconds>(start_to_epoch);
int start_seconds = start_value.count();
return start_seconds;
}
// db funcs
// -----------------------------------------------------------------------------
void Park_time::save_db() {
/*
this creates a sql statement and then executes it
*/
string statement{"insert into Park_time values ( , , , , , );"};
statement.insert(41, "NULL");
statement.insert(39, "NULL");
statement.insert(37, to_string(start_to_int()));
statement.insert(35, to_string(spot_id));
statement.insert(33, to_string(customer_id));
statement.insert(31, to_string(id));
SQLite::Transaction transaction(data::db);
data::db.exec(statement);
transaction.commit();
}
// same as above
void Park_time::update_db() {
string statement = "UPDATE Park_time SET end = , duration = where id = '';";
statement.insert(53, to_string(id));
statement.insert(40, to_string(duration));
statement.insert(27, to_string(start_to_int() + duration));
data::db.exec(statement);
}
// to get id on first save to db
int Park_time::auto_increment_db() {
SQLite::Statement max_id(data::db, "select max(id) from Park_time;");
int id = 0;
max_id.executeStep();
id = max_id.getColumn(0);
max_id.reset();
return id;
}
// text animtion
void text_animation(const string& text, unsigned int pause_time) {
for (const char m : text) // range loop; for each character in string
{
cout << m << flush;
sleep_for(milliseconds(pause_time));
}
}

153
Query.cpp Normal file
View File

@ -0,0 +1,153 @@
#include "headers/Query.h"
vector<Park_time> query_parktimes_for_customer(int cid) {
/*
This is needed to initialize the park_instances for the customer constructor
that is supposed to create a customer from data in the db.
This should not be called on on it's own outside query_customer();
*/
vector<Park_time> park_times;
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE customer_id = ?;");
query.bind(1, cid);
while (query.executeStep()) {
int id = query.getColumn(0);
int spot_id = query.getColumn(2);
int start = query.getColumn(3);
int duration = query.getColumn(5);
Park_time result{id, cid, spot_id, start, duration};
park_times.push_back(result);
}
query.reset();
return park_times;
}
//--------------------------------------------- customers
Customer query_customer_with_id(int id) {
/* do not call this function if you are not certain a customer with this id
exists.
// the only legitimate caller of this function is query_parkspot_x
// there is no error handling in this function
// for when this function doesn't find the customer with this id !!!!
*/
SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;");
query.bind(1, id);
while (query.executeStep()) {
string name = query.getColumn(1);
string password = query.getColumn(2);
int vehicle = query.getColumn(3); // cast to vehicle
string telephone = query.getColumn(4);
int role = query.getColumn(5);
vector<Park_time> park_instances = query_parktimes_for_customer(id);
Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone, role};
return result;
}
}
int query_role_customer(int id) {
SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;");
query.bind(1, id);
while (query.executeStep()) {
int role = query.getColumn(5);
return role;
}
}
//------------------------------- parkspot info
// -- parkspots info, report gen
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
for (Park_spot& i : parkspots) {
if (i.id == id) {
return i;
}
}
}
void reports_from_parkspot(int spotid, pair<int, int> period) {
vector<Park_time> park_times;
SQLite::Statement query(data::db,
"SELECT * FROM Park_time WHERE spot_id = ? AND start > ? AND end < ?;");
query.bind(1, spotid);
query.bind(2, period.first);
query.bind(3, period.second);
while (query.executeStep()) {
int id = query.getColumn(0);
int cid = query.getColumn(1);
int start = query.getColumn(3);
int duration = query.getColumn(5);
Park_time result{id, cid, spotid, start, duration};
park_times.push_back(result);
}
query.reset();
for (auto i : park_times) {
cout << i;
}
}
void reports_from_allparkspots(pair<int, int> period) {
vector<Park_time> park_times;
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ? AND end < ?;");
query.bind(1, period.first);
query.bind(2, period.second);
while (query.executeStep()) {
int id = query.getColumn(0);
int cid = query.getColumn(1);
int spotid = query.getColumn(2);
int start = query.getColumn(3);
int duration = query.getColumn(5);
Park_time result{id, cid, spotid, start, duration};
park_times.push_back(result);
}
query.reset();
for (auto i : park_times) {
cout << i;
}
}
void current_status_parkspots(vector<Park_spot>& spots) {
cout << "P.spot \t\tStatus\t\t Customer\n";
for (auto& i : spots) {
cout << "\n" << i.id << "\t\t" << ((i.taken) ? "true" : "false");
if (i.taken) {
cout << "\t\t" << i.parked_customer;
}
}
cout << "\n";
}
vector<Park_time> reports_from_customer(int cid, pair<int, int> period) {
vector<Park_time> park_times;
int verhicle = int(query_customer_with_id(cid).vehicle);
float sum = 0;
SQLite::Statement query(
data::db, "SELECT * FROM Park_time WHERE customer_id = ? AND start > ? AND end < ?;");
query.bind(1, cid);
query.bind(2, period.first);
query.bind(3, period.second);
while (query.executeStep()) {
int id = query.getColumn(0);
int spotid = query.getColumn(2);
int start = query.getColumn(3);
int duration = query.getColumn(5);
Park_time result{id, cid, spotid, start, duration};
park_times.push_back(result);
sum += duration / 3600;
}
query.reset();
for (auto i : park_times) {
cout << std::setprecision(2) << i;
sum += i.duration / 3600.0;
}
cout << "Your fees for this month: $" << std::setprecision(4) << sum * verhicle << "\n";
return park_times;
}

View File

@ -1,54 +0,0 @@
# Install script for directory: /home/massive/dev/Parkmanne
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if(BUILD_TYPE)
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else()
set(CMAKE_INSTALL_CONFIG_NAME "")
endif()
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()
# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
if(COMPONENT)
message(STATUS "Install component: \"${COMPONENT}\"")
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else()
set(CMAKE_INSTALL_COMPONENT)
endif()
endif()
# Install shared libraries without execute permission?
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
set(CMAKE_INSTALL_SO_NO_EXE "0")
endif()
# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING "FALSE")
endif()
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
# Include the install script for the subdirectory.
include("/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/cmake_install.cmake")
endif()
if(CMAKE_INSTALL_COMPONENT)
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
else()
set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
endif()
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
"${CMAKE_INSTALL_MANIFEST_FILES}")
file(WRITE "/home/massive/dev/Parkmanne/${CMAKE_INSTALL_MANIFEST}"
"${CMAKE_INSTALL_MANIFEST_CONTENT}")

View File

@ -3,11 +3,32 @@
namespace data { namespace data {
SQLite::Database start_db() { SQLite::Database start_db() {
/*
Opens the database, creates it if it can't find the file.
Then creates tables if they don't exist
*/
SQLite::Database db("test.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); SQLite::Database db("test.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);
while (sodium_init() < 0) {
db.exec("create table if not exists Customer (id integer primary key, name text, card_code varchar(20), verhicle int)"); std::cout << "SODIUM NOT WORKING";
db.exec("create table if not exists Park_spot (id integer primary key, taken boolean, customer_id int)"); /*
db.exec("create table if not exists Park_time (id integer primary key, customer_id int, spot_id int, start real, end real, duration real)"); This shouldn't be here, really, but I can't think of a better place
where it runs at least once. This seeds the random generator needed for
salts and other stuff, and needs to be run at least once when working
with any libsodium function. And since this definitely needs to be run at least once, why
not include it here? you can't (well, shouldn't be able to) login into anything if this
doesn't run, since you need to compare passwords to login, and then running the program is
as futile as not opening the db correctly.
*/
}
db.exec(
"create table if not exists Customer (id integer primary key, name "
"text, password text, vehicle int, telephone text, role int)");
db.exec(
"create table if not exists Park_spot (id integer primary key, taken "
"int, customer_id int, vehicle_type int)");
db.exec(
"create table if not exists Park_time (id integer primary key, "
"customer_id int, spot_id int, start int, end int, duration int)");
return db; return db;
} }

39
encrypt.cpp Normal file
View File

@ -0,0 +1,39 @@
#include "headers/encrypt.h"
string hash_password(string password) {
/*
Passing strings and converting to char* because I do not want to be forced
to use char * whenever the function is called.
Low level stuff in the function, the least possible low level stuff outside.
This uses the password hashing algorithm Argon2 implemented by libsodium.
DO NOT MODIFY memory_limit and cpu_limit after you add customers to the db.
When you do that, the hashed passwords can't be decrypted, and that would be
BAD.
*/
const char* password_ = password.c_str();
char hashed_password_[crypto_pwhash_STRBYTES];
int memory_limit = 3.2e+7; // 3.2e7 = 32e6 = 32 mb
int cpu_limit = 1; // this somewhat resembles n_threads, but is not a 1 to 1 match.
int result =
crypto_pwhash_str(hashed_password_, password_, strlen(password_), cpu_limit, memory_limit);
string hashed_password{hashed_password_};
return hashed_password;
}
bool verify_password(string hashed_password, string unhashed_password) {
/*
this verifies the password. It's encryption magic and don't question it.
*/
const char* password_ = unhashed_password.c_str();
const char* hashed_password_ = hashed_password.c_str();
if (crypto_pwhash_str_verify(hashed_password_, password_, strlen(password_)) != 0) {
return false;
} else {
return true;
}
}

BIN
graph.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,58 +1,55 @@
#ifndef CUSTOMER_H #ifndef CUSTOMER_H
#define CUSTOMER_H #define CUSTOMER_H
#pragma once #pragma once
#include "../thirdparty/SQLiteCpp/include/SQLiteCpp/SQLiteCpp.h"
#include "Park_time.h" #include "Park_time.h"
#include <ctime>
#include <random>
#include <string>
#include <vector> #include <vector>
using std::string;
using std::vector; using std::vector;
// enum type is basically een manier om categories te representen als een integer in the background, maar om t in code /*
// aan te geven als de actual category. enum classes make it easy to represent categories.
enum class Verhicle_type { So you can use something like Vehicle_type::twowheeler instead of 2 in code, so you know it's that.
small = 1, but under the hood, it's still an int.
medium = 2, This is so you don't have to polute the global namespace with unnecesary variables.
large = 3, enum classes do not permit implicit conversion between int and the enum class, and are in the
}; Enumclass:: scope in contrast to plain enums. https://en.cppreference.com/w/cpp/language/enum
*/
enum class Vehicle_type { twoweeler = 1, fourweeler = 2 };
/* /*
card code is een randomly generated string moeten zijn, die je bv. op een nfc card zou opslaan en zo zou Customer constructors do the same stuff as all the other constructors.
authenticaten bij je parking spot. We kunnen dit ipv of samen met een password gebruiken. clock_in and out create and modify park_time objects and store them to
clock in en out creeert en compleet een park_time object. Voegt het toe aan een vector. park_instances. Technically, now that we have a working db, we don't need it.
It might have some performance benefits to keeping it, though.
*/ TODO: test or fix this.
save, update, delete and auto increment are the same as in park_time but for customers.
*/
class Customer { class Customer {
public: public:
Customer(string name_, Verhicle_type verhicle_, SQLite::Database& db);
Customer(int id_, string name_, string card_code_, Verhicle_type verhicle_,
vector<Park_time> instances); // needed to construct from db
// potentially: add a destructor that calls update_db() before being destroyed
int id; int id;
string name; string name;
string card_code; string password;
Vehicle_type vehicle;
string telephone;
int role;
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role_);
Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
vector<Park_time> instances, string telephone_, int role_);
void clock_in(int s_id); void clock_in(int s_id);
void clock_out(int s_id); void clock_out(int s_id);
bool parked();
int parked_at();
void update_db(SQLite::Database& database); void update_db();
void delete_db(SQLite::Database& database); void delete_db();
// void gen_weekly(); TODO: this
void gen_monthly();
private: private:
Verhicle_type verhicle;
vector<Park_time> park_instances; vector<Park_time> park_instances;
void save_db();
string gen_cardcode(); int auto_increment_db();
void save_db(SQLite::Database& database);
int auto_increment_db(SQLite::Database& database);
}; };
#endif // CUSTOMER_H #endif // CUSTOMER_H

26
headers/Interface.h Normal file
View File

@ -0,0 +1,26 @@
#include "Query.h"
using std::cin;
//interface functions
void interface(vector<Park_spot>& spots);
void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_admin(vector<Park_spot>& spots);
void park(Customer& c, vector<Park_spot>& spots);
void new_customer();
void new_admin();
void new_parkspot(vector<Park_spot>& spots);
void edit_information(Customer&);
// time creation
pair<int, int> create_month_period();
pair<int, int> create_week_period();
// report functions
void report_single_spot(bool weekly = false);
void report_all_spots(bool weekly = false);
void report_customer(int customerID, bool weekly = false);
// confirmation function
bool confirm();

View File

@ -1,21 +1,34 @@
#ifndef PARK_SPOT_H
#define PARK_SPOT_H
#pragma once
#include "Customer.h" #include "Customer.h"
/* /*
db representation: db representation:
int id not null int id not null
bool taken not null int taken // the library seems to be having problems with bools as types.
int customer_id (null) (many to one, foreign key, whatever) int customer_id (nullable)
Represents a parkspot.
Has the same kind of db functions, same kind of constructors as previous classes.
Dit representeert een parkeerplaats. Het heeft als internal state alleen dat t bezet is of niet.
*/ */
class Park_spot { class Park_spot {
public: public:
int id; int id;
bool taken; bool taken;
Customer* parked; //TODO: think about memory management int parked_customer;
Park_spot(int id_); Vehicle_type v_type;
void clock(Customer* c_customer);
Park_spot(Vehicle_type v_type_);
Park_spot(int id_, bool taken_, int parked, Vehicle_type v_type_);
void clock(Customer& c_customer);
private: private:
void save_db();
void update_db();
void delete_db();
int auto_increment_db();
}; };
#endif // CUSTOMER_H

View File

@ -2,42 +2,74 @@
#define PARK_TIME_H #define PARK_TIME_H
#pragma once #pragma once
#include <chrono> #include "data.h"
#include <iostream>
#include <chrono>
#include <ctime>
#include <thread>
using namespace std::chrono; using namespace std::chrono;
using std::cout;
using std::flush;
using std::to_string;
using std::this_thread::sleep_for;
/* /*
db repr of Park_time
int id (not null, auto increment)
int customer_id (not null) (many to one or something like that)
int spot_id (not null, many to one or something like that)
int duration
datetime start (not null)
datetime end
Dit is gewoon een record van hoe lang, wie en waar iemand parkeert. Basically, een component van
de internal state van customer. Record of who parked at what park_spot and at what time.
public interface-------------------------------------------
The constructors. one for creating new customers, the other one used by the
query functions to construct the object from information stored in the database.
clock_out is the function that gets called from customer.clock_out().
It verifies that the customer is clocking out at the correct parkspot, and saves
the current time of clocking out in end. It also calculates duration so it
doesn't have to be calculated more than once.
operator<< is << overload, can(should) be used for report generation.
// implementation stuff------------------------
start and end are time points representing when someone clocks in and out. they're from the chrono
namespace.
save and update save and update info in the database.
auto_increment pulls the highest id stored in the db, to be used in the constructor.
start_to_int() is used to convert the start timepoint to an integer that can be saved in the
database SQL datetime and chrono datetime don't seem the most compatible.
We choose chrono because it's the recomended way from c++11 onwards, and is more typesafe and
acurate https://stackoverflow.com/questions/36095323/what-is-the-difference-between-chrono-and-ctime
but, it does not have parsing and formatting for human readable time.
It will get that in c++20, but that's a little too late for us :(
So for now, conversion to/from ctime objects it is....
*/ */
class Park_time { class Park_time {
public: public:
Park_time(int c_id, int s_id);
Park_time(int id_, int customer_id_, int spot_id_, int start_, int duration_);
int id; int id;
int customer_id; int customer_id;
int spot_id; int spot_id;
int duration; int duration;
Park_time(int c_id, int s_id);
void clock_out(int c_id, int s_id);
friend std::ostream& operator<<(std::ostream& os, const Park_time & pt);
private: void clock_out(int c_id, int s_id);
friend std::ostream& operator<<(std::ostream& os, const Park_time& pt);
private:
high_resolution_clock::time_point start; high_resolution_clock::time_point start;
high_resolution_clock::time_point end; high_resolution_clock::time_point end;
//TODO: discuss pros cons of using chrono, ctime, or 3th party lib void save_db();
void update_db();
int auto_increment_db(); // helper
int start_to_int(); // helper
}; };
// function that slowly outputs each character one by one
void text_animation(const string& text, unsigned int pause_time);
#endif // Park_time #endif // Park_time

42
headers/Query.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef QUERY_H
#define QUERY_H
#pragma once
#include "Park_spot.h"
#include <iomanip>
using std::pair;
/*these are the functions that search the database and create objects from it.
query_parktimes_for_customer searches for the parktimes that are needed in
customer initialisaiton. generally, i see no use outside of that.
query_customer_with_name searches for customer data by name.
NOTE: query_customer_with_name has been removed, nothing is using it
query_customer_with_id does what the above does, but with id.
query_parkspot_with_id does what the above do, but with a vector and not to the db.
populate_spots is used to query for all the park_spots in db and return them in a vector.
We can keep that in memory to reduce calls to the db, but increasing the memory footprint of this
program
reports_from_x functions query the db for parktimes with various conditions
current_status_parkspots takes in a vector and outputs the status of them
*/
vector<Park_time> query_parktimes_for_customer(int cid);
Customer query_customer_with_id(int id);
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots);
int query_role_customer(int id);
vector<Park_spot> populate_spots();
void reports_from_parkspot(int spotid, pair<int, int> period);
void reports_from_allparkspots(pair<int, int> period);
void current_status_parkspots(vector<Park_spot>& spots);
vector<Park_time> reports_from_customer(int cid, pair<int, int> period);
#endif // CUSTOMER_H

View File

@ -1,6 +1,22 @@
#ifndef DATA_H
#define DATA_H
#pragma once
#include "../thirdparty/SQLiteCpp/include/SQLiteCpp/SQLiteCpp.h" #include "../thirdparty/SQLiteCpp/include/SQLiteCpp/SQLiteCpp.h"
#include "Customer.h" #include "encrypt.h"
namespace data {
SQLite::Database start_db();
} namespace data {
/*
start_db is the function that opens the database, and
if the necesary tables are not there, creates them.
db is the database, and is static to avoid multiple redefinition errors,
because multiple cpp files import this header.
TODO: remove this namespace, we didn't add more functions here like originally planned.
*/
SQLite::Database start_db();
static SQLite::Database db = start_db();
} // namespace data
#endif

26
headers/encrypt.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef ENCRYPT_H
#define ENCRYPT_H
#pragma once
#include <cstring>
#include <iostream>
#include <sodium.h>
#include <string>
using std::string;
/*
hash_password takes the password, and encrypts it. This needs to be done,
because storing passwords in plaintext is BAD, no matter if it's just for a school project!
verify_password takes in a password and the hashed password, and then does magic encryption
stuff(no, not really. It basically hashes the password with the same salt and other parameters, but
that's not that important to know) and to see if the password stored and the given password match.
call these whenever you are working with passwords.
so to check if passwords match, use something like verifypassword(customer.password,
someplainpassword) see libsodium documentation for more info
*/
string hash_password(string password);
bool verify_password(string hashed_password, string unhashed_password);
#endif

View File

@ -1,39 +1,75 @@
#include "headers/Park_spot.h"
#include "headers/data.h" #include "headers/Interface.h"
#include <iostream>
#include <thread> // to make pausing work, not sure if i need chrono, or this, or both
#include <vector>
/* /*
Code strucure like this: Code structure is like this:
class declarations zijn in /headers/class_naam.h, en definitions van de member 1. encrypt.cpp en /header/encrypt.h contain functions to hash passwords and
functs in /class_naam.cpp elke klas in zn eigen file omdat ik incomplete class verify passwords
declarations wilt tegengaan, omdat ik ze niet goed begrijp. En header/source
split om multiple definition errors tegen te gaan.
Park_spot representeert een parkeermeter bij elke parkeer spot. 2. data.cpp and /header/data.h contain the code to start up the database.
Een customer is een customer. Originally, they were supposed to contain all the functions to save to the
Park time is een object die reffereert naar parkspot en customer, basically een database and query from the database. But there were issues, and we did stuff
record die zegt dat een customer voor x tijd geparkeert heeft bij spot x, enz. in the meantime. Most of the original problems that prevented
that are fixed with the latest refactor, but it would take a bit of time to
place the functions there and test that they do what they do.
The functions to save to a database have been integrated in the classes
themself, and unless issues arrise from that I'm not changing that. Functions to
get objects from the database are in Query.cpp en header.
De client clockt in en uit bij een spot. 3. Park_time.cpp en header.
Contain the implementation details of Park_time, which is basically a record of
who parked at what spot and when. Uses a mix of ctime and chrono functions to do
most of the stuff, it's a mess. I will probably have to commit to Doing it one
way or the other to make it more comperhensible, especially for whoever will
make report functions.
4. Customer.cpp and header.
Contains the implementation of Customer. Customer represents a customer, and
saves park_time instances in itself. Not much to explain.
5. Park_spot.cpp and header.
It contians the implementation details of Park_spot, which represents it's
namesake.
6. Query.cpp and header.
Cointain functions that search the database and return objects(P_time, P_spot,
Customer) It is the least tested of the whole project, use with care.
7.Interface.cpp and header
contain all the functions needed to have an interface that's seen when the program is
running.
Explanation of what members do of P_time, P_spot, Customer are in the respective
headers. Explanations of how the member functions work(Or how we intended for
them to work) are in the respective .cpp files.
*/ */
void Wait(int sec) static vector<Park_spot> parking_spots = populate_spots();
/* // this queries the db for all the saved parking_spots and initializes them
a wait function where 1 sec represents 1 hour irl. static vector<Customer> park_customers;
*/
{
std::this_thread::sleep_for(seconds{sec});
}
using std::cout;
int main() { int main() {
SQLite::Database db = data::start_db(); while (true) {
// see implementation of update_db, save_db and delete_db of customer to see how queries and statements work interface(parking_spots);
Customer sagar{"Ramsaransing", Verhicle_type::medium, db}; }
sagar.update_db(db); }
sagar.delete_db(db);
/*
Why is this not in query.cpp? Because somehow, it errors out when it's there.
The error message indicates it is a memory issue but I suspect it's a
concurrency issue. Do not move this.
*/
vector<Park_spot> populate_spots() {
vector<Park_spot> spots;
SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > 0;");
while (query.executeStep()) {
int id = query.getColumn(0);
int taken = query.getColumn(1);
int cid = query.getColumn(2);
Vehicle_type vtype = Vehicle_type(int(query.getColumn(3)));
spots.push_back({id, taken, cid, vtype});
}
return spots;
} }

5
newParkManne.cpp Normal file
View File

@ -0,0 +1,5 @@
#include <iostream>
void say_hello(){
std::cout << "Hello, from newParkManne!\n";
}

View File

@ -1,10 +1,41 @@
use use
``` ```
g++ main.cpp Park_time.cpp Customer.cpp Park_spot.cpp -o test.exe cmake -G "MinGW Makefiles" -S ./ -B ./build/
mingw32-make
``` ```
to build the project to build the project.
it will generate the .exe in /build/park.exe
Or click the build icon in vscode *shrugs*
# Parkmanne # Parkmanne
## A stroll in the park ## A stroll in the park
Parkmanne aims to achieve provisionary effectiveness in the sector of parking. This problem had.
######TO-DO List:
- [x] Admin login
- [x] Billing report menu
- [x] Report from a specific month i.e. january
- [x] Edit option in menu
- [x] Option to confirm edit after input
- [x] Divide menu in sub menus
- [x] Analytics of customer (e.g. # customers with 2-wheeler or list of customer and telephone numbers etc.)
This is a graph of how everything is connected.
If you need to add functionality that doesn't fall in any of these, and you're unsure of what to include, you can decide something like this:
Take my customer class for example.
It needs to be able to save to db, so it needs data.
It needs to modify and save park_time objects, so it needs those.
It needs to encrypt and decrypt passwords. BUT since data already includes encrypt, it doesn't have to be encrypted.
So customer includes those.
Another example is Parkspot.
It needs information about both customers and save to the database.
Since customer also includes data, i don't have to include it again.
Last example:
![header includes](graph.PNG)

BIN
test.db3

Binary file not shown.

View File

@ -1,5 +1,5 @@
# CMAKE generated file: DO NOT EDIT! # CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.14 # Generated by "Unix Makefiles" Generator, CMake Version 3.10
# Default target executed when no arguments are given to make. # Default target executed when no arguments are given to make.
default_target: all default_target: all
@ -48,10 +48,10 @@ RM = /usr/bin/cmake -E remove -f
EQUALS = = EQUALS = =
# The top-level source directory on which CMake was run. # The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/massive/dev/Parkmanne CMAKE_SOURCE_DIR = /home/pyrostefan/Documents/Parkmanne/Parkmanne
# The top-level build directory on which CMake was run. # The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/massive/dev/Parkmanne CMAKE_BINARY_DIR = /home/pyrostefan/Documents/Parkmanne/Parkmanne
#============================================================================= #=============================================================================
# Targets provided globally by CMake. # Targets provided globally by CMake.
@ -82,8 +82,8 @@ install/local/fast: preinstall/fast
# Special rule for the target edit_cache # Special rule for the target edit_cache
edit_cache: edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
.PHONY : edit_cache .PHONY : edit_cache
# Special rule for the target edit_cache # Special rule for the target edit_cache
@ -94,7 +94,7 @@ edit_cache/fast: edit_cache
# Special rule for the target rebuild_cache # Special rule for the target rebuild_cache
rebuild_cache: rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache .PHONY : rebuild_cache
# Special rule for the target rebuild_cache # Special rule for the target rebuild_cache
@ -126,14 +126,14 @@ install/fast: preinstall/fast
# The main all target # The main all target
all: cmake_check_build_system all: cmake_check_build_system
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -E cmake_progress_start /home/massive/dev/Parkmanne/CMakeFiles /home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/progress.marks cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -E cmake_progress_start /home/pyrostefan/Documents/Parkmanne/Parkmanne/CMakeFiles /home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/progress.marks
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/all cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/massive/dev/Parkmanne/CMakeFiles 0 $(CMAKE_COMMAND) -E cmake_progress_start /home/pyrostefan/Documents/Parkmanne/Parkmanne/CMakeFiles 0
.PHONY : all .PHONY : all
# The main clean target # The main clean target
clean: clean:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/clean cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/clean
.PHONY : clean .PHONY : clean
# The main clean target # The main clean target
@ -143,22 +143,22 @@ clean/fast: clean
# Prepare targets for installation. # Prepare targets for installation.
preinstall: all preinstall: all
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/preinstall cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/preinstall
.PHONY : preinstall .PHONY : preinstall
# Prepare targets for installation. # Prepare targets for installation.
preinstall/fast: preinstall/fast:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/preinstall cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/preinstall
.PHONY : preinstall/fast .PHONY : preinstall/fast
# clear depends # clear depends
depend: depend:
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend .PHONY : depend
# Convenience name for target. # Convenience name for target.
thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule: thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule
.PHONY : thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule .PHONY : thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule
# Convenience name for target. # Convenience name for target.
@ -168,12 +168,12 @@ SQLiteCpp_cpplint: thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/rule
# fast build rule for target. # fast build rule for target.
SQLiteCpp_cpplint/fast: SQLiteCpp_cpplint/fast:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/build cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp_cpplint.dir/build
.PHONY : SQLiteCpp_cpplint/fast .PHONY : SQLiteCpp_cpplint/fast
# Convenience name for target. # Convenience name for target.
thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule: thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule
.PHONY : thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule .PHONY : thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule
# Convenience name for target. # Convenience name for target.
@ -183,7 +183,7 @@ SQLiteCpp: thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/rule
# fast build rule for target. # fast build rule for target.
SQLiteCpp/fast: SQLiteCpp/fast:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build
.PHONY : SQLiteCpp/fast .PHONY : SQLiteCpp/fast
src/Backup.o: src/Backup.cpp.o src/Backup.o: src/Backup.cpp.o
@ -192,7 +192,7 @@ src/Backup.o: src/Backup.cpp.o
# target to build an object file # target to build an object file
src/Backup.cpp.o: src/Backup.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.o
.PHONY : src/Backup.cpp.o .PHONY : src/Backup.cpp.o
src/Backup.i: src/Backup.cpp.i src/Backup.i: src/Backup.cpp.i
@ -201,7 +201,7 @@ src/Backup.i: src/Backup.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Backup.cpp.i: src/Backup.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.i
.PHONY : src/Backup.cpp.i .PHONY : src/Backup.cpp.i
src/Backup.s: src/Backup.cpp.s src/Backup.s: src/Backup.cpp.s
@ -210,7 +210,7 @@ src/Backup.s: src/Backup.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Backup.cpp.s: src/Backup.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Backup.cpp.s
.PHONY : src/Backup.cpp.s .PHONY : src/Backup.cpp.s
src/Column.o: src/Column.cpp.o src/Column.o: src/Column.cpp.o
@ -219,7 +219,7 @@ src/Column.o: src/Column.cpp.o
# target to build an object file # target to build an object file
src/Column.cpp.o: src/Column.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.o
.PHONY : src/Column.cpp.o .PHONY : src/Column.cpp.o
src/Column.i: src/Column.cpp.i src/Column.i: src/Column.cpp.i
@ -228,7 +228,7 @@ src/Column.i: src/Column.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Column.cpp.i: src/Column.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.i
.PHONY : src/Column.cpp.i .PHONY : src/Column.cpp.i
src/Column.s: src/Column.cpp.s src/Column.s: src/Column.cpp.s
@ -237,7 +237,7 @@ src/Column.s: src/Column.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Column.cpp.s: src/Column.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Column.cpp.s
.PHONY : src/Column.cpp.s .PHONY : src/Column.cpp.s
src/Database.o: src/Database.cpp.o src/Database.o: src/Database.cpp.o
@ -246,7 +246,7 @@ src/Database.o: src/Database.cpp.o
# target to build an object file # target to build an object file
src/Database.cpp.o: src/Database.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.o
.PHONY : src/Database.cpp.o .PHONY : src/Database.cpp.o
src/Database.i: src/Database.cpp.i src/Database.i: src/Database.cpp.i
@ -255,7 +255,7 @@ src/Database.i: src/Database.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Database.cpp.i: src/Database.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.i
.PHONY : src/Database.cpp.i .PHONY : src/Database.cpp.i
src/Database.s: src/Database.cpp.s src/Database.s: src/Database.cpp.s
@ -264,7 +264,7 @@ src/Database.s: src/Database.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Database.cpp.s: src/Database.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Database.cpp.s
.PHONY : src/Database.cpp.s .PHONY : src/Database.cpp.s
src/Exception.o: src/Exception.cpp.o src/Exception.o: src/Exception.cpp.o
@ -273,7 +273,7 @@ src/Exception.o: src/Exception.cpp.o
# target to build an object file # target to build an object file
src/Exception.cpp.o: src/Exception.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.o
.PHONY : src/Exception.cpp.o .PHONY : src/Exception.cpp.o
src/Exception.i: src/Exception.cpp.i src/Exception.i: src/Exception.cpp.i
@ -282,7 +282,7 @@ src/Exception.i: src/Exception.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Exception.cpp.i: src/Exception.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.i
.PHONY : src/Exception.cpp.i .PHONY : src/Exception.cpp.i
src/Exception.s: src/Exception.cpp.s src/Exception.s: src/Exception.cpp.s
@ -291,7 +291,7 @@ src/Exception.s: src/Exception.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Exception.cpp.s: src/Exception.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Exception.cpp.s
.PHONY : src/Exception.cpp.s .PHONY : src/Exception.cpp.s
src/Statement.o: src/Statement.cpp.o src/Statement.o: src/Statement.cpp.o
@ -300,7 +300,7 @@ src/Statement.o: src/Statement.cpp.o
# target to build an object file # target to build an object file
src/Statement.cpp.o: src/Statement.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.o
.PHONY : src/Statement.cpp.o .PHONY : src/Statement.cpp.o
src/Statement.i: src/Statement.cpp.i src/Statement.i: src/Statement.cpp.i
@ -309,7 +309,7 @@ src/Statement.i: src/Statement.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Statement.cpp.i: src/Statement.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.i
.PHONY : src/Statement.cpp.i .PHONY : src/Statement.cpp.i
src/Statement.s: src/Statement.cpp.s src/Statement.s: src/Statement.cpp.s
@ -318,7 +318,7 @@ src/Statement.s: src/Statement.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Statement.cpp.s: src/Statement.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Statement.cpp.s
.PHONY : src/Statement.cpp.s .PHONY : src/Statement.cpp.s
src/Transaction.o: src/Transaction.cpp.o src/Transaction.o: src/Transaction.cpp.o
@ -327,7 +327,7 @@ src/Transaction.o: src/Transaction.cpp.o
# target to build an object file # target to build an object file
src/Transaction.cpp.o: src/Transaction.cpp.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.o
.PHONY : src/Transaction.cpp.o .PHONY : src/Transaction.cpp.o
src/Transaction.i: src/Transaction.cpp.i src/Transaction.i: src/Transaction.cpp.i
@ -336,7 +336,7 @@ src/Transaction.i: src/Transaction.cpp.i
# target to preprocess a source file # target to preprocess a source file
src/Transaction.cpp.i: src/Transaction.cpp.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.i
.PHONY : src/Transaction.cpp.i .PHONY : src/Transaction.cpp.i
src/Transaction.s: src/Transaction.cpp.s src/Transaction.s: src/Transaction.cpp.s
@ -345,7 +345,7 @@ src/Transaction.s: src/Transaction.cpp.s
# target to generate assembly for a file # target to generate assembly for a file
src/Transaction.cpp.s: src/Transaction.cpp.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/build.make thirdparty/SQLiteCpp/CMakeFiles/SQLiteCpp.dir/src/Transaction.cpp.s
.PHONY : src/Transaction.cpp.s .PHONY : src/Transaction.cpp.s
# Help Target # Help Target
@ -391,6 +391,6 @@ help:
# No rule that depends on this can have commands that come from listfiles # No rule that depends on this can have commands that come from listfiles
# because they might be regenerated. # because they might be regenerated.
cmake_check_build_system: cmake_check_build_system:
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system .PHONY : cmake_check_build_system

View File

@ -1,4 +1,4 @@
# Install script for directory: /home/massive/dev/Parkmanne/thirdparty/SQLiteCpp # Install script for directory: /home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp
# Set the install prefix # Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX) if(NOT DEFINED CMAKE_INSTALL_PREFIX)
@ -29,7 +29,7 @@ endif()
# Install shared libraries without execute permission? # Install shared libraries without execute permission?
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
set(CMAKE_INSTALL_SO_NO_EXE "0") set(CMAKE_INSTALL_SO_NO_EXE "1")
endif() endif()
# Is this installation the result of a crosscompile? # Is this installation the result of a crosscompile?
@ -38,18 +38,18 @@ if(NOT DEFINED CMAKE_CROSSCOMPILING)
endif() endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xlibrariesx" OR NOT CMAKE_INSTALL_COMPONENT) if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xlibrariesx" OR NOT CMAKE_INSTALL_COMPONENT)
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/libSQLiteCpp.a") file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/libSQLiteCpp.a")
endif() endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xheadersx" OR NOT CMAKE_INSTALL_COMPONENT) if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xheadersx" OR NOT CMAKE_INSTALL_COMPONENT)
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE DIRECTORY FILES "/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/include/" FILES_MATCHING REGEX ".*\\.(hpp|h)$") file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE DIRECTORY FILES "/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/include/" FILES_MATCHING REGEX ".*\\.(hpp|h)$")
endif() endif()
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake") if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake")
file(DIFFERENT EXPORT_FILE_CHANGED FILES file(DIFFERENT EXPORT_FILE_CHANGED FILES
"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake"
"/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake") "/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake")
if(EXPORT_FILE_CHANGED) if(EXPORT_FILE_CHANGED)
file(GLOB OLD_CONFIG_FILES "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig-*.cmake") file(GLOB OLD_CONFIG_FILES "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp/SQLiteCppConfig-*.cmake")
if(OLD_CONFIG_FILES) if(OLD_CONFIG_FILES)
@ -58,15 +58,15 @@ if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_
endif() endif()
endif() endif()
endif() endif()
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp" TYPE FILE FILES "/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake") file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp" TYPE FILE FILES "/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig.cmake")
if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^()$") if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^()$")
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp" TYPE FILE FILES "/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig-noconfig.cmake") file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/SQLiteCpp" TYPE FILE FILES "/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/CMakeFiles/Export/lib/cmake/SQLiteCpp/SQLiteCppConfig-noconfig.cmake")
endif() endif()
endif() endif()
if(NOT CMAKE_INSTALL_LOCAL_ONLY) if(NOT CMAKE_INSTALL_LOCAL_ONLY)
# Include the install script for each subdirectory. # Include the install script for each subdirectory.
include("/home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/sqlite3/cmake_install.cmake") include("/home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/sqlite3/cmake_install.cmake")
endif() endif()

View File

@ -1,5 +1,5 @@
# CMAKE generated file: DO NOT EDIT! # CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.14 # Generated by "Unix Makefiles" Generator, CMake Version 3.10
# Default target executed when no arguments are given to make. # Default target executed when no arguments are given to make.
default_target: all default_target: all
@ -48,10 +48,10 @@ RM = /usr/bin/cmake -E remove -f
EQUALS = = EQUALS = =
# The top-level source directory on which CMake was run. # The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/massive/dev/Parkmanne CMAKE_SOURCE_DIR = /home/pyrostefan/Documents/Parkmanne/Parkmanne
# The top-level build directory on which CMake was run. # The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/massive/dev/Parkmanne CMAKE_BINARY_DIR = /home/pyrostefan/Documents/Parkmanne/Parkmanne
#============================================================================= #=============================================================================
# Targets provided globally by CMake. # Targets provided globally by CMake.
@ -70,8 +70,8 @@ install/strip/fast: preinstall/fast
# Special rule for the target edit_cache # Special rule for the target edit_cache
edit_cache: edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
.PHONY : edit_cache .PHONY : edit_cache
# Special rule for the target edit_cache # Special rule for the target edit_cache
@ -82,7 +82,7 @@ edit_cache/fast: edit_cache
# Special rule for the target rebuild_cache # Special rule for the target rebuild_cache
rebuild_cache: rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache .PHONY : rebuild_cache
# Special rule for the target rebuild_cache # Special rule for the target rebuild_cache
@ -126,14 +126,14 @@ install/fast: preinstall/fast
# The main all target # The main all target
all: cmake_check_build_system all: cmake_check_build_system
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -E cmake_progress_start /home/massive/dev/Parkmanne/CMakeFiles /home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/sqlite3/CMakeFiles/progress.marks cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -E cmake_progress_start /home/pyrostefan/Documents/Parkmanne/Parkmanne/CMakeFiles /home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/sqlite3/CMakeFiles/progress.marks
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/all cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/massive/dev/Parkmanne/CMakeFiles 0 $(CMAKE_COMMAND) -E cmake_progress_start /home/pyrostefan/Documents/Parkmanne/Parkmanne/CMakeFiles 0
.PHONY : all .PHONY : all
# The main clean target # The main clean target
clean: clean:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/clean cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/clean
.PHONY : clean .PHONY : clean
# The main clean target # The main clean target
@ -143,22 +143,22 @@ clean/fast: clean
# Prepare targets for installation. # Prepare targets for installation.
preinstall: all preinstall: all
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/preinstall cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/preinstall
.PHONY : preinstall .PHONY : preinstall
# Prepare targets for installation. # Prepare targets for installation.
preinstall/fast: preinstall/fast:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/preinstall cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/preinstall
.PHONY : preinstall/fast .PHONY : preinstall/fast
# clear depends # clear depends
depend: depend:
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend .PHONY : depend
# Convenience name for target. # Convenience name for target.
thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule: thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule:
cd /home/massive/dev/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f CMakeFiles/Makefile2 thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule
.PHONY : thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule .PHONY : thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule
# Convenience name for target. # Convenience name for target.
@ -168,7 +168,7 @@ sqlite3: thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/rule
# fast build rule for target. # fast build rule for target.
sqlite3/fast: sqlite3/fast:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build
.PHONY : sqlite3/fast .PHONY : sqlite3/fast
sqlite3.o: sqlite3.c.o sqlite3.o: sqlite3.c.o
@ -177,7 +177,7 @@ sqlite3.o: sqlite3.c.o
# target to build an object file # target to build an object file
sqlite3.c.o: sqlite3.c.o:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.o cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.o
.PHONY : sqlite3.c.o .PHONY : sqlite3.c.o
sqlite3.i: sqlite3.c.i sqlite3.i: sqlite3.c.i
@ -186,7 +186,7 @@ sqlite3.i: sqlite3.c.i
# target to preprocess a source file # target to preprocess a source file
sqlite3.c.i: sqlite3.c.i:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.i cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.i
.PHONY : sqlite3.c.i .PHONY : sqlite3.c.i
sqlite3.s: sqlite3.c.s sqlite3.s: sqlite3.c.s
@ -195,7 +195,7 @@ sqlite3.s: sqlite3.c.s
# target to generate assembly for a file # target to generate assembly for a file
sqlite3.c.s: sqlite3.c.s:
cd /home/massive/dev/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.s cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(MAKE) -f thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/build.make thirdparty/SQLiteCpp/sqlite3/CMakeFiles/sqlite3.dir/sqlite3.c.s
.PHONY : sqlite3.c.s .PHONY : sqlite3.c.s
# Help Target # Help Target
@ -225,6 +225,6 @@ help:
# No rule that depends on this can have commands that come from listfiles # No rule that depends on this can have commands that come from listfiles
# because they might be regenerated. # because they might be regenerated.
cmake_check_build_system: cmake_check_build_system:
cd /home/massive/dev/Parkmanne && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 cd /home/pyrostefan/Documents/Parkmanne/Parkmanne && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system .PHONY : cmake_check_build_system

View File

@ -1,4 +1,4 @@
# Install script for directory: /home/massive/dev/Parkmanne/thirdparty/SQLiteCpp/sqlite3 # Install script for directory: /home/pyrostefan/Documents/Parkmanne/Parkmanne/thirdparty/SQLiteCpp/sqlite3
# Set the install prefix # Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX) if(NOT DEFINED CMAKE_INSTALL_PREFIX)
@ -29,7 +29,7 @@ endif()
# Install shared libraries without execute permission? # Install shared libraries without execute permission?
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
set(CMAKE_INSTALL_SO_NO_EXE "0") set(CMAKE_INSTALL_SO_NO_EXE "1")
endif() endif()
# Is this installation the result of a crosscompile? # Is this installation the result of a crosscompile?

View File

@ -10,95 +10,78 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Backup.h> #include <SQLiteCpp/Backup.h>
#include <SQLiteCpp/Exception.h> #include <SQLiteCpp/Exception.h>
#include <sqlite3.h> #include <sqlite3.h>
namespace SQLite {
namespace SQLite
{
// Initialize resource for SQLite database backup // Initialize resource for SQLite database backup
Backup::Backup(Database& aDestDatabase, Backup::Backup(Database& aDestDatabase,
const char* apDestDatabaseName, const char* apDestDatabaseName,
Database& aSrcDatabase, Database& aSrcDatabase,
const char* apSrcDatabaseName) : const char* apSrcDatabaseName)
mpSQLiteBackup(NULL) : mpSQLiteBackup(NULL)
{ {
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
apDestDatabaseName, apDestDatabaseName,
aSrcDatabase.getHandle(), aSrcDatabase.getHandle(),
apSrcDatabaseName); apSrcDatabaseName);
if (NULL == mpSQLiteBackup) if (NULL == mpSQLiteBackup) {
{
// If an error occurs, the error code and message are attached to the destination database connection. // If an error occurs, the error code and message are attached to the destination database connection.
throw SQLite::Exception(aDestDatabase.getHandle()); throw SQLite::Exception(aDestDatabase.getHandle());
} }
} }
// Initialize resource for SQLite database backup // Initialize resource for SQLite database backup
Backup::Backup(Database& aDestDatabase, Backup::Backup(Database& aDestDatabase,
const std::string& aDestDatabaseName, const std::string& aDestDatabaseName,
Database& aSrcDatabase, Database& aSrcDatabase,
const std::string& aSrcDatabaseName) : const std::string& aSrcDatabaseName)
mpSQLiteBackup(NULL) : mpSQLiteBackup(NULL)
{ {
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
aDestDatabaseName.c_str(), aDestDatabaseName.c_str(),
aSrcDatabase.getHandle(), aSrcDatabase.getHandle(),
aSrcDatabaseName.c_str()); aSrcDatabaseName.c_str());
if (NULL == mpSQLiteBackup) if (NULL == mpSQLiteBackup) {
{
// If an error occurs, the error code and message are attached to the destination database connection. // If an error occurs, the error code and message are attached to the destination database connection.
throw SQLite::Exception(aDestDatabase.getHandle()); throw SQLite::Exception(aDestDatabase.getHandle());
} }
} }
// Initialize resource for SQLite database backup // Initialize resource for SQLite database backup
Backup::Backup(Database &aDestDatabase, Database &aSrcDatabase) : Backup::Backup(Database& aDestDatabase, Database& aSrcDatabase)
mpSQLiteBackup(NULL) : mpSQLiteBackup(NULL)
{ {
mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(), mpSQLiteBackup = sqlite3_backup_init(aDestDatabase.getHandle(),
"main", "main",
aSrcDatabase.getHandle(), aSrcDatabase.getHandle(),
"main"); "main");
if (NULL == mpSQLiteBackup) if (NULL == mpSQLiteBackup) {
{
// If an error occurs, the error code and message are attached to the destination database connection. // If an error occurs, the error code and message are attached to the destination database connection.
throw SQLite::Exception(aDestDatabase.getHandle()); throw SQLite::Exception(aDestDatabase.getHandle());
} }
} }
// Release resource for SQLite database backup // Release resource for SQLite database backup
Backup::~Backup() Backup::~Backup()
{ {
if (NULL != mpSQLiteBackup) if (NULL != mpSQLiteBackup) {
{
sqlite3_backup_finish(mpSQLiteBackup); sqlite3_backup_finish(mpSQLiteBackup);
} }
} }
// Execute backup step with a given number of source pages to be copied // Execute backup step with a given number of source pages to be copied
int Backup::executeStep(const int aNumPage /* = -1 */) int Backup::executeStep(const int aNumPage /* = -1 */)
{ {
const int res = sqlite3_backup_step(mpSQLiteBackup, aNumPage); const int res = sqlite3_backup_step(mpSQLiteBackup, aNumPage);
if (SQLITE_OK != res && SQLITE_DONE != res && SQLITE_BUSY != res && SQLITE_LOCKED != res) if (SQLITE_OK != res && SQLITE_DONE != res && SQLITE_BUSY != res && SQLITE_LOCKED != res) {
{
throw SQLite::Exception(sqlite3_errstr(res), res); throw SQLite::Exception(sqlite3_errstr(res), res);
} }
return res; return res;
} }
// Get the number of remaining source pages to be copied in this backup process // Get the number of remaining source pages to be copied in this backup process
int Backup::getRemainingPageCount() int Backup::getRemainingPageCount()
{ {
return sqlite3_backup_remaining(mpSQLiteBackup); return sqlite3_backup_remaining(mpSQLiteBackup);
} }
// Get the number of total source pages to be copied in this backup process // Get the number of total source pages to be copied in this backup process
int Backup::getTotalPageCount() int Backup::getTotalPageCount()
{ {
return sqlite3_backup_pagecount(mpSQLiteBackup); return sqlite3_backup_pagecount(mpSQLiteBackup);
} }
} // namespace SQLite } // namespace SQLite

View File

@ -9,41 +9,33 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Column.h> #include <SQLiteCpp/Column.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <iostream> #include <iostream>
namespace SQLite namespace SQLite
{ {
const int INTEGER = SQLITE_INTEGER; const int INTEGER = SQLITE_INTEGER;
const int FLOAT = SQLITE_FLOAT; const int FLOAT = SQLITE_FLOAT;
const int TEXT = SQLITE_TEXT; const int TEXT = SQLITE_TEXT;
const int BLOB = SQLITE_BLOB; const int BLOB = SQLITE_BLOB;
const int Null = SQLITE_NULL; const int Null = SQLITE_NULL;
// Encapsulation of a Column in a row of the result pointed by the prepared Statement. // Encapsulation of a Column in a row of the result pointed by the prepared Statement.
Column::Column(Statement::Ptr& aStmtPtr, int aIndex) noexcept : // nothrow Column::Column(Statement::Ptr& aStmtPtr, int aIndex) noexcept
mStmtPtr(aStmtPtr), : // nothrow
mStmtPtr(aStmtPtr)
,
mIndex(aIndex) mIndex(aIndex)
{ {
} }
// Finalize and unregister the SQL query from the SQLite Database Connection. // Finalize and unregister the SQL query from the SQLite Database Connection.
Column::~Column() Column::~Column()
{ {
// the finalization will be done by the destructor of the last shared pointer // the finalization will be done by the destructor of the last shared pointer
} }
// Return the named assigned to this result column (potentially aliased) // Return the named assigned to this result column (potentially aliased)
const char* Column::getName() const noexcept // nothrow const char* Column::getName() const noexcept // nothrow
{ {
return sqlite3_column_name(mStmtPtr, mIndex); return sqlite3_column_name(mStmtPtr, mIndex);
} }
#ifdef SQLITE_ENABLE_COLUMN_METADATA #ifdef SQLITE_ENABLE_COLUMN_METADATA
// Return the name of the table column that is the origin of this result column // Return the name of the table column that is the origin of this result column
const char* Column::getOriginName() const noexcept // nothrow const char* Column::getOriginName() const noexcept // nothrow
@ -51,74 +43,61 @@ const char* Column::getOriginName() const noexcept // nothrow
return sqlite3_column_origin_name(mStmtPtr, mIndex); return sqlite3_column_origin_name(mStmtPtr, mIndex);
} }
#endif #endif
// Return the integer value of the column specified by its index starting at 0 // Return the integer value of the column specified by its index starting at 0
int Column::getInt() const noexcept // nothrow int Column::getInt() const noexcept // nothrow
{ {
return sqlite3_column_int(mStmtPtr, mIndex); return sqlite3_column_int(mStmtPtr, mIndex);
} }
// Return the unsigned integer value of the column specified by its index starting at 0 // Return the unsigned integer value of the column specified by its index starting at 0
unsigned Column::getUInt() const noexcept // nothrow unsigned Column::getUInt() const noexcept // nothrow
{ {
return static_cast<unsigned>(getInt64()); return static_cast<unsigned>(getInt64());
} }
// Return the 64bits integer value of the column specified by its index starting at 0 // Return the 64bits integer value of the column specified by its index starting at 0
long long Column::getInt64() const noexcept // nothrow long long Column::getInt64() const noexcept // nothrow
{ {
return sqlite3_column_int64(mStmtPtr, mIndex); return sqlite3_column_int64(mStmtPtr, mIndex);
} }
// Return the double value of the column specified by its index starting at 0 // Return the double value of the column specified by its index starting at 0
double Column::getDouble() const noexcept // nothrow double Column::getDouble() const noexcept // nothrow
{ {
return sqlite3_column_double(mStmtPtr, mIndex); return sqlite3_column_double(mStmtPtr, mIndex);
} }
// Return a pointer to the text value (NULL terminated string) of the column specified by its index starting at 0 // Return a pointer to the text value (NULL terminated string) of the column specified by its index starting at 0
const char* Column::getText(const char* apDefaultValue /* = "" */) const noexcept // nothrow const char* Column::getText(const char* apDefaultValue /* = "" */) const noexcept // nothrow
{ {
const char* pText = reinterpret_cast<const char*>(sqlite3_column_text(mStmtPtr, mIndex)); const char* pText = reinterpret_cast<const char*>(sqlite3_column_text(mStmtPtr, mIndex));
return (pText?pText:apDefaultValue); return (pText ? pText : apDefaultValue);
} }
// Return a pointer to the blob value (*not* NULL terminated) of the column specified by its index starting at 0 // Return a pointer to the blob value (*not* NULL terminated) of the column specified by its index starting at 0
const void* Column::getBlob() const noexcept // nothrow const void* Column::getBlob() const noexcept // nothrow
{ {
return sqlite3_column_blob(mStmtPtr, mIndex); return sqlite3_column_blob(mStmtPtr, mIndex);
} }
// Return a std::string to a TEXT or BLOB column // Return a std::string to a TEXT or BLOB column
std::string Column::getString() const std::string Column::getString() const
{ {
// Note: using sqlite3_column_blob and not sqlite3_column_text // Note: using sqlite3_column_blob and not sqlite3_column_text
// - no need for sqlite3_column_text to add a \0 on the end, as we're getting the bytes length directly // - no need for sqlite3_column_text to add a \0 on the end, as we're getting the bytes length directly
const char *data = static_cast<const char *>(sqlite3_column_blob(mStmtPtr, mIndex)); const char* data = static_cast<const char*>(sqlite3_column_blob(mStmtPtr, mIndex));
// SQLite docs: "The safest policy is to invoke… sqlite3_column_blob() followed by sqlite3_column_bytes()" // SQLite docs: "The safest policy is to invoke… sqlite3_column_blob() followed by sqlite3_column_bytes()"
// Note: std::string is ok to pass nullptr as first arg, if length is 0 // Note: std::string is ok to pass nullptr as first arg, if length is 0
return std::string(data, sqlite3_column_bytes(mStmtPtr, mIndex)); return std::string(data, sqlite3_column_bytes(mStmtPtr, mIndex));
} }
// Return the type of the value of the column // Return the type of the value of the column
int Column::getType() const noexcept // nothrow int Column::getType() const noexcept // nothrow
{ {
return sqlite3_column_type(mStmtPtr, mIndex); return sqlite3_column_type(mStmtPtr, mIndex);
} }
// Return the number of bytes used by the text value of the column // Return the number of bytes used by the text value of the column
int Column::getBytes() const noexcept // nothrow int Column::getBytes() const noexcept // nothrow
{ {
return sqlite3_column_bytes(mStmtPtr, mIndex); return sqlite3_column_bytes(mStmtPtr, mIndex);
} }
// Standard std::ostream inserter // Standard std::ostream inserter
std::ostream& operator<<(std::ostream& aStream, const Column& aColumn) std::ostream& operator<<(std::ostream& aStream, const Column& aColumn)
{ {
aStream.write(aColumn.getText(), aColumn.getBytes()); aStream.write(aColumn.getText(), aColumn.getBytes());
return aStream; return aStream;
} }
} // namespace SQLite } // namespace SQLite

View File

@ -9,52 +9,42 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Database.h> #include <SQLiteCpp/Database.h>
#include <SQLiteCpp/Statement.h> #include <SQLiteCpp/Statement.h>
#include <SQLiteCpp/Assertion.h> #include <SQLiteCpp/Assertion.h>
#include <SQLiteCpp/Exception.h> #include <SQLiteCpp/Exception.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <fstream> #include <fstream>
#include <string.h> #include <string.h>
#ifndef SQLITE_DETERMINISTIC #ifndef SQLITE_DETERMINISTIC
#define SQLITE_DETERMINISTIC 0x800 #define SQLITE_DETERMINISTIC 0x800
#endif // SQLITE_DETERMINISTIC #endif // SQLITE_DETERMINISTIC
namespace SQLite namespace SQLite
{ {
const int OPEN_READONLY = SQLITE_OPEN_READONLY; const int OPEN_READONLY = SQLITE_OPEN_READONLY;
const int OPEN_READWRITE = SQLITE_OPEN_READWRITE; const int OPEN_READWRITE = SQLITE_OPEN_READWRITE;
const int OPEN_CREATE = SQLITE_OPEN_CREATE; const int OPEN_CREATE = SQLITE_OPEN_CREATE;
const int OPEN_URI = SQLITE_OPEN_URI; const int OPEN_URI = SQLITE_OPEN_URI;
const int OK = SQLITE_OK; const int OK = SQLITE_OK;
const char* VERSION = SQLITE_VERSION; const char* VERSION = SQLITE_VERSION;
const int VERSION_NUMBER = SQLITE_VERSION_NUMBER; const int VERSION_NUMBER = SQLITE_VERSION_NUMBER;
// Return SQLite version string using runtime call to the compiled library // Return SQLite version string using runtime call to the compiled library
const char* getLibVersion() noexcept // nothrow const char* getLibVersion() noexcept // nothrow
{ {
return sqlite3_libversion(); return sqlite3_libversion();
} }
// Return SQLite version number using runtime call to the compiled library // Return SQLite version number using runtime call to the compiled library
int getLibVersionNumber() noexcept // nothrow int getLibVersionNumber() noexcept // nothrow
{ {
return sqlite3_libversion_number(); return sqlite3_libversion_number();
} }
// Open the provided database UTF-8 filename with SQLite::OPEN_xxx provided flags. // Open the provided database UTF-8 filename with SQLite::OPEN_xxx provided flags.
Database::Database(const char* apFilename, Database::Database(const char* apFilename,
const int aFlags /* = SQLite::OPEN_READONLY*/, const int aFlags /* = SQLite::OPEN_READONLY*/,
const int aBusyTimeoutMs /* = 0 */, const int aBusyTimeoutMs /* = 0 */,
const char* apVfs /* = nullptr*/) : const char* apVfs /* = nullptr*/)
mpSQLite(nullptr), :
mpSQLite(nullptr)
,
mFilename(apFilename) mFilename(apFilename)
{ {
const int ret = sqlite3_open_v2(apFilename, &mpSQLite, aFlags, apVfs); const int ret = sqlite3_open_v2(apFilename, &mpSQLite, aFlags, apVfs);
@ -69,13 +59,14 @@ Database::Database(const char* apFilename,
setBusyTimeout(aBusyTimeoutMs); setBusyTimeout(aBusyTimeoutMs);
} }
} }
// Open the provided database UTF-8 filename with SQLite::OPEN_xxx provided flags. // Open the provided database UTF-8 filename with SQLite::OPEN_xxx provided flags.
Database::Database(const std::string& aFilename, Database::Database(const std::string& aFilename,
const int aFlags /* = SQLite::OPEN_READONLY*/, const int aFlags /* = SQLite::OPEN_READONLY*/,
const int aBusyTimeoutMs /* = 0 */, const int aBusyTimeoutMs /* = 0 */,
const std::string& aVfs /* = "" */) : const std::string& aVfs /* = "" */)
mpSQLite(nullptr), :
mpSQLite(nullptr)
,
mFilename(aFilename) mFilename(aFilename)
{ {
const int ret = sqlite3_open_v2(aFilename.c_str(), &mpSQLite, aFlags, aVfs.empty() ? nullptr : aVfs.c_str()); const int ret = sqlite3_open_v2(aFilename.c_str(), &mpSQLite, aFlags, aVfs.empty() ? nullptr : aVfs.c_str());
@ -90,20 +81,16 @@ Database::Database(const std::string& aFilename,
setBusyTimeout(aBusyTimeoutMs); setBusyTimeout(aBusyTimeoutMs);
} }
} }
// Close the SQLite database connection. // Close the SQLite database connection.
Database::~Database() Database::~Database()
{ {
const int ret = sqlite3_close(mpSQLite); const int ret = sqlite3_close(mpSQLite);
// Avoid unreferenced variable warning when build in release mode // Avoid unreferenced variable warning when build in release mode
(void) ret; (void)ret;
// Only case of error is SQLITE_BUSY: "database is locked" (some statements are not finalized) // Only case of error is SQLITE_BUSY: "database is locked" (some statements are not finalized)
// Never throw an exception in a destructor : // Never throw an exception in a destructor :
SQLITECPP_ASSERT(SQLITE_OK == ret, "database is locked"); // See SQLITECPP_ENABLE_ASSERT_HANDLER SQLITECPP_ASSERT(SQLITE_OK == ret, "database is locked"); // See SQLITECPP_ENABLE_ASSERT_HANDLER
} }
/** /**
* @brief Set a busy handler that sleeps for a specified amount of time when a table is locked. * @brief Set a busy handler that sleeps for a specified amount of time when a table is locked.
* *
@ -122,17 +109,14 @@ void Database::setBusyTimeout(const int aBusyTimeoutMs)
const int ret = sqlite3_busy_timeout(mpSQLite, aBusyTimeoutMs); const int ret = sqlite3_busy_timeout(mpSQLite, aBusyTimeoutMs);
check(ret); check(ret);
} }
// Shortcut to execute one or multiple SQL statements without results (UPDATE, INSERT, ALTER, COMMIT, CREATE...). // Shortcut to execute one or multiple SQL statements without results (UPDATE, INSERT, ALTER, COMMIT, CREATE...).
int Database::exec(const char* apQueries) int Database::exec(const char* apQueries)
{ {
const int ret = sqlite3_exec(mpSQLite, apQueries, nullptr, nullptr, nullptr); const int ret = sqlite3_exec(mpSQLite, apQueries, nullptr, nullptr, nullptr);
check(ret); check(ret);
// Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE only) // Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE only)
return sqlite3_changes(mpSQLite); return sqlite3_changes(mpSQLite);
} }
// Shortcut to execute a one step query and fetch the first column of the result. // Shortcut to execute a one step query and fetch the first column of the result.
// WARNING: Be very careful with this dangerous method: you have to // WARNING: Be very careful with this dangerous method: you have to
// make a COPY OF THE result, else it will be destroy before the next line // make a COPY OF THE result, else it will be destroy before the next line
@ -145,7 +129,6 @@ Column Database::execAndGet(const char* apQuery)
(void)query.executeStep(); // Can return false if no result, which will throw next line in getColumn() (void)query.executeStep(); // Can return false if no result, which will throw next line in getColumn()
return query.getColumn(0); return query.getColumn(0);
} }
// Shortcut to test if a table exists. // Shortcut to test if a table exists.
bool Database::tableExists(const char* apTableName) bool Database::tableExists(const char* apTableName)
{ {
@ -154,68 +137,60 @@ bool Database::tableExists(const char* apTableName)
(void)query.executeStep(); // Cannot return false, as the above query always return a result (void)query.executeStep(); // Cannot return false, as the above query always return a result
return (1 == query.getColumn(0).getInt()); return (1 == query.getColumn(0).getInt());
} }
// Get the rowid of the most recent successful INSERT into the database from the current connection. // Get the rowid of the most recent successful INSERT into the database from the current connection.
long long Database::getLastInsertRowid() const noexcept // nothrow long long Database::getLastInsertRowid() const noexcept // nothrow
{ {
return sqlite3_last_insert_rowid(mpSQLite); return sqlite3_last_insert_rowid(mpSQLite);
} }
// Get total number of rows modified by all INSERT, UPDATE or DELETE statement since connection. // Get total number of rows modified by all INSERT, UPDATE or DELETE statement since connection.
int Database::getTotalChanges() const noexcept // nothrow int Database::getTotalChanges() const noexcept // nothrow
{ {
return sqlite3_total_changes(mpSQLite); return sqlite3_total_changes(mpSQLite);
} }
// Return the numeric result code for the most recent failed API call (if any). // Return the numeric result code for the most recent failed API call (if any).
int Database::getErrorCode() const noexcept // nothrow int Database::getErrorCode() const noexcept // nothrow
{ {
return sqlite3_errcode(mpSQLite); return sqlite3_errcode(mpSQLite);
} }
// Return the extended numeric result code for the most recent failed API call (if any). // Return the extended numeric result code for the most recent failed API call (if any).
int Database::getExtendedErrorCode() const noexcept // nothrow int Database::getExtendedErrorCode() const noexcept // nothrow
{ {
return sqlite3_extended_errcode(mpSQLite); return sqlite3_extended_errcode(mpSQLite);
} }
// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). // Return UTF-8 encoded English language explanation of the most recent failed API call (if any).
const char* Database::getErrorMsg() const noexcept // nothrow const char* Database::getErrorMsg() const noexcept // nothrow
{ {
return sqlite3_errmsg(mpSQLite); return sqlite3_errmsg(mpSQLite);
} }
// Attach a custom function to your sqlite database. Assumes UTF8 text representation. // Attach a custom function to your sqlite database. Assumes UTF8 text representation.
// Parameter details can be found here: http://www.sqlite.org/c3ref/create_function.html // Parameter details can be found here: http://www.sqlite.org/c3ref/create_function.html
void Database::createFunction(const char* apFuncName, void Database::createFunction(const char* apFuncName,
int aNbArg, int aNbArg,
bool abDeterministic, bool abDeterministic,
void* apApp, void* apApp,
void (*apFunc)(sqlite3_context *, int, sqlite3_value **), void (*apFunc)(sqlite3_context*, int, sqlite3_value**),
void (*apStep)(sqlite3_context *, int, sqlite3_value **), void (*apStep)(sqlite3_context*, int, sqlite3_value**),
void (*apFinal)(sqlite3_context *), // NOLINT(readability/casting) void (*apFinal)(sqlite3_context*), // NOLINT(readability/casting)
void (*apDestroy)(void *)) void (*apDestroy)(void*))
{ {
int TextRep = SQLITE_UTF8; int TextRep = SQLITE_UTF8;
// optimization if deterministic function (e.g. of nondeterministic function random()) // optimization if deterministic function (e.g. of nondeterministic function random())
if (abDeterministic) if (abDeterministic)
{ {
TextRep = TextRep|SQLITE_DETERMINISTIC; TextRep = TextRep | SQLITE_DETERMINISTIC;
} }
const int ret = sqlite3_create_function_v2(mpSQLite, apFuncName, aNbArg, TextRep, const int ret = sqlite3_create_function_v2(mpSQLite, apFuncName, aNbArg, TextRep,
apApp, apFunc, apStep, apFinal, apDestroy); apApp, apFunc, apStep, apFinal, apDestroy);
check(ret); check(ret);
} }
// Load an extension into the sqlite database. Only affects the current connection. // Load an extension into the sqlite database. Only affects the current connection.
// Parameter details can be found here: http://www.sqlite.org/c3ref/load_extension.html // Parameter details can be found here: http://www.sqlite.org/c3ref/load_extension.html
void Database::loadExtension(const char* apExtensionName, const char *apEntryPointName) void Database::loadExtension(const char* apExtensionName, const char* apEntryPointName)
{ {
#ifdef SQLITE_OMIT_LOAD_EXTENSION #ifdef SQLITE_OMIT_LOAD_EXTENSION
// Unused // Unused
(void)apExtensionName; (void)apExtensionName;
(void)apEntryPointName; (void)apEntryPointName;
throw std::runtime_error("sqlite extensions are disabled"); throw std::runtime_error("sqlite extensions are disabled");
#else #else
#ifdef SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION // Since SQLite 3.13 (2016-05-18): #ifdef SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION // Since SQLite 3.13 (2016-05-18):
@ -229,12 +204,10 @@ void Database::loadExtension(const char* apExtensionName, const char *apEntryPoi
int ret = sqlite3_enable_load_extension(mpSQLite, 1); int ret = sqlite3_enable_load_extension(mpSQLite, 1);
#endif #endif
check(ret); check(ret);
ret = sqlite3_load_extension(mpSQLite, apExtensionName, apEntryPointName, 0); ret = sqlite3_load_extension(mpSQLite, apExtensionName, apEntryPointName, 0);
check(ret); check(ret);
#endif #endif
} }
// Set the key for the current sqlite database instance. // Set the key for the current sqlite database instance.
void Database::key(const std::string& aKey) const void Database::key(const std::string& aKey) const
{ {
@ -253,7 +226,6 @@ void Database::key(const std::string& aKey) const
} }
#endif // SQLITE_HAS_CODEC #endif // SQLITE_HAS_CODEC
} }
// Reset the key for the current sqlite database instance. // Reset the key for the current sqlite database instance.
void Database::rekey(const std::string& aNewKey) const void Database::rekey(const std::string& aNewKey) const
{ {
@ -275,7 +247,6 @@ void Database::rekey(const std::string& aNewKey) const
throw exception; throw exception;
#endif // SQLITE_HAS_CODEC #endif // SQLITE_HAS_CODEC
} }
// Test if a file contains an unencrypted database. // Test if a file contains an unencrypted database.
bool Database::isUnencrypted(const std::string& aFilename) bool Database::isUnencrypted(const std::string& aFilename)
{ {
@ -299,5 +270,4 @@ bool Database::isUnencrypted(const std::string& aFilename)
const SQLite::Exception exception("Could not open database, the aFilename parameter was empty."); const SQLite::Exception exception("Could not open database, the aFilename parameter was empty.");
throw exception; throw exception;
} }
} // namespace SQLite } // namespace SQLite

View File

@ -9,59 +9,66 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Exception.h> #include <SQLiteCpp/Exception.h>
#include <sqlite3.h> #include <sqlite3.h>
namespace SQLite namespace SQLite
{ {
Exception::Exception(const char* aErrorMessage)
Exception::Exception(const char* aErrorMessage) : :
std::runtime_error(aErrorMessage), std::runtime_error(aErrorMessage)
mErrcode(-1), // 0 would be SQLITE_OK, which doesn't make sense ,
mErrcode(-1)
, // 0 would be SQLITE_OK, which doesn't make sense
mExtendedErrcode(-1) mExtendedErrcode(-1)
{ {
} }
Exception::Exception(const std::string& aErrorMessage) : Exception::Exception(const std::string& aErrorMessage)
std::runtime_error(aErrorMessage), :
mErrcode(-1), // 0 would be SQLITE_OK, which doesn't make sense std::runtime_error(aErrorMessage)
,
mErrcode(-1)
, // 0 would be SQLITE_OK, which doesn't make sense
mExtendedErrcode(-1) mExtendedErrcode(-1)
{ {
} }
Exception::Exception(const char* aErrorMessage, int ret)
Exception::Exception(const char* aErrorMessage, int ret) : :
std::runtime_error(aErrorMessage), std::runtime_error(aErrorMessage)
mErrcode(ret), ,
mErrcode(ret)
,
mExtendedErrcode(-1) mExtendedErrcode(-1)
{ {
} }
Exception::Exception(const std::string& aErrorMessage, int ret)
Exception::Exception(const std::string& aErrorMessage, int ret) : :
std::runtime_error(aErrorMessage), std::runtime_error(aErrorMessage)
mErrcode(ret), ,
mErrcode(ret)
,
mExtendedErrcode(-1) mExtendedErrcode(-1)
{ {
} }
Exception::Exception(sqlite3* apSQLite)
Exception::Exception(sqlite3* apSQLite) : :
std::runtime_error(sqlite3_errmsg(apSQLite)), std::runtime_error(sqlite3_errmsg(apSQLite))
mErrcode(sqlite3_errcode(apSQLite)), ,
mErrcode(sqlite3_errcode(apSQLite))
,
mExtendedErrcode(sqlite3_extended_errcode(apSQLite)) mExtendedErrcode(sqlite3_extended_errcode(apSQLite))
{ {
} }
Exception::Exception(sqlite3* apSQLite, int ret)
Exception::Exception(sqlite3* apSQLite, int ret) : :
std::runtime_error(sqlite3_errmsg(apSQLite)), std::runtime_error(sqlite3_errmsg(apSQLite))
mErrcode(ret), ,
mErrcode(ret)
,
mExtendedErrcode(sqlite3_extended_errcode(apSQLite)) mExtendedErrcode(sqlite3_extended_errcode(apSQLite))
{ {
} }
// Return a string, solely based on the error code // Return a string, solely based on the error code
const char* Exception::getErrorStr() const noexcept // nothrow const char* Exception::getErrorStr() const noexcept // nothrow
{ {
return sqlite3_errstr(mErrcode); return sqlite3_errstr(mErrcode);
} }
} // namespace SQLite } // namespace SQLite

View File

@ -9,45 +9,54 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Statement.h> #include <SQLiteCpp/Statement.h>
#include <SQLiteCpp/Database.h> #include <SQLiteCpp/Database.h>
#include <SQLiteCpp/Column.h> #include <SQLiteCpp/Column.h>
#include <SQLiteCpp/Assertion.h> #include <SQLiteCpp/Assertion.h>
#include <SQLiteCpp/Exception.h> #include <SQLiteCpp/Exception.h>
#include <sqlite3.h> #include <sqlite3.h>
namespace SQLite namespace SQLite
{ {
// Compile and register the SQL query for the provided SQLite Database Connection // Compile and register the SQL query for the provided SQLite Database Connection
Statement::Statement(Database &aDatabase, const char* apQuery) : Statement::Statement(Database& aDatabase, const char* apQuery)
mQuery(apQuery), :
mStmtPtr(aDatabase.mpSQLite, mQuery), // prepare the SQL query, and ref count (needs Database friendship) mQuery(apQuery)
mColumnCount(0), ,
mbHasRow(false), mStmtPtr(aDatabase.mpSQLite, mQuery)
, // prepare the SQL query, and ref count (needs Database friendship)
mColumnCount(0)
,
mbHasRow(false)
,
mbDone(false) mbDone(false)
{ {
mColumnCount = sqlite3_column_count(mStmtPtr); mColumnCount = sqlite3_column_count(mStmtPtr);
} }
// Compile and register the SQL query for the provided SQLite Database Connection // Compile and register the SQL query for the provided SQLite Database Connection
Statement::Statement(Database &aDatabase, const std::string& aQuery) : Statement::Statement(Database& aDatabase, const std::string& aQuery)
mQuery(aQuery), :
mStmtPtr(aDatabase.mpSQLite, mQuery), // prepare the SQL query, and ref count (needs Database friendship) mQuery(aQuery)
mColumnCount(0), ,
mbHasRow(false), mStmtPtr(aDatabase.mpSQLite, mQuery)
, // prepare the SQL query, and ref count (needs Database friendship)
mColumnCount(0)
,
mbHasRow(false)
,
mbDone(false) mbDone(false)
{ {
mColumnCount = sqlite3_column_count(mStmtPtr); mColumnCount = sqlite3_column_count(mStmtPtr);
} }
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)
Statement::Statement(Statement&& aStatement) noexcept : Statement::Statement(Statement&& aStatement) noexcept
mQuery(std::move(aStatement.mQuery)), :
mStmtPtr(std::move(aStatement.mStmtPtr)), mQuery(std::move(aStatement.mQuery))
mColumnCount(aStatement.mColumnCount), ,
mbHasRow(aStatement.mbHasRow), mStmtPtr(std::move(aStatement.mStmtPtr))
,
mColumnCount(aStatement.mColumnCount)
,
mbHasRow(aStatement.mbHasRow)
,
mbDone(aStatement.mbDone) mbDone(aStatement.mbDone)
{ {
aStatement.mColumnCount = 0; aStatement.mColumnCount = 0;
@ -55,62 +64,53 @@ Statement::Statement(Statement&& aStatement) noexcept :
aStatement.mbDone = false; aStatement.mbDone = false;
} }
#endif #endif
// Finalize and unregister the SQL query from the SQLite Database Connection. // Finalize and unregister the SQL query from the SQLite Database Connection.
Statement::~Statement() Statement::~Statement()
{ {
// the finalization will be done by the destructor of the last shared pointer // the finalization will be done by the destructor of the last shared pointer
} }
// Reset the statement to make it ready for a new execution (see also #clearBindings() bellow) // Reset the statement to make it ready for a new execution (see also #clearBindings() bellow)
void Statement::reset() void Statement::reset()
{ {
const int ret = tryReset(); const int ret = tryReset();
check(ret); check(ret);
} }
int Statement::tryReset() noexcept int Statement::tryReset() noexcept
{ {
mbHasRow = false; mbHasRow = false;
mbDone = false; mbDone = false;
return sqlite3_reset(mStmtPtr); return sqlite3_reset(mStmtPtr);
} }
// Clears away all the bindings of a prepared statement (can be associated with #reset() above). // Clears away all the bindings of a prepared statement (can be associated with #reset() above).
void Statement::clearBindings() void Statement::clearBindings()
{ {
const int ret = sqlite3_clear_bindings(mStmtPtr); const int ret = sqlite3_clear_bindings(mStmtPtr);
check(ret); check(ret);
} }
// Bind an int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind an int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const int aValue) void Statement::bind(const int aIndex, const int aValue)
{ {
const int ret = sqlite3_bind_int(mStmtPtr, aIndex, aValue); const int ret = sqlite3_bind_int(mStmtPtr, aIndex, aValue);
check(ret); check(ret);
} }
// Bind a 32bits unsigned int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a 32bits unsigned int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const unsigned aValue) void Statement::bind(const int aIndex, const unsigned aValue)
{ {
const int ret = sqlite3_bind_int64(mStmtPtr, aIndex, aValue); const int ret = sqlite3_bind_int64(mStmtPtr, aIndex, aValue);
check(ret); check(ret);
} }
// Bind a 64bits int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a 64bits int value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const long long aValue) void Statement::bind(const int aIndex, const long long aValue)
{ {
const int ret = sqlite3_bind_int64(mStmtPtr, aIndex, aValue); const int ret = sqlite3_bind_int64(mStmtPtr, aIndex, aValue);
check(ret); check(ret);
} }
// Bind a double (64bits float) value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a double (64bits float) value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const double aValue) void Statement::bind(const int aIndex, const double aValue)
{ {
const int ret = sqlite3_bind_double(mStmtPtr, aIndex, aValue); const int ret = sqlite3_bind_double(mStmtPtr, aIndex, aValue);
check(ret); check(ret);
} }
// Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const std::string& aValue) void Statement::bind(const int aIndex, const std::string& aValue)
{ {
@ -118,21 +118,18 @@ void Statement::bind(const int aIndex, const std::string& aValue)
static_cast<int>(aValue.size()), SQLITE_TRANSIENT); static_cast<int>(aValue.size()), SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const char* apValue) void Statement::bind(const int aIndex, const char* apValue)
{ {
const int ret = sqlite3_bind_text(mStmtPtr, aIndex, apValue, -1, SQLITE_TRANSIENT); const int ret = sqlite3_bind_text(mStmtPtr, aIndex, apValue, -1, SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex, const void* apValue, const int aSize) void Statement::bind(const int aIndex, const void* apValue, const int aSize)
{ {
const int ret = sqlite3_bind_blob(mStmtPtr, aIndex, apValue, aSize, SQLITE_TRANSIENT); const int ret = sqlite3_bind_blob(mStmtPtr, aIndex, apValue, aSize, SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a string value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const int aIndex, const std::string& aValue) void Statement::bindNoCopy(const int aIndex, const std::string& aValue)
{ {
@ -140,29 +137,24 @@ void Statement::bindNoCopy(const int aIndex, const std::string& aValue)
static_cast<int>(aValue.size()), SQLITE_STATIC); static_cast<int>(aValue.size()), SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a text value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const int aIndex, const char* apValue) void Statement::bindNoCopy(const int aIndex, const char* apValue)
{ {
const int ret = sqlite3_bind_text(mStmtPtr, aIndex, apValue, -1, SQLITE_STATIC); const int ret = sqlite3_bind_text(mStmtPtr, aIndex, apValue, -1, SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a binary blob value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const int aIndex, const void* apValue, const int aSize) void Statement::bindNoCopy(const int aIndex, const void* apValue, const int aSize)
{ {
const int ret = sqlite3_bind_blob(mStmtPtr, aIndex, apValue, aSize, SQLITE_STATIC); const int ret = sqlite3_bind_blob(mStmtPtr, aIndex, apValue, aSize, SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a NULL value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a NULL value to a parameter "?", "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const int aIndex) void Statement::bind(const int aIndex)
{ {
const int ret = sqlite3_bind_null(mStmtPtr, aIndex); const int ret = sqlite3_bind_null(mStmtPtr, aIndex);
check(ret); check(ret);
} }
// Bind an int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind an int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const int aValue) void Statement::bind(const char* apName, const int aValue)
{ {
@ -170,7 +162,6 @@ void Statement::bind(const char* apName, const int aValue)
const int ret = sqlite3_bind_int(mStmtPtr, index, aValue); const int ret = sqlite3_bind_int(mStmtPtr, index, aValue);
check(ret); check(ret);
} }
// Bind a 32bits unsigned int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a 32bits unsigned int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const unsigned aValue) void Statement::bind(const char* apName, const unsigned aValue)
{ {
@ -178,7 +169,6 @@ void Statement::bind(const char* apName, const unsigned aValue)
const int ret = sqlite3_bind_int64(mStmtPtr, index, aValue); const int ret = sqlite3_bind_int64(mStmtPtr, index, aValue);
check(ret); check(ret);
} }
// Bind a 64bits int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a 64bits int value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const long long aValue) void Statement::bind(const char* apName, const long long aValue)
{ {
@ -186,7 +176,6 @@ void Statement::bind(const char* apName, const long long aValue)
const int ret = sqlite3_bind_int64(mStmtPtr, index, aValue); const int ret = sqlite3_bind_int64(mStmtPtr, index, aValue);
check(ret); check(ret);
} }
// Bind a double (64bits float) value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a double (64bits float) value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const double aValue) void Statement::bind(const char* apName, const double aValue)
{ {
@ -194,7 +183,6 @@ void Statement::bind(const char* apName, const double aValue)
const int ret = sqlite3_bind_double(mStmtPtr, index, aValue); const int ret = sqlite3_bind_double(mStmtPtr, index, aValue);
check(ret); check(ret);
} }
// Bind a string value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a string value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const std::string& aValue) void Statement::bind(const char* apName, const std::string& aValue)
{ {
@ -203,7 +191,6 @@ void Statement::bind(const char* apName, const std::string& aValue)
static_cast<int>(aValue.size()), SQLITE_TRANSIENT); static_cast<int>(aValue.size()), SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a text value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a text value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const char* apValue) void Statement::bind(const char* apName, const char* apValue)
{ {
@ -211,7 +198,6 @@ void Statement::bind(const char* apName, const char* apValue)
const int ret = sqlite3_bind_text(mStmtPtr, index, apValue, -1, SQLITE_TRANSIENT); const int ret = sqlite3_bind_text(mStmtPtr, index, apValue, -1, SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a binary blob value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a binary blob value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName, const void* apValue, const int aSize) void Statement::bind(const char* apName, const void* apValue, const int aSize)
{ {
@ -219,7 +205,6 @@ void Statement::bind(const char* apName, const void* apValue, const int aSize)
const int ret = sqlite3_bind_blob(mStmtPtr, index, apValue, aSize, SQLITE_TRANSIENT); const int ret = sqlite3_bind_blob(mStmtPtr, index, apValue, aSize, SQLITE_TRANSIENT);
check(ret); check(ret);
} }
// Bind a string value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a string value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const char* apName, const std::string& aValue) void Statement::bindNoCopy(const char* apName, const std::string& aValue)
{ {
@ -228,7 +213,6 @@ void Statement::bindNoCopy(const char* apName, const std::string& aValue)
static_cast<int>(aValue.size()), SQLITE_STATIC); static_cast<int>(aValue.size()), SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a text value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a text value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const char* apName, const char* apValue) void Statement::bindNoCopy(const char* apName, const char* apValue)
{ {
@ -236,7 +220,6 @@ void Statement::bindNoCopy(const char* apName, const char* apValue)
const int ret = sqlite3_bind_text(mStmtPtr, index, apValue, -1, SQLITE_STATIC); const int ret = sqlite3_bind_text(mStmtPtr, index, apValue, -1, SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a binary blob value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a binary blob value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bindNoCopy(const char* apName, const void* apValue, const int aSize) void Statement::bindNoCopy(const char* apName, const void* apValue, const int aSize)
{ {
@ -244,7 +227,6 @@ void Statement::bindNoCopy(const char* apName, const void* apValue, const int aS
const int ret = sqlite3_bind_blob(mStmtPtr, index, apValue, aSize, SQLITE_STATIC); const int ret = sqlite3_bind_blob(mStmtPtr, index, apValue, aSize, SQLITE_STATIC);
check(ret); check(ret);
} }
// Bind a NULL value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement // Bind a NULL value to a parameter "?NNN", ":VVV", "@VVV" or "$VVV" in the SQL prepared statement
void Statement::bind(const char* apName) void Statement::bind(const char* apName)
{ {
@ -252,8 +234,6 @@ void Statement::bind(const char* apName)
const int ret = sqlite3_bind_null(mStmtPtr, index); const int ret = sqlite3_bind_null(mStmtPtr, index);
check(ret); check(ret);
} }
// Execute a step of the query to fetch one row of results // Execute a step of the query to fetch one row of results
bool Statement::executeStep() bool Statement::executeStep()
{ {
@ -269,10 +249,8 @@ bool Statement::executeStep()
throw SQLite::Exception("Statement needs to be reseted", ret); throw SQLite::Exception("Statement needs to be reseted", ret);
} }
} }
return mbHasRow; // true only if one row is accessible by getColumn(N) return mbHasRow; // true only if one row is accessible by getColumn(N)
} }
// Execute a one-step query with no expected result // Execute a one-step query with no expected result
int Statement::exec() int Statement::exec()
{ {
@ -292,11 +270,9 @@ int Statement::exec()
throw SQLite::Exception("Statement needs to be reseted", ret); throw SQLite::Exception("Statement needs to be reseted", ret);
} }
} }
// Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE) // Return the number of rows modified by those SQL statements (INSERT, UPDATE or DELETE)
return sqlite3_changes(mStmtPtr); return sqlite3_changes(mStmtPtr);
} }
int Statement::tryExecuteStep() noexcept int Statement::tryExecuteStep() noexcept
{ {
if (false == mbDone) if (false == mbDone)
@ -316,7 +292,6 @@ int Statement::tryExecuteStep() noexcept
mbHasRow = false; mbHasRow = false;
mbDone = false; mbDone = false;
} }
return ret; return ret;
} }
else else
@ -325,30 +300,24 @@ int Statement::tryExecuteStep() noexcept
return SQLITE_MISUSE; return SQLITE_MISUSE;
} }
} }
// Return a copy of the column data specified by its index starting at 0 // Return a copy of the column data specified by its index starting at 0
// (use the Column copy-constructor) // (use the Column copy-constructor)
Column Statement::getColumn(const int aIndex) Column Statement::getColumn(const int aIndex)
{ {
checkRow(); checkRow();
checkIndex(aIndex); checkIndex(aIndex);
// Share the Statement Object handle with the new Column created // Share the Statement Object handle with the new Column created
return Column(mStmtPtr, aIndex); return Column(mStmtPtr, aIndex);
} }
// Return a copy of the column data specified by its column name starting at 0 // Return a copy of the column data specified by its column name starting at 0
// (use the Column copy-constructor) // (use the Column copy-constructor)
Column Statement::getColumn(const char* apName) Column Statement::getColumn(const char* apName)
{ {
checkRow(); checkRow();
const int index = getColumnIndex(apName); const int index = getColumnIndex(apName);
// Share the Statement Object handle with the new Column created // Share the Statement Object handle with the new Column created
return Column(mStmtPtr, index); return Column(mStmtPtr, index);
} }
// Test if the column is NULL // Test if the column is NULL
bool Statement::isColumnNull(const int aIndex) const bool Statement::isColumnNull(const int aIndex) const
{ {
@ -356,21 +325,18 @@ bool Statement::isColumnNull(const int aIndex) const
checkIndex(aIndex); checkIndex(aIndex);
return (SQLITE_NULL == sqlite3_column_type(mStmtPtr, aIndex)); return (SQLITE_NULL == sqlite3_column_type(mStmtPtr, aIndex));
} }
bool Statement::isColumnNull(const char* apName) const bool Statement::isColumnNull(const char* apName) const
{ {
checkRow(); checkRow();
const int index = getColumnIndex(apName); const int index = getColumnIndex(apName);
return (SQLITE_NULL == sqlite3_column_type(mStmtPtr, index)); return (SQLITE_NULL == sqlite3_column_type(mStmtPtr, index));
} }
// Return the named assigned to the specified result column (potentially aliased) // Return the named assigned to the specified result column (potentially aliased)
const char* Statement::getColumnName(const int aIndex) const const char* Statement::getColumnName(const int aIndex) const
{ {
checkIndex(aIndex); checkIndex(aIndex);
return sqlite3_column_name(mStmtPtr, aIndex); return sqlite3_column_name(mStmtPtr, aIndex);
} }
#ifdef SQLITE_ENABLE_COLUMN_METADATA #ifdef SQLITE_ENABLE_COLUMN_METADATA
// Return the named assigned to the specified result column (potentially aliased) // Return the named assigned to the specified result column (potentially aliased)
const char* Statement::getColumnOriginName(const int aIndex) const const char* Statement::getColumnOriginName(const int aIndex) const
@ -379,7 +345,6 @@ const char* Statement::getColumnOriginName(const int aIndex) const
return sqlite3_column_origin_name(mStmtPtr, aIndex); return sqlite3_column_origin_name(mStmtPtr, aIndex);
} }
#endif #endif
// Return the index of the specified (potentially aliased) column name // Return the index of the specified (potentially aliased) column name
int Statement::getColumnIndex(const char* apName) const int Statement::getColumnIndex(const char* apName) const
{ {
@ -392,60 +357,55 @@ int Statement::getColumnIndex(const char* apName) const
mColumnNames[pName] = i; mColumnNames[pName] = i;
} }
} }
const TColumnNames::const_iterator iIndex = mColumnNames.find(apName); const TColumnNames::const_iterator iIndex = mColumnNames.find(apName);
if (iIndex == mColumnNames.end()) if (iIndex == mColumnNames.end())
{ {
throw SQLite::Exception("Unknown column name."); throw SQLite::Exception("Unknown column name.");
} }
return (*iIndex).second; return (*iIndex).second;
} }
int Statement::getBindParameterCount() const noexcept int Statement::getBindParameterCount() const noexcept
{ {
return sqlite3_bind_parameter_count(mStmtPtr); return sqlite3_bind_parameter_count(mStmtPtr);
} }
// Return the numeric result code for the most recent failed API call (if any). // Return the numeric result code for the most recent failed API call (if any).
int Statement::getErrorCode() const noexcept // nothrow int Statement::getErrorCode() const noexcept // nothrow
{ {
return sqlite3_errcode(mStmtPtr); return sqlite3_errcode(mStmtPtr);
} }
// Return the extended numeric result code for the most recent failed API call (if any). // Return the extended numeric result code for the most recent failed API call (if any).
int Statement::getExtendedErrorCode() const noexcept // nothrow int Statement::getExtendedErrorCode() const noexcept // nothrow
{ {
return sqlite3_extended_errcode(mStmtPtr); return sqlite3_extended_errcode(mStmtPtr);
} }
// Return UTF-8 encoded English language explanation of the most recent failed API call (if any). // Return UTF-8 encoded English language explanation of the most recent failed API call (if any).
const char* Statement::getErrorMsg() const noexcept // nothrow const char* Statement::getErrorMsg() const noexcept // nothrow
{ {
return sqlite3_errmsg(mStmtPtr); return sqlite3_errmsg(mStmtPtr);
} }
// Return a UTF-8 string containing the SQL text of prepared statement with bound parameters expanded. // Return a UTF-8 string containing the SQL text of prepared statement with bound parameters expanded.
std::string Statement::getExpandedSQL() { std::string Statement::getExpandedSQL()
{
char* expanded = sqlite3_expanded_sql(mStmtPtr); char* expanded = sqlite3_expanded_sql(mStmtPtr);
std::string expandedString(expanded); std::string expandedString(expanded);
sqlite3_free(expanded); sqlite3_free(expanded);
return expandedString; return expandedString;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Internal class : shared pointer to the sqlite3_stmt SQLite Statement Object // Internal class : shared pointer to the sqlite3_stmt SQLite Statement Object
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/** /**
* @brief Prepare the statement and initialize its reference counter * @brief Prepare the statement and initialize its reference counter
* *
* @param[in] apSQLite The sqlite3 database connexion * @param[in] apSQLite The sqlite3 database connexion
* @param[in] aQuery The SQL query string to prepare * @param[in] aQuery The SQL query string to prepare
*/ */
Statement::Ptr::Ptr(sqlite3* apSQLite, std::string& aQuery) : Statement::Ptr::Ptr(sqlite3* apSQLite, std::string& aQuery)
mpSQLite(apSQLite), :
mpStmt(NULL), mpSQLite(apSQLite)
,
mpStmt(NULL)
,
mpRefCount(NULL) mpRefCount(NULL)
{ {
const int ret = sqlite3_prepare_v2(apSQLite, aQuery.c_str(), static_cast<int>(aQuery.size()), &mpStmt, NULL); const int ret = sqlite3_prepare_v2(apSQLite, aQuery.c_str(), static_cast<int>(aQuery.size()), &mpStmt, NULL);
@ -458,29 +418,32 @@ Statement::Ptr::Ptr(sqlite3* apSQLite, std::string& aQuery) :
// This is needed to enable Column objects to live longer than the Statement objet it refers to. // This is needed to enable Column objects to live longer than the Statement objet it refers to.
mpRefCount = new unsigned int(1); // NOLINT(readability/casting) mpRefCount = new unsigned int(1); // NOLINT(readability/casting)
} }
/** /**
* @brief Copy constructor increments the ref counter * @brief Copy constructor increments the ref counter
* *
* @param[in] aPtr Pointer to copy * @param[in] aPtr Pointer to copy
*/ */
Statement::Ptr::Ptr(const Statement::Ptr& aPtr) : Statement::Ptr::Ptr(const Statement::Ptr& aPtr)
mpSQLite(aPtr.mpSQLite), :
mpStmt(aPtr.mpStmt), mpSQLite(aPtr.mpSQLite)
,
mpStmt(aPtr.mpStmt)
,
mpRefCount(aPtr.mpRefCount) mpRefCount(aPtr.mpRefCount)
{ {
assert(NULL != mpRefCount); assert(NULL != mpRefCount);
assert(0 != *mpRefCount); assert(0 != *mpRefCount);
// Increment the reference counter of the sqlite3_stmt, // Increment the reference counter of the sqlite3_stmt,
// asking not to finalize the sqlite3_stmt during the lifetime of the new objet // asking not to finalize the sqlite3_stmt during the lifetime of the new objet
++(*mpRefCount); ++(*mpRefCount);
} }
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)
Statement::Ptr::Ptr(Ptr&& aPtr) : Statement::Ptr::Ptr(Ptr&& aPtr)
mpSQLite(aPtr.mpSQLite), :
mpStmt(aPtr.mpStmt), mpSQLite(aPtr.mpSQLite)
,
mpStmt(aPtr.mpStmt)
,
mpRefCount(aPtr.mpRefCount) mpRefCount(aPtr.mpRefCount)
{ {
aPtr.mpSQLite = NULL; aPtr.mpSQLite = NULL;
@ -488,7 +451,6 @@ Statement::Ptr::Ptr(Ptr&& aPtr) :
aPtr.mpRefCount = NULL; aPtr.mpRefCount = NULL;
} }
#endif #endif
/** /**
* @brief Decrement the ref counter and finalize the sqlite3_stmt when it reaches 0 * @brief Decrement the ref counter and finalize the sqlite3_stmt when it reaches 0
*/ */
@ -497,7 +459,6 @@ Statement::Ptr::~Ptr()
if (NULL != mpRefCount) if (NULL != mpRefCount)
{ {
assert(0 != *mpRefCount); assert(0 != *mpRefCount);
// Decrement and check the reference counter of the sqlite3_stmt // Decrement and check the reference counter of the sqlite3_stmt
--(*mpRefCount); --(*mpRefCount);
if (0 == *mpRefCount) if (0 == *mpRefCount)
@ -505,7 +466,6 @@ Statement::Ptr::~Ptr()
// If count reaches zero, finalize the sqlite3_stmt, as no Statement nor Column objet use it anymore. // If count reaches zero, finalize the sqlite3_stmt, as no Statement nor Column objet use it anymore.
// No need to check the return code, as it is the same as the last statement evaluation. // No need to check the return code, as it is the same as the last statement evaluation.
sqlite3_finalize(mpStmt); sqlite3_finalize(mpStmt);
// and delete the reference counter // and delete the reference counter
delete mpRefCount; delete mpRefCount;
mpRefCount = NULL; mpRefCount = NULL;
@ -514,6 +474,4 @@ Statement::Ptr::~Ptr()
// else, the finalization will be done later, by the last object // else, the finalization will be done later, by the last object
} }
} }
} // namespace SQLite } // namespace SQLite

View File

@ -9,23 +9,19 @@
* or copy at http://opensource.org/licenses/MIT) * or copy at http://opensource.org/licenses/MIT)
*/ */
#include <SQLiteCpp/Transaction.h> #include <SQLiteCpp/Transaction.h>
#include <SQLiteCpp/Database.h> #include <SQLiteCpp/Database.h>
#include <SQLiteCpp/Assertion.h> #include <SQLiteCpp/Assertion.h>
namespace SQLite namespace SQLite
{ {
// Begins the SQLite transaction // Begins the SQLite transaction
Transaction::Transaction(Database& aDatabase) : Transaction::Transaction(Database& aDatabase)
mDatabase(aDatabase), :
mDatabase(aDatabase)
,
mbCommited(false) mbCommited(false)
{ {
mDatabase.exec("BEGIN"); mDatabase.exec("BEGIN");
} }
// Safely rollback the transaction if it has not been committed. // Safely rollback the transaction if it has not been committed.
Transaction::~Transaction() Transaction::~Transaction()
{ {
@ -41,7 +37,6 @@ Transaction::~Transaction()
} }
} }
} }
// Commit the transaction. // Commit the transaction.
void Transaction::commit() void Transaction::commit()
{ {
@ -55,6 +50,4 @@ void Transaction::commit()
throw SQLite::Exception("Transaction already commited."); throw SQLite::Exception("Transaction already commited.");
} }
} }
} // namespace SQLite } // namespace SQLite