SQLite Callback wird nicht aufgerufen



  • Hallo,

    ich hab erst kürzlich mit SQLite und SQL angefangen, daher kenn ich mich noch nicht allzu gut aus. Ich möchte SQLite in ein anderes, größeres Projekt einbinden, hab das Problem dass meine Callbackfunktion nicht aufgerufen wird, wenn es keine Datensätze gibt (denke ich).
    Ist das normal bzw. krieg ich es irgendwie hin dass die Callback-Funktion trotzdem aufgerufen wird?

    Es geht darum um in einem OpenSource Spiel ein Accountsystem zu implementieren (mit register, login etc).
    Das ist der bisherige Code falls notwendig:

    void CSQLite::SQLThread(void *pP)
    {
    	CSQLite::ThreadParam *pParam = static_cast<CSQLite::ThreadParam *> (pP);
    
    	char *zErrMsg;
    	sqlite3 *db;
    
    	if((db = pParam->m_pDB->OpenDB()) == 0)
    		return;
    
    	pParam->m_pDBConnection = db;
    	if(sqlite3_exec(db, pParam->m_aSQLStatement, pParam->m_pfnCallback, pParam, &zErrMsg) != SQLITE_OK)
    	{
    		dbg_msg("SQL", "SQL error: %s", zErrMsg);
    		sqlite3_free(zErrMsg);
    	}
    
    	pParam->m_pDB->CloseDB(db);
    	delete pParam->m_pData;
    	delete pParam;
    }
    
    void CSQLite::RegisterAccount(int ClientID, const char *pUserName, const char *pPass)
    {
    	CSQLite::ThreadParam *pTParam = new CSQLite::ThreadParam;
    	CPlayerData *pPlayerData = new CPlayerData;
    
    	//Set PlayerData
    	pPlayerData->m_UserID = ClientID;
    	str_copy(pPlayerData->m_aLoginName, pUserName, sizeof(pPlayerData->m_aLoginName));
    	str_copy(pPlayerData->m_aPasswordHash, md5(pPass), sizeof(pPlayerData->m_aPasswordHash));
    
    	//Set ThreadParam
    	pTParam->m_pDB = this;
    	pTParam->m_pData = pPlayerData;
    	pTParam->m_pfnCallback = RegisterCallback;
    	str_format(pTParam->m_aSQLStatement, sizeof(pTParam->m_aSQLStatement), "SELECT * FROM Accounts WHERE LoginName=\'%s\'", pUserName);
    
    	void *RegisterThread = thread_create(SQLThread, pTParam);
    	thread_detach(RegisterThread);
    }
    
    int CSQLite::RegisterCallback(void *ReturnData, int argc, char **argv, char **azColName)
    {
    	CSQLite::ThreadParam *pParam = static_cast<CSQLite::ThreadParam *> (ReturnData);
    	//pParam->m_pDB->m_pGameServer->SendChatTarget(pParam->m_pData->m_UserID, "In Callback-function");
    
    	// This name already exists
    	if(argc != 0)
    	{
    		pParam->m_pDB->m_pGameServer->SendChatTarget(pParam->m_pData->m_UserID, "This username already exists, please choose a different name");
    		return 0;
    	}
    	else
    	{
    		char aBuf[256];
    		char *zErrMsg;
    		str_format(aBuf, sizeof(aBuf), "INSERT INTO Accounts (LoginName, PasswordHash, RegisterDate) VALUES(\'%s\', \'%s\', %d)", pParam->m_pData->m_aLoginName, pParam->m_pData->m_aPasswordHash, time_timestamp());
    
    		if(sqlite3_exec(pParam->m_pDBConnection, aBuf, 0, 0, &zErrMsg) == SQLITE_OK)
    		{
    			pParam->m_pDB->m_pGameServer->SendChatTarget(pParam->m_pData->m_UserID, "You have been registered successfully");
    			return 1;
    		}
    		else
    		{
    			pParam->m_pDB->m_pGameServer->SendChatTarget(pParam->m_pData->m_UserID, "Registration failed!");
    			dbg_msg("SQL", "User registration (ID: %d) failed: %s", pParam->m_pData->m_UserID, zErrMsg);
    			sqlite3_free(zErrMsg);
    			return 0;
    		}
    	}
    }
    


  • Hat niemand eine Idee?
    Oder sollte ich in dem Fall auf den Wrapper verzichten und die core Objekte und Interfaces nutzen?



  • Hast du mal mit dem Debugger geschaut, was passiert? An welcher Stelle erwartest du denn was anderes als was passiert?


Anmelden zum Antworten