Version18.81

This commit is contained in:
Antonio Cañas Vargas 2019-03-18 15:42:22 +01:00
parent 550d2899a4
commit 12b56ef03c
14 changed files with 792 additions and 708 deletions

View File

@ -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
{ {

View File

@ -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
-- --

View File

@ -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)

View File

@ -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 *****/
/* /*

View File

@ -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);

View File

@ -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");

View File

@ -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))

View File

@ -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

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -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",