mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-16 13:44:06 +02:00
Version19.248
This commit is contained in:
parent
1b80819347
commit
08af524f2d
|
@ -440,8 +440,8 @@ struct swad__sendMessageOutput
|
||||||
struct swad__usersArray usersArray;
|
struct swad__usersArray usersArray;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* getLocations */
|
/* location */
|
||||||
struct swad__getLocationsOutput
|
struct swad__location
|
||||||
{
|
{
|
||||||
int institutionCode;
|
int institutionCode;
|
||||||
char *institutionShortName;
|
char *institutionShortName;
|
||||||
|
@ -458,12 +458,25 @@ struct swad__getLocationsOutput
|
||||||
char *roomFullName;
|
char *roomFullName;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* sendCurrentLocation */
|
/* getLocation */
|
||||||
struct swad__sendCurrentLocationOutput
|
struct swad__getLocationOutput
|
||||||
|
{
|
||||||
|
struct swad__location location;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* sendMyLocation */
|
||||||
|
struct swad__sendMyLocationOutput
|
||||||
{
|
{
|
||||||
int success;
|
int success;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* getLastLocation */
|
||||||
|
struct swad__getLastLocationOutput
|
||||||
|
{
|
||||||
|
struct swad__location location;
|
||||||
|
long checkinTime;
|
||||||
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*************************** Web service functions ***************************/
|
/*************************** Web service functions ***************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -549,8 +562,9 @@ int swad__sendMessage (char *wsKey,int messageCode,char *to,char *subject,char *
|
||||||
struct swad__sendMessageOutput *sendMessageOut);
|
struct swad__sendMessageOutput *sendMessageOut);
|
||||||
|
|
||||||
/* Wi-Fi-based positioning system */
|
/* Wi-Fi-based positioning system */
|
||||||
int swad__getLocations (char *wsKey,char *MAC,
|
int swad__getLocation (char *wsKey,char *MAC,
|
||||||
struct swad__getLocationsOutput *getLocationsOut);
|
struct swad__getLocationOutput *getLocationOut);
|
||||||
int swad__sendCurrentLocation (char *wsKey,int roomCode,
|
int swad__sendMyLocation (char *wsKey,int roomCode,
|
||||||
struct swad__sendCurrentLocationOutput *endCurrentLocationOut);
|
struct swad__sendMyLocationOutput *sendMyLocationOut);
|
||||||
|
int swad__getLastLocation (char *wsKey,int userCode,
|
||||||
|
struct swad__getLastLocationOutput *getLastLocationOut);
|
||||||
|
|
|
@ -13383,3 +13383,22 @@ SELECT COUNT(*) FROM exa_log_user_agent WHERE LogCod=(SELECT MAX(LogCod) FROM ex
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO room_check_in (UsrCod,RooCod,CheckInTime) SELECT 1,RooCod,NOW() FROM rooms WHERE RooCod=1;
|
INSERT INTO room_check_in (UsrCod,RooCod,CheckInTime) SELECT 1,RooCod,NOW() FROM rooms WHERE RooCod=1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO room_check_in (UsrCod,RooCod,CheckInTime) VALUES (1,1,NOW());
|
||||||
|
|
||||||
|
SELECT institutions.InsCod,institutions.ShortName,institutions.FullName,centres.CtrCod,centres.ShortName,centres.FullName,buildings.BldCod,buildings.ShortName,buildings.FullName,rooms.Floor,rooms.RooCod,rooms.ShortName,rooms.FullName,UNIX_TIMESTAMP(room_check_in.CheckInTime) FROM room_check_in,rooms,buildings,centres,institutions WHERE room_check_in.UsrCod=1 AND room_check_in.CheckInTime=(SELECT MAX(CheckInTime) FROM room_check_in.UsrCod=1) AND room_check_in.RooCod=rooms.RooCod AND rooms.BldCod=buildings.BldCod AND buildings.CtrCod=centres.CtrCod AND centres.InsCod=institutions.InsCod;
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM (SELECT DISTINCT degrees.CtrCod FROM crs_usr,courses,degrees WHERE crs_usr.UsrCod=1346 AND crs_usr.CrsCod=courses.CrsCod AND courses.DegCod=degrees.DegCod) AS centres1,(SELECT DISTINCT degrees.CtrCod FROM crs_usr,courses,degrees WHERE crs_usr.UsrCod=1331 AND crs_usr.CrsCod=courses.CrsCod AND courses.DegCod=degrees.DegCod) AS centres2 WHERE centres1.CtrCod=centres2.CtrCod;
|
||||||
|
|
377
swad_API.c
377
swad_API.c
|
@ -166,8 +166,9 @@ static const char *API_Functions[1 + API_NUM_FUNCTIONS] =
|
||||||
[API_getMatches ] = "getMatches", // 29
|
[API_getMatches ] = "getMatches", // 29
|
||||||
[API_getMatchStatus ] = "getMatchStatus", // 30
|
[API_getMatchStatus ] = "getMatchStatus", // 30
|
||||||
[API_answerMatchQuestion ] = "answerMatchQuestion", // 31
|
[API_answerMatchQuestion ] = "answerMatchQuestion", // 31
|
||||||
[API_getLocations ] = "getLocations", // 32
|
[API_getLocation ] = "getLocation", // 32
|
||||||
[API_sendCurrentLocation ] = "sendCurrentLocation", // 33
|
[API_sendMyLocation ] = "sendMyLocation", // 33
|
||||||
|
[API_getLastLocation ] = "getLastLocation", // 34
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Web service roles (they do not match internal swad-core roles) */
|
/* Web service roles (they do not match internal swad-core roles) */
|
||||||
|
@ -272,6 +273,14 @@ static void API_ListDir (unsigned Level,const char *Path,const char *PathInTree)
|
||||||
static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,const char *FileName);
|
static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,const char *FileName);
|
||||||
static void API_IndentXMLLine (unsigned Level);
|
static void API_IndentXMLLine (unsigned Level);
|
||||||
|
|
||||||
|
static void API_GetDataOfLocation (struct soap *soap,
|
||||||
|
struct swad__location *location,
|
||||||
|
time_t *CheckInTime,
|
||||||
|
MYSQL_RES **mysql_res,
|
||||||
|
unsigned NumLocs);
|
||||||
|
static void API_ResetLocation (struct soap *soap,
|
||||||
|
struct swad__location *location);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******* Function called when a web service if required by a plugin **********/
|
/******* Function called when a web service if required by a plugin **********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -5894,20 +5903,18 @@ int swad__getMarks (struct soap *soap,
|
||||||
/**************** Get locations associated to a MAC address ******************/
|
/**************** Get locations associated to a MAC address ******************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
int swad__getLocations (struct soap *soap,
|
int swad__getLocation (struct soap *soap,
|
||||||
char *wsKey,char *MAC, // input
|
char *wsKey,char *MAC, // input
|
||||||
struct swad__getLocationsOutput *getLocationsOut) // output
|
struct swad__getLocationOutput *getLocationOut) // output
|
||||||
{
|
{
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
unsigned long MACnum;
|
unsigned long MACnum;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
|
||||||
unsigned NumLocs;
|
unsigned NumLocs;
|
||||||
size_t Length;
|
|
||||||
|
|
||||||
/***** Initializations *****/
|
/***** Initializations *****/
|
||||||
API_Set_gSOAP_RuntimeEnv (soap);
|
API_Set_gSOAP_RuntimeEnv (soap);
|
||||||
Gbl.WebService.Function = API_getLocations;
|
Gbl.WebService.Function = API_getLocation;
|
||||||
|
|
||||||
/***** Check web service key *****/
|
/***** Check web service key *****/
|
||||||
if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK)
|
if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK)
|
||||||
|
@ -5956,113 +5963,10 @@ int swad__getLocations (struct soap *soap,
|
||||||
" ORDER BY rooms.Capacity DESC LIMIT 1", // Get the biggest room
|
" ORDER BY rooms.Capacity DESC LIMIT 1", // Get the biggest room
|
||||||
MACnum);
|
MACnum);
|
||||||
|
|
||||||
if (NumLocs) // Rooms found
|
API_GetDataOfLocation (soap,
|
||||||
{
|
&(getLocationOut->location),
|
||||||
/* Get next location */
|
NULL, // Don't get check in time
|
||||||
row = mysql_fetch_row (mysql_res);
|
&mysql_res,NumLocs);
|
||||||
/*
|
|
||||||
institutions.InsCod // row[ 0]
|
|
||||||
institutions.ShortName // row[ 1]
|
|
||||||
institutions.FullName // row[ 2]
|
|
||||||
centres.CtrCod // row[ 3]
|
|
||||||
centres.ShortName // row[ 4]
|
|
||||||
centres.FullName // row[ 5]
|
|
||||||
buildings.BldCod // row[ 6]
|
|
||||||
buildings.ShortName // row[ 7]
|
|
||||||
buildings.FullName // row[ 8]
|
|
||||||
rooms.Floor // row[ 9]
|
|
||||||
rooms.RooCod // row[10]
|
|
||||||
rooms.ShortName // row[11]
|
|
||||||
rooms.FullName // row[12]
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Get institution code (row[0]) */
|
|
||||||
getLocationsOut->institutionCode = (int) Str_ConvertStrCodToLongCod (row[0]);
|
|
||||||
|
|
||||||
/* Get institution short name (row[1]) */
|
|
||||||
Length = strlen (row[1]);
|
|
||||||
getLocationsOut->institutionShortName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->institutionShortName,row[1],Length);
|
|
||||||
|
|
||||||
/* Get institution full name (row[2]) */
|
|
||||||
Length = strlen (row[2]);
|
|
||||||
getLocationsOut->institutionFullName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->institutionFullName,row[2],Length);
|
|
||||||
|
|
||||||
/* Get center code (row[3]) */
|
|
||||||
getLocationsOut->centerCode = (int) Str_ConvertStrCodToLongCod (row[3]);
|
|
||||||
|
|
||||||
/* Get center short name (row[4]) */
|
|
||||||
Length = strlen (row[4]);
|
|
||||||
getLocationsOut->centerShortName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->centerShortName,row[4],Length);
|
|
||||||
|
|
||||||
/* Get center full name (row[5]) */
|
|
||||||
Length = strlen (row[5]);
|
|
||||||
getLocationsOut->centerFullName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->centerFullName,row[5],Length);
|
|
||||||
|
|
||||||
/* Get building code (row[6]) */
|
|
||||||
getLocationsOut->buildingCode = (int) Str_ConvertStrCodToLongCod (row[6]);
|
|
||||||
|
|
||||||
/* Get building short name (row[7]) */
|
|
||||||
Length = strlen (row[7]);
|
|
||||||
getLocationsOut->buildingShortName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->buildingShortName,row[7],Length);
|
|
||||||
|
|
||||||
/* Get building full name (row[8]) */
|
|
||||||
Length = strlen (row[8]);
|
|
||||||
getLocationsOut->buildingFullName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->buildingFullName,row[8],Length);
|
|
||||||
|
|
||||||
/* Get floor (row[9]) */
|
|
||||||
getLocationsOut->floor = (int) Str_ConvertStrCodToLongCod (row[9]);
|
|
||||||
|
|
||||||
/* Get room code (row[10]) */
|
|
||||||
getLocationsOut->roomCode = (int) Str_ConvertStrCodToLongCod (row[10]);
|
|
||||||
|
|
||||||
/* Get room short name (row[11]) */
|
|
||||||
Length = strlen (row[11]);
|
|
||||||
getLocationsOut->roomShortName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->roomShortName,row[11],Length);
|
|
||||||
|
|
||||||
/* Get room full name (row[12]) */
|
|
||||||
Length = strlen (row[12]);
|
|
||||||
getLocationsOut->roomFullName = (char *) soap_malloc (soap,Length + 1);
|
|
||||||
Str_Copy (getLocationsOut->roomFullName,row[12],Length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* No room found ==> reset output */
|
|
||||||
getLocationsOut->institutionCode = -1;
|
|
||||||
getLocationsOut->institutionShortName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->institutionShortName[0] = '\0';
|
|
||||||
getLocationsOut->institutionFullName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->institutionFullName[0] = '\0';
|
|
||||||
|
|
||||||
getLocationsOut->centerCode = -1;
|
|
||||||
getLocationsOut->centerShortName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->centerShortName[0] = '\0';
|
|
||||||
getLocationsOut->centerFullName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->centerFullName[0] = '\0';
|
|
||||||
|
|
||||||
getLocationsOut->buildingCode = -1;
|
|
||||||
getLocationsOut->buildingShortName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->buildingShortName[0] = '\0';
|
|
||||||
getLocationsOut->buildingFullName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->buildingFullName[0] = '\0';
|
|
||||||
|
|
||||||
getLocationsOut->floor = 0;
|
|
||||||
|
|
||||||
getLocationsOut->roomCode = -1;
|
|
||||||
getLocationsOut->roomShortName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->roomShortName[0] = '\0';
|
|
||||||
getLocationsOut->roomFullName = (char *) soap_malloc (soap,1);
|
|
||||||
getLocationsOut->roomFullName[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
|
||||||
|
|
||||||
return SOAP_OK;
|
return SOAP_OK;
|
||||||
}
|
}
|
||||||
|
@ -6071,19 +5975,19 @@ int swad__getLocations (struct soap *soap,
|
||||||
/***************** Check in (send user's current location) *******************/
|
/***************** Check in (send user's current location) *******************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
int swad__sendCurrentLocation (struct soap *soap,
|
int swad__sendMyLocation (struct soap *soap,
|
||||||
char *wsKey,int roomCode, // input
|
char *wsKey,int roomCode, // input
|
||||||
struct swad__sendCurrentLocationOutput *sendCurrentLocationOut) // output
|
struct swad__sendMyLocationOutput *sendMyLocationOut) // output
|
||||||
{
|
{
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
long ChkCod;
|
long ChkCod;
|
||||||
|
|
||||||
/***** Initializations *****/
|
/***** Initializations *****/
|
||||||
API_Set_gSOAP_RuntimeEnv (soap);
|
API_Set_gSOAP_RuntimeEnv (soap);
|
||||||
Gbl.WebService.Function = API_sendCurrentLocation;
|
Gbl.WebService.Function = API_sendMyLocation;
|
||||||
|
|
||||||
/***** Default values returned on error *****/
|
/***** Default values returned on error *****/
|
||||||
sendCurrentLocationOut->success = 0; // error
|
sendMyLocationOut->success = 0; // error
|
||||||
|
|
||||||
/***** Check web service key *****/
|
/***** Check web service key *****/
|
||||||
if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK)
|
if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK)
|
||||||
|
@ -6113,7 +6017,242 @@ int swad__sendCurrentLocation (struct soap *soap,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,roomCode);
|
Gbl.Usrs.Me.UsrDat.UsrCod,roomCode);
|
||||||
|
|
||||||
/***** Return notification code *****/
|
/***** Return notification code *****/
|
||||||
sendCurrentLocationOut->success = (ChkCod > 0) ? 1 : 0;
|
sendMyLocationOut->success = (ChkCod > 0) ? 1 : 0;
|
||||||
|
|
||||||
return SOAP_OK;
|
return SOAP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************** Check in (send user's current location) *******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
int swad__getLastLocation (struct soap *soap,
|
||||||
|
char *wsKey,int userCode, // input
|
||||||
|
struct swad__getLastLocationOutput *getLastLocationOut) // output
|
||||||
|
{
|
||||||
|
int ReturnCode;
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
unsigned NumLocs;
|
||||||
|
|
||||||
|
/***** Initializations *****/
|
||||||
|
API_Set_gSOAP_RuntimeEnv (soap);
|
||||||
|
Gbl.WebService.Function = API_getLastLocation;
|
||||||
|
|
||||||
|
/***** Check web service key *****/
|
||||||
|
if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK)
|
||||||
|
return ReturnCode;
|
||||||
|
if (Gbl.Usrs.Me.UsrDat.UsrCod < 0) // Web service key does not exist in database
|
||||||
|
return soap_receiver_fault (soap,
|
||||||
|
"Bad web service key",
|
||||||
|
"Web service key does not exist in database");
|
||||||
|
|
||||||
|
/***** Check if I can see user's location *****/
|
||||||
|
/*
|
||||||
|
I can only consult the location of another user
|
||||||
|
if the intersection of the centers of our courses is not empty.
|
||||||
|
The other user does not have to share any course with me,
|
||||||
|
but at least some course of each one has to share center.
|
||||||
|
*/
|
||||||
|
if (DB_QueryCOUNT ("can not get session data",
|
||||||
|
"SELECT COUNT(*) FROM "
|
||||||
|
"(SELECT DISTINCT degrees.CtrCod"
|
||||||
|
" FROM crs_usr,courses,degrees"
|
||||||
|
" WHERE crs_usr.UsrCod=%ld"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod) AS C1," // centres of my courses
|
||||||
|
"(SELECT DISTINCT degrees.CtrCod"
|
||||||
|
" FROM crs_usr,courses,degrees"
|
||||||
|
" WHERE crs_usr.UsrCod=%d"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod) AS C2" // centres of user's courses
|
||||||
|
" WHERE C1.CtrCod=C2.CtrCod",
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
userCode))
|
||||||
|
{
|
||||||
|
/***** Get list of locations *****/
|
||||||
|
NumLocs = (unsigned)
|
||||||
|
DB_QuerySELECT (&mysql_res,"can not get matches",
|
||||||
|
"SELECT institutions.InsCod," // row[ 0]
|
||||||
|
"institutions.ShortName," // row[ 1]
|
||||||
|
"institutions.FullName," // row[ 2]
|
||||||
|
"centres.CtrCod," // row[ 3]
|
||||||
|
"centres.ShortName," // row[ 4]
|
||||||
|
"centres.FullName," // row[ 5]
|
||||||
|
"buildings.BldCod," // row[ 6]
|
||||||
|
"buildings.ShortName," // row[ 7]
|
||||||
|
"buildings.FullName," // row[ 8]
|
||||||
|
"rooms.Floor," // row[ 9]
|
||||||
|
"rooms.RooCod," // row[10]
|
||||||
|
"rooms.ShortName," // row[11]
|
||||||
|
"rooms.FullName," // row[12]
|
||||||
|
"UNIX_TIMESTAMP(room_check_in.CheckInTime)" // row[13]
|
||||||
|
" FROM room_check_in,rooms,buildings,centres,institutions"
|
||||||
|
" WHERE room_check_in.UsrCod=%d"
|
||||||
|
" AND room_check_in.ChkCod="
|
||||||
|
"(SELECT ChkCod FROM room_check_in"
|
||||||
|
" WHERE UsrCod=%d"
|
||||||
|
" ORDER BY ChkCod DESC LIMIT 1)" // Faster than SELECT MAX
|
||||||
|
" AND room_check_in.RooCod=rooms.RooCod"
|
||||||
|
" AND rooms.BldCod=buildings.BldCod"
|
||||||
|
" AND buildings.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod=institutions.InsCod",
|
||||||
|
userCode,userCode);
|
||||||
|
API_GetDataOfLocation (soap,
|
||||||
|
&(getLastLocationOut->location),
|
||||||
|
&(getLastLocationOut->checkinTime), // Get check in time
|
||||||
|
&mysql_res,NumLocs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* I can not see user's location ==> reset output */
|
||||||
|
API_ResetLocation (soap, &(getLastLocationOut->location));
|
||||||
|
getLastLocationOut->checkinTime = 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SOAP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Get assignment data *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void API_GetDataOfLocation (struct soap *soap,
|
||||||
|
struct swad__location *location,
|
||||||
|
time_t *CheckInTime,
|
||||||
|
MYSQL_RES **mysql_res,
|
||||||
|
unsigned NumLocs)
|
||||||
|
{
|
||||||
|
MYSQL_ROW row;
|
||||||
|
size_t Length;
|
||||||
|
|
||||||
|
/***** Get data of location from database *****/
|
||||||
|
if (NumLocs) // Rooms found
|
||||||
|
{
|
||||||
|
/* Get row */
|
||||||
|
row = mysql_fetch_row (*mysql_res);
|
||||||
|
/*
|
||||||
|
institutions.InsCod // row[ 0]
|
||||||
|
institutions.ShortName // row[ 1]
|
||||||
|
institutions.FullName // row[ 2]
|
||||||
|
centres.CtrCod // row[ 3]
|
||||||
|
centres.ShortName // row[ 4]
|
||||||
|
centres.FullName // row[ 5]
|
||||||
|
buildings.BldCod // row[ 6]
|
||||||
|
buildings.ShortName // row[ 7]
|
||||||
|
buildings.FullName // row[ 8]
|
||||||
|
rooms.Floor // row[ 9]
|
||||||
|
rooms.RooCod // row[10]
|
||||||
|
rooms.ShortName // row[11]
|
||||||
|
rooms.FullName // row[12]
|
||||||
|
UNIX_TIMESTAMP(room_check_in.CheckInTime) // row[13] (optional)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Get institution code (row[0]) */
|
||||||
|
location->institutionCode = (int) Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
|
||||||
|
/* Get institution short name (row[1]) */
|
||||||
|
Length = strlen (row[1]);
|
||||||
|
location->institutionShortName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->institutionShortName,row[1],Length);
|
||||||
|
|
||||||
|
/* Get institution full name (row[2]) */
|
||||||
|
Length = strlen (row[2]);
|
||||||
|
location->institutionFullName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->institutionFullName,row[2],Length);
|
||||||
|
|
||||||
|
/* Get center code (row[3]) */
|
||||||
|
location->centerCode = (int) Str_ConvertStrCodToLongCod (row[3]);
|
||||||
|
|
||||||
|
/* Get center short name (row[4]) */
|
||||||
|
Length = strlen (row[4]);
|
||||||
|
location->centerShortName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->centerShortName,row[4],Length);
|
||||||
|
|
||||||
|
/* Get center full name (row[5]) */
|
||||||
|
Length = strlen (row[5]);
|
||||||
|
location->centerFullName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->centerFullName,row[5],Length);
|
||||||
|
|
||||||
|
/* Get building code (row[6]) */
|
||||||
|
location->buildingCode = (int) Str_ConvertStrCodToLongCod (row[6]);
|
||||||
|
|
||||||
|
/* Get building short name (row[7]) */
|
||||||
|
Length = strlen (row[7]);
|
||||||
|
location->buildingShortName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->buildingShortName,row[7],Length);
|
||||||
|
|
||||||
|
/* Get building full name (row[8]) */
|
||||||
|
Length = strlen (row[8]);
|
||||||
|
location->buildingFullName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->buildingFullName,row[8],Length);
|
||||||
|
|
||||||
|
/* Get floor (row[9]) */
|
||||||
|
location->floor = (int) Str_ConvertStrCodToLongCod (row[9]);
|
||||||
|
|
||||||
|
/* Get room code (row[10]) */
|
||||||
|
location->roomCode = (int) Str_ConvertStrCodToLongCod (row[10]);
|
||||||
|
|
||||||
|
/* Get room short name (row[11]) */
|
||||||
|
Length = strlen (row[11]);
|
||||||
|
location->roomShortName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->roomShortName,row[11],Length);
|
||||||
|
|
||||||
|
/* Get room full name (row[12]) */
|
||||||
|
Length = strlen (row[12]);
|
||||||
|
location->roomFullName = (char *) soap_malloc (soap,Length + 1);
|
||||||
|
Str_Copy (location->roomFullName,row[12],Length);
|
||||||
|
|
||||||
|
/* Get check in time (row[13]) */
|
||||||
|
if (CheckInTime)
|
||||||
|
{
|
||||||
|
*CheckInTime = 0L;
|
||||||
|
if (row[13])
|
||||||
|
sscanf (row[13],"%ld",CheckInTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No room found ==> reset output */
|
||||||
|
API_ResetLocation (soap,location);
|
||||||
|
|
||||||
|
if (CheckInTime)
|
||||||
|
*CheckInTime = 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (mysql_res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Get assignment data *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void API_ResetLocation (struct soap *soap,
|
||||||
|
struct swad__location *location)
|
||||||
|
{
|
||||||
|
location->institutionCode = -1;
|
||||||
|
location->institutionShortName = (char *) soap_malloc (soap,1);
|
||||||
|
location->institutionShortName[0] = '\0';
|
||||||
|
location->institutionFullName = (char *) soap_malloc (soap,1);
|
||||||
|
location->institutionFullName[0] = '\0';
|
||||||
|
|
||||||
|
location->centerCode = -1;
|
||||||
|
location->centerShortName = (char *) soap_malloc (soap,1);
|
||||||
|
location->centerShortName[0] = '\0';
|
||||||
|
location->centerFullName = (char *) soap_malloc (soap,1);
|
||||||
|
location->centerFullName[0] = '\0';
|
||||||
|
|
||||||
|
location->buildingCode = -1;
|
||||||
|
location->buildingShortName = (char *) soap_malloc (soap,1);
|
||||||
|
location->buildingShortName[0] = '\0';
|
||||||
|
location->buildingFullName = (char *) soap_malloc (soap,1);
|
||||||
|
location->buildingFullName[0] = '\0';
|
||||||
|
|
||||||
|
location->floor = 0;
|
||||||
|
|
||||||
|
location->roomCode = -1;
|
||||||
|
location->roomShortName = (char *) soap_malloc (soap,1);
|
||||||
|
location->roomShortName[0] = '\0';
|
||||||
|
location->roomFullName = (char *) soap_malloc (soap,1);
|
||||||
|
location->roomFullName[0] = '\0';
|
||||||
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
/***************************** Public constants ******************************/
|
/***************************** Public constants ******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define API_NUM_FUNCTIONS 33
|
#define API_NUM_FUNCTIONS 34
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Public types ********************************/
|
/******************************* Public types ********************************/
|
||||||
|
@ -72,8 +72,9 @@ typedef enum
|
||||||
API_getMatches = 29,
|
API_getMatches = 29,
|
||||||
API_getMatchStatus = 30,
|
API_getMatchStatus = 30,
|
||||||
API_answerMatchQuestion = 31,
|
API_answerMatchQuestion = 31,
|
||||||
API_getLocations = 32,
|
API_getLocation = 32,
|
||||||
API_sendCurrentLocation = 33,
|
API_sendMyLocation = 33,
|
||||||
|
API_getLastLocation = 34,
|
||||||
} API_Function_t;
|
} API_Function_t;
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -556,12 +556,15 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
||||||
En OpenSWAD:
|
En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 19.247.1 (2020-05-25)"
|
#define Log_PLATFORM_VERSION "SWAD 19.248 (2020-05-25)"
|
||||||
#define CSS_FILE "swad19.238.2.css"
|
#define CSS_FILE "swad19.238.2.css"
|
||||||
#define JS_FILE "swad19.246.1.js"
|
#define JS_FILE "swad19.246.1.js"
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
Version 19.248.1: May 30, 2020 Exam session results can not be marked as visible if end of time is not in the past. (? lines)
|
||||||
|
Version 19.248: May 30, 2020 New API function getLastLocation. (302787 lines)
|
||||||
Version 19.247.1: May 29, 2020 Do not show exam results in hidden exams or hidden exam sessions. (302646 lines)
|
Version 19.247.1: May 29, 2020 Do not show exam results in hidden exams or hidden exam sessions. (302646 lines)
|
||||||
Version 19.247: May 24, 2020 New API function getCurrentLocation. (302622 lines)
|
Version 19.247: May 24, 2020 New API function sendMyCurrentLocation. (302622 lines)
|
||||||
1 change necessary in database:
|
1 change necessary in database:
|
||||||
CREATE TABLE IF NOT EXISTS room_check_in (ChkCod INT NOT NULL AUTO_INCREMENT,UsrCod INT NOT NULL,RooCod INT NOT NULL,CheckInTime DATETIME NOT NULL,UNIQUE INDEX(ChkCod),INDEX(UsrCod,CheckInTime),INDEX(CheckInTime));
|
CREATE TABLE IF NOT EXISTS room_check_in (ChkCod INT NOT NULL AUTO_INCREMENT,UsrCod INT NOT NULL,RooCod INT NOT NULL,CheckInTime DATETIME NOT NULL,UNIQUE INDEX(ChkCod),INDEX(UsrCod,CheckInTime),INDEX(CheckInTime));
|
||||||
If you want to use MyISAM:
|
If you want to use MyISAM:
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Sch_MIN_LENGTH_LONGEST_WORD 3
|
#define Sch_MIN_LENGTH_LONGEST_WORD 3
|
||||||
#define Sch_MIN_LENGTH_TOTAL 3 // "A An" is not valid; "A An Ann" is valid
|
#define Sch_MIN_LENGTH_TOTAL 6 // "An Ann" is not valid; "A An Ann" is valid
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Private types ********************************/
|
/****************************** Private types ********************************/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user