mirror of https://github.com/acanas/swad-core.git
Version 21.29: Oct 11, 2021 New module swad_peoject_database for database queries related to projects.
This commit is contained in:
parent
07931f57db
commit
b8644f7c2b
2
Makefile
2
Makefile
|
@ -73,7 +73,7 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
|
|||
swad_password_database.o swad_photo.o swad_photo_database.o \
|
||||
swad_place.o swad_place_database.o swad_plugin.o swad_plugin_database.o \
|
||||
swad_privacy.o swad_profile.o swad_profile_database.o swad_program.o \
|
||||
swad_program_database.o swad_project.o \
|
||||
swad_program_database.o swad_project.o swad_project_database.o \
|
||||
swad_QR.o \
|
||||
swad_record.o swad_report.o swad_role.o swad_room.o swad_RSS.o \
|
||||
swad_scope.o swad_search.o swad_session.o swad_setting.o \
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
#include "swad_profile.h"
|
||||
#include "swad_profile_database.h"
|
||||
#include "swad_project.h"
|
||||
#include "swad_project_database.h"
|
||||
#include "swad_role.h"
|
||||
#include "swad_setting.h"
|
||||
#include "swad_string.h"
|
||||
|
@ -6436,7 +6437,7 @@ static void Brw_PasteClipboard (void)
|
|||
case Brw_ADMI_DOC_PRJ:
|
||||
case Brw_ADMI_ASS_PRJ:
|
||||
PrjCod = Gbl.FileBrowser.Clipboard.Cod;
|
||||
Hie.Crs.CrsCod = Prj_GetCourseOfProject (PrjCod);
|
||||
Hie.Crs.CrsCod = Prj_DB_GetCrsOfPrj (PrjCod);
|
||||
if (Crs_GetDataOfCourseByCod (&Hie.Crs))
|
||||
snprintf (PathOrg,sizeof (PathOrg),"%s/%ld/%s/%02u/%ld/%s",
|
||||
Cfg_PATH_CRS_PRIVATE,Hie.Crs.CrsCod,Cfg_FOLDER_PRJ,
|
||||
|
@ -9226,7 +9227,7 @@ void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod,
|
|||
case Brw_ADMI_ASS_PRJ:
|
||||
/* Cod stores the project code */
|
||||
*GrpCod = -1L;
|
||||
*CrsCod = Crs.CrsCod = Prj_GetCourseOfProject (Cod);
|
||||
*CrsCod = Crs.CrsCod = Prj_DB_GetCrsOfPrj (Cod);
|
||||
Crs_GetDataOfCourseByCod (&Crs);
|
||||
*DegCod = Deg.DegCod = Crs.DegCod;
|
||||
Deg_GetDataOfDegreeByCod (&Deg);
|
||||
|
|
|
@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
|
|||
|
||||
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||
*/
|
||||
#define Log_PLATFORM_VERSION "SWAD 21.28.1 (2021-10-10)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 21.29 (2021-10-11)"
|
||||
#define CSS_FILE "swad20.45.css"
|
||||
#define JS_FILE "swad20.69.1.js"
|
||||
/*
|
||||
TODO: Rename CENTRE to CENTER in help wiki.
|
||||
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
||||
|
||||
Version 21.29: Oct 11, 2021 New module swad_peoject_database for database queries related to projects. (319208 lines)
|
||||
Version 21.28.1: Oct 10, 2021 Code refactoring in projects. (318975 lines)
|
||||
Version 21.28: Oct 09, 2021 New module swad_program_database for database queries related to course program. (319013 lines)
|
||||
Version 21.27.1: Oct 07, 2021 Queries moved to module swad_profile_database. (318855 lines)
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include "swad_program.h"
|
||||
#include "swad_program_database.h"
|
||||
#include "swad_project.h"
|
||||
#include "swad_project_database.h"
|
||||
#include "swad_role.h"
|
||||
#include "swad_survey.h"
|
||||
#include "swad_test.h"
|
||||
|
|
1087
swad_project.c
1087
swad_project.c
File diff suppressed because it is too large
Load Diff
|
@ -214,7 +214,6 @@ void Prj_AllocMemProject (struct Prj_Project *Prj);
|
|||
void Prj_FreeMemProject (struct Prj_Project *Prj);
|
||||
|
||||
void Prj_GetDataOfProjectByCod (struct Prj_Project *Prj);
|
||||
long Prj_GetCourseOfProject (long PrjCod);
|
||||
void Prj_FreeListProjects (struct Prj_Projects *Projects);
|
||||
|
||||
void Prj_PutParamPrjCod (long PrjCod);
|
||||
|
@ -238,7 +237,4 @@ void Prj_UnloProjectEdition (void);
|
|||
void Prj_RemoveCrsProjects (long CrsCod);
|
||||
void Prj_RemoveUsrFromProjects (long UsrCod);
|
||||
|
||||
unsigned Prj_DB_GetNumCoursesWithProjects (HieLvl_Level_t Scope);
|
||||
unsigned Prj_DB_GetNumProjects (HieLvl_Level_t Scope);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,854 @@
|
|||
// swad_project_database.c: projects (final degree projects, thesis), operations with database
|
||||
|
||||
/*
|
||||
SWAD (Shared Workspace At a Distance),
|
||||
is a web platform developed at the University of Granada (Spain),
|
||||
and used to support university teaching.
|
||||
|
||||
This file is part of SWAD core.
|
||||
Copyright (C) 1999-2021 Antonio Cañas Vargas
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
/********************************* Headers ***********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _GNU_SOURCE // For asprintf
|
||||
#include <stdio.h> // For asprintf
|
||||
|
||||
#include "swad_database.h"
|
||||
#include "swad_error.h"
|
||||
#include "swad_global.h"
|
||||
#include "swad_project.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
extern struct Globals Gbl;
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Public constants and types ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/***** Enum field in database for types of proposal *****/
|
||||
const char *Prj_Proposal_DB[Prj_NUM_PROPOSAL_TYPES] =
|
||||
{
|
||||
[Prj_PROPOSAL_NEW ] = "new",
|
||||
[Prj_PROPOSAL_MODIFIED ] = "modified",
|
||||
[Prj_PROPOSAL_UNMODIFIED] = "unmodified",
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Private constants and types ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Private variables *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/*****************************************************************************/
|
||||
/************ Update configuration of projects for current course ************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_UpdateCrsPrjsConfig (bool Editable)
|
||||
{
|
||||
DB_QueryREPLACE ("can not save configuration of projects",
|
||||
"REPLACE INTO prj_config"
|
||||
" (CrsCod,Editable)"
|
||||
" VALUES"
|
||||
" (%ld,'%c')",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
Editable ? 'Y' :
|
||||
'N');
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************************** Lock project edition ***************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_LockProjectEdition (long PrjCod)
|
||||
{
|
||||
DB_QueryUPDATE ("can not lock project edition",
|
||||
"UPDATE prj_projects"
|
||||
" SET Locked='Y'"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld",
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Unlock project edition ***************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_UnlockProjectEdition (long PrjCod)
|
||||
{
|
||||
DB_QueryUPDATE ("can not lock project edition",
|
||||
"UPDATE prj_projects"
|
||||
" SET Locked='N'"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Create a new project *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
long Prj_DB_CreateProject (const struct Prj_Project *Prj)
|
||||
{
|
||||
return
|
||||
DB_QueryINSERTandReturnCode ("can not create new project",
|
||||
"INSERT INTO prj_projects"
|
||||
" (CrsCod,DptCod,Hidden,Assigned,NumStds,Proposal,"
|
||||
"CreatTime,ModifTime,"
|
||||
"Title,Description,Knowledge,Materials,URL)"
|
||||
" VALUES"
|
||||
" (%ld,%ld,'%c','%c',%u,'%s',"
|
||||
"FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
|
||||
"'%s','%s','%s','%s','%s')",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
Prj->DptCod,
|
||||
Prj->Hidden == Prj_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Prj->Assigned == Prj_ASSIGNED ? 'Y' :
|
||||
'N',
|
||||
Prj->NumStds,
|
||||
Prj_Proposal_DB[Prj->Proposal],
|
||||
Prj->CreatTime,
|
||||
Prj->ModifTime,
|
||||
Prj->Title,
|
||||
Prj->Description,
|
||||
Prj->Knowledge,
|
||||
Prj->Materials,
|
||||
Prj->URL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********************** Update an existing project **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_UpdateProject (const struct Prj_Project *Prj)
|
||||
{
|
||||
DB_QueryUPDATE ("can not update project",
|
||||
"UPDATE prj_projects"
|
||||
" SET DptCod=%ld,"
|
||||
"Hidden='%c',"
|
||||
"Assigned='%c',"
|
||||
"NumStds=%u,"
|
||||
"Proposal='%s',"
|
||||
"ModifTime=FROM_UNIXTIME(%ld),"
|
||||
"Title='%s',"
|
||||
"Description='%s',"
|
||||
"Knowledge='%s',"
|
||||
"Materials='%s',"
|
||||
"URL='%s'"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
Prj->DptCod,
|
||||
Prj->Hidden == Prj_HIDDEN ? 'Y' :
|
||||
'N',
|
||||
Prj->Assigned == Prj_ASSIGNED ? 'Y' :
|
||||
'N',
|
||||
Prj->NumStds,
|
||||
Prj_Proposal_DB[Prj->Proposal],
|
||||
Prj->ModifTime,
|
||||
Prj->Title,
|
||||
Prj->Description,
|
||||
Prj->Knowledge,
|
||||
Prj->Materials,
|
||||
Prj->URL,
|
||||
Prj->PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Add user to project **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrCod)
|
||||
{
|
||||
DB_QueryREPLACE ("can not add user to project",
|
||||
"REPLACE INTO prj_users"
|
||||
" (PrjCod,RoleInProject,UsrCod)"
|
||||
" VALUES"
|
||||
" (%ld,%u,%ld)",
|
||||
PrjCod,
|
||||
(unsigned) RoleInProject,
|
||||
UsrCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Hide a project *******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_HideUnhideProject (long PrjCod,char YN)
|
||||
{
|
||||
DB_QueryUPDATE ("can not hide project",
|
||||
"UPDATE prj_projects"
|
||||
" SET Hidden='%c'"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
YN,
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************************** Get projects *******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
|
||||
const struct Prj_Projects *Projects,
|
||||
const char *UsrsSubQuery) // NULL if no users
|
||||
{
|
||||
char *AssignSubQuery;
|
||||
char *HidVisSubQuery;
|
||||
char *DptCodSubQuery;
|
||||
static const char *OrderBySubQuery[Prj_NUM_ORDERS] =
|
||||
{
|
||||
[Prj_ORDER_START_TIME] = "prj_projects.CreatTime DESC,"
|
||||
"prj_projects.ModifTime DESC,"
|
||||
"prj_projects.Title",
|
||||
[Prj_ORDER_END_TIME ] = "prj_projects.ModifTime DESC,"
|
||||
"prj_projects.CreatTime DESC,"
|
||||
"prj_projects.Title",
|
||||
[Prj_ORDER_TITLE ] = "prj_projects.Title,"
|
||||
"prj_projects.CreatTime DESC,"
|
||||
"prj_projects.ModifTime DESC",
|
||||
[Prj_ORDER_DEPARTMENT] = "dpt_departments.FullName,"
|
||||
"prj_projects.CreatTime DESC,"
|
||||
"prj_projects.ModifTime DESC,"
|
||||
"prj_projects.Title",
|
||||
};
|
||||
unsigned NumPrjsFromDB = 0;
|
||||
|
||||
/* Assigned subquery */
|
||||
switch (Projects->Filter.Assign)
|
||||
{
|
||||
case (1 << Prj_ASSIGNED): // Assigned projects
|
||||
if (asprintf (&AssignSubQuery," AND prj_projects.Assigned='Y'") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
case (1 << Prj_NONASSIG): // Non-assigned projects
|
||||
if (asprintf (&AssignSubQuery," AND prj_projects.Assigned='N'") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
default: // All projects
|
||||
if (asprintf (&AssignSubQuery,"%s","") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Hidden subquery */
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD: // Students can view only visible projects
|
||||
if (asprintf (&HidVisSubQuery," AND prj_projects.Hidden='N'") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
switch (Projects->Filter.Hidden)
|
||||
{
|
||||
case (1 << Prj_HIDDEN): // Hidden projects
|
||||
if (asprintf (&HidVisSubQuery," AND prj_projects.Hidden='Y'") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
case (1 << Prj_VISIBL): // Visible projects
|
||||
if (asprintf (&HidVisSubQuery," AND prj_projects.Hidden='N'") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
default: // All projects
|
||||
if (asprintf (&HidVisSubQuery,"%s","") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Err_WrongRoleExit ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Department subquery */
|
||||
if (Projects->Filter.DptCod >= 0)
|
||||
{
|
||||
if (asprintf (&DptCodSubQuery," AND prj_projects.DptCod=%ld",
|
||||
Projects->Filter.DptCod) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
}
|
||||
else // Any department
|
||||
{
|
||||
if (asprintf (&DptCodSubQuery,"%s","") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
}
|
||||
|
||||
/* Query */
|
||||
switch (Projects->Filter.Who)
|
||||
{
|
||||
case Usr_WHO_ME:
|
||||
/* Get list of projects */
|
||||
switch (Projects->SelectedOrder)
|
||||
{
|
||||
case Prj_ORDER_START_TIME:
|
||||
case Prj_ORDER_END_TIME:
|
||||
case Prj_ORDER_TITLE:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects,"
|
||||
"prj_users"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod"
|
||||
" AND prj_users.UsrCod=%ld"
|
||||
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
case Prj_ORDER_DEPARTMENT:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects LEFT JOIN dpt_departments,"
|
||||
"prj_users"
|
||||
" ON prj_projects.DptCod=dpt_departments.DptCod"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod"
|
||||
" AND prj_users.UsrCod=%ld"
|
||||
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Usr_WHO_SELECTED:
|
||||
if (UsrsSubQuery)
|
||||
{
|
||||
/* Get list of projects */
|
||||
switch (Projects->SelectedOrder)
|
||||
{
|
||||
case Prj_ORDER_START_TIME:
|
||||
case Prj_ORDER_END_TIME:
|
||||
case Prj_ORDER_TITLE:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects,"
|
||||
"prj_users"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod"
|
||||
" AND prj_users.UsrCod IN (%s)"
|
||||
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
UsrsSubQuery,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
case Prj_ORDER_DEPARTMENT:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects LEFT JOIN dpt_departments,"
|
||||
"prj_users"
|
||||
" ON prj_projects.DptCod=dpt_departments.DptCod"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod"
|
||||
" AND prj_users.UsrCod IN (%s)"
|
||||
" GROUP BY prj_projects.PrjCod" // To not repeat projects (DISTINCT can not be used)
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
UsrsSubQuery,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Usr_WHO_ALL:
|
||||
/* Get list of projects */
|
||||
switch (Projects->SelectedOrder)
|
||||
{
|
||||
case Prj_ORDER_START_TIME:
|
||||
case Prj_ORDER_END_TIME:
|
||||
case Prj_ORDER_TITLE:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
case Prj_ORDER_DEPARTMENT:
|
||||
NumPrjsFromDB = (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get projects",
|
||||
"SELECT prj_projects.PrjCod"
|
||||
" FROM prj_projects LEFT JOIN dpt_departments"
|
||||
" ON prj_projects.DptCod=dpt_departments.DptCod"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
"%s"
|
||||
"%s"
|
||||
"%s"
|
||||
" ORDER BY %s",
|
||||
Gbl.Hierarchy.Crs.CrsCod,
|
||||
AssignSubQuery,
|
||||
HidVisSubQuery,
|
||||
DptCodSubQuery,
|
||||
OrderBySubQuery[Projects->SelectedOrder]);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Err_WrongWhoExit ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Free allocated memory for subqueries */
|
||||
free (AssignSubQuery);
|
||||
free (HidVisSubQuery);
|
||||
free (DptCodSubQuery);
|
||||
|
||||
return NumPrjsFromDB;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** Get configuration of projects for current course *************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetCrsPrjsConfig (MYSQL_RES **mysql_res)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get configuration of test",
|
||||
"SELECT Editable" // row[0]
|
||||
" FROM prj_config"
|
||||
" WHERE CrsCod=%ld",
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************* Get project data using its code ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetDataOfProjectByCod (MYSQL_RES **mysql_res,long PrjCod)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get project data",
|
||||
"SELECT PrjCod," // row[ 0]
|
||||
"CrsCod," // row[ 1]
|
||||
"DptCod," // row[ 2]
|
||||
"Locked," // row[ 3]
|
||||
"Hidden," // row[ 4]
|
||||
"Assigned," // row[ 5]
|
||||
"NumStds," // row[ 6]
|
||||
"Proposal," // row[ 7]
|
||||
"UNIX_TIMESTAMP(CreatTime)," // row[ 8]
|
||||
"UNIX_TIMESTAMP(ModifTime)," // row[ 9]
|
||||
"Title," // row[10]
|
||||
"Description," // row[11]
|
||||
"Knowledge," // row[12]
|
||||
"Materials," // row[13]
|
||||
"URL" // row[14]
|
||||
" FROM prj_projects"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************* Get some project data to check faults *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get project data",
|
||||
"SELECT Assigned='Y'," // row[0] = 0 / 1
|
||||
"NumStds," // row[1] =
|
||||
"Title<>''," // row[2] = 0 / 1
|
||||
"Description<>''" // row[3] = 0 / 1
|
||||
" FROM prj_projects"
|
||||
" WHERE PrjCod=%ld",
|
||||
PrjCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************** Get number of users with a role in a project ****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetNumUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of users in project",
|
||||
"SELECT COUNT(UsrCod)"
|
||||
" FROM prj_users"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND RoleInProject=%u",
|
||||
PrjCod,
|
||||
(unsigned) RoleInProject);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************** Get users with a role in a project *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetUsrsInPrj (MYSQL_RES **mysql_res,
|
||||
long PrjCod,Prj_RoleInProject_t RoleInProject)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get users in project",
|
||||
"SELECT prj_users.UsrCod," // row[0]
|
||||
"usr_data.Surname1 AS S1," // row[1]
|
||||
"usr_data.Surname2 AS S2," // row[2]
|
||||
"usr_data.FirstName AS FN" // row[3]
|
||||
" FROM prj_users,"
|
||||
"usr_data"
|
||||
" WHERE prj_users.PrjCod=%ld"
|
||||
" AND prj_users.RoleInProject=%u"
|
||||
" AND prj_users.UsrCod=usr_data.UsrCod"
|
||||
" ORDER BY S1,"
|
||||
"S2,"
|
||||
"FN",
|
||||
PrjCod,
|
||||
(unsigned) RoleInProject);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************ Get my roles in a project **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
unsigned Prj_DB_GetMyRolesInPrj (MYSQL_RES **mysql_res,long PrjCod)
|
||||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get my roles in project",
|
||||
"SELECT RoleInProject" // row[0]
|
||||
" FROM prj_users"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND UsrCod=%ld",
|
||||
PrjCod,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Get course of a project **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
long Prj_DB_GetCrsOfPrj (long PrjCod)
|
||||
{
|
||||
/***** Trivial check: project code should be > 0 *****/
|
||||
if (PrjCod <= 0)
|
||||
return -1L;
|
||||
|
||||
/***** Get course code from database *****/
|
||||
return DB_QuerySELECTCode ("can not get project course",
|
||||
"SELECT CrsCod" // row[0]
|
||||
" FROM prj_projects"
|
||||
" WHERE PrjCod=%ld",
|
||||
PrjCod); // Project found...
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************** Get number of courses with projects ********************/
|
||||
/*****************************************************************************/
|
||||
// Returns the number of courses with projects
|
||||
// in this location (all the platform, current degree or current course)
|
||||
|
||||
unsigned Prj_DB_GetNumCoursesWithProjects (HieLvl_Level_t Scope)
|
||||
{
|
||||
/***** Get number of courses with projects from database *****/
|
||||
switch (Scope)
|
||||
{
|
||||
case HieLvl_SYS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT CrsCod)"
|
||||
" FROM prj_projects"
|
||||
" WHERE CrsCod>0");
|
||||
case HieLvl_CTY:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT prj_projects.CrsCod)"
|
||||
" FROM ins_instits,"
|
||||
"ctr_centers,"
|
||||
"deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE ins_instits.CtyCod=%ld"
|
||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Cty.CtyCod);
|
||||
case HieLvl_INS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT prj_projects.CrsCod)"
|
||||
" FROM ctr_centers,"
|
||||
"deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE ctr_centers.InsCod=%ld"
|
||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Ins.InsCod);
|
||||
case HieLvl_CTR:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT prj_projects.CrsCod)"
|
||||
" FROM deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE deg_degrees.CtrCod=%ld"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Ctr.CtrCod);
|
||||
case HieLvl_DEG:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT prj_projects.CrsCod)"
|
||||
" FROM crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE crs_courses.DegCod=%ld"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Deg.DegCod);
|
||||
case HieLvl_CRS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of courses with projects",
|
||||
"SELECT COUNT(DISTINCT CrsCod)"
|
||||
" FROM prj_projects"
|
||||
" WHERE CrsCod=%ld",
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
default:
|
||||
Err_WrongScopeExit ();
|
||||
return 0; // Not reached
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Get number of projects ***************************/
|
||||
/*****************************************************************************/
|
||||
// Returns the number of projects in this location
|
||||
|
||||
unsigned Prj_DB_GetNumProjects (HieLvl_Level_t Scope)
|
||||
{
|
||||
/***** Get number of projects from database *****/
|
||||
switch (Scope)
|
||||
{
|
||||
case HieLvl_SYS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM prj_projects"
|
||||
" WHERE CrsCod>0");
|
||||
case HieLvl_CTY:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM ins_instits,"
|
||||
"ctr_centers,"
|
||||
"deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE ins_instits.CtyCod=%ld"
|
||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Cty.CtyCod);
|
||||
case HieLvl_INS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM ctr_centers,"
|
||||
"deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE ctr_centers.InsCod=%ld"
|
||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Ins.InsCod);
|
||||
case HieLvl_CTR:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM deg_degrees,"
|
||||
"crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE deg_degrees.CtrCod=%ld"
|
||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Ctr.CtrCod);
|
||||
case HieLvl_DEG:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM crs_courses,"
|
||||
"prj_projects"
|
||||
" WHERE crs_courses.DegCod=%ld"
|
||||
" AND crs_courses.CrsCod=prj_projects.CrsCod",
|
||||
Gbl.Hierarchy.Deg.DegCod);
|
||||
case HieLvl_CRS:
|
||||
return (unsigned)
|
||||
DB_QueryCOUNT ("can not get number of projects",
|
||||
"SELECT COUNT(*)"
|
||||
" FROM prj_projects"
|
||||
" WHERE CrsCod=%ld",
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
default:
|
||||
Err_WrongScopeExit ();
|
||||
return 0; // Not reached
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************ Remove user from a project *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveUsrFromPrj (long PrjCod,Prj_RoleInProject_t RoleInPrj,long UsrCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove a user from a project",
|
||||
"DELETE FROM prj_users"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND RoleInProject=%u"
|
||||
" AND UsrCod=%ld",
|
||||
PrjCod,
|
||||
(unsigned) RoleInPrj,
|
||||
UsrCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************* Remove user from all his/her projects *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveUsrFromProjects (long UsrCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove user from projects",
|
||||
"DELETE FROM prj_users"
|
||||
" WHERE UsrCod=%ld",
|
||||
UsrCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************* Remove all users from a project ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveUsrsFromPrj (long PrjCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove project",
|
||||
"DELETE FROM prj_users"
|
||||
" USING prj_projects,"
|
||||
"prj_users"
|
||||
" WHERE prj_projects.PrjCod=%ld"
|
||||
" AND prj_projects.CrsCod=%ld" // Extra check
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod",
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** Remove all users from all projects in a course ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveUsrsFromCrsPrjs (long CrsCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove all the projects in a course",
|
||||
"DELETE FROM prj_users"
|
||||
" USING prj_projects,"
|
||||
"prj_users"
|
||||
" WHERE prj_projects.CrsCod=%ld"
|
||||
" AND prj_projects.PrjCod=prj_users.PrjCod",
|
||||
CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************** Remove configuration of projects in the course **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveConfigOfCrsPrjs (long CrsCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove configuration of projects in a course",
|
||||
"DELETE FROM prj_config"
|
||||
" WHERE CrsCod=%ld",
|
||||
CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************************* Remove project ******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemovePrj (long PrjCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove project",
|
||||
"DELETE FROM prj_projects"
|
||||
" WHERE PrjCod=%ld"
|
||||
" AND CrsCod=%ld", // Extra check
|
||||
PrjCod,
|
||||
Gbl.Hierarchy.Crs.CrsCod);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************* Remove all projects in a course ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_RemoveCrsPrjs (long CrsCod)
|
||||
{
|
||||
DB_QueryDELETE ("can not remove all the projects of a course",
|
||||
"DELETE FROM prj_projects"
|
||||
" WHERE CrsCod=%ld",
|
||||
CrsCod);
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
// swad_project_database.h: projects (final degree projects, thesis), operations with database
|
||||
|
||||
#ifndef _SWAD_PRJ_DB
|
||||
#define _SWAD_PRJ_DB
|
||||
/*
|
||||
SWAD (Shared Workspace At a Distance),
|
||||
is a web platform developed at the University of Granada (Spain),
|
||||
and used to support university teaching.
|
||||
|
||||
This file is part of SWAD core.
|
||||
Copyright (C) 1999-2021 Antonio Cañas Vargas
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
/********************************* Headers ***********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "swad_hierarchy_level.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Public types and constants ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Public prototypes *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Prj_DB_UpdateCrsPrjsConfig (bool Editable);
|
||||
void Prj_DB_LockProjectEdition (long PrjCod);
|
||||
void Prj_DB_UnlockProjectEdition (long PrjCod);
|
||||
long Prj_DB_CreateProject (const struct Prj_Project *Prj);
|
||||
void Prj_DB_UpdateProject (const struct Prj_Project *Prj);
|
||||
void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrCod);
|
||||
void Prj_DB_HideUnhideProject (long PrjCod,char YN);
|
||||
|
||||
unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
|
||||
const struct Prj_Projects *Projects,
|
||||
const char *UsrsSubQuery); // NULL if no users
|
||||
unsigned Prj_DB_GetCrsPrjsConfig (MYSQL_RES **mysql_res);
|
||||
unsigned Prj_DB_GetDataOfProjectByCod (MYSQL_RES **mysql_res,long PrjCod);
|
||||
unsigned Prj_DB_GetPrjDataToCheckFaults (MYSQL_RES **mysql_res,long PrjCod);
|
||||
unsigned Prj_DB_GetNumUsrsInPrj (long PrjCod,Prj_RoleInProject_t RoleInProject);
|
||||
unsigned Prj_DB_GetUsrsInPrj (MYSQL_RES **mysql_res,
|
||||
long PrjCod,Prj_RoleInProject_t RoleInProject);
|
||||
unsigned Prj_DB_GetMyRolesInPrj (MYSQL_RES **mysql_res,long PrjCod);
|
||||
long Prj_DB_GetCrsOfPrj (long PrjCod);
|
||||
unsigned Prj_DB_GetNumCoursesWithProjects (HieLvl_Level_t Scope);
|
||||
unsigned Prj_DB_GetNumProjects (HieLvl_Level_t Scope);
|
||||
|
||||
void Prj_DB_RemoveUsrFromPrj (long PrjCod,Prj_RoleInProject_t RoleInPrj,long UsrCod);
|
||||
void Prj_DB_RemoveUsrFromProjects (long UsrCod);
|
||||
void Prj_DB_RemoveUsrsFromPrj (long PrjCod);
|
||||
void Prj_DB_RemoveUsrsFromCrsPrjs (long CrsCod);
|
||||
void Prj_DB_RemoveConfigOfCrsPrjs (long CrsCod);
|
||||
void Prj_DB_RemovePrj (long PrjCod);
|
||||
void Prj_DB_RemoveCrsPrjs (long CrsCod);
|
||||
|
||||
#endif
|
10
swad_user.c
10
swad_user.c
|
@ -6317,7 +6317,7 @@ void Usr_FreeListSelectedUsrCods (long *LstSelectedUsrCods)
|
|||
|
||||
void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[],
|
||||
unsigned NumUsrsInList,
|
||||
char **SubQueryUsrs)
|
||||
char **UsrsSubQuery)
|
||||
{
|
||||
char SubQueryOneUsr[1 + Cns_MAX_DECIMAL_DIGITS_LONG + 1];
|
||||
unsigned NumUsr;
|
||||
|
@ -6325,9 +6325,9 @@ void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[],
|
|||
|
||||
/***** Allocate space for subquery *****/
|
||||
MaxLength = NumUsrsInList * (1 + Cns_MAX_DECIMAL_DIGITS_LONG);
|
||||
if ((*SubQueryUsrs = malloc (MaxLength + 1)) == NULL)
|
||||
if ((*UsrsSubQuery = malloc (MaxLength + 1)) == NULL)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
(*SubQueryUsrs)[0] = '\0';
|
||||
(*UsrsSubQuery)[0] = '\0';
|
||||
|
||||
/***** Build subquery *****/
|
||||
for (NumUsr = 0;
|
||||
|
@ -6337,10 +6337,10 @@ void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[],
|
|||
{
|
||||
snprintf (SubQueryOneUsr,sizeof (SubQueryOneUsr),",%ld",
|
||||
LstSelectedUsrCods[NumUsr]);
|
||||
Str_Concat (*SubQueryUsrs,SubQueryOneUsr,MaxLength);
|
||||
Str_Concat (*UsrsSubQuery,SubQueryOneUsr,MaxLength);
|
||||
}
|
||||
else
|
||||
snprintf (*SubQueryUsrs,sizeof (SubQueryOneUsr),"%ld",
|
||||
snprintf (*UsrsSubQuery,sizeof (SubQueryOneUsr),"%ld",
|
||||
LstSelectedUsrCods[NumUsr]);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue