Version 18.10

This commit is contained in:
Antonio Cañas Vargas 2018-10-30 02:37:09 +01:00
parent 132a181191
commit e9cb6f21dc
10 changed files with 632 additions and 531 deletions

View File

@ -174,6 +174,7 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
struct ListUsrCods *ListUsrCods,
bool OnlyConfirmedIDs)
{
char *Query;
char SubQuery[256];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -190,34 +191,34 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
/***** Allocate memory for query string *****/
MaxLength = 512 + UsrDat->IDs.Num * (1 + ID_MAX_BYTES_USR_ID + 1) - 1;
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Get user's code(s) from database *****/
Str_Copy (Gbl.DB.QueryPtr,CheckPassword ? "SELECT DISTINCT(usr_IDs.UsrCod) FROM usr_IDs,usr_data"
" WHERE usr_IDs.UsrID IN (" :
"SELECT DISTINCT(UsrCod) FROM usr_IDs"
" WHERE UsrID IN (",
Str_Copy (Query,CheckPassword ? "SELECT DISTINCT(usr_IDs.UsrCod) FROM usr_IDs,usr_data"
" WHERE usr_IDs.UsrID IN (" :
"SELECT DISTINCT(UsrCod) FROM usr_IDs"
" WHERE UsrID IN (",
MaxLength);
for (NumID = 0;
NumID < UsrDat->IDs.Num;
NumID++)
{
if (NumID)
Str_Concat (Gbl.DB.QueryPtr,",",
Str_Concat (Query,",",
MaxLength);
sprintf (SubQuery,"'%s'",UsrDat->IDs.List[NumID].ID);
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
Str_Concat (Query,SubQuery,
MaxLength);
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
MaxLength);
if (CheckPassword)
{
if (OnlyConfirmedIDs)
Str_Concat (Gbl.DB.QueryPtr," AND usr_IDs.Confirmed='Y'",
Str_Concat (Query," AND usr_IDs.Confirmed='Y'",
MaxLength);
// Get user's code if I have written the correct password
@ -225,14 +226,14 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
sprintf (SubQuery," AND usr_IDs.UsrCod=usr_data.UsrCod"
" AND (usr_data.Password='%s' OR usr_data.Password='')",
EncryptedPassword);
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
Str_Concat (Query,SubQuery,
MaxLength);
}
else if (OnlyConfirmedIDs)
Str_Concat (Gbl.DB.QueryPtr," AND Confirmed='Y'",
Str_Concat (Query," AND Confirmed='Y'",
MaxLength);
ListUsrCods->NumUsrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get user's codes");
ListUsrCods->NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's codes");
if (ListUsrCods->NumUsrs)
{
/***** Allocate space for the list of users' codes *****/

View File

@ -2418,6 +2418,7 @@ static void Att_GetNumStdsTotalWhoAreInAttEvent (struct AttendanceEvent *Att)
static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSelectedUsrCods[],unsigned NumStdsInList)
{
char *Query;
char SubQuery[1 + 1 + 10 + 1];
unsigned NumStd;
unsigned NumStdsInAttEvent = 0;
@ -2427,11 +2428,11 @@ static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSel
{
/***** Allocate space for query *****/
MaxLength = 256 + NumStdsInList * (1 + 1 + 10);
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Count number of students registered in an event in database *****/
snprintf (Gbl.DB.QueryPtr,MaxLength + 1,
snprintf (Query,MaxLength + 1,
"SELECT COUNT(*) FROM att_usr"
" WHERE AttCod=%ld"
" AND UsrCod IN (",
@ -2444,12 +2445,13 @@ static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSel
NumStd ? ",%ld" :
"%ld",
LstSelectedUsrCods[NumStd]);
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
Str_Concat (Query,SubQuery,
MaxLength);
}
Str_Concat (Gbl.DB.QueryPtr,") AND Present='Y'",
Str_Concat (Query,") AND Present='Y'",
MaxLength);
NumStdsInAttEvent = (unsigned) DB_QueryCOUNT_new ("can not get number of students from a list who are registered in an event");
}
return NumStdsInAttEvent;

View File

@ -355,10 +355,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 18.9.10 (2018-10-30)"
#define Log_PLATFORM_VERSION "SWAD 18.10 (2018-10-30)"
#define CSS_FILE "swad18.4.css"
#define JS_FILE "swad17.17.1.js"
/*
Version 18.10: Oct 30, 2018 Fixing bugs in access to database. Not finished. (235399 lines)
Version 18.9.10: Oct 30, 2018 Some sprintf for database queries changed by asprintf. (235311 lines)
Version 18.9.8: Oct 30, 2018 Cleaning unused functions. (235694 lines)
Version 18.9.7: Oct 29, 2018 Some sprintf for database queries changed by internal function. (235705 lines)

View File

@ -3084,6 +3084,25 @@ void DB_BuildQuery (const char *fmt,...)
// vasprintf will return -1
Lay_NotEnoughMemoryExit ();
}
void DB_BuildQuery_old (char **Query,const char *fmt,...)
{
int NumBytesPrinted;
va_list ap;
if (*Query != NULL)
Lay_ShowErrorAndExit ("Error building query.");
va_start (ap,fmt);
NumBytesPrinted = vasprintf (Query,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
// or some other error occurs,
// vasprintf will return -1
Lay_NotEnoughMemoryExit ();
}
/*
static void DB_QueryPrintf (char **strp,const char *fmt,...)
{
@ -3105,18 +3124,23 @@ static void DB_QueryPrintf (char **strp,const char *fmt,...)
/*****************************************************************************/
unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError)
{
return DB_QuerySELECT (&Gbl.DB.QueryPtr,mysql_res,MsgError);
}
unsigned long DB_QuerySELECT (char **Query,MYSQL_RES **mysql_res,const char *MsgError)
{
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
does point to an allocated string *****/
if (*Query == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
/***** Query database and free query string pointer *****/
Result = mysql_query (&Gbl.mysql,Gbl.DB.QueryPtr); // Returns 0 on success
free ((void *) Gbl.DB.QueryPtr);
Gbl.DB.QueryPtr = NULL;
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
free ((void *) *Query);
*Query = NULL;
if (Result)
DB_ExitOnMySQLError (MsgError);
@ -3133,13 +3157,18 @@ unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError)
/*****************************************************************************/
unsigned long DB_QueryCOUNT_new (const char *MsgError)
{
return DB_QueryCOUNT (&Gbl.DB.QueryPtr,MsgError);
}
unsigned long DB_QueryCOUNT (char **Query,const char *MsgError)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRows;
/***** Make query "SELECT COUNT(*) FROM..." *****/
DB_QuerySELECT_new (&mysql_res,MsgError);
DB_QuerySELECT (Query,&mysql_res,MsgError);
/***** Get number of rows *****/
row = mysql_fetch_row (mysql_res);
@ -3161,7 +3190,7 @@ void DB_QueryINSERT_new (const char *MsgError)
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
does point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
@ -3173,6 +3202,27 @@ void DB_QueryINSERT_new (const char *MsgError)
DB_ExitOnMySQLError (MsgError);
}
/*****************************************************************************/
/******************** Make an INSERT query in database ***********************/
/*****************************************************************************/
void DB_QueryINSERT (char **Query,const char *MsgError)
{
int Result;
/***** Check that query string pointer
does point to an allocated string *****/
if (*Query == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
/***** Query database and free query string pointer *****/
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
free ((void *) *Query);
*Query = NULL;
if (Result)
DB_ExitOnMySQLError (MsgError);
}
/*****************************************************************************/
/** Make an INSERT query in database and return code of last inserted item ***/
/*****************************************************************************/
@ -3182,7 +3232,7 @@ long DB_QueryINSERTandReturnCode_new (const char *MsgError)
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
does point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
@ -3206,7 +3256,7 @@ void DB_QueryREPLACE_new (const char *MsgError)
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
does point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
@ -3223,18 +3273,23 @@ void DB_QueryREPLACE_new (const char *MsgError)
/*****************************************************************************/
void DB_QueryUPDATE_new (const char *MsgError)
{
DB_QueryUPDATE (&Gbl.DB.QueryPtr,MsgError);
}
void DB_QueryUPDATE (char **Query,const char *MsgError)
{
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
does point to an allocated string *****/
if (*Query == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
/***** Query database and free query string pointer *****/
Result = mysql_query (&Gbl.mysql,Gbl.DB.QueryPtr); // Returns 0 on success
free ((void *) Gbl.DB.QueryPtr);
Gbl.DB.QueryPtr = NULL;
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
free ((void *) *Query);
*Query = NULL;
if (Result)
DB_ExitOnMySQLError (MsgError);
@ -3251,7 +3306,7 @@ void DB_QueryDELETE_new (const char *MsgError)
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
does point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");
@ -3272,7 +3327,7 @@ void DB_Query_new (const char *MsgError)
int Result;
/***** Check that query string pointer
does not point to an allocated string *****/
does point to an allocated string *****/
if (Gbl.DB.QueryPtr == NULL)
Lay_ShowErrorAndExit ("Wrong query string.");

View File

@ -38,18 +38,23 @@ void DB_OpenDBConnection (void);
void DB_CloseDBConnection (void);
void DB_BuildQuery (const char *fmt,...);
void DB_BuildQuery_old (char **Query,const char *fmt,...);
unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError);
unsigned long DB_QuerySELECT (char **Query,MYSQL_RES **mysql_res,const char *MsgError);
unsigned long DB_QueryCOUNT_new (const char *MsgError);
unsigned long DB_QueryCOUNT (char **Query,const char *MsgError);
void DB_QueryINSERT_new (const char *MsgError);
void DB_QueryINSERT (char **Query,const char *MsgError);
long DB_QueryINSERTandReturnCode_new (const char *MsgError);
void DB_QueryREPLACE_new (const char *MsgError);
void DB_QueryUPDATE_new (const char *MsgError);
void DB_QueryUPDATE (char **Query,const char *MsgError);
void DB_QueryDELETE_new (const char *MsgError);

View File

@ -1022,8 +1022,6 @@ static unsigned Sch_SearchDocumentsInMyCoursesInDB (const char *RangeQuery)
RangeQuery);
/***** Query database and list documents found *****/
/* if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
Lay_ShowAlert (Lay_INFO,Gbl.DB.QueryPtr); */
NumDocs = Brw_ListDocsFound (Txt_document_in_my_courses,
Txt_documents_in_my_courses);
@ -1178,8 +1176,6 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
(unsigned) Brw_ADMI_BRF_USR);
/***** Query database and list documents found *****/
/* if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
Lay_ShowAlert (Lay_INFO,Gbl.DB.QueryPtr); */
return Brw_ListDocsFound (Txt_document_from_me,
Txt_documents_from_me);
}

View File

@ -284,6 +284,7 @@ void Sta_GetRemoteAddr (void)
void Sta_LogAccess (const char *Comments)
{
size_t MaxLength;
char *Query;
long LogCod;
long ActCod = Act_GetActCod (Gbl.Action.Act);
Rol_Role_t RoleToStore = (Gbl.Action.Act == ActLogOut) ? Gbl.Usrs.Me.Role.LoggedBeforeCloseSession :
@ -334,42 +335,42 @@ void Sta_LogAccess (const char *Comments)
{
/* Allocate space for query */
MaxLength = 512 + strlen (Comments);
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/* Log comments */
snprintf (Gbl.DB.QueryPtr,MaxLength,
snprintf (Query,MaxLength,
"INSERT INTO log_comments"
" (LogCod,Comments)"
" VALUES"
" (%ld,'",
LogCod);
Str_AddStrToQuery (Gbl.DB.QueryPtr,Comments,MaxLength);
Str_Concat (Gbl.DB.QueryPtr,"')",
Str_AddStrToQuery (Query,Comments,MaxLength);
Str_Concat (Query,"')",
MaxLength);
DB_QueryINSERT_new ("can not log access (comments)");
DB_QueryINSERT (Query,"can not log access (comments)");
}
if (Gbl.Search.LogSearch && Gbl.Search.Str[0])
{
/* Allocate space for query */
MaxLength = 512 + strlen (Gbl.Search.Str);
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/* Log search string */
snprintf (Gbl.DB.QueryPtr,MaxLength,
snprintf (Query,MaxLength,
"INSERT INTO log_search"
" (LogCod,SearchStr)"
" VALUES"
" (%ld,'",
LogCod);
Str_AddStrToQuery (Gbl.DB.QueryPtr,Gbl.Search.Str,MaxLength);
Str_Concat (Gbl.DB.QueryPtr,"')",
Str_AddStrToQuery (Query,Gbl.Search.Str,MaxLength);
Str_Concat (Query,"')",
MaxLength);
DB_QueryINSERT_new ("can not log access (search)");
DB_QueryINSERT (Query,"can not log access (search)");
}
if (Gbl.WebService.IsWebService)
@ -869,6 +870,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
extern const char *Txt_List_of_detailed_clicks;
extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES];
extern const char *Txt_Time_zone_used_in_the_calculation_of_these_statistics;
char *Query;
char QueryAux[512];
long LengthQuery;
MYSQL_RES *mysql_res;
@ -1053,26 +1055,26 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
/***** Select clicks from the table of log *****/
/* Allocate memory for the query */
if ((Gbl.DB.QueryPtr = (char *) malloc (Sta_MAX_BYTES_QUERY_ACCESS + 1)) == NULL)
if ((Query = (char *) malloc (Sta_MAX_BYTES_QUERY_ACCESS + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/* Start the query */
switch (Gbl.Stat.ClicksGroupedBy)
{
case Sta_CLICKS_CRS_DETAILED_LIST:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE LogCod,UsrCod,Role,"
"UNIX_TIMESTAMP(ClickTime) AS F,ActCod FROM %s",
LogTable);
break;
case Sta_CLICKS_CRS_PER_USR:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE UsrCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_CRS_PER_DAY:
case Sta_CLICKS_GBL_PER_DAY:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m%%d') AS Day,"
"%s FROM %s",
@ -1081,7 +1083,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_DAY_AND_HOUR:
case Sta_CLICKS_GBL_PER_DAY_AND_HOUR:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m%%d') AS Day,"
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H') AS Hour,"
@ -1094,7 +1096,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
case Sta_CLICKS_GBL_PER_WEEK:
/* With %x%v the weeks are counted from monday to sunday.
With %X%V the weeks are counted from sunday to saturday. */
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
(Gbl.Prefs.FirstDayOfWeek == 0) ?
"SELECT SQL_NO_CACHE " // Weeks start on monday
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%x%%v') AS Week,"
@ -1107,7 +1109,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_MONTH:
case Sta_CLICKS_GBL_PER_MONTH:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m') AS Month,"
"%s FROM %s",
@ -1116,7 +1118,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_YEAR:
case Sta_CLICKS_GBL_PER_YEAR:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y') AS Year,"
"%s FROM %s",
@ -1125,7 +1127,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_HOUR:
case Sta_CLICKS_GBL_PER_HOUR:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H') AS Hour,"
"%s FROM %s",
@ -1134,7 +1136,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_MINUTE:
case Sta_CLICKS_GBL_PER_MINUTE:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE "
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H%%i') AS Minute,"
"%s FROM %s",
@ -1143,47 +1145,47 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
break;
case Sta_CLICKS_CRS_PER_ACTION:
case Sta_CLICKS_GBL_PER_ACTION:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE ActCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_PLUGIN:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE log_ws.PlgCod,%s AS Num FROM %s,log_ws",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_API_FUNCTION:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE log_ws.FunCod,%s AS Num FROM %s,log_ws",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_BANNER:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE log_banners.BanCod,%s AS Num FROM %s,log_banners",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_COUNTRY:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE CtyCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_INSTITUTION:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE InsCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_CENTRE:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE CtrCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_DEGREE:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE DegCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
case Sta_CLICKS_GBL_PER_COURSE:
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
"SELECT SQL_NO_CACHE CrsCod,%s AS Num FROM %s",
StrQueryCountType,LogTable);
break;
@ -1193,7 +1195,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
LogTable,
(long) Gbl.DateRange.TimeUTC[0],
(long) Gbl.DateRange.TimeUTC[1]);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
switch (GlobalOrCourse)
@ -1210,7 +1212,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.CtyCod=%ld",
LogTable,Gbl.CurrentCty.Cty.CtyCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
break;
@ -1219,7 +1221,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.InsCod=%ld",
LogTable,Gbl.CurrentIns.Ins.InsCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
break;
@ -1228,7 +1230,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.CtrCod=%ld",
LogTable,Gbl.CurrentCtr.Ctr.CtrCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
break;
@ -1237,7 +1239,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.DegCod=%ld",
LogTable,Gbl.CurrentDeg.Deg.DegCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
break;
@ -1246,7 +1248,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.CrsCod=%ld",
LogTable,Gbl.CurrentCrs.Crs.CrsCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
break;
@ -1315,7 +1317,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
LogTable,Gbl.Usrs.Me.UsrDat.UsrCod);
break;
}
Str_Concat (Gbl.DB.QueryPtr,StrRole,
Str_Concat (Query,StrRole,
Sta_MAX_BYTES_QUERY_ACCESS);
switch (Gbl.Stat.ClicksGroupedBy)
@ -1324,13 +1326,13 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
case Sta_CLICKS_GBL_PER_API_FUNCTION:
sprintf (QueryAux," AND %s.LogCod=log_ws.LogCod",
LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_BANNER:
sprintf (QueryAux," AND %s.LogCod=log_banners.LogCod",
LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
default:
@ -1340,13 +1342,13 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
case Sta_SHOW_COURSE_ACCESSES:
sprintf (QueryAux," AND %s.CrsCod=%ld",
LogTable,Gbl.CurrentCrs.Crs.CrsCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
/***** Initialize data structure of the user *****/
Usr_UsrDataConstructor (&UsrDat);
LengthQuery = strlen (Gbl.DB.QueryPtr);
LengthQuery = strlen (Query);
NumUsr = 0;
Ptr = Gbl.Usrs.Select[Rol_UNK];
while (*Ptr)
@ -1363,12 +1365,12 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
NumUsr ? " OR %s.UsrCod=%ld" :
" AND (%s.UsrCod=%ld",
LogTable,UsrDat.UsrCod);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
NumUsr++;
}
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Sta_MAX_BYTES_QUERY_ACCESS);
/***** Free memory used by the data of the user *****/
@ -1381,7 +1383,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
{
sprintf (QueryAux," AND %s.ActCod=%ld",
LogTable,Act_GetActCod (Gbl.Stat.NumAction));
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
}
@ -1389,90 +1391,90 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
switch (Gbl.Stat.ClicksGroupedBy)
{
case Sta_CLICKS_CRS_DETAILED_LIST:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY F",
Str_Concat (Query," ORDER BY F",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_USR:
sprintf (QueryAux," GROUP BY %s.UsrCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_DAY:
case Sta_CLICKS_GBL_PER_DAY:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Day DESC",
Str_Concat (Query," GROUP BY Day DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_DAY_AND_HOUR:
case Sta_CLICKS_GBL_PER_DAY_AND_HOUR:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Day DESC,Hour",
Str_Concat (Query," GROUP BY Day DESC,Hour",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_WEEK:
case Sta_CLICKS_GBL_PER_WEEK:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Week DESC",
Str_Concat (Query," GROUP BY Week DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_MONTH:
case Sta_CLICKS_GBL_PER_MONTH:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Month DESC",
Str_Concat (Query," GROUP BY Month DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_YEAR:
case Sta_CLICKS_GBL_PER_YEAR:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Year DESC",
Str_Concat (Query," GROUP BY Year DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_HOUR:
case Sta_CLICKS_GBL_PER_HOUR:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Hour",
Str_Concat (Query," GROUP BY Hour",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_MINUTE:
case Sta_CLICKS_GBL_PER_MINUTE:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Minute",
Str_Concat (Query," GROUP BY Minute",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_CRS_PER_ACTION:
case Sta_CLICKS_GBL_PER_ACTION:
sprintf (QueryAux," GROUP BY %s.ActCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_PLUGIN:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_ws.PlgCod ORDER BY Num DESC",
Str_Concat (Query," GROUP BY log_ws.PlgCod ORDER BY Num DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_API_FUNCTION:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_ws.FunCod ORDER BY Num DESC",
Str_Concat (Query," GROUP BY log_ws.FunCod ORDER BY Num DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_BANNER:
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_banners.BanCod ORDER BY Num DESC",
Str_Concat (Query," GROUP BY log_banners.BanCod ORDER BY Num DESC",
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_COUNTRY:
sprintf (QueryAux," GROUP BY %s.CtyCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_INSTITUTION:
sprintf (QueryAux," GROUP BY %s.InsCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_CENTRE:
sprintf (QueryAux," GROUP BY %s.CtrCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_DEGREE:
sprintf (QueryAux," GROUP BY %s.DegCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
case Sta_CLICKS_GBL_PER_COURSE:
sprintf (QueryAux," GROUP BY %s.CrsCod ORDER BY Num DESC",LogTable);
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
Str_Concat (Query,QueryAux,
Sta_MAX_BYTES_QUERY_ACCESS);
break;
}
@ -1482,7 +1484,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
Ale_ShowAlert (Ale_INFO,Query);
*/
/***** Make the query *****/
NumRows = DB_QuerySELECT_new (&mysql_res,"can not get clicks");
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get clicks");
/***** Count the number of rows in result *****/
if (NumRows == 0)

View File

@ -2469,6 +2469,7 @@ void Tst_ListQuestionsToSelect (void)
static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
{
extern const char *Txt_No_questions_found_matching_your_search_criteria;
char *Query;
unsigned long NumRows;
long LengthQuery;
unsigned NumItemInList;
@ -2480,7 +2481,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
char CrsCodStr[1 + 10 + 1];
/***** Allocate space for query *****/
if ((Gbl.DB.QueryPtr = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
if ((Query = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Select questions *****/
@ -2499,7 +2500,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
row[10] NumHitsNotBlank
row[11] Score
*/
snprintf (Gbl.DB.QueryPtr,Tst_MAX_BYTES_QUERY_TEST + 1,
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
"SELECT tst_questions.QstCod,"
"UNIX_TIMESTAMP(tst_questions.EditTime) AS F,"
"tst_questions.AnsType,tst_questions.Shuffle,"
@ -2511,45 +2512,45 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
"tst_questions.Score"
" FROM tst_questions");
if (!Gbl.Test.Tags.All)
Str_Concat (Gbl.DB.QueryPtr,",tst_question_tags,tst_tags",
Str_Concat (Query,",tst_question_tags,tst_tags",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr," WHERE tst_questions.CrsCod='",
Str_Concat (Query," WHERE tst_questions.CrsCod='",
Tst_MAX_BYTES_QUERY_TEST);
snprintf (CrsCodStr,sizeof (CrsCodStr),
"%ld",
Gbl.CurrentCrs.Crs.CrsCod);
Str_Concat (Gbl.DB.QueryPtr,CrsCodStr,
Str_Concat (Query,CrsCodStr,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
Tst_MAX_BYTES_QUERY_TEST);
snprintf (LongStr,sizeof (LongStr),
"%ld",
(long) Gbl.DateRange.TimeUTC[0]);
Str_Concat (Gbl.DB.QueryPtr,LongStr,
Str_Concat (Query,LongStr,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
Str_Concat (Query,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
Tst_MAX_BYTES_QUERY_TEST);
snprintf (LongStr,sizeof (LongStr),
"%ld",
(long) Gbl.DateRange.TimeUTC[1]);
Str_Concat (Gbl.DB.QueryPtr,LongStr,
Str_Concat (Query,LongStr,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"')",
Str_Concat (Query,"')",
Tst_MAX_BYTES_QUERY_TEST);
/* Add the tags selected */
if (!Gbl.Test.Tags.All)
{
Str_Concat (Gbl.DB.QueryPtr," AND tst_questions.QstCod=tst_question_tags.QstCod"
Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod"
" AND tst_question_tags.TagCod=tst_tags.TagCod"
" AND tst_tags.CrsCod='",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,CrsCodStr,
Str_Concat (Query,CrsCodStr,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Tst_MAX_BYTES_QUERY_TEST);
LengthQuery = strlen (Gbl.DB.QueryPtr);
LengthQuery = strlen (Query);
NumItemInList = 0;
Ptr = Gbl.Test.Tags.List;
while (*Ptr)
@ -2558,24 +2559,24 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Gbl.DB.QueryPtr,
Str_Concat (Query,
NumItemInList ? " OR tst_tags.TagTxt='" :
" AND (tst_tags.TagTxt='",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,TagText,
Str_Concat (Query,TagText,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Tst_MAX_BYTES_QUERY_TEST);
}
/* Add the types of answer selected */
if (!Gbl.Test.AllAnsTypes)
{
LengthQuery = strlen (Gbl.DB.QueryPtr);
LengthQuery = strlen (Query);
NumItemInList = 0;
Ptr = Gbl.Test.ListAnsTypes;
while (*Ptr)
@ -2585,48 +2586,48 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Gbl.DB.QueryPtr,
Str_Concat (Query,
NumItemInList ? " OR tst_questions.AnsType='" :
" AND (tst_questions.AnsType='",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,Tst_StrAnswerTypesDB[AnsType],
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Tst_MAX_BYTES_QUERY_TEST);
}
/* End the query */
Str_Concat (Gbl.DB.QueryPtr," GROUP BY tst_questions.QstCod",
Str_Concat (Query," GROUP BY tst_questions.QstCod",
Tst_MAX_BYTES_QUERY_TEST);
switch (Gbl.Test.SelectedOrder)
{
case Tst_ORDER_STEM:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Stem",
Str_Concat (Query," ORDER BY tst_questions.Stem",
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_NUM_HITS:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.NumHits DESC,"
Str_Concat (Query," ORDER BY tst_questions.NumHits DESC,"
"tst_questions.Stem",
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_AVERAGE_SCORE:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
"tst_questions.NumHits DESC,"
"tst_questions.Stem",
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_NUM_HITS_NOT_BLANK:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.NumHitsNotBlank DESC,"
Str_Concat (Query," ORDER BY tst_questions.NumHitsNotBlank DESC,"
"tst_questions.Stem",
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_AVERAGE_SCORE_NOT_BLANK:
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
"tst_questions.NumHitsNotBlank DESC,"
"tst_questions.Stem",
Tst_MAX_BYTES_QUERY_TEST);
@ -2634,7 +2635,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
}
/* Make the query */
NumRows = DB_QuerySELECT_new (mysql_res,"can not get questions");
NumRows = DB_QuerySELECT (Query,mysql_res,"can not get questions");
if (NumRows == 0)
Ale_ShowAlert (Ale_INFO,Txt_No_questions_found_matching_your_search_criteria);
@ -2648,6 +2649,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
{
char *Query;
long LengthQuery;
unsigned NumItemInList;
const char *Ptr;
@ -2657,7 +2659,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
char StrNumQsts[10 + 1];
/***** Allocate space for query *****/
if ((Gbl.DB.QueryPtr = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
if ((Query = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Select questions without hidden tags *****/
@ -2679,7 +2681,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
// Reject questions with any tag hidden
// Select only questions with tags
// DISTINCTROW is necessary to not repeat questions
snprintf (Gbl.DB.QueryPtr,Tst_MAX_BYTES_QUERY_TEST + 1,
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
"SELECT DISTINCTROW tst_questions.QstCod,"
"UNIX_TIMESTAMP(tst_questions.EditTime),"
"tst_questions.AnsType,tst_questions.Shuffle,"
@ -2706,7 +2708,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
if (!Gbl.Test.Tags.All) // User has not selected all the tags
{
/* Add selected tags */
LengthQuery = strlen (Gbl.DB.QueryPtr);
LengthQuery = strlen (Query);
NumItemInList = 0;
Ptr = Gbl.Test.Tags.List;
while (*Ptr)
@ -2715,24 +2717,24 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Gbl.DB.QueryPtr,
Str_Concat (Query,
NumItemInList ? " OR tst_tags.TagTxt='" :
" AND (tst_tags.TagTxt='",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,TagText,
Str_Concat (Query,TagText,
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Tst_MAX_BYTES_QUERY_TEST);
}
/* Add answer types selected */
if (!Gbl.Test.AllAnsTypes)
{
LengthQuery = strlen (Gbl.DB.QueryPtr);
LengthQuery = strlen (Query);
NumItemInList = 0;
Ptr = Gbl.Test.ListAnsTypes;
while (*Ptr)
@ -2742,34 +2744,34 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Gbl.DB.QueryPtr,
Str_Concat (Query,
NumItemInList ? " OR tst_questions.AnsType='" :
" AND (tst_questions.AnsType='",
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,Tst_StrAnswerTypesDB[AnsType],
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Tst_MAX_BYTES_QUERY_TEST);
}
/* End query */
Str_Concat (Gbl.DB.QueryPtr," ORDER BY RAND(NOW()) LIMIT ",
Str_Concat (Query," ORDER BY RAND(NOW()) LIMIT ",
Tst_MAX_BYTES_QUERY_TEST);
snprintf (StrNumQsts,sizeof (StrNumQsts),
"%u",
Gbl.Test.NumQsts);
Str_Concat (Gbl.DB.QueryPtr,StrNumQsts,
Str_Concat (Query,StrNumQsts,
Tst_MAX_BYTES_QUERY_TEST);
/*
if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
Lay_ShowAlert (Lay_INFO,Query);
*/
/* Make the query */
return DB_QuerySELECT_new (mysql_res,"can not get questions");
return DB_QuerySELECT (Query,mysql_res,"can not get questions");
}
/*****************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@ -2680,6 +2680,7 @@ int swad__sendAttendanceUsers (struct soap *soap,
char LongStr[1 + 10 + 1];
struct UsrData UsrDat;
unsigned NumCodsInList;
char *Query;
char SubQuery[256];
size_t Length = 0; // Initialized to avoid warning
@ -2733,12 +2734,12 @@ int swad__sendAttendanceUsers (struct soap *soap,
/* Start query used to mark not present users as absent */
Length = 256 + NumCodsInList * (1 + 1 + 10 + 1) - 1;
if ((Gbl.DB.QueryPtr = (char *) malloc (Length + 1)) == NULL)
if ((Query = (char *) malloc (Length + 1)) == NULL)
return soap_receiver_fault (Gbl.soap,
"Not enough memory",
"Not enough memory to store list of users");
sprintf (Gbl.DB.QueryPtr,"UPDATE att_usr SET Present='N'"
" WHERE AttCod=%ld",
sprintf (Query,"UPDATE att_usr SET Present='N'"
" WHERE AttCod=%ld",
Att.AttCod);
}
@ -2763,7 +2764,7 @@ int swad__sendAttendanceUsers (struct soap *soap,
sprintf (SubQuery,sendAttendanceUsersOut->numUsers ? ",%ld" :
" AND UsrCod NOT IN (%ld",
UsrDat.UsrCod);
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
Str_Concat (Query,SubQuery,
Length);
}
@ -2775,10 +2776,10 @@ int swad__sendAttendanceUsers (struct soap *soap,
{
/* Mark not present users as absent in table of users */
if (sendAttendanceUsersOut->numUsers)
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Length);
DB_QueryUPDATE_new ("can not set other users as absent");
DB_QueryUPDATE (Query,"can not set other users as absent");
/* Clean table att_usr */
Att_RemoveUsrsAbsentWithoutCommentsFromAttEvent (Att.AttCod);
@ -3145,9 +3146,11 @@ int swad__sendMessage (struct soap *soap,
int ReturnCode;
long ReplyUsrCod = -1L;
char Nickname[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
char *Query;
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumRow,NumRows;
unsigned NumRow;
unsigned NumRows;
bool FirstNickname = true;
bool ThereAreNicknames = false;
const char *Ptr;
@ -3229,17 +3232,17 @@ int swad__sendMessage (struct soap *soap,
}
/***** Allocate space for query *****/
if ((Gbl.DB.QueryPtr = (char *) malloc (Svc_MAX_BYTES_QUERY_RECIPIENTS + 1)) == NULL)
if ((Query = (char *) malloc (Svc_MAX_BYTES_QUERY_RECIPIENTS + 1)) == NULL)
Lay_NotEnoughMemoryExit ();
/***** Build query for recipients from database *****/
if (ReplyUsrCod > 0)
snprintf (Gbl.DB.QueryPtr,Svc_MAX_BYTES_QUERY_RECIPIENTS + 1,
snprintf (Query,Svc_MAX_BYTES_QUERY_RECIPIENTS + 1,
"SELECT UsrCod FROM usr_data"
" WHERE UsrCod=%ld",
ReplyUsrCod);
else
Gbl.DB.QueryPtr[0] = '\0';
Query[0] = '\0';
/***** Loop over recipients' nicknames building query *****/
Ptr = to;
@ -3254,7 +3257,7 @@ int swad__sendMessage (struct soap *soap,
Str_RemoveLeadingArrobas (Nickname);
/* Check for overflow in query */
if (strlen (Gbl.DB.QueryPtr) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
if (strlen (Query) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
Svc_MAX_BYTES_QUERY_RECIPIENTS)
return soap_sender_fault (Gbl.soap,
"Can not send message",
@ -3264,25 +3267,25 @@ int swad__sendMessage (struct soap *soap,
if (FirstNickname)
{
if (ReplyUsrCod > 0)
Str_Concat (Gbl.DB.QueryPtr," UNION ",
Str_Concat (Query," UNION ",
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Gbl.DB.QueryPtr,"SELECT UsrCod FROM usr_nicknames"
Str_Concat (Query,"SELECT UsrCod FROM usr_nicknames"
" WHERE Nickname IN ('",
Svc_MAX_BYTES_QUERY_RECIPIENTS);
FirstNickname = false;
ThereAreNicknames = true;
}
else
Str_Concat (Gbl.DB.QueryPtr,",'",
Str_Concat (Query,",'",
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Gbl.DB.QueryPtr,Nickname,
Str_Concat (Query,Nickname,
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Gbl.DB.QueryPtr,"'",
Str_Concat (Query,"'",
Svc_MAX_BYTES_QUERY_RECIPIENTS);
}
}
if (ThereAreNicknames)
Str_Concat (Gbl.DB.QueryPtr,")",
Str_Concat (Query,")",
Svc_MAX_BYTES_QUERY_RECIPIENTS);
/***** Initialize output structure *****/
@ -3293,7 +3296,7 @@ int swad__sendMessage (struct soap *soap,
if (ReplyUsrCod > 0 || ThereAreNicknames) // There are a recipient to reply or nicknames in "to"
{
/***** Get users *****/
NumRows = DB_QuerySELECT_new (&mysql_res,"can not get users");
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get users");
sendMessageOut->numUsers = (int) NumRows;
sendMessageOut->usersArray.__size = (int) NumRows;