Version 22.57: Oct 29, 2022 Code refactoring in search.

This commit is contained in:
acanas 2022-10-29 12:20:54 +02:00
parent 272fed1a69
commit aa43a66552
17 changed files with 149 additions and 65 deletions

View File

@ -1634,6 +1634,7 @@ int swad__findUsers (struct soap *soap,
struct swad__getUsersOutput *getUsersOut) // output struct swad__getUsersOutput *getUsersOut) // output
{ {
int ReturnCode; int ReturnCode;
struct Sch_Search Search;
char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1]; char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1];
Rol_Role_t Role; Rol_Role_t Role;
bool FilterTooShort = false; bool FilterTooShort = false;
@ -1689,13 +1690,14 @@ int swad__findUsers (struct soap *soap,
Role = API_SvcRole_to_RolRole[userRole]; Role = API_SvcRole_to_RolRole[userRole];
/***** Query users beloging to course or group from database *****/ /***** Query users beloging to course or group from database *****/
Str_Copy (Gbl.Search.Str,filter,sizeof (Gbl.Search.Str) - 1); Search.WhatToSearch = Sch_SEARCH_USERS;
Str_Copy (Search.Str,filter,sizeof (Search.Str) - 1);
if (Gbl.Search.Str[0]) // Search some users if (Search.Str[0]) // Search some users
{ {
Gbl.Scope.Current = (Gbl.Hierarchy.Level == HieLvl_CRS) ? HieLvl_CRS : Gbl.Scope.Current = (Gbl.Hierarchy.Level == HieLvl_CRS) ? HieLvl_CRS :
HieLvl_SYS; HieLvl_SYS;
if (Sch_BuildSearchQuery (SearchQuery, if (Sch_BuildSearchQuery (SearchQuery,&Search,
"CONCAT_WS(' ',FirstName,Surname1,Surname2)", "CONCAT_WS(' ',FirstName,Surname1,Surname2)",
NULL,NULL)) NULL,NULL))
{ {

View File

@ -605,7 +605,7 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia. TODO: Attach pdf files in multimedia.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.56 (2022-10-29)" #define Log_PLATFORM_VERSION "SWAD 22.57 (2022-10-29)"
#define CSS_FILE "swad22.49.4.css" #define CSS_FILE "swad22.49.4.css"
#define JS_FILE "swad22.49.js" #define JS_FILE "swad22.49.js"
/* /*
@ -616,6 +616,7 @@ Que al subir un fichero por defecto est
Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes... Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes...
Exportar listas en CSV. Exportar listas en CSV.
Version 22.57: Oct 29, 2022 Code refactoring in search. (333762 lines)
Version 22.56: Oct 29, 2022 Code refactoring in user record. (333696 lines) Version 22.56: Oct 29, 2022 Code refactoring in user record. (333696 lines)
Version 22.55: Oct 28, 2022 Code refactoring in degree types. (333694 lines) Version 22.55: Oct 28, 2022 Code refactoring in degree types. (333694 lines)
Version 22.54: Oct 28, 2022 Code refactoring and bug fixing in institutional links. (333614 lines) Version 22.54: Oct 28, 2022 Code refactoring and bug fixing in institutional links. (333614 lines)

View File

@ -221,10 +221,6 @@ void Gbl_InitializeGlobals (void)
Gbl.Crs.Records.LstFields.Num = 0; Gbl.Crs.Records.LstFields.Num = 0;
Gbl.Crs.Records.LstFields.NestedCalls = 0; Gbl.Crs.Records.LstFields.NestedCalls = 0;
Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
Gbl.Search.Str[0] = '\0';
Gbl.Search.LogSearch = false;
Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_UNKNOWN; Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_UNKNOWN;
Gbl.Usrs.Listing.RecsPerPag = Rec_DEF_RECORDS_PER_PAGE; Gbl.Usrs.Listing.RecsPerPag = Rec_DEF_RECORDS_PER_PAGE;
Gbl.Usrs.Listing.WithPhotos = Usr_LIST_WITH_PHOTOS_DEF; Gbl.Usrs.Listing.WithPhotos = Usr_LIST_WITH_PHOTOS_DEF;

View File

@ -100,12 +100,14 @@ struct Globals
struct Crs_ListCourses Crss; // List of courses in current degree struct Crs_ListCourses Crss; // List of courses in current degree
struct Crs_Course Crs; // Current course. Aditional info about course is stored in Gbl.Crs. struct Crs_Course Crs; // Current course. Aditional info about course is stored in Gbl.Crs.
} Hierarchy; } Hierarchy;
/*
struct struct
{ {
Sch_WhatToSearch_t WhatToSearch; Sch_WhatToSearch_t WhatToSearch;
char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1]; char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1];
bool LogSearch; bool LogSearch;
} Search; } Search;
*/
struct struct
{ {
bool IsWebService; // Must generate HTML output (IsWebService==false) or SOAP-XML output (IsWebService==true)? bool IsWebService; // Must generate HTML output (IsWebService==false) or SOAP-XML output (IsWebService==true)?

View File

@ -53,6 +53,32 @@
extern struct Globals Gbl; extern struct Globals Gbl;
/*****************************************************************************/
/************************* Private global variables **************************/
/*****************************************************************************/
static bool Log_Search = false; // Log search in database?
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static bool Log_GetLogSearch (void);
/*****************************************************************************/
/******************** Set/get logging search in database *********************/
/*****************************************************************************/
void Log_SetLogSearch (bool Search)
{
Log_Search = Search;
}
static bool Log_GetLogSearch (void)
{
return Log_Search;
}
/*****************************************************************************/ /*****************************************************************************/
/**************************** Log access in database *************************/ /**************************** Log access in database *************************/
/*****************************************************************************/ /*****************************************************************************/
@ -92,8 +118,8 @@ void Log_LogAccess (const char *Comments)
} }
/* Log search string */ /* Log search string */
if (Gbl.Search.LogSearch && Gbl.Search.Str[0]) if (Log_GetLogSearch ())
Log_DB_LogSearchString (LogCod); Log_DB_LogSearchString (LogCod,Sch_GetSearch ());
if (Gbl.WebService.IsWebService) if (Gbl.WebService.IsWebService)
/* Log web service plugin and API function */ /* Log web service plugin and API function */

View File

@ -33,6 +33,8 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void Log_SetLogSearch (bool Search);
void Log_LogAccess (const char *Comments); void Log_LogAccess (const char *Comments);
void Log_PutLinkToLastClicks (void); void Log_PutLinkToLastClicks (void);

View File

@ -114,15 +114,14 @@ void Log_DB_LogComments (long LogCod,const char *CommentsDB)
/****************************** Log search string ****************************/ /****************************** Log search string ****************************/
/*****************************************************************************/ /*****************************************************************************/
void Log_DB_LogSearchString (long LogCod) void Log_DB_LogSearchString (long LogCod,const struct Sch_Search *Search)
{ {
DB_QueryINSERT ("can not log access (search)", DB_QueryINSERT ("can not log access (search)",
"INSERT INTO log_search" "INSERT INTO log_search"
" (LogCod,SearchStr)" " (LogCod,SearchStr)"
" VALUES" " VALUES"
" (%ld,'%s')", " (%ld,'%s')",
LogCod, LogCod,Search->Str);
Gbl.Search.Str);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -30,7 +30,7 @@
long Log_DB_LogAccessInHistoricalLog (long ActCod,Rol_Role_t RoleToStore); long Log_DB_LogAccessInHistoricalLog (long ActCod,Rol_Role_t RoleToStore);
void Log_DB_LogAccessInRecentLog (long LogCod,long ActCod,Rol_Role_t RoleToStore); void Log_DB_LogAccessInRecentLog (long LogCod,long ActCod,Rol_Role_t RoleToStore);
void Log_DB_LogComments (long LogCod,const char *CommentsDB); void Log_DB_LogComments (long LogCod,const char *CommentsDB);
void Log_DB_LogSearchString (long LogCod); void Log_DB_LogSearchString (long LogCod,const struct Sch_Search *Search);
void Log_DB_LogAPI (long LogCod); void Log_DB_LogAPI (long LogCod);
void Log_DB_LogBanner (long LogCod,long BanCodClicked); void Log_DB_LogBanner (long LogCod,long BanCodClicked);

View File

@ -89,7 +89,7 @@ extern struct Globals Gbl;
/************************* Private global variables **************************/ /************************* Private global variables **************************/
/*****************************************************************************/ /*****************************************************************************/
struct static struct
{ {
struct Usr_Data *UsrDat; struct Usr_Data *UsrDat;
Rec_SharedRecordViewType_t TypeOfView; Rec_SharedRecordViewType_t TypeOfView;

View File

@ -40,6 +40,7 @@
#include "swad_HTML.h" #include "swad_HTML.h"
#include "swad_institution_database.h" #include "swad_institution_database.h"
#include "swad_layout.h" #include "swad_layout.h"
#include "swad_log.h"
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_session_database.h" #include "swad_session_database.h"
#include "swad_user.h" #include "swad_user.h"
@ -58,13 +59,22 @@
extern struct Globals Gbl; extern struct Globals Gbl;
/*****************************************************************************/
/************************* Private global variables **************************/
/*****************************************************************************/
static struct Sch_Search Sch_Search =
{
.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT,
};
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static void Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_Level_t DefaultScope); static void Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_Level_t DefaultScope);
static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch); static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch);
static void Sch_GetParamSearch (void); static void Sch_GetParamSearchStr (void);
static void Sch_SearchInDB (void); static void Sch_SearchInDB (void);
static unsigned Sch_SearchCountrsInDB (const char *RangeQuery); static unsigned Sch_SearchCountrsInDB (const char *RangeQuery);
@ -81,6 +91,16 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery);
static void Sch_SaveLastSearchIntoSession (void); static void Sch_SaveLastSearchIntoSession (void);
/*****************************************************************************/
/*********************** Get pointer to global search ************************/
/*****************************************************************************/
struct Sch_Search *Sch_GetSearch (void)
{
return &Sch_Search;
}
/*****************************************************************************/ /*****************************************************************************/
/*********************** Request search in system tab ************************/ /*********************** Request search in system tab ************************/
/*****************************************************************************/ /*****************************************************************************/
@ -132,6 +152,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_Level_t DefaultS
}; };
Sch_WhatToSearch_t WhatToSearch; Sch_WhatToSearch_t WhatToSearch;
unsigned WTS; unsigned WTS;
const struct Sch_Search *Search = Sch_GetSearch ();
/***** Begin container *****/ /***** Begin container *****/
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
@ -178,7 +199,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_Level_t DefaultS
{ {
WTS = (unsigned) WhatToSearch; WTS = (unsigned) WhatToSearch;
HTM_OPTION (HTM_Type_UNSIGNED,&WTS, HTM_OPTION (HTM_Type_UNSIGNED,&WTS,
Gbl.Search.WhatToSearch == WhatToSearch,false, Search->WhatToSearch == WhatToSearch,false,
"%s",*Titles[WhatToSearch]); "%s",*Titles[WhatToSearch]);
} }
HTM_SELECT_End (); HTM_SELECT_End ();
@ -252,10 +273,11 @@ void Sch_PutFormToSearchInPageTopHeading (void)
void Sch_PutInputStringToSearch (const char *IdInputText) void Sch_PutInputStringToSearch (const char *IdInputText)
{ {
extern const char *Txt_Search; extern const char *Txt_Search;
const struct Sch_Search *Search = Sch_GetSearch ();
/***** String to find *****/ /***** String to find *****/
// Input field not required, because it can be hidden (display:none) // Input field not required, because it can be hidden (display:none)
HTM_INPUT_SEARCH ("Search",Sch_MAX_CHARS_STRING_TO_FIND,Gbl.Search.Str, HTM_INPUT_SEARCH ("Search",Sch_MAX_CHARS_STRING_TO_FIND,Search->Str,
"id=\"%s\" size=\"18\" class=\"INPUT_%s\"" "id=\"%s\" size=\"18\" class=\"INPUT_%s\""
" placeholder=\"%s…\"", " placeholder=\"%s…\"",
IdInputText, IdInputText,
@ -279,6 +301,7 @@ void Sch_PutMagnifyingGlassButton (Ico_Color_t Color)
void Sch_GetParamWhatToSearch (void) void Sch_GetParamWhatToSearch (void)
{ {
Sch_WhatToSearch_t WhatToSearch; Sch_WhatToSearch_t WhatToSearch;
struct Sch_Search *Search = Sch_GetSearch ();
/***** Get what to search from form *****/ /***** Get what to search from form *****/
WhatToSearch = (Sch_WhatToSearch_t) WhatToSearch = (Sch_WhatToSearch_t)
@ -290,17 +313,19 @@ void Sch_GetParamWhatToSearch (void)
/***** If parameter WhatToSearch is not present, /***** If parameter WhatToSearch is not present,
use parameter from session *****/ use parameter from session *****/
if (WhatToSearch != Sch_SEARCH_UNKNOWN) if (WhatToSearch != Sch_SEARCH_UNKNOWN)
Gbl.Search.WhatToSearch = WhatToSearch; Search->WhatToSearch = WhatToSearch;
} }
/*****************************************************************************/ /*****************************************************************************/
/*********************** Get string from search form *************************/ /*********************** Get string from search form *************************/
/*****************************************************************************/ /*****************************************************************************/
static void Sch_GetParamSearch (void) static void Sch_GetParamSearchStr (void)
{ {
struct Sch_Search *Search = Sch_GetSearch ();
/***** Get string to search *****/ /***** Get string to search *****/
Par_GetParToText ("Search",Gbl.Search.Str,Sch_MAX_BYTES_STRING_TO_FIND); Par_GetParToText ("Search",Search->Str,Sch_MAX_BYTES_STRING_TO_FIND);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -313,7 +338,7 @@ void Sch_GetParamsSearch (void)
Sch_GetParamWhatToSearch (); Sch_GetParamWhatToSearch ();
/***** Get search string *****/ /***** Get search string *****/
Sch_GetParamSearch (); Sch_GetParamSearchStr ();
/***** Save my search in order to show it in current session *****/ /***** Save my search in order to show it in current session *****/
if (Gbl.Usrs.Me.Logged) if (Gbl.Usrs.Me.Logged)
@ -326,8 +351,13 @@ void Sch_GetParamsSearch (void)
void Sch_SysSearch (void) void Sch_SysSearch (void)
{ {
if (Gbl.Search.Str[0]) const struct Sch_Search *Search = Sch_GetSearch ();
if (Search->Str[0])
{ {
/***** Activate logging search in database *****/
Log_SetLogSearch (true);
/***** Show search form again *****/ /***** Show search form again *****/
Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_SYS); Sch_PutFormToSearchWithWhatToSearchAndScope (HieLvl_SYS);
@ -348,8 +378,7 @@ static void Sch_SearchInDB (void)
extern const char *Txt_No_results; extern const char *Txt_No_results;
char RangeQuery[256]; char RangeQuery[256];
unsigned NumResults = 0; // Initialized to avoid warning unsigned NumResults = 0; // Initialized to avoid warning
struct Sch_Search *Search = Sch_GetSearch ();
Gbl.Search.LogSearch = true;
/***** Select courses in all degrees or in current degree *****/ /***** Select courses in all degrees or in current degree *****/
switch (Gbl.Scope.Current) switch (Gbl.Scope.Current)
@ -381,9 +410,9 @@ static void Sch_SearchInDB (void)
break; break;
} }
if (Gbl.Search.WhatToSearch == Sch_SEARCH_UNKNOWN) if (Search->WhatToSearch == Sch_SEARCH_UNKNOWN)
Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT; Search->WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
switch (Gbl.Search.WhatToSearch) switch (Search->WhatToSearch)
{ {
case Sch_SEARCH_ALL: case Sch_SEARCH_ALL:
NumResults = Sch_SearchCountrsInDB (RangeQuery); NumResults = Sch_SearchCountrsInDB (RangeQuery);
@ -467,7 +496,8 @@ static unsigned Sch_SearchCountrsInDB (const char *RangeQuery)
/***** Split countries string into words *****/ /***** Split countries string into words *****/
snprintf (FieldName,sizeof (FieldName),"Name_%s", snprintf (FieldName,sizeof (FieldName),"Name_%s",
Lan_STR_LANG_ID[Gbl.Prefs.Language]); Lan_STR_LANG_ID[Gbl.Prefs.Language]);
if (Sch_BuildSearchQuery (SearchQuery,FieldName,NULL,NULL)) if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
FieldName,NULL,NULL))
{ {
/***** Query database and list countries found *****/ /***** Query database and list countries found *****/
NumCtys = Cty_DB_SearchCtys (&mysql_res,SearchQuery,RangeQuery); NumCtys = Cty_DB_SearchCtys (&mysql_res,SearchQuery,RangeQuery);
@ -498,7 +528,8 @@ static unsigned Sch_SearchInstitsInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_INSTITS)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_INSTITS))
/***** Split institutions string into words *****/ /***** Split institutions string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"ins_instits.FullName",NULL,NULL)) if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"ins_instits.FullName",NULL,NULL))
{ {
/***** Query database and list institutions found *****/ /***** Query database and list institutions found *****/
NumInss = Ins_DB_SearchInss (&mysql_res,SearchQuery,RangeQuery); NumInss = Ins_DB_SearchInss (&mysql_res,SearchQuery,RangeQuery);
@ -526,7 +557,8 @@ static unsigned Sch_SearchCentersInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_CENTERS)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_CENTERS))
/***** Split center string into words *****/ /***** Split center string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"ctr_centers.FullName",NULL,NULL)) if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"ctr_centers.FullName",NULL,NULL))
{ {
/***** Query database and list centers found *****/ /***** Query database and list centers found *****/
NumCtrs = Ctr_DB_SearchCtrs (&mysql_res,SearchQuery,RangeQuery); NumCtrs = Ctr_DB_SearchCtrs (&mysql_res,SearchQuery,RangeQuery);
@ -553,7 +585,8 @@ static unsigned Sch_SearchDegreesInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DEGREES)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DEGREES))
/***** Split degree string into words *****/ /***** Split degree string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"deg_degrees.FullName",NULL,NULL)) if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"deg_degrees.FullName",NULL,NULL))
{ {
/***** Query database and list degrees found *****/ /***** Query database and list degrees found *****/
NumDegs = Deg_DB_SearchDegs (&mysql_res,SearchQuery,RangeQuery); NumDegs = Deg_DB_SearchDegs (&mysql_res,SearchQuery,RangeQuery);
@ -578,7 +611,8 @@ static unsigned Sch_SearchCoursesInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_COURSES)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_COURSES))
/***** Split course string into words *****/ /***** Split course string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"crs_courses.FullName",NULL,NULL)) if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"crs_courses.FullName",NULL,NULL))
{ {
/***** Query database and list courses found *****/ /***** Query database and list courses found *****/
NumCrss = Crs_DB_SearchCrss (&mysql_res,SearchQuery,RangeQuery); NumCrss = Crs_DB_SearchCrss (&mysql_res,SearchQuery,RangeQuery);
@ -601,7 +635,7 @@ static unsigned Sch_SearchUsrsInDB (Rol_Role_t Role)
char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1]; char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1];
/***** Split user string into words *****/ /***** Split user string into words *****/
if (Sch_BuildSearchQuery (SearchQuery, if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"CONCAT_WS(' ',FirstName,Surname1,Surname2)", "CONCAT_WS(' ',FirstName,Surname1,Surname2)",
NULL,NULL)) NULL,NULL))
/***** Query database and list users found *****/ /***** Query database and list users found *****/
@ -633,7 +667,8 @@ static unsigned Sch_SearchOpenDocumentsInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_OPEN_DOCUMENTS)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_OPEN_DOCUMENTS))
/***** Split document string into words *****/ /***** Split document string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"SUBSTRING_INDEX(brw_files.Path,'/',-1)", if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
"_latin1 "," COLLATE latin1_general_ci")) "_latin1 "," COLLATE latin1_general_ci"))
{ {
/***** Query database *****/ /***** Query database *****/
@ -665,7 +700,8 @@ static unsigned Sch_SearchDocumentsInMyCoursesInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DOCUM_IN_MY_COURSES)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DOCUM_IN_MY_COURSES))
/***** Split document string into words *****/ /***** Split document string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"SUBSTRING_INDEX(brw_files.Path,'/',-1)", if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
"_latin1 "," COLLATE latin1_general_ci")) "_latin1 "," COLLATE latin1_general_ci"))
{ {
/***** Query database *****/ /***** Query database *****/
@ -697,7 +733,8 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
/***** Check user's permission *****/ /***** Check user's permission *****/
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_MY_DOCUMENTS)) if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_MY_DOCUMENTS))
/***** Split document string into words *****/ /***** Split document string into words *****/
if (Sch_BuildSearchQuery (SearchQuery,"SUBSTRING_INDEX(brw_files.Path,'/',-1)", if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
"_latin1 "," COLLATE latin1_general_ci")) "_latin1 "," COLLATE latin1_general_ci"))
{ {
/***** Query database *****/ /***** Query database *****/
@ -721,6 +758,7 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
// Returns false when no valid search query // Returns false when no valid search query
bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1], bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1],
const struct Sch_Search *Search,
const char *FieldName, const char *FieldName,
const char *CharSet,const char *Collate) const char *CharSet,const char *Collate)
{ {
@ -733,10 +771,10 @@ bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1],
char SearchWords[Sch_MAX_WORDS_IN_SEARCH][Sch_MAX_BYTES_SEARCH_WORD + 1]; char SearchWords[Sch_MAX_WORDS_IN_SEARCH][Sch_MAX_BYTES_SEARCH_WORD + 1];
bool SearchWordIsValid = true; bool SearchWordIsValid = true;
if (Gbl.Search.Str[0]) if (Search->Str[0])
{ {
SearchQuery[0] = '\0'; SearchQuery[0] = '\0';
Ptr = Gbl.Search.Str; Ptr = Search->Str;
for (NumWords = 0; for (NumWords = 0;
NumWords < Sch_MAX_WORDS_IN_SEARCH && *Ptr; NumWords < Sch_MAX_WORDS_IN_SEARCH && *Ptr;
NumWords++) NumWords++)
@ -745,7 +783,7 @@ bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1],
Str_GetNextStringUntilSpace (&Ptr,SearchWords[NumWords],Sch_MAX_BYTES_SEARCH_WORD); Str_GetNextStringUntilSpace (&Ptr,SearchWords[NumWords],Sch_MAX_BYTES_SEARCH_WORD);
/* Is this word valid? */ /* Is this word valid? */
switch (Gbl.Search.WhatToSearch) switch (Search->WhatToSearch)
{ {
case Sch_SEARCH_OPEN_DOCUMENTS: case Sch_SEARCH_OPEN_DOCUMENTS:
case Sch_SEARCH_DOCUM_IN_MY_COURSES: case Sch_SEARCH_DOCUM_IN_MY_COURSES:
@ -807,18 +845,21 @@ bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1],
static void Sch_SaveLastSearchIntoSession (void) static void Sch_SaveLastSearchIntoSession (void)
{ {
struct Sch_Search *Search;
if (Gbl.Usrs.Me.Logged) if (Gbl.Usrs.Me.Logged)
{ {
if (Gbl.Search.WhatToSearch == Sch_SEARCH_UNKNOWN) Search = Sch_GetSearch ();
Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT; if (Search->WhatToSearch == Sch_SEARCH_UNKNOWN)
Search->WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
/***** Save last search in session *****/ /***** Save last search in session *****/
Ses_DB_SaveLastSearchIntoSession (); Ses_DB_SaveLastSearchIntoSession (Search);
/***** Update my last type of search *****/ /***** Update my last type of search *****/
// WhatToSearch is stored in usr_last for next time I log in // WhatToSearch is stored in usr_last for next time I log in
// In other existing sessions distinct to this, WhatToSearch will remain unchanged // In other existing sessions distinct to this, WhatToSearch will remain unchanged
Usr_DB_UpdateMyLastWhatToSearch (); Usr_DB_UpdateMyLastWhatToSearch (Search->WhatToSearch);
} }
} }

View File

@ -67,10 +67,18 @@ typedef enum
} Sch_WhatToSearch_t; } Sch_WhatToSearch_t;
#define Sch_WHAT_TO_SEARCH_DEFAULT Sch_SEARCH_ALL #define Sch_WHAT_TO_SEARCH_DEFAULT Sch_SEARCH_ALL
struct Sch_Search
{
Sch_WhatToSearch_t WhatToSearch;
char Str[Sch_MAX_BYTES_STRING_TO_FIND + 1];
};
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
struct Sch_Search *Sch_GetSearch (void);
void Sch_ReqSysSearch (void); void Sch_ReqSysSearch (void);
void Sch_PutFormToSearchInPageTopHeading (void); void Sch_PutFormToSearchInPageTopHeading (void);
@ -82,6 +90,7 @@ void Sch_GetParamsSearch (void);
void Sch_SysSearch (void); void Sch_SysSearch (void);
bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1], bool Sch_BuildSearchQuery (char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1],
const struct Sch_Search *Search,
const char *FieldName, const char *FieldName,
const char *CharSet,const char *Collate); const char *CharSet,const char *Collate);

View File

@ -74,6 +74,8 @@ void Ses_GetNumSessions (void)
void Ses_CreateSession (void) void Ses_CreateSession (void)
{ {
struct Sch_Search *Search = Sch_GetSearch ();
/***** Create a unique name for the session *****/ /***** Create a unique name for the session *****/
Str_Copy (Gbl.Session.Id,Cry_GetUniqueNameEncrypted (),sizeof (Gbl.Session.Id) - 1); Str_Copy (Gbl.Session.Id,Cry_GetUniqueNameEncrypted (),sizeof (Gbl.Session.Id) - 1);
@ -82,7 +84,9 @@ void Ses_CreateSession (void)
Err_ShowErrorAndExit ("Can not create session."); Err_ShowErrorAndExit ("Can not create session.");
/***** Add session to database *****/ /***** Add session to database *****/
Ses_DB_InsertSession (); if (Search->WhatToSearch == Sch_SEARCH_UNKNOWN)
Search->WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
Ses_DB_InsertSession (Search->WhatToSearch);
/***** Update time and course in connected list *****/ /***** Update time and course in connected list *****/
Con_DB_UpdateMeInConnectedList (); Con_DB_UpdateMeInConnectedList ();
@ -155,6 +159,7 @@ bool Ses_GetSessionData (void)
MYSQL_ROW row; MYSQL_ROW row;
unsigned UnsignedNum; unsigned UnsignedNum;
bool Result = false; bool Result = false;
struct Sch_Search *Search;
/***** Check if the session existed in the database *****/ /***** Check if the session existed in the database *****/
if (Ses_DB_GetSessionData (&mysql_res)) if (Ses_DB_GetSessionData (&mysql_res))
@ -186,16 +191,18 @@ bool Ses_GetSessionData (void)
/***** Get last search *****/ /***** Get last search *****/
if (Gbl.Action.Act != ActLogOut) // When closing session, last search will not be needed if (Gbl.Action.Act != ActLogOut) // When closing session, last search will not be needed
{ {
Search = Sch_GetSearch ();
/* Get what to search (row[8]) */ /* Get what to search (row[8]) */
Gbl.Search.WhatToSearch = Sch_SEARCH_UNKNOWN; Search->WhatToSearch = Sch_SEARCH_UNKNOWN;
if (sscanf (row[8],"%u",&UnsignedNum) == 1) if (sscanf (row[8],"%u",&UnsignedNum) == 1)
if (UnsignedNum < Sch_NUM_WHAT_TO_SEARCH) if (UnsignedNum < Sch_NUM_WHAT_TO_SEARCH)
Gbl.Search.WhatToSearch = (Sch_WhatToSearch_t) UnsignedNum; Search->WhatToSearch = (Sch_WhatToSearch_t) UnsignedNum;
if (Gbl.Search.WhatToSearch == Sch_SEARCH_UNKNOWN) if (Search->WhatToSearch == Sch_SEARCH_UNKNOWN)
Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT; Search->WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
/* Get search string (row[9]) */ /* Get search string (row[9]) */
Str_Copy (Gbl.Search.Str,row[9],sizeof (Gbl.Search.Str) - 1); Str_Copy (Search->Str,row[9],sizeof (Search->Str) - 1);
} }
Result = true; Result = true;

View File

@ -40,11 +40,8 @@ extern struct Globals Gbl;
/******************** Insert new session in the database *********************/ /******************** Insert new session in the database *********************/
/*****************************************************************************/ /*****************************************************************************/
void Ses_DB_InsertSession (void) void Ses_DB_InsertSession (Sch_WhatToSearch_t WhatToSearch)
{ {
if (Gbl.Search.WhatToSearch == Sch_SEARCH_UNKNOWN)
Gbl.Search.WhatToSearch = Sch_WHAT_TO_SEARCH_DEFAULT;
DB_QueryINSERT ("can not create session", DB_QueryINSERT ("can not create session",
"INSERT INTO ses_sessions" "INSERT INTO ses_sessions"
" (SessionId,UsrCod,Password,Role," " (SessionId,UsrCod,Password,Role,"
@ -61,7 +58,7 @@ void Ses_DB_InsertSession (void)
Gbl.Hierarchy.Ctr.CtrCod, Gbl.Hierarchy.Ctr.CtrCod,
Gbl.Hierarchy.Deg.DegCod, Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
Gbl.Search.WhatToSearch); WhatToSearch);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -98,15 +95,15 @@ void Ses_DB_UpdateSession (void)
/********************** Save last search into session ************************/ /********************** Save last search into session ************************/
/*****************************************************************************/ /*****************************************************************************/
void Ses_DB_SaveLastSearchIntoSession (void) void Ses_DB_SaveLastSearchIntoSession (const struct Sch_Search *Search)
{ {
DB_QueryUPDATE ("can not update last search in session", DB_QueryUPDATE ("can not update last search in session",
"UPDATE ses_sessions" "UPDATE ses_sessions"
" SET WhatToSearch=%u," " SET WhatToSearch=%u,"
"SearchStr='%s'" "SearchStr='%s'"
" WHERE SessionId='%s'", " WHERE SessionId='%s'",
(unsigned) Gbl.Search.WhatToSearch, (unsigned) Search->WhatToSearch,
Gbl.Search.Str, Search->Str,
Gbl.Session.Id); Gbl.Session.Id);
} }

View File

@ -33,9 +33,9 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
//---------------------------------- Sessions --------------------------------- //---------------------------------- Sessions ---------------------------------
void Ses_DB_InsertSession (void); void Ses_DB_InsertSession (Sch_WhatToSearch_t WhatToSearch);
void Ses_DB_UpdateSession (void); void Ses_DB_UpdateSession (void);
void Ses_DB_SaveLastSearchIntoSession (void); void Ses_DB_SaveLastSearchIntoSession (const struct Sch_Search *Search);
void Ses_DB_SaveLastPageMsgIntoSession (Pag_WhatPaginate_t WhatPaginate,unsigned NumPage); void Ses_DB_SaveLastPageMsgIntoSession (Pag_WhatPaginate_t WhatPaginate,unsigned NumPage);
void Ses_DB_UpdateSessionLastRefresh (void); void Ses_DB_UpdateSessionLastRefresh (void);

View File

@ -1947,6 +1947,7 @@ static void Usr_ShowAlertThereAreMoreThanOneUsr (void)
static void Usr_SetMyPrefsAndRoles (void) static void Usr_SetMyPrefsAndRoles (void)
{ {
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
struct Sch_Search *Search;
bool GetRoleAndActionFromLastData; bool GetRoleAndActionFromLastData;
Act_Action_t LastSuperAction; Act_Action_t LastSuperAction;
bool JustAfterLogin = Gbl.Action.Act == ActLogIn || bool JustAfterLogin = Gbl.Action.Act == ActLogIn ||
@ -1981,7 +1982,8 @@ static void Usr_SetMyPrefsAndRoles (void)
{ {
/***** WhatToSearch is stored in session, /***** WhatToSearch is stored in session,
but in login it is got from user's last data *****/ but in login it is got from user's last data *****/
Gbl.Search.WhatToSearch = Gbl.Usrs.Me.UsrLast.WhatToSearch; Search = Sch_GetSearch ();
Search->WhatToSearch = Gbl.Usrs.Me.UsrLast.WhatToSearch;
/***** Location in hierarchy and role are stored in session, /***** Location in hierarchy and role are stored in session,
but in login the are got from user's last data *****/ but in login the are got from user's last data *****/

View File

@ -1492,7 +1492,7 @@ void Usr_DB_UpdateMyLastData (void)
/********************** Update my last type of search ************************/ /********************** Update my last type of search ************************/
/*****************************************************************************/ /*****************************************************************************/
void Usr_DB_UpdateMyLastWhatToSearch (void) void Usr_DB_UpdateMyLastWhatToSearch (Sch_WhatToSearch_t WhatToSearch)
{ {
// WhatToSearch is stored in usr_last for next time I log in // WhatToSearch is stored in usr_last for next time I log in
// In other existing sessions distinct to this, WhatToSearch will remain unchanged // In other existing sessions distinct to this, WhatToSearch will remain unchanged
@ -1500,7 +1500,7 @@ void Usr_DB_UpdateMyLastWhatToSearch (void)
"UPDATE usr_last" "UPDATE usr_last"
" SET WhatToSearch=%u" " SET WhatToSearch=%u"
" WHERE UsrCod=%ld", " WHERE UsrCod=%ld",
(unsigned) Gbl.Search.WhatToSearch, (unsigned) WhatToSearch,
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
} }

View File

@ -70,7 +70,7 @@ void Usr_DB_RemoveUsrData (long UsrCod);
//------------------------------ User's last data ----------------------------- //------------------------------ User's last data -----------------------------
void Usr_DB_InsertMyLastData (void); void Usr_DB_InsertMyLastData (void);
void Usr_DB_UpdateMyLastData (void); void Usr_DB_UpdateMyLastData (void);
void Usr_DB_UpdateMyLastWhatToSearch (void); void Usr_DB_UpdateMyLastWhatToSearch (Sch_WhatToSearch_t WhatToSearch);
bool Usr_DB_CheckMyLastData (void); bool Usr_DB_CheckMyLastData (void);
unsigned Usr_DB_GetMyLastData (MYSQL_RES **mysql_res); unsigned Usr_DB_GetMyLastData (MYSQL_RES **mysql_res);