LINUX.ORG.RU

Автор iserverd не поддерживает уже, но вот с участком кода, проблема..


0

0

Вот код:

int check_online_table()
{
PGresult *res;
fstring dbcomm_str;

PQclear(PQexec(users_dbconn, "BEGIN;"));

res = PQexec(users_dbconn, "DECLARE uportal CURSOR FOR SELECT uin FROM Online_Users");

if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
handle_database_error(res, "[DECLARE PORTAL IN ODB CHECK]");
return(0);
}
else
{
PQclear(res);
}

/* Check every user in table */
for (;;)
{
res = PQexec(users_dbconn, "FETCH IN uportal");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
handle_database_error(res, "[ODB CHECK FETCH FROM PORTAL]");
break;
}

if (PQntuples(res) == 0)
{
PQclear(res);
break;
}


if (!shm_user_exist(atoul( PQgetvalue(res, 0, 0) )))
{
/* Delete this user from database only */
db_online_delete(atoul(PQgetvalue(res, 0, 0)), 0);
}

PQclear(res);
}

slprintf(dbcomm_str, sizeof(dbcomm_str)-1,
"UPDATE Online_Users SET lutm=%d",
timeToLong(time(NULL)));

PQclear(PQexec(users_dbconn, dbcomm_str));
PQclear(PQexec(users_dbconn, "CLOSE uportal"));
PQclear(PQexec(users_dbconn, "END;"));

return (0);
}

Зацикливается, как я выяснил, в бесконечном цикле ( for (;;)). Сам я не програмирую в Си, программирую на Delphi для винды, поэтому моих знаний не хватает чтоб разораться почему зацикливается. Вроде всё нормально.

З.Ы. Если научите как делать сдесь отступы, с радостью запостю со всеми отступами. Спасибо.

anonymous

Забыл добавить, что зацикливание бывает не всегда, как я понял (уверенность на 90 процентов) зацикливание происходит когда код выполняется в участке:

if (!shm_user_exist(atoul( PQgetvalue(res, 0, 0) ))) { /* Delete this user from database only */ db_online_delete(atoul(PQgetvalue(res, 0, 0)), 0); }

anonymous
()
Ответ на: комментарий от anonymous

Вот на всякий случай функция из за которой как я думаю происходит зацикливание:

int db_online_delete(unsigned long to_uin, int shm)
{
PGresult *res;

fstring dbcomm_str;
/* exec select command on backend server */
slprintf(dbcomm_str, sizeof(dbcomm_str)-1,
"DELETE FROM Online_Users WHERE uin=%lu", to_uin);

if (shm) shm_delete(to_uin);

res = PQexec(users_dbconn, dbcomm_str);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
handle_database_error(res, "[DELETE ONLINE USER]");
return(-1);
}

PQclear(res);

if (lp_realtime_odb())
{
/* Just in case... I'll delete all expired records from database */
/* We should do this only in online_db realtime mode */
slprintf(dbcomm_str, sizeof(dbcomm_str)-1,
"DELETE FROM Online_Users WHERE ((%lu-lutm) > (ttl+5)) AND (ttl > 0)",
time(NULL));

res = PQexec(users_dbconn, dbcomm_str);

if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
handle_database_error(res, "[DELETE EXPIRED USERS]");
return(0);
}

PQclear(res);
return(0);
}

return(0);
}

anonymous
()
Ответ на: комментарий от anonymous

В участок кода:

if (lp_realtime_odb()) { ... }

можно не смотреть, так как при этом это выражение точно равно false, так в настройках задано.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.