static cell AMX_NATIVE_CALL SQL_MakeDbTuple(AMX *amx, cell *params) { SQL_Connection *sql = new SQL_Connection; int len; sql->port = 0; sql->host = strdup(""); sql->user = strdup(""); sql->pass = strdup(""); char *db = MF_GetAmxString(amx, params[4], 0, &len); char path[255]; FILE *fp; MF_BuildPathnameR(path, sizeof(path)-1, "%s", db); if ((fp=fopen(path, "rb"))) { fclose(fp); sql->db = strdup(path); } else { MF_BuildPathnameR(path, sizeof(path)-1, "%s/sqlite3/%s.sq3", MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data"), db); sql->db = strdup(path); } unsigned int num = MakeHandle(sql, Handle_Connection, FreeConnection); return num; }
bool loadDatabase() { const auto isDatabaseLoaded = HandleDB.filename != nullptr; if (isDatabaseLoaded) { return true; } const char *databases[] = { "City", "Country" // Is the default shipped database with AMXX. }; const auto modName = MF_GetModname(); const auto dataDir = MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data"); char file[260]; auto status = -1; for (auto& database : databases) { // MF_BuildPathname not used because backslash // makes CreateFileMapping failing under windows. ke::SafeSprintf(file, sizeof file, "%s/%s/GeoLite2-%s.mmdb", modName, dataDir, database); status = MMDB_open(file, MMDB_MODE_MMAP, &HandleDB); if (status == MMDB_SUCCESS) { break; } if (status != MMDB_FILE_OPEN_ERROR) { MF_Log("Could not open %s - %s", file, MMDB_strerror(status)); if (status == MMDB_IO_ERROR) { MF_Log(" IO error: %s", strerror(errno)); } } } if (status != MMDB_SUCCESS) { MF_Log("Could not find GeoIP2 databases. Disabled natives."); return false; } MF_Log("Database info: %s %i.%i", HandleDB.metadata.description.descriptions[0]->description, HandleDB.metadata.binary_format_major_version, HandleDB.metadata.binary_format_minor_version); // Retrieve supported languages. for (size_t i = 0; i < HandleDB.metadata.languages.count; i++) { LangList.append(ke::AString(HandleDB.metadata.languages.names[i])); } return true; }