kopia lustrzana https://gitlab.com/tomaszg/geostat
				
				
				
			Store type of log as an integer value in SQLite. 1 for found, 0 for not found, -1 for other
							rodzic
							
								
									40a8143338
								
							
						
					
					
						commit
						92bfb82eb2
					
				
							
								
								
									
										25
									
								
								ocdb.cpp
								
								
								
								
							
							
						
						
									
										25
									
								
								ocdb.cpp
								
								
								
								
							|  | @ -56,7 +56,7 @@ bool OCdb::init(const std::string& dump_path) { | |||
| 
 | ||||
| 	if (!request("CREATE TABLE IF NOT EXISTS revision (revision INTEGER PRIMARY KEY);") || | ||||
| 		!request("CREATE TABLE IF NOT EXISTS caches (code TEXT PRIMARY KEY, name TEXT, location TEXT, type TEXT, status TEXT, size TEXT, difficulty INTEGER, terrain INTEGER, country TEXT, region TEXT, owner TEXT);") || | ||||
| 		!request("CREATE TABLE IF NOT EXISTS logs (uuid TEXT PRIMARY KEY, cache_code TEXT, date TEXT, user TEXT, type TEXT);") || | ||||
| 		!request("CREATE TABLE IF NOT EXISTS logs (uuid TEXT PRIMARY KEY, cache_code TEXT, date TEXT, user TEXT, type INTEGER);") || | ||||
| 		!request("CREATE INDEX idx_user on logs (user, type);")) | ||||
| 		throw 1; | ||||
| 	request("COMMIT;"); | ||||
|  | @ -222,6 +222,7 @@ bool OCdb::update_cache(const json& j) { | |||
| bool OCdb::update_log(const json& j) { | ||||
| 	// logs (uuid TEXT PRIMARY KEY, cache_code TEXT, date TEXT, user TEXT, type TEXT);"))
 | ||||
| 	std::map<std::string, std::string> fields; | ||||
| 	std::map<std::string, short> fields2; | ||||
| 	int res; | ||||
| 
 | ||||
| 	std::string uuid = j["object_key"]["uuid"].get<std::string>(); | ||||
|  | @ -231,19 +232,28 @@ bool OCdb::update_log(const json& j) { | |||
| 		fields["date"] = j["data"]["date"].get<std::string>(); | ||||
| 	if (j["data"]["user"].count("uuid") > 0 && !j["data"]["user"]["uuid"].is_null()) | ||||
| 		fields["user"] = j["data"]["user"]["uuid"].get<std::string>(); | ||||
| 	if (j["data"].count("type") > 0 && !j["data"]["type"].is_null()) | ||||
| 		fields["type"] = j["data"]["type"].get<std::string>(); | ||||
| 
 | ||||
| 	if (j["data"].count("type") > 0 && !j["data"]["type"].is_null()) { | ||||
| 		if (j["data"]["type"].get<std::string>() == "Didn't find it") | ||||
| 			fields2["type"] = 0; | ||||
| 		else if (j["data"]["type"].get<std::string>() == "Found it") | ||||
| 			fields2["type"] = 1; | ||||
| 		else | ||||
| 			fields2["type"] = -1; | ||||
| 	} | ||||
| 	if (fields.empty()) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	std::string sql = "INSERT INTO logs (uuid,"; | ||||
| 	for (auto& i : fields) | ||||
| 		sql += i.first + ','; | ||||
| 	for (auto& i : fields2) | ||||
| 		sql += i.first + ','; | ||||
| 	sql.pop_back(); | ||||
| 	sql += ") VALUES ('" + uuid + "',"; | ||||
| 	for (__attribute__((unused)) auto& i : fields) | ||||
| 		sql += "?,"; | ||||
| 	for (__attribute__((unused)) auto& i : fields2) | ||||
| 		sql += "?,"; | ||||
| 	sql.pop_back(); | ||||
| 	sql += ") ON CONFLICT(uuid) DO UPDATE SET "; | ||||
| 	for (auto& i : fields) | ||||
|  | @ -261,6 +271,9 @@ bool OCdb::update_log(const json& j) { | |||
| 	for (auto& i : fields) { | ||||
| 		sqlite3_bind_text(stmt, n++, i.second.c_str(), -1, nullptr); | ||||
| 	} | ||||
| 	for (auto& i : fields2) { | ||||
| 		sqlite3_bind_int(stmt, n++, i.second); | ||||
| 	} | ||||
| 	res = sqlite3_step(stmt); | ||||
| 	if (res != SQLITE_DONE) { | ||||
| 		Debug(1) << "Request \"" << sql << "\" failed:\n" | ||||
|  | @ -299,7 +312,7 @@ Caches OCdb::get_user_caches_not_found(const std::string& uuid) const { | |||
| 	Caches cc; | ||||
| 	Cache c; | ||||
| 
 | ||||
| 	std::string sql = "SELECT code, location FROM caches WHERE status = 'Available' AND NOT EXISTS (SELECT cache_code FROM logs WHERE cache_code = code AND type = 'Found it' and user = ?);"; | ||||
| 	std::string sql = "SELECT code, location FROM caches WHERE status = 'Available' AND NOT EXISTS (SELECT cache_code FROM logs WHERE cache_code = code AND type = 1 and user = ?);"; | ||||
| 
 | ||||
| 	res = sqlite3_prepare_v2(db, sql.c_str(), sql.length() + 1, &stmt, NULL); | ||||
| 	if (res != SQLITE_OK) { | ||||
|  | @ -331,7 +344,7 @@ Caches OCdb::get_user_caches(const std::string& uuid, __attribute__((unused)) in | |||
| 	Caches cc; | ||||
| 	Cache c; | ||||
| 	//code TEXT PRIMARY KEY, name TEXT, location TEXT, type TEXT, status TEXT, size TEXT, difficulty REAL, terrain REAL, country TEXT, region TEXT, owner TEXT)
 | ||||
| 	std::string sql = "SELECT code, location, type, size, difficulty, terrain, country, region, owner FROM caches WHERE EXISTS (SELECT cache_code FROM logs WHERE cache_code = code AND type = 'Found it' and user = ?);"; | ||||
| 	std::string sql = "SELECT code, location, type, size, difficulty, terrain, country, region, owner FROM caches WHERE EXISTS (SELECT cache_code FROM logs WHERE cache_code = code AND type = 1 and user = ?);"; | ||||
| 
 | ||||
| 	res = sqlite3_prepare_v2(db, sql.c_str(), sql.length() + 1, &stmt, NULL); | ||||
| 	if (res != SQLITE_OK) { | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Tomasz Golinski
						Tomasz Golinski