Prepare statement
This commit is contained in:
		
							parent
							
								
									5fde5c52aa
								
							
						
					
					
						commit
						20f415026f
					
				
							
								
								
									
										48
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -10,6 +10,52 @@ | |||||||
|         "type_traits": "cpp", |         "type_traits": "cpp", | ||||||
|         "tuple": "cpp", |         "tuple": "cpp", | ||||||
|         "array": "cpp", |         "array": "cpp", | ||||||
|         "utility": "cpp" |         "utility": "cpp", | ||||||
|  |         "cctype": "cpp", | ||||||
|  |         "clocale": "cpp", | ||||||
|  |         "cmath": "cpp", | ||||||
|  |         "cstdarg": "cpp", | ||||||
|  |         "cstddef": "cpp", | ||||||
|  |         "cstdio": "cpp", | ||||||
|  |         "cstdlib": "cpp", | ||||||
|  |         "ctime": "cpp", | ||||||
|  |         "cwchar": "cpp", | ||||||
|  |         "cwctype": "cpp", | ||||||
|  |         "atomic": "cpp", | ||||||
|  |         "bit": "cpp", | ||||||
|  |         "chrono": "cpp", | ||||||
|  |         "compare": "cpp", | ||||||
|  |         "concepts": "cpp", | ||||||
|  |         "condition_variable": "cpp", | ||||||
|  |         "cstdint": "cpp", | ||||||
|  |         "map": "cpp", | ||||||
|  |         "exception": "cpp", | ||||||
|  |         "algorithm": "cpp", | ||||||
|  |         "functional": "cpp", | ||||||
|  |         "iterator": "cpp", | ||||||
|  |         "memory": "cpp", | ||||||
|  |         "memory_resource": "cpp", | ||||||
|  |         "numeric": "cpp", | ||||||
|  |         "optional": "cpp", | ||||||
|  |         "random": "cpp", | ||||||
|  |         "ratio": "cpp", | ||||||
|  |         "string_view": "cpp", | ||||||
|  |         "fstream": "cpp", | ||||||
|  |         "initializer_list": "cpp", | ||||||
|  |         "iosfwd": "cpp", | ||||||
|  |         "istream": "cpp", | ||||||
|  |         "limits": "cpp", | ||||||
|  |         "mutex": "cpp", | ||||||
|  |         "new": "cpp", | ||||||
|  |         "numbers": "cpp", | ||||||
|  |         "ostream": "cpp", | ||||||
|  |         "semaphore": "cpp", | ||||||
|  |         "sstream": "cpp", | ||||||
|  |         "stdexcept": "cpp", | ||||||
|  |         "stop_token": "cpp", | ||||||
|  |         "streambuf": "cpp", | ||||||
|  |         "thread": "cpp", | ||||||
|  |         "cinttypes": "cpp", | ||||||
|  |         "typeinfo": "cpp" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -34,7 +34,8 @@ public: | |||||||
|      |      | ||||||
|     SQLite3(const string path, bool _keepOpen = false); |     SQLite3(const string path, bool _keepOpen = false); | ||||||
| 
 | 
 | ||||||
|     map<string, vector<string>> query(const string sql_command); |     // map<string, vector<string>> query(const string sql_command);
 | ||||||
|  |     std::map<std::string, std::vector<std::string>> query(const std::string& sql_command, const std::vector<std::string>& values); | ||||||
| 
 | 
 | ||||||
|     ~SQLite3(); |     ~SQLite3(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ bool SQLite3::close() { | |||||||
|    db = NULL; |    db = NULL; | ||||||
|    return operationStatus != SQLITE_OK; |    return operationStatus != SQLITE_OK; | ||||||
| } | } | ||||||
| 
 | /*
 | ||||||
| map<string, vector<string>> SQLite3::query(const string sql_command) { | map<string, vector<string>> SQLite3::query(const string sql_command) { | ||||||
|    io.lock(); |    io.lock(); | ||||||
|    if (!keepOpen) { |    if (!keepOpen) { | ||||||
| @ -68,7 +68,48 @@ map<string, vector<string>> SQLite3::query(const string sql_command) { | |||||||
|    io.unlock(); |    io.unlock(); | ||||||
|    return _parsed; |    return _parsed; | ||||||
| } | } | ||||||
|  | */ | ||||||
| 
 | 
 | ||||||
|  | map<string, vector<string>> SQLite3::query(const string& sql_command, const vector<string>& values) { | ||||||
|  |     lock_guard<mutex> lock(io); | ||||||
|  |     map<string, vector<string>> results; | ||||||
|  |      | ||||||
|  |     if (!keepOpen) { | ||||||
|  |         if (open()) { | ||||||
|  |             throw string("[ERROR] Unable to open database "); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     sqlite3_stmt* stmt; | ||||||
|  |     if (sqlite3_prepare_v2(db, sql_command.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { | ||||||
|  |         throw string("[ERROR] Failed to prepare statement: ") + sqlite3_errmsg(db); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Binduj parametre
 | ||||||
|  |     for (size_t i = 0; i < values.size(); ++i) { | ||||||
|  |         sqlite3_bind_text(stmt, static_cast<int>(i + 1), values[i].c_str(), -1, SQLITE_TRANSIENT); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Dohvati rezultate
 | ||||||
|  |     int columnCount = sqlite3_column_count(stmt); | ||||||
|  |     while (sqlite3_step(stmt) == SQLITE_ROW) { | ||||||
|  |         for (int i = 0; i < columnCount; ++i) { | ||||||
|  |             const char* columnName = sqlite3_column_name(stmt, i); | ||||||
|  |             const char* columnValue = (const char*)sqlite3_column_text(stmt, i); | ||||||
|  |             results[columnName].push_back(columnValue ? columnValue : "NULL"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     sqlite3_finalize(stmt); // Oslobodi resurse vezane uz izjavu
 | ||||||
|  | 
 | ||||||
|  |     if (!keepOpen) { | ||||||
|  |         if (close()) { | ||||||
|  |             throw string("[ERROR] Unable to close database "); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return results; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| map<string, vector<string>> SQLite3::parse(const string& result) { | map<string, vector<string>> SQLite3::parse(const string& result) { | ||||||
|    string a = result; |    string a = result; | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ int main() { | |||||||
|     // cout << mydb.ask("Select * from Tab1");
 |     // cout << mydb.ask("Select * from Tab1");
 | ||||||
|     // cout << mydb.ask("INSERT INTO Tab1 VALUES(3,'Pakora', 'marijanab@bitelex.ml');");
 |     // cout << mydb.ask("INSERT INTO Tab1 VALUES(3,'Pakora', 'marijanab@bitelex.ml');");
 | ||||||
| 
 | 
 | ||||||
|     auto res = mydb.query("Select * from Tab1"); |     auto res = mydb.query("Select * from Tab1 Where id > ?", {"3"}); | ||||||
|     // cout << endl <<  res["NAME"][1];
 |     // cout << endl <<  res["NAME"][1];
 | ||||||
| 
 | 
 | ||||||
|     // cout << endl <<  res["MAIL"][1];
 |     // cout << endl <<  res["MAIL"][1];
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user