mirror of https://github.com/acanas/swad-core.git
Version18.81
This commit is contained in:
parent
550d2899a4
commit
12b56ef03c
|
@ -2991,7 +2991,7 @@ a:hover img.CENTRE_PHOTO_SHOW
|
||||||
.TL_POST_MED
|
.TL_POST_MED
|
||||||
{
|
{
|
||||||
box-sizing:border-box;
|
box-sizing:border-box;
|
||||||
border-radius:8px;
|
border-radius:4px;
|
||||||
}
|
}
|
||||||
.TL_COMMENT_CONTAINER
|
.TL_COMMENT_CONTAINER
|
||||||
{
|
{
|
||||||
|
@ -3017,7 +3017,7 @@ a:hover img.CENTRE_PHOTO_SHOW
|
||||||
.TL_COMMENT_MED
|
.TL_COMMENT_MED
|
||||||
{
|
{
|
||||||
box-sizing:border-box;
|
box-sizing:border-box;
|
||||||
border-radius:8px;
|
border-radius:4px;
|
||||||
}
|
}
|
||||||
.TL_FORM_NEW_COMMENT
|
.TL_FORM_NEW_COMMENT
|
||||||
{
|
{
|
||||||
|
|
|
@ -1334,6 +1334,7 @@ CREATE TABLE IF NOT EXISTS usr_data (
|
||||||
Comments TEXT NOT NULL DEFAULT '',
|
Comments TEXT NOT NULL DEFAULT '',
|
||||||
Menu TINYINT NOT NULL DEFAULT 0,
|
Menu TINYINT NOT NULL DEFAULT 0,
|
||||||
SideCols TINYINT NOT NULL DEFAULT 3,
|
SideCols TINYINT NOT NULL DEFAULT 3,
|
||||||
|
ThirdPartyCookies ENUM('N','Y') NOT NULL DEFAULT 'N',
|
||||||
NotifNtfEvents INT NOT NULL DEFAULT 0,
|
NotifNtfEvents INT NOT NULL DEFAULT 0,
|
||||||
EmailNtfEvents INT NOT NULL DEFAULT 0,
|
EmailNtfEvents INT NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY(UsrCod),
|
PRIMARY KEY(UsrCod),
|
||||||
|
@ -1351,7 +1352,8 @@ CREATE TABLE IF NOT EXISTS usr_data (
|
||||||
INDEX(DptCod),
|
INDEX(DptCod),
|
||||||
INDEX(CtrCod),
|
INDEX(CtrCod),
|
||||||
INDEX(Menu),
|
INDEX(Menu),
|
||||||
INDEX(SideCols));
|
INDEX(SideCols),
|
||||||
|
INDEX(ThirdPartyCookies));
|
||||||
--
|
--
|
||||||
-- Table usr_duplicated: stores informs of users possibly duplicated
|
-- Table usr_duplicated: stores informs of users possibly duplicated
|
||||||
--
|
--
|
||||||
|
|
|
@ -436,6 +436,8 @@ Lo de mutear anuncios, en principio prefiero hacer una opci
|
||||||
|
|
||||||
// TODO: Los usuarios que no tienes permiso para ver su perfil público, se debería mostrar algo, una mínima ficha sin tinmeline o algo así
|
// TODO: Los usuarios que no tienes permiso para ver su perfil público, se debería mostrar algo, una mínima ficha sin tinmeline o algo así
|
||||||
|
|
||||||
|
// TODO: Para acelerar la carga, todas las preferencias de usuarios no deberían obtenerse siempre, sino en una llamada especial pues en general sólo interesan para el usuario identificado
|
||||||
|
|
||||||
// TODO: Allow timeline posting only for users belonging to courses or admins to avoid user who create accounts only to post
|
// TODO: Allow timeline posting only for users belonging to courses or admins to avoid user who create accounts only to post
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -457,10 +459,51 @@ En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 18.80 (2019-03-17)"
|
#define Log_PLATFORM_VERSION "SWAD 18.81 (2019-03-18)"
|
||||||
#define CSS_FILE "swad18.80.css"
|
#define CSS_FILE "swad18.80.css"
|
||||||
#define JS_FILE "swad18.80.js"
|
#define JS_FILE "swad18.80.js"
|
||||||
/*
|
/*
|
||||||
|
TODO: Remove unused fields MediaName,MediaType,MediaTitle,MediaURL,Media from tables:
|
||||||
|
// ALTER TABLE forum_post DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE msg_content DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE msg_content_deleted DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE social_comments DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE social_posts DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE tst_answers DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE tst_questions DROP COLUMN MediaName,DROP COLUMN MediaType,DROP COLUMN MediaTitle,DROP COLUMN MediaURL;
|
||||||
|
// ALTER TABLE media DROP COLUMN T,DROP COLUMN Cod;
|
||||||
|
|
||||||
|
Version 18.81: Mar 18, 2019 New database table media to store images and videos.
|
||||||
|
Fixed bugs in removal of publications in timeline. (240704 lines)
|
||||||
|
1 change necessary in database:
|
||||||
|
CREATE TABLE IF NOT EXISTS media (MedCod INT NOT NULL AUTO_INCREMENT,Type ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',Name VARCHAR(43) NOT NULL DEFAULT '',URL VARCHAR(255) NOT NULL DEFAULT '',Title VARCHAR(2047) NOT NULL DEFAULT '',T VARCHAR (2047) NOT NULL DEFAULT '',Cod INT NOT NULL DEFAULT -1,UNIQUE INDEX(MedCod),INDEX(Type));
|
||||||
|
Only if you use MyISAM:
|
||||||
|
ALTER TABLE media ENGINE=MyISAM;
|
||||||
|
21 changes necessary in database:
|
||||||
|
ALTER TABLE forum_post ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Content,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE msg_content ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Content,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE msg_content_deleted ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Content,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE social_comments ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Content,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE social_posts ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Content,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE tst_answers ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Feedback,ADD INDEX (MedCod);
|
||||||
|
ALTER TABLE tst_questions ADD COLUMN MedCod INT NOT NULL DEFAULT -1 AFTER Feedback,ADD INDEX (MedCod);
|
||||||
|
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'forum_post',PstCod FROM forum_post WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'msg_content',MsgCod FROM msg_content WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'msg_content_deleted',MsgCod FROM msg_content_deleted WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'social_comments',PubCod FROM social_comments WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'social_posts',PstCod FROM social_posts WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'tst_answers',QstCod*10+AnsInd FROM tst_answers WHERE MediaType<>'none';
|
||||||
|
INSERT INTO media (Type,Name,URL,Title,T,Cod) SELECT MediaType,MediaName,MediaURL,MediaTitle,'tst_questions',QstCod FROM tst_questions WHERE MediaType<>'none';
|
||||||
|
|
||||||
|
UPDATE forum_post,media SET forum_post.MedCod=media.MedCod WHERE media.T='forum_post' AND forum_post.PstCod=media.Cod;
|
||||||
|
UPDATE msg_content,media SET msg_content.MedCod=media.MedCod WHERE media.T='msg_content' AND msg_content.MsgCod=media.Cod;
|
||||||
|
UPDATE msg_content_deleted,media SET msg_content_deleted.MedCod=media.MedCod WHERE media.T='msg_content_deleted' AND msg_content_deleted.MsgCod=media.Cod;
|
||||||
|
UPDATE social_comments,media SET social_comments.MedCod=media.MedCod WHERE media.T='social_comments' AND social_comments.PubCod=media.Cod;
|
||||||
|
UPDATE social_posts,media SET social_posts.MedCod=media.MedCod WHERE media.T='social_posts' AND social_posts.PstCod=media.Cod;
|
||||||
|
UPDATE tst_answers,media SET tst_answers.MedCod=media.MedCod WHERE media.T='tst_answers' AND tst_answers.QstCod*10+AnsInd=media.Cod;
|
||||||
|
UPDATE tst_questions,media SET tst_questions.MedCod=media.MedCod WHERE media.T='tst_questions' AND tst_questions.QstCod=media.Cod;
|
||||||
|
|
||||||
Version 18.80: Mar 17, 2019 Figure about cookies. (240647 lines)
|
Version 18.80: Mar 17, 2019 Figure about cookies. (240647 lines)
|
||||||
Version 18.79.1: Mar 17, 2019 YouTube videos are not shown if user doesn't accept third party cookies. (240541 lines)
|
Version 18.79.1: Mar 17, 2019 YouTube videos are not shown if user doesn't accept third party cookies. (240541 lines)
|
||||||
Version 18.79: Mar 17, 2019 New module swad_cookies for user's preference about cookies. (240494 lines)
|
Version 18.79: Mar 17, 2019 New module swad_cookies for user's preference about cookies. (240494 lines)
|
||||||
|
|
|
@ -1218,12 +1218,13 @@ mysql> DESCRIBE forum_post;
|
||||||
| NumNotif | int(11) | NO | | 0 | |
|
| NumNotif | int(11) | NO | | 0 | |
|
||||||
| Subject | text | NO | | NULL | |
|
| Subject | text | NO | | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
12 rows in set (0.00 sec)
|
13 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
|
||||||
"PstCod INT NOT NULL AUTO_INCREMENT,"
|
"PstCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
@ -1234,6 +1235,7 @@ mysql> DESCRIBE forum_post;
|
||||||
"NumNotif INT NOT NULL DEFAULT 0,"
|
"NumNotif INT NOT NULL DEFAULT 0,"
|
||||||
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
|
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
|
||||||
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
|
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
@ -1242,7 +1244,8 @@ mysql> DESCRIBE forum_post;
|
||||||
"INDEX(ThrCod),"
|
"INDEX(ThrCod),"
|
||||||
"INDEX(UsrCod),"
|
"INDEX(UsrCod),"
|
||||||
"INDEX(CreatTime),"
|
"INDEX(CreatTime),"
|
||||||
"INDEX(ModifTime))");
|
"INDEX(ModifTime),"
|
||||||
|
"INDEX(MedCod))");
|
||||||
|
|
||||||
/***** Table forum_thr_clip *****/
|
/***** Table forum_thr_clip *****/
|
||||||
/*
|
/*
|
||||||
|
@ -1714,6 +1717,29 @@ mysql> DESCRIBE marks_properties;
|
||||||
"Footer INT NOT NULL,"
|
"Footer INT NOT NULL,"
|
||||||
"UNIQUE INDEX(FilCod))");
|
"UNIQUE INDEX(FilCod))");
|
||||||
|
|
||||||
|
/***** Table media *****/
|
||||||
|
/*
|
||||||
|
mysql> DESCRIBE media;
|
||||||
|
+--------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+--------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
|
| MedCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
|
| Type | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | MUL | none | |
|
||||||
|
| Name | varchar(43) | NO | | | |
|
||||||
|
| URL | varchar(255) | NO | | | |
|
||||||
|
| Title | varchar(2047) | NO | | | |
|
||||||
|
+--------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
|
5 rows in set (0.00 sec)
|
||||||
|
*/
|
||||||
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS media ("
|
||||||
|
"MedCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
"Type ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
|
"Name VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
|
"URL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
|
"Title VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
"UNIQUE INDEX(MedCod),"
|
||||||
|
"INDEX(Type))");
|
||||||
|
|
||||||
/***** Table msg_banned *****/
|
/***** Table msg_banned *****/
|
||||||
/*
|
/*
|
||||||
mysql> DESCRIBE msg_banned;
|
mysql> DESCRIBE msg_banned;
|
||||||
|
@ -1739,23 +1765,26 @@ mysql> DESCRIBE msg_content;
|
||||||
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
|
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| Subject | text | NO | MUL | NULL | |
|
| Subject | text | NO | MUL | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
7 rows in set (0.00 sec)
|
8 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
|
||||||
"MsgCod INT NOT NULL AUTO_INCREMENT,"
|
"MsgCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
"Subject TEXT NOT NULL,"
|
"Subject TEXT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(MsgCod),"
|
"UNIQUE INDEX(MsgCod),"
|
||||||
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Subject,Content),"
|
||||||
|
"INDEX(MedCod)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
/***** Table msg_content_deleted *****/
|
/***** Table msg_content_deleted *****/
|
||||||
/*
|
/*
|
||||||
|
@ -1766,23 +1795,26 @@ mysql> DESCRIBE msg_content_deleted;
|
||||||
| MsgCod | int(11) | NO | PRI | NULL | |
|
| MsgCod | int(11) | NO | PRI | NULL | |
|
||||||
| Subject | text | NO | MUL | NULL | |
|
| Subject | text | NO | MUL | NULL | |
|
||||||
| Content | longtext | NO | | NULL | |
|
| Content | longtext | NO | | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
||||||
7 rows in set (0.00 sec)
|
8 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
|
||||||
"MsgCod INT NOT NULL,"
|
"MsgCod INT NOT NULL,"
|
||||||
"Subject TEXT NOT NULL,"
|
"Subject TEXT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(MsgCod),"
|
"UNIQUE INDEX(MsgCod),"
|
||||||
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Subject,Content),"
|
||||||
|
"INDEX(MedCod)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
/***** Table msg_rcv *****/
|
/***** Table msg_rcv *****/
|
||||||
/*
|
/*
|
||||||
|
@ -2181,22 +2213,25 @@ mysql> DESCRIBE social_comments;
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
||||||
| PubCod | bigint(20) | NO | PRI | NULL | |
|
| PubCod | bigint(20) | NO | PRI | NULL | |
|
||||||
| Content | longtext | NO | MUL | NULL | |
|
| Content | longtext | NO | MUL | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
||||||
6 rows in set (0.00 sec)
|
7 rows in set (0.01 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
|
||||||
"PubCod BIGINT NOT NULL,"
|
"PubCod BIGINT NOT NULL,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(PubCod),"
|
"UNIQUE INDEX(PubCod),"
|
||||||
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Content),"
|
||||||
|
"INDEX(MedCod)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
/***** Table social_comments_fav *****/
|
/***** Table social_comments_fav *****/
|
||||||
/*
|
/*
|
||||||
|
@ -2279,22 +2314,25 @@ mysql> DESCRIBE social_posts;
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
|
||||||
| Content | longtext | NO | MUL | NULL | |
|
| Content | longtext | NO | MUL | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
+------------+-------------------------------------------------------+------+-----+---------+----------------+
|
||||||
6 rows in set (0.00 sec)
|
7 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
|
||||||
"PubCod INT NOT NULL AUTO_INCREMENT,"
|
"PubCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
"Content LONGTEXT NOT NULL,"
|
"Content LONGTEXT NOT NULL,"
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"UNIQUE INDEX(PubCod),"
|
"UNIQUE INDEX(PubCod),"
|
||||||
"FULLTEXT(Content)) ENGINE = MYISAM;");
|
"FULLTEXT(Content),"
|
||||||
|
"INDEX(MedCod)) ENGINE = MYISAM;");
|
||||||
|
|
||||||
/***** Table social_pubs *****/
|
/***** Table social_pubs *****/
|
||||||
/*
|
/*
|
||||||
|
@ -2554,25 +2592,28 @@ mysql> DESCRIBE tst_answers;
|
||||||
| AnsInd | tinyint(4) | NO | | NULL | |
|
| AnsInd | tinyint(4) | NO | | NULL | |
|
||||||
| Answer | text | NO | | NULL | |
|
| Answer | text | NO | | NULL | |
|
||||||
| Feedback | text | NO | | NULL | |
|
| Feedback | text | NO | | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
| MediaURL | varchar(255) | NO | | | |
|
| MediaURL | varchar(255) | NO | | | |
|
||||||
| Correct | enum('N','Y') | NO | | NULL | |
|
| Correct | enum('N','Y') | NO | | NULL | |
|
||||||
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
+------------+-------------------------------------------------------+------+-----+---------+-------+
|
||||||
9 rows in set (0.00 sec)
|
10 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
|
||||||
"QstCod INT NOT NULL,"
|
"QstCod INT NOT NULL,"
|
||||||
"AnsInd TINYINT NOT NULL,"
|
"AnsInd TINYINT NOT NULL,"
|
||||||
"Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
"Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
||||||
"Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
"Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
|
||||||
"Correct ENUM('N','Y') NOT NULL,"
|
"Correct ENUM('N','Y') NOT NULL,"
|
||||||
"INDEX(QstCod))");
|
"INDEX(QstCod),"
|
||||||
|
"INDEX(MedCod))");
|
||||||
|
|
||||||
/***** Table tst_config *****/
|
/***** Table tst_config *****/
|
||||||
/*
|
/*
|
||||||
|
@ -2684,6 +2725,7 @@ mysql> DESCRIBE tst_questions;
|
||||||
| Shuffle | enum('N','Y') | NO | | NULL | |
|
| Shuffle | enum('N','Y') | NO | | NULL | |
|
||||||
| Stem | text | NO | | NULL | |
|
| Stem | text | NO | | NULL | |
|
||||||
| Feedback | text | NO | | NULL | |
|
| Feedback | text | NO | | NULL | |
|
||||||
|
| MedCod | int(11) | NO | MUL | -1 | |
|
||||||
| MediaName | varchar(43) | NO | | | |
|
| MediaName | varchar(43) | NO | | | |
|
||||||
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
|
||||||
| MediaTitle | varchar(2047) | NO | | | |
|
| MediaTitle | varchar(2047) | NO | | | |
|
||||||
|
@ -2692,7 +2734,7 @@ mysql> DESCRIBE tst_questions;
|
||||||
| NumHitsNotBlank | int(11) | NO | | 0 | |
|
| NumHitsNotBlank | int(11) | NO | | 0 | |
|
||||||
| Score | double | NO | | 0 | |
|
| Score | double | NO | | 0 | |
|
||||||
+-----------------+---------------------------------------------------------------------------+------+-----+---------+----------------+
|
+-----------------+---------------------------------------------------------------------------+------+-----+---------+----------------+
|
||||||
14 rows in set (0.00 sec)
|
15 rows in set (0.00 sec)
|
||||||
*/
|
*/
|
||||||
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions ("
|
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions ("
|
||||||
"QstCod INT NOT NULL AUTO_INCREMENT,"
|
"QstCod INT NOT NULL AUTO_INCREMENT,"
|
||||||
|
@ -2702,6 +2744,7 @@ mysql> DESCRIBE tst_questions;
|
||||||
"Shuffle ENUM('N','Y') NOT NULL,"
|
"Shuffle ENUM('N','Y') NOT NULL,"
|
||||||
"Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
"Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
||||||
"Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
"Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
|
||||||
|
"MedCod INT NOT NULL DEFAULT -1,"
|
||||||
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
|
||||||
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
|
||||||
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
|
||||||
|
@ -2710,7 +2753,8 @@ mysql> DESCRIBE tst_questions;
|
||||||
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
|
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
|
||||||
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
|
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
|
||||||
"UNIQUE INDEX(QstCod),"
|
"UNIQUE INDEX(QstCod),"
|
||||||
"INDEX(CrsCod,EditTime))");
|
"INDEX(CrsCod,EditTime),"
|
||||||
|
"INDEX(MedCod))");
|
||||||
|
|
||||||
/***** Table tst_status *****/
|
/***** Table tst_status *****/
|
||||||
/*
|
/*
|
||||||
|
@ -2865,7 +2909,7 @@ mysql> DESCRIBE usr_data;
|
||||||
"INDEX(CtrCod),"
|
"INDEX(CtrCod),"
|
||||||
"INDEX(Menu),"
|
"INDEX(Menu),"
|
||||||
"INDEX(SideCols),"
|
"INDEX(SideCols),"
|
||||||
"INDEX(ThirdPartyCookies)");
|
"INDEX(ThirdPartyCookies))");
|
||||||
|
|
||||||
/***** Table usr_duplicated *****/
|
/***** Table usr_duplicated *****/
|
||||||
/*
|
/*
|
||||||
|
|
47
swad_forum.c
47
swad_forum.c
|
@ -283,7 +283,7 @@ static void For_InsertPstIntoBannedPstTable (long PstCod);
|
||||||
static long For_InsertForumPst (long ThrCod,long UsrCod,
|
static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
const char *Subject,const char *Content,
|
const char *Subject,const char *Content,
|
||||||
struct Media *Media);
|
struct Media *Media);
|
||||||
static bool For_RemoveForumPst (long PstCod,struct Media *Media);
|
static bool For_RemoveForumPst (long PstCod,long MedCod);
|
||||||
static unsigned For_NumPstsInThrWithPstCod (long PstCod,long *ThrCod);
|
static unsigned For_NumPstsInThrWithPstCod (long PstCod,long *ThrCod);
|
||||||
|
|
||||||
static long For_InsertForumThread (long FirstPstCod);
|
static long For_InsertForumThread (long FirstPstCod);
|
||||||
|
@ -501,28 +501,29 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
long PstCod;
|
long PstCod;
|
||||||
|
|
||||||
/***** Check if image is received and processed *****/
|
/***** Check if image is received and processed *****/
|
||||||
|
Media->MedCod = -1L;
|
||||||
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
|
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
|
||||||
Media->Status == Med_PROCESSED) // The new media received has been processed
|
Media->Status == Med_PROCESSED) // The new media received has been processed
|
||||||
|
{
|
||||||
/* Move processed media to definitive directory */
|
/* Move processed media to definitive directory */
|
||||||
Med_MoveMediaToDefinitiveDir (Media);
|
Med_MoveMediaToDefinitiveDir (Media);
|
||||||
|
|
||||||
|
/* Store media in database */
|
||||||
|
if (Media->Status == Med_MOVED)
|
||||||
|
Med_StoreMediaInDB (Media); // Set Media->MedCod
|
||||||
|
}
|
||||||
|
|
||||||
/***** Insert forum post in the database *****/
|
/***** Insert forum post in the database *****/
|
||||||
PstCod =
|
PstCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
|
||||||
"INSERT INTO forum_post"
|
"INSERT INTO forum_post"
|
||||||
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
|
||||||
"Subject,Content,"
|
"Subject,Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,%ld,NOW(),NOW(),0,"
|
" (%ld,%ld,NOW(),NOW(),0,"
|
||||||
"'%s','%s',"
|
"'%s','%s',%ld)",
|
||||||
"'%s','%s','%s','%s')",
|
|
||||||
ThrCod,UsrCod,
|
ThrCod,UsrCod,
|
||||||
Subject,Content,
|
Subject,Content,Media->MedCod);
|
||||||
Media->Name,
|
|
||||||
Med_GetStringTypeForDB (Media->Type),
|
|
||||||
Media->Title ? Media->Title : "",
|
|
||||||
Media->URL ? Media->URL : "");
|
|
||||||
|
|
||||||
return PstCod;
|
return PstCod;
|
||||||
}
|
}
|
||||||
|
@ -532,13 +533,13 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Return true if the post thread is deleted
|
// Return true if the post thread is deleted
|
||||||
|
|
||||||
static bool For_RemoveForumPst (long PstCod,struct Media *Media)
|
static bool For_RemoveForumPst (long PstCod,long MedCod)
|
||||||
{
|
{
|
||||||
long ThrCod;
|
long ThrCod;
|
||||||
bool ThreadDeleted = false;
|
bool ThreadDeleted = false;
|
||||||
|
|
||||||
/***** Remove media file attached to forum post *****/
|
/***** Remove media file attached to forum post *****/
|
||||||
Med_RemoveMediaFiles (Media->Name,Media->Type);
|
Med_RemoveMedia (MedCod);
|
||||||
|
|
||||||
/***** If the post is the only one in its thread, delete that thread *****/
|
/***** If the post is the only one in its thread, delete that thread *****/
|
||||||
if (For_NumPstsInThrWithPstCod (PstCod,&ThrCod) < 2)
|
if (For_NumPstsInThrWithPstCod (PstCod,&ThrCod) < 2)
|
||||||
|
@ -1345,10 +1346,7 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
"UNIX_TIMESTAMP(CreatTime)," // row[1]
|
"UNIX_TIMESTAMP(CreatTime)," // row[1]
|
||||||
"Subject," // row[2]
|
"Subject," // row[2]
|
||||||
"Content," // row[3]
|
"Content," // row[3]
|
||||||
"MediaName," // row[4]
|
"MedCod" // row[4]
|
||||||
"MediaType," // row[5]
|
|
||||||
"MediaTitle," // row[6]
|
|
||||||
"MediaURL" // row[7]
|
|
||||||
" FROM forum_post WHERE PstCod=%ld",
|
" FROM forum_post WHERE PstCod=%ld",
|
||||||
PstCod);
|
PstCod);
|
||||||
|
|
||||||
|
@ -1359,22 +1357,23 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||||
/***** Get number of rows *****/
|
/***** Get number of rows *****/
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
/****** Get author code (row[1]) *****/
|
/***** Get author code (row[1]) *****/
|
||||||
*UsrCod = Str_ConvertStrCodToLongCod (row[0]);
|
*UsrCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
|
||||||
/****** Get creation time (row[1]) *****/
|
/***** Get creation time (row[1]) *****/
|
||||||
*CreatTimeUTC = Dat_GetUNIXTimeFromStr (row[1]);
|
*CreatTimeUTC = Dat_GetUNIXTimeFromStr (row[1]);
|
||||||
|
|
||||||
/****** Get subject (row[2]) *****/
|
/***** Get subject (row[2]) *****/
|
||||||
Str_Copy (Subject,row[2],
|
Str_Copy (Subject,row[2],
|
||||||
Cns_MAX_BYTES_SUBJECT);
|
Cns_MAX_BYTES_SUBJECT);
|
||||||
|
|
||||||
/****** Get location (row[3]) *****/
|
/***** Get location (row[3]) *****/
|
||||||
Str_Copy (Content,row[3],
|
Str_Copy (Content,row[3],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get media data (row[4], row[5], row[6], row[7]) *****/
|
/***** Get media (row[4]) *****/
|
||||||
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],Media);
|
Media->MedCod = Str_ConvertStrCodToLongCod (row[4]);
|
||||||
|
Med_GetMediaDataByCod (Media);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -4089,7 +4088,7 @@ void For_ReceiveForumPost (void)
|
||||||
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
|
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free media *****/
|
||||||
Med_MediaDestructor (&Media);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
||||||
/***** Increment number of forum posts in my user's figures *****/
|
/***** Increment number of forum posts in my user's figures *****/
|
||||||
|
@ -4188,7 +4187,7 @@ void For_RemovePost (void)
|
||||||
Lay_ShowErrorAndExit ("You can not remove post because it is not the last of the thread.");
|
Lay_ShowErrorAndExit ("You can not remove post because it is not the last of the thread.");
|
||||||
|
|
||||||
/***** Remove the post *****/
|
/***** Remove the post *****/
|
||||||
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Media);
|
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,Media.MedCod);
|
||||||
|
|
||||||
/***** Free image *****/
|
/***** Free image *****/
|
||||||
Med_MediaDestructor (&Media);
|
Med_MediaDestructor (&Media);
|
||||||
|
|
38
swad_game.c
38
swad_game.c
|
@ -2734,10 +2734,7 @@ static void Gam_ListGameQuestions (struct Game *Game)
|
||||||
"tst_questions.AnsType," // row[1]
|
"tst_questions.AnsType," // row[1]
|
||||||
"tst_questions.Stem," // row[2]
|
"tst_questions.Stem," // row[2]
|
||||||
"tst_questions.Feedback," // row[3]
|
"tst_questions.Feedback," // row[3]
|
||||||
"tst_questions.MediaName," // row[4]
|
"tst_questions.MedCod" // row[4]
|
||||||
"tst_questions.MediaType," // row[5]
|
|
||||||
"tst_questions.MediaTitle," // row[6]
|
|
||||||
"tst_questions.MediaURL" // row[7]
|
|
||||||
" FROM gam_questions,tst_questions"
|
" FROM gam_questions,tst_questions"
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
" AND gam_questions.QstCod=tst_questions.QstCod"
|
" AND gam_questions.QstCod=tst_questions.QstCod"
|
||||||
|
@ -2842,10 +2839,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
|
||||||
row[1] AnsType
|
row[1] AnsType
|
||||||
row[2] Stem
|
row[2] Stem
|
||||||
row[3] Feedback
|
row[3] Feedback
|
||||||
row[4] MediaName
|
row[4] MedCod
|
||||||
row[5] MediaType
|
|
||||||
row[6] MediaTitle
|
|
||||||
row[7] MediaURL
|
|
||||||
*/
|
*/
|
||||||
/***** Create test question *****/
|
/***** Create test question *****/
|
||||||
Tst_QstConstructor ();
|
Tst_QstConstructor ();
|
||||||
|
@ -2923,16 +2917,24 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
|
||||||
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
|
||||||
fprintf (Gbl.F.Out,"</td>");
|
fprintf (Gbl.F.Out,"</td>");
|
||||||
|
|
||||||
/* Write stem (row[2]), media data (row[4], row[5], row[6], row[7]),
|
/* Write stem (row[2]) */
|
||||||
feedback (row[3]) and answers */
|
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
|
||||||
Gbl.RowEvenOdd);
|
Gbl.RowEvenOdd);
|
||||||
Tst_WriteQstStem (row[2],"TEST_EDI");
|
Tst_WriteQstStem (row[2],"TEST_EDI");
|
||||||
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],&Gbl.Test.Media);
|
|
||||||
|
/* Get media (row[4]) */
|
||||||
|
Gbl.Test.Media.MedCod = Str_ConvertStrCodToLongCod (row[4]);
|
||||||
|
Med_GetMediaDataByCod (&Gbl.Test.Media);
|
||||||
|
|
||||||
|
/* Show media */
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
|
||||||
|
/* Show feedback (row[3]) */
|
||||||
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
|
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
|
||||||
|
|
||||||
|
/* Show answers */
|
||||||
Tst_WriteAnswersGameResult (Game,NumQst,QstCod,
|
Tst_WriteAnswersGameResult (Game,NumQst,QstCod,
|
||||||
"TEST_EDI",true); // Show result
|
"TEST_EDI",true); // Show result
|
||||||
|
|
||||||
|
@ -3531,10 +3533,7 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
|
||||||
"SELECT tst_questions.QstCod," // row[0]
|
"SELECT tst_questions.QstCod," // row[0]
|
||||||
"tst_questions.AnsType," // row[1]
|
"tst_questions.AnsType," // row[1]
|
||||||
"tst_questions.Stem," // row[2]
|
"tst_questions.Stem," // row[2]
|
||||||
"tst_questions.MediaName," // row[3]
|
"tst_questions.MedCod" // row[3]
|
||||||
"tst_questions.MediaType," // row[4]
|
|
||||||
"tst_questions.MediaTitle," // row[5]
|
|
||||||
"tst_questions.MediaURL" // row[6]
|
|
||||||
" FROM gam_questions,tst_questions"
|
" FROM gam_questions,tst_questions"
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
" AND gam_questions.QstInd=%u"
|
" AND gam_questions.QstInd=%u"
|
||||||
|
@ -3553,9 +3552,14 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
fprintf (Gbl.F.Out,"<div class=\"GAM_PLAY_QST_CONTAINER\">");
|
||||||
|
|
||||||
/* Write stem (row[2]) and media data (row[3], row[4], row[5], row[6]) */
|
/* Write stem (row[2]) */
|
||||||
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
Tst_WriteQstStem (row[2],"GAM_PLAY_QST");
|
||||||
Med_GetMediaDataFromRow (row[3],row[4],row[5],row[6],&Gbl.Test.Media);
|
|
||||||
|
/* Get media (row[3]) */
|
||||||
|
Gbl.Test.Media.MedCod = Str_ConvertStrCodToLongCod (row[3]);
|
||||||
|
Med_GetMediaDataByCod (&Gbl.Test.Media);
|
||||||
|
|
||||||
|
/* Show media */
|
||||||
Med_ShowMedia (&Gbl.Test.Media,
|
Med_ShowMedia (&Gbl.Test.Media,
|
||||||
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
|
||||||
"TEST_IMG_EDIT_LIST_STEM");
|
"TEST_IMG_EDIT_LIST_STEM");
|
||||||
|
|
379
swad_media.c
379
swad_media.c
|
@ -38,6 +38,7 @@
|
||||||
|
|
||||||
#include "swad_config.h"
|
#include "swad_config.h"
|
||||||
#include "swad_cookie.h"
|
#include "swad_cookie.h"
|
||||||
|
#include "swad_database.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
#include "swad_file.h"
|
#include "swad_file.h"
|
||||||
#include "swad_file_browser.h"
|
#include "swad_file_browser.h"
|
||||||
|
@ -153,8 +154,10 @@ static void Med_ShowVideo (struct Media *Media,
|
||||||
const char *ClassMedia);
|
const char *ClassMedia);
|
||||||
static void Med_ShowYoutube (struct Media *Media,const char *ClassMedia);
|
static void Med_ShowYoutube (struct Media *Media,const char *ClassMedia);
|
||||||
|
|
||||||
|
static Med_Type_t Med_GetTypeFromStrInDB (const char *Str);
|
||||||
static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
|
static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
|
||||||
const char *MIMEType);
|
const char *MIMEType);
|
||||||
|
static const char *Med_GetStringTypeForDB (Med_Type_t Type);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Media (image/video) constructor **********************/
|
/********************** Media (image/video) constructor **********************/
|
||||||
|
@ -197,6 +200,7 @@ void Med_ResetMedia (struct Media *Media)
|
||||||
|
|
||||||
static void Med_ResetMediaExceptURLAndTitle (struct Media *Media)
|
static void Med_ResetMediaExceptURLAndTitle (struct Media *Media)
|
||||||
{
|
{
|
||||||
|
Media->MedCod = -1L;
|
||||||
Media->Action = Med_ACTION_NO_MEDIA;
|
Media->Action = Med_ACTION_NO_MEDIA;
|
||||||
Media->Status = Med_STATUS_NONE;
|
Media->Status = Med_STATUS_NONE;
|
||||||
Media->Name[0] = '\0';
|
Media->Name[0] = '\0';
|
||||||
|
@ -235,58 +239,81 @@ static void Med_FreeMediaTitle (struct Media *Media)
|
||||||
/**** Get media name, title and URL from a query result and copy to struct ***/
|
/**** Get media name, title and URL from a query result and copy to struct ***/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Med_GetMediaDataFromRow (const char *Name,
|
void Med_GetMediaDataByCod (struct Media *Media)
|
||||||
const char *TypeStr,
|
|
||||||
const char *Title,
|
|
||||||
const char *URL,
|
|
||||||
struct Media *Media)
|
|
||||||
{
|
{
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
unsigned NumRows;
|
||||||
size_t Length;
|
size_t Length;
|
||||||
|
|
||||||
/***** Copy image name to struct *****/
|
/***** Get data of a media from database *****/
|
||||||
Str_Copy (Media->Name,Name,
|
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a post",
|
||||||
Med_BYTES_NAME);
|
"SELECT Type," // row[0]
|
||||||
|
"Name," // row[1]
|
||||||
|
"URL," // row[2]
|
||||||
|
"Title" // row[3]
|
||||||
|
" FROM media WHERE MedCod=%ld",
|
||||||
|
Media->MedCod);
|
||||||
|
|
||||||
/***** Convert type string to type *****/
|
/***** Result should have a unique row *****/
|
||||||
Media->Type = Med_GetTypeFromStrInDB (TypeStr);
|
if (NumRows == 0) // Media not found
|
||||||
|
/***** Reset media data *****/
|
||||||
/***** Set status of media file *****/
|
Med_ResetMedia (Media);
|
||||||
Media->Status = (Media->Type != Med_TYPE_NONE) ? Med_STORED_IN_DB :
|
else if (NumRows == 1)
|
||||||
Med_STATUS_NONE;
|
|
||||||
|
|
||||||
/***** Copy image URL to struct *****/
|
|
||||||
// Media->URL can be empty or filled with previous value
|
|
||||||
// If filled ==> free it
|
|
||||||
Med_FreeMediaURL (Media);
|
|
||||||
if (URL[0])
|
|
||||||
{
|
{
|
||||||
/* Get and limit length of the URL */
|
/***** Get row *****/
|
||||||
Length = strlen (URL);
|
row = mysql_fetch_row (mysql_res);
|
||||||
if (Length > Cns_MAX_BYTES_WWW)
|
|
||||||
Length = Cns_MAX_BYTES_WWW;
|
|
||||||
|
|
||||||
if ((Media->URL = (char *) malloc (Length + 1)) == NULL)
|
/***** Convert type string (row[0]) to type *****/
|
||||||
Lay_ShowErrorAndExit ("Error allocating memory for image URL.");
|
Media->Type = Med_GetTypeFromStrInDB (row[0]);
|
||||||
Str_Copy (Media->URL,URL,
|
|
||||||
Length);
|
/***** Set status of media file *****/
|
||||||
|
Media->Status = (Media->Type != Med_TYPE_NONE) ? Med_STORED_IN_DB :
|
||||||
|
Med_STATUS_NONE;
|
||||||
|
|
||||||
|
/***** Copy media name (row[1]) to struct *****/
|
||||||
|
Str_Copy (Media->Name,row[1],
|
||||||
|
Med_BYTES_NAME);
|
||||||
|
|
||||||
|
/***** Copy media URL (row[2]) to struct *****/
|
||||||
|
// Media->URL can be empty or filled with previous value
|
||||||
|
// If filled ==> free it
|
||||||
|
Med_FreeMediaURL (Media);
|
||||||
|
if (row[2][0])
|
||||||
|
{
|
||||||
|
/* Get and limit length of the URL */
|
||||||
|
Length = strlen (row[2]);
|
||||||
|
if (Length > Cns_MAX_BYTES_WWW)
|
||||||
|
Length = Cns_MAX_BYTES_WWW;
|
||||||
|
|
||||||
|
if ((Media->URL = (char *) malloc (Length + 1)) == NULL)
|
||||||
|
Lay_ShowErrorAndExit ("Error allocating memory for image URL.");
|
||||||
|
Str_Copy (Media->URL,row[2],
|
||||||
|
Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Copy media title (row[3]) to struct *****/
|
||||||
|
// Media->Title can be empty or filled with previous value
|
||||||
|
// If filled ==> free it
|
||||||
|
Med_FreeMediaTitle (Media);
|
||||||
|
if (row[3][0])
|
||||||
|
{
|
||||||
|
/* Get and limit length of the title */
|
||||||
|
Length = strlen (row[3]);
|
||||||
|
if (Length > Med_MAX_BYTES_TITLE)
|
||||||
|
Length = Med_MAX_BYTES_TITLE;
|
||||||
|
|
||||||
|
if ((Media->Title = (char *) malloc (Length + 1)) == NULL)
|
||||||
|
Lay_ShowErrorAndExit ("Error allocating memory for image title.");
|
||||||
|
Str_Copy (Media->Title,row[3],
|
||||||
|
Length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
Lay_ShowErrorAndExit ("Internal error in database when getting media data.");
|
||||||
|
|
||||||
/***** Copy image title to struct *****/
|
/***** Free structure that stores the query result *****/
|
||||||
// Media->Title can be empty or filled with previous value
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
// If filled ==> free it
|
|
||||||
Med_FreeMediaTitle (Media);
|
|
||||||
if (Title[0])
|
|
||||||
{
|
|
||||||
/* Get and limit length of the title */
|
|
||||||
Length = strlen (Title);
|
|
||||||
if (Length > Med_MAX_BYTES_TITLE)
|
|
||||||
Length = Med_MAX_BYTES_TITLE;
|
|
||||||
|
|
||||||
if ((Media->Title = (char *) malloc (Length + 1)) == NULL)
|
|
||||||
Lay_ShowErrorAndExit ("Error allocating memory for image title.");
|
|
||||||
Str_Copy (Media->Title,Title,
|
|
||||||
Length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -980,7 +1007,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
|
|
||||||
/***** Get embed URL from form *****/
|
/***** Get embed URL from form *****/
|
||||||
Usr_GetURLFromForm (ParamURL,Media);
|
Usr_GetURLFromForm (ParamURL,Media);
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: Media->URL = '%s'",Media->URL);
|
|
||||||
|
|
||||||
/***** Process URL trying to convert it to a YouTube embed URL *****/
|
/***** Process URL trying to convert it to a YouTube embed URL *****/
|
||||||
if (Media->URL)
|
if (Media->URL)
|
||||||
|
@ -1007,7 +1033,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
if (PtrHost[0])
|
if (PtrHost[0])
|
||||||
{
|
{
|
||||||
/***** Step 2: Skip host *****/
|
/***** Step 2: Skip host *****/
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrHost = '%s'",PtrHost);
|
|
||||||
if (!strncasecmp (PtrHost,"youtu.be/" , 9)) // Host starts by youtu.be/
|
if (!strncasecmp (PtrHost,"youtu.be/" , 9)) // Host starts by youtu.be/
|
||||||
{
|
{
|
||||||
YouTube = SHORT;
|
YouTube = SHORT;
|
||||||
|
@ -1035,7 +1060,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
|
|
||||||
if (YouTube != WRONG)
|
if (YouTube != WRONG)
|
||||||
{
|
{
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrPath = '%s'",PtrPath);
|
|
||||||
/***** Step 3: Skip path *****/
|
/***** Step 3: Skip path *****/
|
||||||
if (YouTube == FULL)
|
if (YouTube == FULL)
|
||||||
{
|
{
|
||||||
|
@ -1063,7 +1087,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
|
|
||||||
if (YouTube != WRONG)
|
if (YouTube != WRONG)
|
||||||
{
|
{
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrParams = '%s'",PtrParams);
|
|
||||||
/***** Step 4: Search for video code *****/
|
/***** Step 4: Search for video code *****/
|
||||||
switch (YouTube)
|
switch (YouTube)
|
||||||
{
|
{
|
||||||
|
@ -1095,7 +1118,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
|
|
||||||
if (YouTube != WRONG)
|
if (YouTube != WRONG)
|
||||||
{
|
{
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrCode = '%s'",PtrCode);
|
|
||||||
/***** Step 5: Get video code *****/
|
/***** Step 5: Get video code *****/
|
||||||
CodeLength = strspn (PtrCode,Str_BIN_TO_BASE64URL);
|
CodeLength = strspn (PtrCode,Str_BIN_TO_BASE64URL);
|
||||||
if (CodeLength > 0 &&
|
if (CodeLength > 0 &&
|
||||||
|
@ -1105,7 +1127,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
|
||||||
/* Copy code */
|
/* Copy code */
|
||||||
strncpy (Media->Name,PtrCode,CodeLength);
|
strncpy (Media->Name,PtrCode,CodeLength);
|
||||||
Media->Name[CodeLength] = '\0';
|
Media->Name[CodeLength] = '\0';
|
||||||
// Ale_ShowAlert (Ale_INFO,"DEBUG: Media->Name = '%s'",Media->Name);
|
|
||||||
|
|
||||||
Media->Type = Med_YOUTUBE;
|
Media->Type = Med_YOUTUBE;
|
||||||
Media->Status = Med_PROCESSED;
|
Media->Status = Med_PROCESSED;
|
||||||
|
@ -1126,56 +1147,63 @@ void Med_MoveMediaToDefinitiveDir (struct Media *Media)
|
||||||
char PathMedPrivTmp[PATH_MAX + 1];
|
char PathMedPrivTmp[PATH_MAX + 1];
|
||||||
char PathMedPriv[PATH_MAX + 1];
|
char PathMedPriv[PATH_MAX + 1];
|
||||||
|
|
||||||
/***** Check trivial cases *****/
|
/***** Check trivial case *****/
|
||||||
if (Media->Status != Med_PROCESSED)
|
if (Media->Status == Med_PROCESSED)
|
||||||
return;
|
|
||||||
if (Media->Type == Med_YOUTUBE)
|
|
||||||
return; // Nothing to do with files
|
|
||||||
|
|
||||||
/***** Build temporary path *****/
|
|
||||||
snprintf (PathMedPrivTmp,sizeof (PathMedPrivTmp),
|
|
||||||
"%s/%s/%s",
|
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP);
|
|
||||||
|
|
||||||
/***** Create private subdirectory for media if it does not exist *****/
|
|
||||||
snprintf (PathMedPriv,sizeof (PathMedPriv),
|
|
||||||
"%s/%s/%c%c",
|
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
|
|
||||||
Media->Name[0],
|
|
||||||
Media->Name[1]);
|
|
||||||
Fil_CreateDirIfNotExists (PathMedPriv);
|
|
||||||
|
|
||||||
/***** Move files *****/
|
|
||||||
switch (Media->Type)
|
|
||||||
{
|
{
|
||||||
case Med_JPG:
|
if (Media->Type == Med_YOUTUBE)
|
||||||
/* Move JPG */
|
// Nothing to do with files ==> Processing successfully finished
|
||||||
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
Media->Status = Med_MOVED; // Success
|
||||||
Med_Extensions[Med_JPG]))
|
else
|
||||||
return; // Fail
|
{
|
||||||
break;
|
/***** Build temporary path *****/
|
||||||
case Med_GIF:
|
snprintf (PathMedPrivTmp,sizeof (PathMedPrivTmp),
|
||||||
/* Move PNG */
|
"%s/%s/%s",
|
||||||
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,Cfg_FOLDER_IMG_TMP);
|
||||||
"png"))
|
|
||||||
return; // Fail
|
/***** Create private subdirectory for media if it does not exist *****/
|
||||||
/* Move GIF */
|
snprintf (PathMedPriv,sizeof (PathMedPriv),
|
||||||
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
"%s/%s/%c%c",
|
||||||
Med_Extensions[Med_GIF]))
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
|
||||||
return; // Fail
|
Media->Name[0],
|
||||||
break;
|
Media->Name[1]);
|
||||||
case Med_MP4:
|
Fil_CreateDirIfNotExists (PathMedPriv);
|
||||||
case Med_WEBM:
|
|
||||||
case Med_OGG:
|
/***** Move files *****/
|
||||||
/* Move MP4 or WEBM or OGG */
|
switch (Media->Type)
|
||||||
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
{
|
||||||
Med_Extensions[Media->Type]))
|
case Med_JPG:
|
||||||
return; // Fail
|
/* Move JPG */
|
||||||
break;
|
if (Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
||||||
default:
|
Med_Extensions[Med_JPG]))
|
||||||
Lay_ShowErrorAndExit ("Wrong media type.");
|
Media->Status = Med_MOVED; // Success
|
||||||
break;
|
break;
|
||||||
|
case Med_GIF:
|
||||||
|
/* Move PNG */
|
||||||
|
if (Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
||||||
|
"png"))
|
||||||
|
/* Move GIF */
|
||||||
|
if (Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
||||||
|
Med_Extensions[Med_GIF]))
|
||||||
|
Media->Status = Med_MOVED; // Success
|
||||||
|
break;
|
||||||
|
case Med_MP4:
|
||||||
|
case Med_WEBM:
|
||||||
|
case Med_OGG:
|
||||||
|
/* Move MP4 or WEBM or OGG */
|
||||||
|
if (Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
|
||||||
|
Med_Extensions[Media->Type]))
|
||||||
|
Media->Status = Med_MOVED; // Success
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Lay_ShowErrorAndExit ("Wrong media type.");
|
||||||
|
break; // Not reached
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***** If fail ==> reset media *****/
|
||||||
|
if (Media->Status != Med_MOVED) // Fail
|
||||||
|
Med_ResetMedia (Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1212,6 +1240,32 @@ static bool Med_MoveTmpFileToDefDir (struct Media *Media,
|
||||||
return true; // Success
|
return true; // Success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Store media into database **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Med_StoreMediaInDB (struct Media *Media)
|
||||||
|
{
|
||||||
|
/***** Trivial case *****/
|
||||||
|
if (Media->Status != Med_MOVED)
|
||||||
|
{
|
||||||
|
Med_ResetMedia (Media); // No media inserted in database
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Insert media into database *****/
|
||||||
|
Media->MedCod = DB_QueryINSERTandReturnCode ("can not create media",
|
||||||
|
"INSERT INTO media"
|
||||||
|
" (Type,Name,URL,Title)"
|
||||||
|
" VALUES"
|
||||||
|
" ('%s','%s','%s','%s')",
|
||||||
|
Med_GetStringTypeForDB (Media->Type),
|
||||||
|
Media->Name,
|
||||||
|
Media->URL ? Media->URL : "",
|
||||||
|
Media->Title ? Media->Title : "");
|
||||||
|
Media->Status = Med_STORED_IN_DB;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****** Show a user uploaded media (in a test question, timeline, etc.) ******/
|
/****** Show a user uploaded media (in a test question, timeline, etc.) ******/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1542,10 +1596,10 @@ static void Med_ShowYoutube (struct Media *Media,const char *ClassMedia)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*** Remove private files with an image/video, given the image/video name ****/
|
/**************** Remove media files and entries in database *****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res)
|
void Med_RemoveMediaFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res)
|
||||||
{
|
{
|
||||||
unsigned NumMed;
|
unsigned NumMed;
|
||||||
|
|
||||||
|
@ -1553,87 +1607,106 @@ void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res)
|
||||||
for (NumMed = 0;
|
for (NumMed = 0;
|
||||||
NumMed < NumMedia;
|
NumMed < NumMedia;
|
||||||
NumMed++)
|
NumMed++)
|
||||||
Med_RemoveMediaFilesFromRow (mysql_res);
|
Med_RemoveMediaFromRow (mysql_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Med_RemoveMediaFilesFromRow (MYSQL_RES *mysql_res)
|
void Med_RemoveMediaFromRow (MYSQL_RES *mysql_res)
|
||||||
{
|
{
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
long MedCod;
|
||||||
|
|
||||||
/***** Get media name (row[0]) and type (row[1]) *****/
|
/***** Get media code (row[0]) *****/
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
MedCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
|
||||||
/***** Remove image file *****/
|
/***** Remove media files *****/
|
||||||
Med_RemoveMediaFiles (row[0],Med_GetTypeFromStrInDB (row[1]));
|
Med_RemoveMedia (MedCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type)
|
void Med_RemoveMedia (long MedCod)
|
||||||
{
|
{
|
||||||
char PathMedPriv[PATH_MAX + 1];
|
char PathMedPriv[PATH_MAX + 1];
|
||||||
char FullPathMediaPriv[PATH_MAX + 1];
|
char FullPathMediaPriv[PATH_MAX + 1];
|
||||||
|
struct Media Media;
|
||||||
|
|
||||||
/***** Trivial cases *****/
|
/***** Trivial case *****/
|
||||||
if (Name == NULL)
|
if (MedCod <= 0)
|
||||||
return;
|
|
||||||
if (!Name[0])
|
|
||||||
return;
|
|
||||||
if (Type == Med_YOUTUBE)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/***** Build path to private directory with the media *****/
|
/***** Initialize media *****/
|
||||||
snprintf (PathMedPriv,sizeof (PathMedPriv),
|
Med_MediaConstructor (&Media);
|
||||||
"%s/%s/%c%c",
|
|
||||||
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
|
|
||||||
Name[0],
|
|
||||||
Name[1]);
|
|
||||||
|
|
||||||
/***** Remove files *****/
|
/***** Get media *****/
|
||||||
switch (Type)
|
Media.MedCod = MedCod;
|
||||||
|
Med_GetMediaDataByCod (&Media);
|
||||||
|
|
||||||
|
/***** Step 1. Remove files *****/
|
||||||
|
if (Media.Type != Med_TYPE_NONE &&
|
||||||
|
Media.Type != Med_YOUTUBE &&
|
||||||
|
Media.Name[0])
|
||||||
{
|
{
|
||||||
case Med_JPG:
|
/***** Build path to private directory with the media *****/
|
||||||
/***** Remove private JPG file *****/
|
snprintf (PathMedPriv,sizeof (PathMedPriv),
|
||||||
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
"%s/%s/%c%c",
|
||||||
"%s/%s.%s",
|
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
|
||||||
PathMedPriv,Name,Med_Extensions[Med_JPG]);
|
Media.Name[0],
|
||||||
unlink (FullPathMediaPriv);
|
Media.Name[1]);
|
||||||
|
|
||||||
break;
|
/***** Remove files *****/
|
||||||
case Med_GIF:
|
switch (Media.Type)
|
||||||
/***** Remove private GIF file *****/
|
{
|
||||||
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
case Med_JPG:
|
||||||
"%s/%s.%s",
|
/***** Remove private JPG file *****/
|
||||||
PathMedPriv,Name,Med_Extensions[Med_GIF]);
|
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
||||||
unlink (FullPathMediaPriv);
|
"%s/%s.%s",
|
||||||
|
PathMedPriv,Media.Name,Med_Extensions[Med_JPG]);
|
||||||
|
unlink (FullPathMediaPriv);
|
||||||
|
|
||||||
/***** Remove private PNG file *****/
|
break;
|
||||||
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
case Med_GIF:
|
||||||
"%s/%s.png",
|
/***** Remove private GIF file *****/
|
||||||
PathMedPriv,Name);
|
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
||||||
unlink (FullPathMediaPriv);
|
"%s/%s.%s",
|
||||||
|
PathMedPriv,Media.Name,Med_Extensions[Med_GIF]);
|
||||||
|
unlink (FullPathMediaPriv);
|
||||||
|
|
||||||
break;
|
/***** Remove private PNG file *****/
|
||||||
case Med_MP4:
|
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
||||||
case Med_WEBM:
|
"%s/%s.png",
|
||||||
case Med_OGG:
|
PathMedPriv,Media.Name);
|
||||||
/***** Remove private video file *****/
|
unlink (FullPathMediaPriv);
|
||||||
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
|
||||||
"%s/%s.%s",
|
|
||||||
PathMedPriv,Name,Med_Extensions[Type]);
|
|
||||||
unlink (FullPathMediaPriv);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
case Med_MP4:
|
||||||
break;
|
case Med_WEBM:
|
||||||
|
case Med_OGG:
|
||||||
|
/***** Remove private video file *****/
|
||||||
|
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
|
||||||
|
"%s/%s.%s",
|
||||||
|
PathMedPriv,Media.Name,Med_Extensions[Media.Type]);
|
||||||
|
unlink (FullPathMediaPriv);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Public links are removed automatically after a period
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public links are removed automatically after a period
|
/***** Step 2. Remove entry for this media from database *****/
|
||||||
|
DB_QueryDELETE ("can not remove media",
|
||||||
|
"DELETE FROM media WHERE MedCod=%ld",
|
||||||
|
MedCod);
|
||||||
|
|
||||||
|
/***** Free media *****/
|
||||||
|
Med_MediaDestructor (&Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************ Get media type from string *************************/
|
/************************ Get media type from string *************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
|
static Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
|
||||||
{
|
{
|
||||||
Med_Type_t Type;
|
Med_Type_t Type;
|
||||||
|
|
||||||
|
@ -1708,7 +1781,7 @@ static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
|
||||||
/*************** Get string media type in database from type *****************/
|
/*************** Get string media type in database from type *****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
const char *Med_GetStringTypeForDB (Med_Type_t Type)
|
static const char *Med_GetStringTypeForDB (Med_Type_t Type)
|
||||||
{
|
{
|
||||||
/***** Check if type is out of valid range *****/
|
/***** Check if type is out of valid range *****/
|
||||||
if (Type > (Med_Type_t) (Med_NUM_TYPES - 1))
|
if (Type > (Med_Type_t) (Med_NUM_TYPES - 1))
|
||||||
|
|
21
swad_media.h
21
swad_media.h
|
@ -58,7 +58,7 @@ typedef enum
|
||||||
No file Original file Temporary Definitive Name of the image/video
|
No file Original file Temporary Definitive Name of the image/video
|
||||||
uploaded uploaded by user processed file processed file stored in database
|
uploaded uploaded by user processed file processed file stored in database
|
||||||
--------- --------------------------- ------------------ ------------------ ---------------------
|
--------- --------------------------- ------------------ ------------------ ---------------------
|
||||||
Med_STATUS_NONE Med_PROCESSED Med_NAME_STORED_IN_DB
|
Med_STATUS_NONE Med_PROCESSED Med_MOVED Med_NAME_STORED_IN_DB
|
||||||
--------- --------------------------- ------------------ ------------------ ---------------------
|
--------- --------------------------- ------------------ ------------------ ---------------------
|
||||||
upload-file process file move file insert in database
|
upload-file process file move file insert in database
|
||||||
--------- --------------------------- ------------------ ------------------ ---------------------
|
--------- --------------------------- ------------------ ------------------ ---------------------
|
||||||
|
@ -82,6 +82,7 @@ typedef enum
|
||||||
{
|
{
|
||||||
Med_STATUS_NONE,
|
Med_STATUS_NONE,
|
||||||
Med_PROCESSED,
|
Med_PROCESSED,
|
||||||
|
Med_MOVED,
|
||||||
Med_STORED_IN_DB,
|
Med_STORED_IN_DB,
|
||||||
} Med_Status_t;
|
} Med_Status_t;
|
||||||
|
|
||||||
|
@ -100,6 +101,7 @@ typedef enum
|
||||||
/***** Struct used to get images/videos from forms *****/
|
/***** Struct used to get images/videos from forms *****/
|
||||||
struct Media
|
struct Media
|
||||||
{
|
{
|
||||||
|
long MedCod;
|
||||||
Med_Action_t Action;
|
Med_Action_t Action;
|
||||||
Med_Status_t Status;
|
Med_Status_t Status;
|
||||||
char Name[Med_BYTES_NAME + 1];
|
char Name[Med_BYTES_NAME + 1];
|
||||||
|
@ -135,11 +137,7 @@ void Med_MediaConstructor (struct Media *Media);
|
||||||
void Med_MediaDestructor (struct Media *Media);
|
void Med_MediaDestructor (struct Media *Media);
|
||||||
void Med_ResetMedia (struct Media *Media);
|
void Med_ResetMedia (struct Media *Media);
|
||||||
|
|
||||||
void Med_GetMediaDataFromRow (const char *Name,
|
void Med_GetMediaDataByCod (struct Media *Media);
|
||||||
const char *TypeStr,
|
|
||||||
const char *Title,
|
|
||||||
const char *URL,
|
|
||||||
struct Media *Media);
|
|
||||||
|
|
||||||
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput);
|
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput);
|
||||||
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
|
void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
|
||||||
|
@ -148,14 +146,13 @@ void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media,
|
||||||
void Med_SetParamNames (struct ParamUploadMedia *ParamUploadMedia,int NumMediaInForm);
|
void Med_SetParamNames (struct ParamUploadMedia *ParamUploadMedia,int NumMediaInForm);
|
||||||
|
|
||||||
void Med_MoveMediaToDefinitiveDir (struct Media *Media);
|
void Med_MoveMediaToDefinitiveDir (struct Media *Media);
|
||||||
|
void Med_StoreMediaInDB (struct Media *Media);
|
||||||
|
|
||||||
void Med_ShowMedia (struct Media *Media,
|
void Med_ShowMedia (struct Media *Media,
|
||||||
const char *ClassContainer,const char *ClassMedia);
|
const char *ClassContainer,const char *ClassMedia);
|
||||||
|
|
||||||
void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res);
|
void Med_RemoveMediaFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res);
|
||||||
void Med_RemoveMediaFilesFromRow (MYSQL_RES *mysql_res);
|
void Med_RemoveMediaFromRow (MYSQL_RES *mysql_res);
|
||||||
void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type);
|
void Med_RemoveMedia (long MedCod);
|
||||||
|
|
||||||
Med_Type_t Med_GetTypeFromStrInDB (const char *Str);
|
|
||||||
const char *Med_GetStringTypeForDB (Med_Type_t Type);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1282,25 +1282,26 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
||||||
long MsgCod;
|
long MsgCod;
|
||||||
|
|
||||||
/***** Check if image is received and processed *****/
|
/***** Check if image is received and processed *****/
|
||||||
|
Media->MedCod = -1L;
|
||||||
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
|
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
|
||||||
Media->Status == Med_PROCESSED) // The new media received has been processed
|
Media->Status == Med_PROCESSED) // The new media received has been processed
|
||||||
|
{
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Med_MoveMediaToDefinitiveDir (Media);
|
Med_MoveMediaToDefinitiveDir (Media);
|
||||||
|
|
||||||
|
/* Store media in database */
|
||||||
|
if (Media->Status == Med_MOVED)
|
||||||
|
Med_StoreMediaInDB (Media); // Set Media->MedCod
|
||||||
|
}
|
||||||
|
|
||||||
/***** Insert message subject and content in the database *****/
|
/***** Insert message subject and content in the database *****/
|
||||||
MsgCod =
|
MsgCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create message",
|
DB_QueryINSERTandReturnCode ("can not create message",
|
||||||
"INSERT INTO msg_content"
|
"INSERT INTO msg_content"
|
||||||
" (Subject,Content,"
|
" (Subject,Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s',"
|
" ('%s','%s',%ld)",
|
||||||
"'%s','%s','%s','%s')",
|
Subject,Content,Media->MedCod);
|
||||||
Subject,Content,
|
|
||||||
Media->Name,
|
|
||||||
Med_GetStringTypeForDB (Media->Type),
|
|
||||||
Media->Title ? Media->Title : "",
|
|
||||||
Media->URL ? Media->URL : "");
|
|
||||||
|
|
||||||
/***** Insert message in sent messages *****/
|
/***** Insert message in sent messages *****/
|
||||||
DB_QueryINSERT ("can not create message",
|
DB_QueryINSERT ("can not create message",
|
||||||
|
@ -1493,10 +1494,8 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
|
||||||
/* Insert message content into msg_content_deleted */
|
/* Insert message content into msg_content_deleted */
|
||||||
DB_QueryINSERT ("can not remove the content of a message",
|
DB_QueryINSERT ("can not remove the content of a message",
|
||||||
"INSERT IGNORE INTO msg_content_deleted"
|
"INSERT IGNORE INTO msg_content_deleted"
|
||||||
" (MsgCod,Subject,Content,"
|
" (MsgCod,Subject,Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
" SELECT MsgCod,Subject,Content,MedCod"
|
||||||
" SELECT MsgCod,Subject,Content,"
|
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL"
|
|
||||||
" FROM msg_content WHERE MsgCod=%ld",
|
" FROM msg_content WHERE MsgCod=%ld",
|
||||||
MsgCod);
|
MsgCod);
|
||||||
|
|
||||||
|
@ -2788,10 +2787,7 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
|
||||||
/***** Get content of message from database *****/
|
/***** Get content of message from database *****/
|
||||||
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content of a message",
|
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content of a message",
|
||||||
"SELECT Content," // row[0]
|
"SELECT Content," // row[0]
|
||||||
"MediaName," // row[1]
|
"MedCod" // row[1]
|
||||||
"MediaType," // row[2]
|
|
||||||
"MediaTitle," // row[3]
|
|
||||||
"MediaURL" // row[4]
|
|
||||||
" FROM msg_content WHERE MsgCod=%ld",
|
" FROM msg_content WHERE MsgCod=%ld",
|
||||||
MsgCod);
|
MsgCod);
|
||||||
|
|
||||||
|
@ -2806,8 +2802,9 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
|
/***** Get media (row[1]) *****/
|
||||||
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],Media);
|
Media->MedCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||||
|
Med_GetMediaDataByCod (Media);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
591
swad_test.c
591
swad_test.c
File diff suppressed because it is too large
Load Diff
|
@ -143,11 +143,6 @@ void Tst_ShowFormAskTst (void);
|
||||||
void Tst_ShowNewTest (void);
|
void Tst_ShowNewTest (void);
|
||||||
void Tst_AssessTest (void);
|
void Tst_AssessTest (void);
|
||||||
|
|
||||||
void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
|
|
||||||
struct UsrData *UsrDat,
|
|
||||||
struct Game *Game,
|
|
||||||
unsigned NumQst,long QstCod,MYSQL_ROW row,
|
|
||||||
double *ScoreThisQst,bool *AnswerIsNotBlank);
|
|
||||||
void Tst_WriteQstStem (const char *Stem,const char *ClassStem);
|
void Tst_WriteQstStem (const char *Stem,const char *ClassStem);
|
||||||
void Tst_WriteQstFeedback (const char *Feedback,const char *ClassFeedback);
|
void Tst_WriteQstFeedback (const char *Feedback,const char *ClassFeedback);
|
||||||
|
|
||||||
|
|
|
@ -194,19 +194,16 @@ void TsI_CreateXML (unsigned long NumRows,MYSQL_RES *mysql_res)
|
||||||
{
|
{
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
/*
|
/*
|
||||||
row[ 0] QstCod
|
row[0] QstCod
|
||||||
row[ 1] UNIX_TIMESTAMP(EditTime)
|
row[1] UNIX_TIMESTAMP(EditTime)
|
||||||
row[ 2] AnsType
|
row[2] AnsType
|
||||||
row[ 3] Shuffle
|
row[3] Shuffle
|
||||||
row[ 4] Stem
|
row[4] Stem
|
||||||
row[ 5] Feedback
|
row[5] Feedback
|
||||||
row[ 6] MediaName
|
row[6] MedCod
|
||||||
row[ 7] MediaType
|
row[7] NumHits
|
||||||
row[ 8] MediaTitle
|
row[8] NumHitsNotBlank
|
||||||
row[ 9] MediaURL
|
row[9] Score
|
||||||
row[10] NumHits
|
|
||||||
row[11] NumHitsNotBlank
|
|
||||||
row[12] Score
|
|
||||||
*/
|
*/
|
||||||
/* row[0] holds the code of the question */
|
/* row[0] holds the code of the question */
|
||||||
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
|
||||||
|
@ -313,12 +310,10 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
|
||||||
row[0] AnsInd
|
row[0] AnsInd
|
||||||
row[1] Answer
|
row[1] Answer
|
||||||
row[2] Feedback
|
row[2] Feedback
|
||||||
row[3] MediaName
|
row[3] MedCod
|
||||||
row[4] MediaType
|
row[4] Correct
|
||||||
row[5] MediaTitle
|
|
||||||
row[6] MediaURL
|
|
||||||
row[7] Correct
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/***** Write the answers *****/
|
/***** Write the answers *****/
|
||||||
switch (Gbl.Test.AnswerType)
|
switch (Gbl.Test.AnswerType)
|
||||||
{
|
{
|
||||||
|
|
217
swad_timeline.c
217
swad_timeline.c
|
@ -98,7 +98,7 @@ struct TL_Note
|
||||||
TL_NoteType_t NoteType;
|
TL_NoteType_t NoteType;
|
||||||
long UsrCod;
|
long UsrCod;
|
||||||
long HieCod; // Hierarchy code (institution/centre/degree/course)
|
long HieCod; // Hierarchy code (institution/centre/degree/course)
|
||||||
long Cod; // Code of file, forum post, notice,...
|
long Cod; // Code of file, forum post, notice, timeline post...
|
||||||
bool Unavailable; // File, forum post, notice,... unavailable (removed)
|
bool Unavailable; // File, forum post, notice,... unavailable (removed)
|
||||||
time_t DateTimeUTC;
|
time_t DateTimeUTC;
|
||||||
unsigned NumShared; // Number of times (users) this note has been shared
|
unsigned NumShared; // Number of times (users) this note has been shared
|
||||||
|
@ -234,8 +234,8 @@ static void TL_UnfavComment (struct TL_Comment *SocCom);
|
||||||
static void TL_RequestRemovalNote (void);
|
static void TL_RequestRemovalNote (void);
|
||||||
static void TL_PutParamsRemoveNote (void);
|
static void TL_PutParamsRemoveNote (void);
|
||||||
static void TL_RemoveNote (void);
|
static void TL_RemoveNote (void);
|
||||||
static void TL_RemoveImgFileFromPost (long PstCod);
|
static void TL_RemoveMediaFromPost (long PstCod);
|
||||||
static void TL_RemoveANoteFromDB (struct TL_Note *SocNot);
|
static void TL_RemoveNoteMediaAndDBEntries (struct TL_Note *SocNot);
|
||||||
|
|
||||||
static long TL_GetNotCodOfPublication (long PubCod);
|
static long TL_GetNotCodOfPublication (long PubCod);
|
||||||
static long TL_GetPubCodOfOriginalNote (long NotCod);
|
static long TL_GetPubCodOfOriginalNote (long NotCod);
|
||||||
|
@ -243,8 +243,7 @@ static long TL_GetPubCodOfOriginalNote (long NotCod);
|
||||||
static void TL_RequestRemovalComment (void);
|
static void TL_RequestRemovalComment (void);
|
||||||
static void TL_PutParamsRemoveCommment (void);
|
static void TL_PutParamsRemoveCommment (void);
|
||||||
static void TL_RemoveComment (void);
|
static void TL_RemoveComment (void);
|
||||||
static void TL_RemoveImgFileFromComment (long PubCod);
|
static void TL_RemoveCommentMediaAndDBEntries (long PubCod);
|
||||||
static void TL_RemoveACommentFromDB (struct TL_Comment *SocCom);
|
|
||||||
|
|
||||||
static bool TL_CheckIfNoteIsSharedByUsr (long NotCod,long UsrCod);
|
static bool TL_CheckIfNoteIsSharedByUsr (long NotCod,long UsrCod);
|
||||||
static bool TL_CheckIfNoteIsFavedByUsr (long NotCod,long UsrCod);
|
static bool TL_CheckIfNoteIsFavedByUsr (long NotCod,long UsrCod);
|
||||||
|
@ -1829,10 +1828,7 @@ static void TL_GetAndWritePost (long PstCod)
|
||||||
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content"
|
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content"
|
||||||
" of a post",
|
" of a post",
|
||||||
"SELECT Content," // row[0]
|
"SELECT Content," // row[0]
|
||||||
"MediaName," // row[1]
|
"MedCod" // row[1]
|
||||||
"MediaType," // row[2]
|
|
||||||
"MediaTitle," // row[3]
|
|
||||||
"MediaURL" // row[4]
|
|
||||||
" FROM social_posts"
|
" FROM social_posts"
|
||||||
" WHERE PstCod=%ld",
|
" WHERE PstCod=%ld",
|
||||||
PstCod);
|
PstCod);
|
||||||
|
@ -1846,8 +1842,9 @@ static void TL_GetAndWritePost (long PstCod)
|
||||||
Str_Copy (Content,row[0],
|
Str_Copy (Content,row[0],
|
||||||
Cns_MAX_BYTES_LONG_TEXT);
|
Cns_MAX_BYTES_LONG_TEXT);
|
||||||
|
|
||||||
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
|
/***** Get media (row[1]) *****/
|
||||||
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],&Media);
|
Media.MedCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||||
|
Med_GetMediaDataByCod (&Media);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Content[0] = '\0';
|
Content[0] = '\0';
|
||||||
|
@ -2477,26 +2474,28 @@ static long TL_ReceivePost (void)
|
||||||
Media.Status == Med_PROCESSED) // A media is attached
|
Media.Status == Med_PROCESSED) // A media is attached
|
||||||
{
|
{
|
||||||
/***** Check if media is received and processed *****/
|
/***** Check if media is received and processed *****/
|
||||||
|
Media.MedCod = -1L;
|
||||||
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
|
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
|
||||||
Media.Status == Med_PROCESSED) // The new media received has been processed
|
Media.Status == Med_PROCESSED) // The new media received has been processed
|
||||||
|
{
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Med_MoveMediaToDefinitiveDir (&Media);
|
Med_MoveMediaToDefinitiveDir (&Media);
|
||||||
|
|
||||||
|
/* Store media in database */
|
||||||
|
if (Media.Status == Med_MOVED)
|
||||||
|
Med_StoreMediaInDB (&Media); // Set Media.MedCod
|
||||||
|
}
|
||||||
|
|
||||||
/***** Publish *****/
|
/***** Publish *****/
|
||||||
/* Insert post content in the database */
|
/* Insert post content in the database */
|
||||||
PstCod =
|
PstCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create post",
|
DB_QueryINSERTandReturnCode ("can not create post",
|
||||||
"INSERT INTO social_posts"
|
"INSERT INTO social_posts"
|
||||||
" (Content,"
|
" (Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s',"
|
" ('%s',%ld)",
|
||||||
"'%s','%s','%s','%s')",
|
|
||||||
Content,
|
Content,
|
||||||
Media.Name,
|
Media.MedCod);
|
||||||
Med_GetStringTypeForDB (Media.Type),
|
|
||||||
Media.Title ? Media.Title : "",
|
|
||||||
Media.URL ? Media.URL : "");
|
|
||||||
|
|
||||||
/* Insert post in notes */
|
/* Insert post in notes */
|
||||||
TL_StoreAndPublishNote (TL_NOTE_POST,PstCod,&SocPub);
|
TL_StoreAndPublishNote (TL_NOTE_POST,PstCod,&SocPub);
|
||||||
|
@ -2637,10 +2636,7 @@ static void TL_WriteCommentsInNote (const struct TL_Note *SocNot)
|
||||||
"UNIX_TIMESTAMP("
|
"UNIX_TIMESTAMP("
|
||||||
"social_pubs.TimePublish)," // row[3]
|
"social_pubs.TimePublish)," // row[3]
|
||||||
"social_comments.Content," // row[4]
|
"social_comments.Content," // row[4]
|
||||||
"social_comments.MediaName," // row[5]
|
"social_comments.MedCod" // row[5]
|
||||||
"social_comments.MediaType," // row[6]
|
|
||||||
"social_comments.MediaTitle," // row[7]
|
|
||||||
"social_comments.MediaURL" // row[8]
|
|
||||||
" FROM social_pubs,social_comments"
|
" FROM social_pubs,social_comments"
|
||||||
" WHERE social_pubs.NotCod=%ld"
|
" WHERE social_pubs.NotCod=%ld"
|
||||||
" AND social_pubs.PubType=%u"
|
" AND social_pubs.PubType=%u"
|
||||||
|
@ -3204,11 +3200,18 @@ static long TL_ReceiveComment (void)
|
||||||
Media.Status == Med_PROCESSED) // A media is attached
|
Media.Status == Med_PROCESSED) // A media is attached
|
||||||
{
|
{
|
||||||
/***** Check if media is received and processed *****/
|
/***** Check if media is received and processed *****/
|
||||||
|
Media.MedCod = -1L;
|
||||||
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
|
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
|
||||||
Media.Status == Med_PROCESSED) // The new media received has been processed
|
Media.Status == Med_PROCESSED) // The new media received has been processed
|
||||||
|
{
|
||||||
/* Move processed image to definitive directory */
|
/* Move processed image to definitive directory */
|
||||||
Med_MoveMediaToDefinitiveDir (&Media);
|
Med_MoveMediaToDefinitiveDir (&Media);
|
||||||
|
|
||||||
|
/* Store media in database */
|
||||||
|
if (Media.Status == Med_MOVED)
|
||||||
|
Med_StoreMediaInDB (&Media); // Set Media.MedCod
|
||||||
|
}
|
||||||
|
|
||||||
/***** Publish *****/
|
/***** Publish *****/
|
||||||
/* Insert into publications */
|
/* Insert into publications */
|
||||||
SocPub.NotCod = SocNot.NotCod;
|
SocPub.NotCod = SocNot.NotCod;
|
||||||
|
@ -3219,17 +3222,12 @@ static long TL_ReceiveComment (void)
|
||||||
/* Insert comment content in the database */
|
/* Insert comment content in the database */
|
||||||
DB_QueryINSERT ("can not store comment content",
|
DB_QueryINSERT ("can not store comment content",
|
||||||
"INSERT INTO social_comments"
|
"INSERT INTO social_comments"
|
||||||
" (PubCod,Content,"
|
" (PubCod,Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s',"
|
" (%ld,'%s',%ld)",
|
||||||
"'%s','%s','%s','%s')",
|
|
||||||
SocPub.PubCod,
|
SocPub.PubCod,
|
||||||
Content,
|
Content,
|
||||||
Media.Name,
|
Media.MedCod);
|
||||||
Med_GetStringTypeForDB (Media.Type),
|
|
||||||
Media.Title ? Media.Title : "",
|
|
||||||
Media.URL ? Media.URL : "");
|
|
||||||
|
|
||||||
/***** Store notifications about the new comment *****/
|
/***** Store notifications about the new comment *****/
|
||||||
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
|
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
|
||||||
|
@ -3856,12 +3854,11 @@ static void TL_RemoveNote (void)
|
||||||
ItsMe = Usr_ItsMe (SocNot.UsrCod);
|
ItsMe = Usr_ItsMe (SocNot.UsrCod);
|
||||||
if (ItsMe) // I am the author of this note
|
if (ItsMe) // I am the author of this note
|
||||||
{
|
{
|
||||||
if (SocNot.NoteType == TL_NOTE_POST)
|
|
||||||
/***** Remove image file associated to post *****/
|
|
||||||
TL_RemoveImgFileFromPost (SocNot.Cod);
|
|
||||||
|
|
||||||
/***** Delete note from database *****/
|
/***** Delete note from database *****/
|
||||||
TL_RemoveANoteFromDB (&SocNot);
|
TL_RemoveNoteMediaAndDBEntries (&SocNot);
|
||||||
|
|
||||||
|
/***** Reset note *****/
|
||||||
|
TL_ResetNote (&SocNot);
|
||||||
|
|
||||||
/***** Message of success *****/
|
/***** Message of success *****/
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_TIMELINE_Post_removed);
|
Ale_ShowAlert (Ale_SUCCESS,Txt_TIMELINE_Post_removed);
|
||||||
|
@ -3875,19 +3872,18 @@ static void TL_RemoveNote (void)
|
||||||
/***************** Remove one file associated to a post **********************/
|
/***************** Remove one file associated to a post **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void TL_RemoveImgFileFromPost (long PstCod)
|
static void TL_RemoveMediaFromPost (long PstCod)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
|
|
||||||
/***** Get name of image associated to a post from database *****/
|
/***** Get name of media associated to a post from database *****/
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get image",
|
if (DB_QuerySELECT (&mysql_res,"can not get image",
|
||||||
"SELECT MediaName," // row[0]
|
"SELECT MedCod" // row[0]
|
||||||
"MediaType" // row[1]
|
|
||||||
" FROM social_posts"
|
" FROM social_posts"
|
||||||
" WHERE PstCod=%ld",
|
" WHERE PstCod=%ld",
|
||||||
PstCod))
|
PstCod))
|
||||||
/***** Remove media file *****/
|
/***** Remove media file *****/
|
||||||
Med_RemoveMediaFilesFromRow (mysql_res);
|
Med_RemoveMediaFromRow (mysql_res);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -3897,7 +3893,7 @@ static void TL_RemoveImgFileFromPost (long PstCod)
|
||||||
/*********************** Remove a note from database *************************/
|
/*********************** Remove a note from database *************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
|
static void TL_RemoveNoteMediaAndDBEntries (struct TL_Note *SocNot)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
@ -3905,18 +3901,7 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
|
||||||
unsigned long NumComments;
|
unsigned long NumComments;
|
||||||
unsigned long NumCom;
|
unsigned long NumCom;
|
||||||
|
|
||||||
/***** Mark possible notifications on the publications
|
/***** Remove comments associated to this note *****/
|
||||||
of this note as removed *****/
|
|
||||||
/* Mark notifications of the original note as removed */
|
|
||||||
PubCod = TL_GetPubCodOfOriginalNote (SocNot->NotCod);
|
|
||||||
if (PubCod > 0)
|
|
||||||
{
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,PubCod);
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_SHARE ,PubCod);
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get comments of this note */
|
/* Get comments of this note */
|
||||||
NumComments = DB_QuerySELECT (&mysql_res,"can not get comments",
|
NumComments = DB_QuerySELECT (&mysql_res,"can not get comments",
|
||||||
"SELECT PubCod"
|
"SELECT PubCod"
|
||||||
|
@ -3934,43 +3919,50 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
|
||||||
/* Mark notifications as removed */
|
/* Remove media associated to comment
|
||||||
if (PubCod > 0)
|
and delete comment from database */
|
||||||
{
|
TL_RemoveCommentMediaAndDBEntries (PubCod);
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,PubCod);
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
|
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free structure that stores the query result */
|
/* Free structure that stores the query result */
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
/***** Remove favs *****/
|
/***** Remove media associated to post *****/
|
||||||
/* Remove favs for all comments in this note */
|
if (SocNot->NoteType == TL_NOTE_POST)
|
||||||
DB_QueryDELETE ("can not remove favs for note",
|
{
|
||||||
"DELETE FROM social_comments_fav"
|
TL_RemoveMediaFromPost (SocNot->Cod);
|
||||||
" USING social_pubs,social_comments_fav"
|
MYSQL_RES *mysql_res;
|
||||||
" WHERE social_pubs.NotCod=%ld"
|
|
||||||
" AND social_pubs.PubType=%u"
|
|
||||||
" AND social_pubs.PubCod=social_comments_fav.PubCod",
|
|
||||||
SocNot->NotCod,(unsigned) TL_PUB_COMMENT_TO_NOTE);
|
|
||||||
|
|
||||||
/* Remove favs for this note */
|
/* Get name of media associated to a post from database */
|
||||||
|
if (DB_QuerySELECT (&mysql_res,"can not get image",
|
||||||
|
"SELECT MedCod" // row[0]
|
||||||
|
" FROM social_posts"
|
||||||
|
" WHERE PstCod=%ld",
|
||||||
|
SocNot->Cod))
|
||||||
|
/* Remove media */
|
||||||
|
Med_RemoveMediaFromRow (mysql_res);
|
||||||
|
|
||||||
|
/* Free structure that stores the query result */
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Mark possible notifications on the publications
|
||||||
|
of this note as removed *****/
|
||||||
|
/* Mark notifications of the original note as removed */
|
||||||
|
PubCod = TL_GetPubCodOfOriginalNote (SocNot->NotCod);
|
||||||
|
if (PubCod > 0)
|
||||||
|
{
|
||||||
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
|
||||||
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_SHARE ,PubCod);
|
||||||
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Remove favs for this note *****/
|
||||||
DB_QueryDELETE ("can not remove favs for note",
|
DB_QueryDELETE ("can not remove favs for note",
|
||||||
"DELETE FROM social_notes_fav"
|
"DELETE FROM social_notes_fav"
|
||||||
" WHERE NotCod=%ld",
|
" WHERE NotCod=%ld",
|
||||||
SocNot->NotCod);
|
SocNot->NotCod);
|
||||||
|
|
||||||
/***** Remove content of the comments of this note *****/
|
|
||||||
DB_QueryDELETE ("can not remove comments",
|
|
||||||
"DELETE FROM social_comments"
|
|
||||||
" USING social_pubs,social_comments"
|
|
||||||
" WHERE social_pubs.NotCod=%ld"
|
|
||||||
" AND social_pubs.PubType=%u"
|
|
||||||
" AND social_pubs.PubCod=social_comments.PubCod",
|
|
||||||
SocNot->NotCod,(unsigned) TL_PUB_COMMENT_TO_NOTE);
|
|
||||||
|
|
||||||
/***** Remove all the publications of this note *****/
|
/***** Remove all the publications of this note *****/
|
||||||
DB_QueryDELETE ("can not remove a publication",
|
DB_QueryDELETE ("can not remove a publication",
|
||||||
"DELETE FROM social_pubs"
|
"DELETE FROM social_pubs"
|
||||||
|
@ -3991,9 +3983,6 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
|
||||||
"DELETE FROM social_posts"
|
"DELETE FROM social_posts"
|
||||||
" WHERE PstCod=%ld",
|
" WHERE PstCod=%ld",
|
||||||
SocNot->Cod);
|
SocNot->Cod);
|
||||||
|
|
||||||
/***** Reset note *****/
|
|
||||||
TL_ResetNote (SocNot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4198,11 +4187,12 @@ static void TL_RemoveComment (void)
|
||||||
ItsMe = Usr_ItsMe (SocCom.UsrCod);
|
ItsMe = Usr_ItsMe (SocCom.UsrCod);
|
||||||
if (ItsMe) // I am the author of this comment
|
if (ItsMe) // I am the author of this comment
|
||||||
{
|
{
|
||||||
/***** Remove image file associated to post *****/
|
/***** Remove media associated to comment
|
||||||
TL_RemoveImgFileFromComment (SocCom.PubCod);
|
and delete comment from database *****/
|
||||||
|
TL_RemoveCommentMediaAndDBEntries (SocCom.PubCod);
|
||||||
|
|
||||||
/***** Delete comment from database *****/
|
/***** Reset fields of comment *****/
|
||||||
TL_RemoveACommentFromDB (&SocCom);
|
TL_ResetComment (&SocCom);
|
||||||
|
|
||||||
/***** Message of success *****/
|
/***** Message of success *****/
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_Comment_removed);
|
Ale_ShowAlert (Ale_SUCCESS,Txt_Comment_removed);
|
||||||
|
@ -4216,49 +4206,42 @@ static void TL_RemoveComment (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**************** Remove one file associated to a comment ********************/
|
/*************** Remove comment media and database entries *******************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void TL_RemoveImgFileFromComment (long PubCod)
|
static void TL_RemoveCommentMediaAndDBEntries (long PubCod)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
|
|
||||||
/***** Get name of media associated to a post from database *****/
|
/***** Remove media associated to comment *****/
|
||||||
|
/* Get name of media associated to a comment from database */
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get media",
|
if (DB_QuerySELECT (&mysql_res,"can not get media",
|
||||||
"SELECT MediaName," // row[0]
|
"SELECT MedCod" // row[0]
|
||||||
"MediaType" // row[1]
|
|
||||||
" FROM social_comments"
|
" FROM social_comments"
|
||||||
" WHERE PubCod=%ld",
|
" WHERE PubCod=%ld",
|
||||||
PubCod))
|
PubCod))
|
||||||
/***** Remove media file *****/
|
/* Remove media */
|
||||||
Med_RemoveMediaFilesFromRow (mysql_res);
|
Med_RemoveMediaFromRow (mysql_res);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/* Free structure that stores the query result */
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************* Remove a comment from database ************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void TL_RemoveACommentFromDB (struct TL_Comment *SocCom)
|
|
||||||
{
|
|
||||||
/***** Mark possible notifications on this comment as removed *****/
|
/***** Mark possible notifications on this comment as removed *****/
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,SocCom->PubCod);
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,PubCod);
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,SocCom->PubCod);
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
|
||||||
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,SocCom->PubCod);
|
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
|
||||||
|
|
||||||
/***** Remove favs for this comment *****/
|
/***** Remove favs for this comment *****/
|
||||||
DB_QueryDELETE ("can not remove favs for comment",
|
DB_QueryDELETE ("can not remove favs for comment",
|
||||||
"DELETE FROM social_comments_fav"
|
"DELETE FROM social_comments_fav"
|
||||||
" WHERE PubCod=%ld",
|
" WHERE PubCod=%ld",
|
||||||
SocCom->PubCod);
|
PubCod);
|
||||||
|
|
||||||
/***** Remove content of this comment *****/
|
/***** Remove content of this comment *****/
|
||||||
DB_QueryDELETE ("can not remove a comment",
|
DB_QueryDELETE ("can not remove a comment",
|
||||||
"DELETE FROM social_comments"
|
"DELETE FROM social_comments"
|
||||||
" WHERE PubCod=%ld",
|
" WHERE PubCod=%ld",
|
||||||
SocCom->PubCod);
|
PubCod);
|
||||||
|
|
||||||
/***** Remove this comment *****/
|
/***** Remove this comment *****/
|
||||||
DB_QueryDELETE ("can not remove a comment",
|
DB_QueryDELETE ("can not remove a comment",
|
||||||
|
@ -4266,12 +4249,9 @@ static void TL_RemoveACommentFromDB (struct TL_Comment *SocCom)
|
||||||
" WHERE PubCod=%ld"
|
" WHERE PubCod=%ld"
|
||||||
" AND PublisherCod=%ld" // Extra check: I am the author
|
" AND PublisherCod=%ld" // Extra check: I am the author
|
||||||
" AND PubType=%u", // Extra check: it's a comment
|
" AND PubType=%u", // Extra check: it's a comment
|
||||||
SocCom->PubCod,
|
PubCod,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
(unsigned) TL_PUB_COMMENT_TO_NOTE);
|
(unsigned) TL_PUB_COMMENT_TO_NOTE);
|
||||||
|
|
||||||
/***** Reset comment *****/
|
|
||||||
TL_ResetComment (SocCom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4693,10 +4673,7 @@ static void TL_GetDataOfCommByCod (struct TL_Comment *SocCom)
|
||||||
"social_pubs.NotCod," // row[2]
|
"social_pubs.NotCod," // row[2]
|
||||||
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
|
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
|
||||||
"social_comments.Content," // row[4]
|
"social_comments.Content," // row[4]
|
||||||
"social_comments.MediaName," // row[5]
|
"social_comments.MedCod" // row[5]
|
||||||
"social_comments.MediaType," // row[6]
|
|
||||||
"social_comments.MediaTitle," // row[7]
|
|
||||||
"social_comments.MediaURL" // row[8]
|
|
||||||
" FROM social_pubs,social_comments"
|
" FROM social_pubs,social_comments"
|
||||||
" WHERE social_pubs.PubCod=%ld"
|
" WHERE social_pubs.PubCod=%ld"
|
||||||
" AND social_pubs.PubType=%u"
|
" AND social_pubs.PubType=%u"
|
||||||
|
@ -4826,10 +4803,7 @@ static void TL_GetDataOfCommentFromRow (MYSQL_ROW row,struct TL_Comment *SocCom)
|
||||||
row[2]: NotCod
|
row[2]: NotCod
|
||||||
row[3]: TimePublish
|
row[3]: TimePublish
|
||||||
row[4]: Content
|
row[4]: Content
|
||||||
row[5]: MediaName
|
row[5]: MedCod
|
||||||
row[6]: MediaType
|
|
||||||
row[7]: MediaTitle
|
|
||||||
row[8]: MediaURL
|
|
||||||
*/
|
*/
|
||||||
/***** Get code of comment (row[0]) *****/
|
/***** Get code of comment (row[0]) *****/
|
||||||
SocCom->PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
SocCom->PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
|
@ -4850,8 +4824,9 @@ static void TL_GetDataOfCommentFromRow (MYSQL_ROW row,struct TL_Comment *SocCom)
|
||||||
/***** Get number of times this comment has been favourited *****/
|
/***** Get number of times this comment has been favourited *****/
|
||||||
TL_GetNumTimesACommHasBeenFav (SocCom);
|
TL_GetNumTimesACommHasBeenFav (SocCom);
|
||||||
|
|
||||||
/****** Get media data (row[5], row[6], row[7], row[8]) *****/
|
/***** Get media (row[5]) *****/
|
||||||
Med_GetMediaDataFromRow (row[5],row[6],row[7],row[8],&SocCom->Media);
|
SocCom->Media.MedCod = Str_ConvertStrCodToLongCod (row[5]);
|
||||||
|
Med_GetMediaDataByCod (&SocCom->Media);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -3446,13 +3446,10 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod,
|
||||||
NewMsgCod =
|
NewMsgCod =
|
||||||
DB_QueryINSERTandReturnCode ("can not create message",
|
DB_QueryINSERTandReturnCode ("can not create message",
|
||||||
"INSERT INTO msg_content"
|
"INSERT INTO msg_content"
|
||||||
" (Subject,Content,"
|
" (Subject,Content,MedCod)"
|
||||||
"MediaName,MediaType,MediaTitle,MediaURL)"
|
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" ('%s','%s',"
|
" ('%s','%s',-1)",
|
||||||
"'','%s','','')",
|
Subject,Content);
|
||||||
Subject,Content,
|
|
||||||
Med_GetStringTypeForDB (Med_TYPE_NONE));
|
|
||||||
|
|
||||||
/* Insert message in sent messages */
|
/* Insert message in sent messages */
|
||||||
DB_QueryINSERT ("can not create message",
|
DB_QueryINSERT ("can not create message",
|
||||||
|
|
Loading…
Reference in New Issue