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
{
box-sizing:border-box;
border-radius:8px;
border-radius:4px;
}
.TL_COMMENT_CONTAINER
{
@ -3017,7 +3017,7 @@ a:hover img.CENTRE_PHOTO_SHOW
.TL_COMMENT_MED
{
box-sizing:border-box;
border-radius:8px;
border-radius:4px;
}
.TL_FORM_NEW_COMMENT
{

View File

@ -1334,6 +1334,7 @@ CREATE TABLE IF NOT EXISTS usr_data (
Comments TEXT NOT NULL DEFAULT '',
Menu TINYINT NOT NULL DEFAULT 0,
SideCols TINYINT NOT NULL DEFAULT 3,
ThirdPartyCookies ENUM('N','Y') NOT NULL DEFAULT 'N',
NotifNtfEvents INT NOT NULL DEFAULT 0,
EmailNtfEvents INT NOT NULL DEFAULT 0,
PRIMARY KEY(UsrCod),
@ -1351,7 +1352,8 @@ CREATE TABLE IF NOT EXISTS usr_data (
INDEX(DptCod),
INDEX(CtrCod),
INDEX(Menu),
INDEX(SideCols));
INDEX(SideCols),
INDEX(ThirdPartyCookies));
--
-- 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: 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
/*****************************************************************************/
@ -457,10 +459,51 @@ En OpenSWAD:
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 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.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)

View File

@ -1218,12 +1218,13 @@ mysql> DESCRIBE forum_post;
| NumNotif | int(11) | NO | | 0 | |
| Subject | text | NO | | NULL | |
| Content | longtext | NO | | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | 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 ("
"PstCod INT NOT NULL AUTO_INCREMENT,"
@ -1234,6 +1235,7 @@ mysql> DESCRIBE forum_post;
"NumNotif INT NOT NULL DEFAULT 0,"
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
"MedCod INT NOT NULL DEFAULT -1,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
@ -1242,7 +1244,8 @@ mysql> DESCRIBE forum_post;
"INDEX(ThrCod),"
"INDEX(UsrCod),"
"INDEX(CreatTime),"
"INDEX(ModifTime))");
"INDEX(ModifTime),"
"INDEX(MedCod))");
/***** Table forum_thr_clip *****/
/*
@ -1714,6 +1717,29 @@ mysql> DESCRIBE marks_properties;
"Footer INT NOT NULL,"
"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 *****/
/*
mysql> DESCRIBE msg_banned;
@ -1739,23 +1765,26 @@ mysql> DESCRIBE msg_content;
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | 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 ("
"MsgCod INT NOT NULL AUTO_INCREMENT,"
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MedCod INT NOT NULL DEFAULT -1,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
"FULLTEXT(Subject,Content),"
"INDEX(MedCod)) ENGINE = MYISAM;");
/***** Table msg_content_deleted *****/
/*
@ -1766,23 +1795,26 @@ mysql> DESCRIBE msg_content_deleted;
| MsgCod | int(11) | NO | PRI | NULL | |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | 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 ("
"MsgCod INT NOT NULL,"
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MedCod INT NOT NULL DEFAULT -1,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
"FULLTEXT(Subject,Content)) ENGINE = MYISAM;");
"FULLTEXT(Subject,Content),"
"INDEX(MedCod)) ENGINE = MYISAM;");
/***** Table msg_rcv *****/
/*
@ -2181,22 +2213,25 @@ mysql> DESCRIBE social_comments;
+------------+-------------------------------------------------------+------+-----+---------+-------+
| PubCod | bigint(20) | NO | PRI | NULL | |
| Content | longtext | NO | MUL | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | 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 ("
"PubCod BIGINT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MedCod INT NOT NULL DEFAULT -1,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
"FULLTEXT(Content)) ENGINE = MYISAM;");
"FULLTEXT(Content),"
"INDEX(MedCod)) ENGINE = MYISAM;");
/***** Table social_comments_fav *****/
/*
@ -2279,22 +2314,25 @@ mysql> DESCRIBE social_posts;
+------------+-------------------------------------------------------+------+-----+---------+----------------+
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
| Content | longtext | NO | MUL | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | 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 ("
"PubCod INT NOT NULL AUTO_INCREMENT,"
"Content LONGTEXT NOT NULL,"
"MedCod INT NOT NULL DEFAULT -1,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
"FULLTEXT(Content)) ENGINE = MYISAM;");
"FULLTEXT(Content),"
"INDEX(MedCod)) ENGINE = MYISAM;");
/***** Table social_pubs *****/
/*
@ -2554,25 +2592,28 @@ mysql> DESCRIBE tst_answers;
| AnsInd | tinyint(4) | NO | | NULL | |
| Answer | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
| 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 ("
"QstCod INT NOT NULL,"
"AnsInd TINYINT NOT NULL,"
"Answer 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
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"Correct ENUM('N','Y') NOT NULL,"
"INDEX(QstCod))");
"INDEX(QstCod),"
"INDEX(MedCod))");
/***** Table tst_config *****/
/*
@ -2684,6 +2725,7 @@ mysql> DESCRIBE tst_questions;
| Shuffle | enum('N','Y') | NO | | NULL | |
| Stem | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
| MedCod | int(11) | NO | MUL | -1 | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg','youtube') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
@ -2692,7 +2734,7 @@ mysql> DESCRIBE tst_questions;
| NumHitsNotBlank | int(11) | 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 ("
"QstCod INT NOT NULL AUTO_INCREMENT,"
@ -2702,6 +2744,7 @@ mysql> DESCRIBE tst_questions;
"Shuffle ENUM('N','Y') NOT NULL,"
"Stem 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
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg','youtube') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
@ -2710,7 +2753,8 @@ mysql> DESCRIBE tst_questions;
"NumHitsNotBlank INT NOT NULL DEFAULT 0,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"UNIQUE INDEX(QstCod),"
"INDEX(CrsCod,EditTime))");
"INDEX(CrsCod,EditTime),"
"INDEX(MedCod))");
/***** Table tst_status *****/
/*
@ -2865,7 +2909,7 @@ mysql> DESCRIBE usr_data;
"INDEX(CtrCod),"
"INDEX(Menu),"
"INDEX(SideCols),"
"INDEX(ThirdPartyCookies)");
"INDEX(ThirdPartyCookies))");
/***** Table usr_duplicated *****/
/*

View File

@ -283,7 +283,7 @@ static void For_InsertPstIntoBannedPstTable (long PstCod);
static long For_InsertForumPst (long ThrCod,long UsrCod,
const char *Subject,const char *Content,
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 long For_InsertForumThread (long FirstPstCod);
@ -501,28 +501,29 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
long PstCod;
/***** Check if image is received and processed *****/
Media->MedCod = -1L;
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
Media->Status == Med_PROCESSED) // The new media received has been processed
{
/* Move processed media to definitive directory */
Med_MoveMediaToDefinitiveDir (Media);
/* Store media in database */
if (Media->Status == Med_MOVED)
Med_StoreMediaInDB (Media); // Set Media->MedCod
}
/***** Insert forum post in the database *****/
PstCod =
DB_QueryINSERTandReturnCode ("can not create a new post in a forum",
"INSERT INTO forum_post"
" (ThrCod,UsrCod,CreatTime,ModifTime,NumNotif,"
"Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
"Subject,Content,MedCod)"
" VALUES"
" (%ld,%ld,NOW(),NOW(),0,"
"'%s','%s',"
"'%s','%s','%s','%s')",
"'%s','%s',%ld)",
ThrCod,UsrCod,
Subject,Content,
Media->Name,
Med_GetStringTypeForDB (Media->Type),
Media->Title ? Media->Title : "",
Media->URL ? Media->URL : "");
Subject,Content,Media->MedCod);
return PstCod;
}
@ -532,13 +533,13 @@ static long For_InsertForumPst (long ThrCod,long UsrCod,
/*****************************************************************************/
// 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;
bool ThreadDeleted = false;
/***** 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 (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]
"Subject," // row[2]
"Content," // row[3]
"MediaName," // row[4]
"MediaType," // row[5]
"MediaTitle," // row[6]
"MediaURL" // row[7]
"MedCod" // row[4]
" FROM forum_post WHERE PstCod=%ld",
PstCod);
@ -1359,22 +1357,23 @@ static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
/***** Get number of rows *****/
row = mysql_fetch_row (mysql_res);
/****** Get author code (row[1]) *****/
/***** Get author code (row[1]) *****/
*UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/****** Get creation time (row[1]) *****/
/***** Get creation time (row[1]) *****/
*CreatTimeUTC = Dat_GetUNIXTimeFromStr (row[1]);
/****** Get subject (row[2]) *****/
/***** Get subject (row[2]) *****/
Str_Copy (Subject,row[2],
Cns_MAX_BYTES_SUBJECT);
/****** Get location (row[3]) *****/
/***** Get location (row[3]) *****/
Str_Copy (Content,row[3],
Cns_MAX_BYTES_LONG_TEXT);
/****** Get media data (row[4], row[5], row[6], row[7]) *****/
Med_GetMediaDataFromRow (row[4],row[5],row[6],row[7],Media);
/***** Get media (row[4]) *****/
Media->MedCod = Str_ConvertStrCodToLongCod (row[4]);
Med_GetMediaDataByCod (Media);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -4089,7 +4088,7 @@ void For_ReceiveForumPost (void)
For_UpdateThrFirstAndLastPst (Gbl.Forum.ForumSelected.ThrCod,PstCod,PstCod);
}
/***** Free image *****/
/***** Free media *****/
Med_MediaDestructor (&Media);
/***** 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.");
/***** Remove the post *****/
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,&Media);
ThreadDeleted = For_RemoveForumPst (Gbl.Forum.ForumSelected.PstCod,Media.MedCod);
/***** Free image *****/
Med_MediaDestructor (&Media);

View File

@ -2734,10 +2734,7 @@ static void Gam_ListGameQuestions (struct Game *Game)
"tst_questions.AnsType," // row[1]
"tst_questions.Stem," // row[2]
"tst_questions.Feedback," // row[3]
"tst_questions.MediaName," // row[4]
"tst_questions.MediaType," // row[5]
"tst_questions.MediaTitle," // row[6]
"tst_questions.MediaURL" // row[7]
"tst_questions.MedCod" // row[4]
" FROM gam_questions,tst_questions"
" WHERE gam_questions.GamCod=%ld"
" AND gam_questions.QstCod=tst_questions.QstCod"
@ -2842,10 +2839,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
row[1] AnsType
row[2] Stem
row[3] Feedback
row[4] MediaName
row[5] MediaType
row[6] MediaTitle
row[7] MediaURL
row[4] MedCod
*/
/***** Create test question *****/
Tst_QstConstructor ();
@ -2923,16 +2917,24 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Game *Game,
Tst_GetAndWriteTagsQst (Gbl.Test.QstCod);
fprintf (Gbl.F.Out,"</td>");
/* Write stem (row[2]), media data (row[4], row[5], row[6], row[7]),
feedback (row[3]) and answers */
/* Write stem (row[2]) */
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd);
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,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");
/* Show feedback (row[3]) */
Tst_WriteQstFeedback (row[3],"TEST_EDI_LIGHT");
/* Show answers */
Tst_WriteAnswersGameResult (Game,NumQst,QstCod,
"TEST_EDI",true); // Show result
@ -3531,10 +3533,7 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers)
"SELECT tst_questions.QstCod," // row[0]
"tst_questions.AnsType," // row[1]
"tst_questions.Stem," // row[2]
"tst_questions.MediaName," // row[3]
"tst_questions.MediaType," // row[4]
"tst_questions.MediaTitle," // row[5]
"tst_questions.MediaURL" // row[6]
"tst_questions.MedCod" // row[3]
" FROM gam_questions,tst_questions"
" WHERE gam_questions.GamCod=%ld"
" 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\">");
/* 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");
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,
"TEST_IMG_EDIT_LIST_STEM_CONTAINER",
"TEST_IMG_EDIT_LIST_STEM");

View File

@ -38,6 +38,7 @@
#include "swad_config.h"
#include "swad_cookie.h"
#include "swad_database.h"
#include "swad_global.h"
#include "swad_file.h"
#include "swad_file_browser.h"
@ -153,8 +154,10 @@ static void Med_ShowVideo (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,
const char *MIMEType);
static const char *Med_GetStringTypeForDB (Med_Type_t Type);
/*****************************************************************************/
/********************** Media (image/video) constructor **********************/
@ -197,6 +200,7 @@ void Med_ResetMedia (struct Media *Media)
static void Med_ResetMediaExceptURLAndTitle (struct Media *Media)
{
Media->MedCod = -1L;
Media->Action = Med_ACTION_NO_MEDIA;
Media->Status = Med_STATUS_NONE;
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 ***/
/*****************************************************************************/
void Med_GetMediaDataFromRow (const char *Name,
const char *TypeStr,
const char *Title,
const char *URL,
struct Media *Media)
void Med_GetMediaDataByCod (struct Media *Media)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumRows;
size_t Length;
/***** Copy image name to struct *****/
Str_Copy (Media->Name,Name,
Med_BYTES_NAME);
/***** Get data of a media from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a post",
"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 *****/
Media->Type = Med_GetTypeFromStrInDB (TypeStr);
/***** Set status of media file *****/
Media->Status = (Media->Type != Med_TYPE_NONE) ? Med_STORED_IN_DB :
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])
/***** Result should have a unique row *****/
if (NumRows == 0) // Media not found
/***** Reset media data *****/
Med_ResetMedia (Media);
else if (NumRows == 1)
{
/* Get and limit length of the URL */
Length = strlen (URL);
if (Length > Cns_MAX_BYTES_WWW)
Length = Cns_MAX_BYTES_WWW;
/***** Get row *****/
row = mysql_fetch_row (mysql_res);
if ((Media->URL = (char *) malloc (Length + 1)) == NULL)
Lay_ShowErrorAndExit ("Error allocating memory for image URL.");
Str_Copy (Media->URL,URL,
Length);
/***** Convert type string (row[0]) to type *****/
Media->Type = Med_GetTypeFromStrInDB (row[0]);
/***** 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 *****/
// Media->Title can be empty or filled with previous value
// 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);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
@ -980,7 +1007,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
/***** Get embed URL from form *****/
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 *****/
if (Media->URL)
@ -1007,7 +1033,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
if (PtrHost[0])
{
/***** Step 2: Skip host *****/
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrHost = '%s'",PtrHost);
if (!strncasecmp (PtrHost,"youtu.be/" , 9)) // Host starts by youtu.be/
{
YouTube = SHORT;
@ -1035,7 +1060,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
if (YouTube != WRONG)
{
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrPath = '%s'",PtrPath);
/***** Step 3: Skip path *****/
if (YouTube == FULL)
{
@ -1063,7 +1087,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
if (YouTube != WRONG)
{
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrParams = '%s'",PtrParams);
/***** Step 4: Search for video code *****/
switch (YouTube)
{
@ -1095,7 +1118,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
if (YouTube != WRONG)
{
// Ale_ShowAlert (Ale_INFO,"DEBUG: PtrCode = '%s'",PtrCode);
/***** Step 5: Get video code *****/
CodeLength = strspn (PtrCode,Str_BIN_TO_BASE64URL);
if (CodeLength > 0 &&
@ -1105,7 +1127,6 @@ static void Med_GetAndProcessEmbedFromForm (const char *ParamURL,
/* Copy code */
strncpy (Media->Name,PtrCode,CodeLength);
Media->Name[CodeLength] = '\0';
// Ale_ShowAlert (Ale_INFO,"DEBUG: Media->Name = '%s'",Media->Name);
Media->Type = Med_YOUTUBE;
Media->Status = Med_PROCESSED;
@ -1126,56 +1147,63 @@ void Med_MoveMediaToDefinitiveDir (struct Media *Media)
char PathMedPrivTmp[PATH_MAX + 1];
char PathMedPriv[PATH_MAX + 1];
/***** Check trivial cases *****/
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)
/***** Check trivial case *****/
if (Media->Status == Med_PROCESSED)
{
case Med_JPG:
/* Move JPG */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Med_JPG]))
return; // Fail
break;
case Med_GIF:
/* Move PNG */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
"png"))
return; // Fail
/* Move GIF */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Med_GIF]))
return; // Fail
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]))
return; // Fail
break;
default:
Lay_ShowErrorAndExit ("Wrong media type.");
break;
if (Media->Type == Med_YOUTUBE)
// Nothing to do with files ==> Processing successfully finished
Media->Status = Med_MOVED; // Success
else
{
/***** 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:
/* Move JPG */
if (Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Med_JPG]))
Media->Status = Med_MOVED; // Success
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
}
/*****************************************************************************/
/************************ 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.) ******/
/*****************************************************************************/
@ -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;
@ -1553,87 +1607,106 @@ void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res)
for (NumMed = 0;
NumMed < NumMedia;
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;
long MedCod;
/***** Get media name (row[0]) and type (row[1]) *****/
/***** Get media code (row[0]) *****/
row = mysql_fetch_row (mysql_res);
MedCod = Str_ConvertStrCodToLongCod (row[0]);
/***** Remove image file *****/
Med_RemoveMediaFiles (row[0],Med_GetTypeFromStrInDB (row[1]));
/***** Remove media files *****/
Med_RemoveMedia (MedCod);
}
void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type)
void Med_RemoveMedia (long MedCod)
{
char PathMedPriv[PATH_MAX + 1];
char FullPathMediaPriv[PATH_MAX + 1];
struct Media Media;
/***** Trivial cases *****/
if (Name == NULL)
return;
if (!Name[0])
return;
if (Type == Med_YOUTUBE)
/***** Trivial case *****/
if (MedCod <= 0)
return;
/***** Build path to private directory with the media *****/
snprintf (PathMedPriv,sizeof (PathMedPriv),
"%s/%s/%c%c",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
Name[0],
Name[1]);
/***** Initialize media *****/
Med_MediaConstructor (&Media);
/***** Remove files *****/
switch (Type)
/***** Get media *****/
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:
/***** Remove private JPG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Med_JPG]);
unlink (FullPathMediaPriv);
/***** Build path to private directory with the media *****/
snprintf (PathMedPriv,sizeof (PathMedPriv),
"%s/%s/%c%c",
Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_MEDIA,
Media.Name[0],
Media.Name[1]);
break;
case Med_GIF:
/***** Remove private GIF file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Med_GIF]);
unlink (FullPathMediaPriv);
/***** Remove files *****/
switch (Media.Type)
{
case Med_JPG:
/***** Remove private JPG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Media.Name,Med_Extensions[Med_JPG]);
unlink (FullPathMediaPriv);
/***** Remove private PNG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.png",
PathMedPriv,Name);
unlink (FullPathMediaPriv);
break;
case Med_GIF:
/***** Remove private GIF file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Media.Name,Med_Extensions[Med_GIF]);
unlink (FullPathMediaPriv);
break;
case Med_MP4:
case Med_WEBM:
case Med_OGG:
/***** Remove private video file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Type]);
unlink (FullPathMediaPriv);
/***** Remove private PNG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.png",
PathMedPriv,Media.Name);
unlink (FullPathMediaPriv);
break;
default:
break;
break;
case Med_MP4:
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 *************************/
/*****************************************************************************/
Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
static Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
{
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 *****************/
/*****************************************************************************/
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 *****/
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
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
--------- --------------------------- ------------------ ------------------ ---------------------
@ -82,6 +82,7 @@ typedef enum
{
Med_STATUS_NONE,
Med_PROCESSED,
Med_MOVED,
Med_STORED_IN_DB,
} Med_Status_t;
@ -100,6 +101,7 @@ typedef enum
/***** Struct used to get images/videos from forms *****/
struct Media
{
long MedCod;
Med_Action_t Action;
Med_Status_t Status;
char Name[Med_BYTES_NAME + 1];
@ -135,11 +137,7 @@ void Med_MediaConstructor (struct Media *Media);
void Med_MediaDestructor (struct Media *Media);
void Med_ResetMedia (struct Media *Media);
void Med_GetMediaDataFromRow (const char *Name,
const char *TypeStr,
const char *Title,
const char *URL,
struct Media *Media);
void Med_GetMediaDataByCod (struct Media *Media);
void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput);
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_MoveMediaToDefinitiveDir (struct Media *Media);
void Med_StoreMediaInDB (struct Media *Media);
void Med_ShowMedia (struct Media *Media,
const char *ClassContainer,const char *ClassMedia);
void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res);
void Med_RemoveMediaFilesFromRow (MYSQL_RES *mysql_res);
void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type);
Med_Type_t Med_GetTypeFromStrInDB (const char *Str);
const char *Med_GetStringTypeForDB (Med_Type_t Type);
void Med_RemoveMediaFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res);
void Med_RemoveMediaFromRow (MYSQL_RES *mysql_res);
void Med_RemoveMedia (long MedCod);
#endif

View File

@ -1282,25 +1282,26 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
long MsgCod;
/***** Check if image is received and processed *****/
Media->MedCod = -1L;
if (Media->Action == Med_ACTION_NEW_MEDIA && // New media
Media->Status == Med_PROCESSED) // The new media received has been processed
{
/* Move processed image to definitive directory */
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 *****/
MsgCod =
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
" (Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" (Subject,Content,MedCod)"
" VALUES"
" ('%s','%s',"
"'%s','%s','%s','%s')",
Subject,Content,
Media->Name,
Med_GetStringTypeForDB (Media->Type),
Media->Title ? Media->Title : "",
Media->URL ? Media->URL : "");
" ('%s','%s',%ld)",
Subject,Content,Media->MedCod);
/***** Insert message in sent messages *****/
DB_QueryINSERT ("can not create message",
@ -1493,10 +1494,8 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
/* Insert message content into msg_content_deleted */
DB_QueryINSERT ("can not remove the content of a message",
"INSERT IGNORE INTO msg_content_deleted"
" (MsgCod,Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" SELECT MsgCod,Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL"
" (MsgCod,Subject,Content,MedCod)"
" SELECT MsgCod,Subject,Content,MedCod"
" FROM msg_content WHERE MsgCod=%ld",
MsgCod);
@ -2788,10 +2787,7 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
/***** Get content of message from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get the content of a message",
"SELECT Content," // row[0]
"MediaName," // row[1]
"MediaType," // row[2]
"MediaTitle," // row[3]
"MediaURL" // row[4]
"MedCod" // row[1]
" FROM msg_content WHERE MsgCod=%ld",
MsgCod);
@ -2806,8 +2802,9 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT);
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],Media);
/***** Get media (row[1]) *****/
Media->MedCod = Str_ConvertStrCodToLongCod (row[1]);
Med_GetMediaDataByCod (Media);
/***** Free structure that stores the query result *****/
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_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_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[ 0] QstCod
row[ 1] UNIX_TIMESTAMP(EditTime)
row[ 2] AnsType
row[ 3] Shuffle
row[ 4] Stem
row[ 5] Feedback
row[ 6] MediaName
row[ 7] MediaType
row[ 8] MediaTitle
row[ 9] MediaURL
row[10] NumHits
row[11] NumHitsNotBlank
row[12] Score
row[0] QstCod
row[1] UNIX_TIMESTAMP(EditTime)
row[2] AnsType
row[3] Shuffle
row[4] Stem
row[5] Feedback
row[6] MedCod
row[7] NumHits
row[8] NumHitsNotBlank
row[9] Score
*/
/* row[0] holds the code of the question */
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
@ -313,12 +310,10 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod)
row[0] AnsInd
row[1] Answer
row[2] Feedback
row[3] MediaName
row[4] MediaType
row[5] MediaTitle
row[6] MediaURL
row[7] Correct
row[3] MedCod
row[4] Correct
*/
/***** Write the answers *****/
switch (Gbl.Test.AnswerType)
{

View File

@ -98,7 +98,7 @@ struct TL_Note
TL_NoteType_t NoteType;
long UsrCod;
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)
time_t DateTimeUTC;
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_PutParamsRemoveNote (void);
static void TL_RemoveNote (void);
static void TL_RemoveImgFileFromPost (long PstCod);
static void TL_RemoveANoteFromDB (struct TL_Note *SocNot);
static void TL_RemoveMediaFromPost (long PstCod);
static void TL_RemoveNoteMediaAndDBEntries (struct TL_Note *SocNot);
static long TL_GetNotCodOfPublication (long PubCod);
static long TL_GetPubCodOfOriginalNote (long NotCod);
@ -243,8 +243,7 @@ static long TL_GetPubCodOfOriginalNote (long NotCod);
static void TL_RequestRemovalComment (void);
static void TL_PutParamsRemoveCommment (void);
static void TL_RemoveComment (void);
static void TL_RemoveImgFileFromComment (long PubCod);
static void TL_RemoveACommentFromDB (struct TL_Comment *SocCom);
static void TL_RemoveCommentMediaAndDBEntries (long PubCod);
static bool TL_CheckIfNoteIsSharedByUsr (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"
" of a post",
"SELECT Content," // row[0]
"MediaName," // row[1]
"MediaType," // row[2]
"MediaTitle," // row[3]
"MediaURL" // row[4]
"MedCod" // row[1]
" FROM social_posts"
" WHERE PstCod=%ld",
PstCod);
@ -1846,8 +1842,9 @@ static void TL_GetAndWritePost (long PstCod)
Str_Copy (Content,row[0],
Cns_MAX_BYTES_LONG_TEXT);
/****** Get media data (row[1], row[2], row[3], row[4]) *****/
Med_GetMediaDataFromRow (row[1],row[2],row[3],row[4],&Media);
/***** Get media (row[1]) *****/
Media.MedCod = Str_ConvertStrCodToLongCod (row[1]);
Med_GetMediaDataByCod (&Media);
}
else
Content[0] = '\0';
@ -2477,26 +2474,28 @@ static long TL_ReceivePost (void)
Media.Status == Med_PROCESSED) // A media is attached
{
/***** Check if media is received and processed *****/
Media.MedCod = -1L;
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
Media.Status == Med_PROCESSED) // The new media received has been processed
{
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Media);
/* Store media in database */
if (Media.Status == Med_MOVED)
Med_StoreMediaInDB (&Media); // Set Media.MedCod
}
/***** Publish *****/
/* Insert post content in the database */
PstCod =
DB_QueryINSERTandReturnCode ("can not create post",
"INSERT INTO social_posts"
" (Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" (Content,MedCod)"
" VALUES"
" ('%s',"
"'%s','%s','%s','%s')",
" ('%s',%ld)",
Content,
Media.Name,
Med_GetStringTypeForDB (Media.Type),
Media.Title ? Media.Title : "",
Media.URL ? Media.URL : "");
Media.MedCod);
/* Insert post in notes */
TL_StoreAndPublishNote (TL_NOTE_POST,PstCod,&SocPub);
@ -2637,10 +2636,7 @@ static void TL_WriteCommentsInNote (const struct TL_Note *SocNot)
"UNIX_TIMESTAMP("
"social_pubs.TimePublish)," // row[3]
"social_comments.Content," // row[4]
"social_comments.MediaName," // row[5]
"social_comments.MediaType," // row[6]
"social_comments.MediaTitle," // row[7]
"social_comments.MediaURL" // row[8]
"social_comments.MedCod" // row[5]
" FROM social_pubs,social_comments"
" WHERE social_pubs.NotCod=%ld"
" AND social_pubs.PubType=%u"
@ -3204,11 +3200,18 @@ static long TL_ReceiveComment (void)
Media.Status == Med_PROCESSED) // A media is attached
{
/***** Check if media is received and processed *****/
Media.MedCod = -1L;
if (Media.Action == Med_ACTION_NEW_MEDIA && // New media
Media.Status == Med_PROCESSED) // The new media received has been processed
{
/* Move processed image to definitive directory */
Med_MoveMediaToDefinitiveDir (&Media);
/* Store media in database */
if (Media.Status == Med_MOVED)
Med_StoreMediaInDB (&Media); // Set Media.MedCod
}
/***** Publish *****/
/* Insert into publications */
SocPub.NotCod = SocNot.NotCod;
@ -3219,17 +3222,12 @@ static long TL_ReceiveComment (void)
/* Insert comment content in the database */
DB_QueryINSERT ("can not store comment content",
"INSERT INTO social_comments"
" (PubCod,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" (PubCod,Content,MedCod)"
" VALUES"
" (%ld,'%s',"
"'%s','%s','%s','%s')",
" (%ld,'%s',%ld)",
SocPub.PubCod,
Content,
Media.Name,
Med_GetStringTypeForDB (Media.Type),
Media.Title ? Media.Title : "",
Media.URL ? Media.URL : "");
Media.MedCod);
/***** Store notifications about the new comment *****/
Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_TIMELINE_COMMENT,SocPub.PubCod);
@ -3856,12 +3854,11 @@ static void TL_RemoveNote (void)
ItsMe = Usr_ItsMe (SocNot.UsrCod);
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 *****/
TL_RemoveANoteFromDB (&SocNot);
TL_RemoveNoteMediaAndDBEntries (&SocNot);
/***** Reset note *****/
TL_ResetNote (&SocNot);
/***** Message of success *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_TIMELINE_Post_removed);
@ -3875,19 +3872,18 @@ static void TL_RemoveNote (void)
/***************** Remove one file associated to a post **********************/
/*****************************************************************************/
static void TL_RemoveImgFileFromPost (long PstCod)
static void TL_RemoveMediaFromPost (long PstCod)
{
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",
"SELECT MediaName," // row[0]
"MediaType" // row[1]
"SELECT MedCod" // row[0]
" FROM social_posts"
" WHERE PstCod=%ld",
PstCod))
/***** Remove media file *****/
Med_RemoveMediaFilesFromRow (mysql_res);
Med_RemoveMediaFromRow (mysql_res);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
@ -3897,7 +3893,7 @@ static void TL_RemoveImgFileFromPost (long PstCod)
/*********************** 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_ROW row;
@ -3905,18 +3901,7 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
unsigned long NumComments;
unsigned long NumCom;
/***** 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_COMMENT,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_SHARE ,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
}
/***** Remove comments associated to this note *****/
/* Get comments of this note */
NumComments = DB_QuerySELECT (&mysql_res,"can not get comments",
"SELECT PubCod"
@ -3934,43 +3919,50 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
row = mysql_fetch_row (mysql_res);
PubCod = Str_ConvertStrCodToLongCod (row[0]);
/* Mark notifications as removed */
if (PubCod > 0)
{
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
}
/* Remove media associated to comment
and delete comment from database */
TL_RemoveCommentMediaAndDBEntries (PubCod);
}
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
/***** Remove favs *****/
/* Remove favs for all comments in this note */
DB_QueryDELETE ("can not remove favs for note",
"DELETE FROM social_comments_fav"
" USING social_pubs,social_comments_fav"
" 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 media associated to post *****/
if (SocNot->NoteType == TL_NOTE_POST)
{
TL_RemoveMediaFromPost (SocNot->Cod);
MYSQL_RES *mysql_res;
/* 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",
"DELETE FROM social_notes_fav"
" WHERE NotCod=%ld",
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 *****/
DB_QueryDELETE ("can not remove a publication",
"DELETE FROM social_pubs"
@ -3991,9 +3983,6 @@ static void TL_RemoveANoteFromDB (struct TL_Note *SocNot)
"DELETE FROM social_posts"
" WHERE PstCod=%ld",
SocNot->Cod);
/***** Reset note *****/
TL_ResetNote (SocNot);
}
/*****************************************************************************/
@ -4198,11 +4187,12 @@ static void TL_RemoveComment (void)
ItsMe = Usr_ItsMe (SocCom.UsrCod);
if (ItsMe) // I am the author of this comment
{
/***** Remove image file associated to post *****/
TL_RemoveImgFileFromComment (SocCom.PubCod);
/***** Remove media associated to comment
and delete comment from database *****/
TL_RemoveCommentMediaAndDBEntries (SocCom.PubCod);
/***** Delete comment from database *****/
TL_RemoveACommentFromDB (&SocCom);
/***** Reset fields of comment *****/
TL_ResetComment (&SocCom);
/***** Message of success *****/
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;
/***** 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",
"SELECT MediaName," // row[0]
"MediaType" // row[1]
"SELECT MedCod" // row[0]
" FROM social_comments"
" WHERE PubCod=%ld",
PubCod))
/***** Remove media file *****/
Med_RemoveMediaFilesFromRow (mysql_res);
/* Remove media */
Med_RemoveMediaFromRow (mysql_res);
/***** Free structure that stores the query result *****/
/* Free structure that stores the query result */
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 *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,SocCom->PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,SocCom->PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,SocCom->PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_COMMENT,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_FAV ,PubCod);
Ntf_MarkNotifAsRemoved (Ntf_EVENT_TIMELINE_MENTION,PubCod);
/***** Remove favs for this comment *****/
DB_QueryDELETE ("can not remove favs for comment",
"DELETE FROM social_comments_fav"
" WHERE PubCod=%ld",
SocCom->PubCod);
PubCod);
/***** Remove content of this comment *****/
DB_QueryDELETE ("can not remove a comment",
"DELETE FROM social_comments"
" WHERE PubCod=%ld",
SocCom->PubCod);
PubCod);
/***** Remove this comment *****/
DB_QueryDELETE ("can not remove a comment",
@ -4266,12 +4249,9 @@ static void TL_RemoveACommentFromDB (struct TL_Comment *SocCom)
" WHERE PubCod=%ld"
" AND PublisherCod=%ld" // Extra check: I am the author
" AND PubType=%u", // Extra check: it's a comment
SocCom->PubCod,
PubCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
(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]
"UNIX_TIMESTAMP(social_pubs.TimePublish)," // row[3]
"social_comments.Content," // row[4]
"social_comments.MediaName," // row[5]
"social_comments.MediaType," // row[6]
"social_comments.MediaTitle," // row[7]
"social_comments.MediaURL" // row[8]
"social_comments.MedCod" // row[5]
" FROM social_pubs,social_comments"
" WHERE social_pubs.PubCod=%ld"
" AND social_pubs.PubType=%u"
@ -4826,10 +4803,7 @@ static void TL_GetDataOfCommentFromRow (MYSQL_ROW row,struct TL_Comment *SocCom)
row[2]: NotCod
row[3]: TimePublish
row[4]: Content
row[5]: MediaName
row[6]: MediaType
row[7]: MediaTitle
row[8]: MediaURL
row[5]: MedCod
*/
/***** Get code of comment (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 *****/
TL_GetNumTimesACommHasBeenFav (SocCom);
/****** Get media data (row[5], row[6], row[7], row[8]) *****/
Med_GetMediaDataFromRow (row[5],row[6],row[7],row[8],&SocCom->Media);
/***** Get media (row[5]) *****/
SocCom->Media.MedCod = Str_ConvertStrCodToLongCod (row[5]);
Med_GetMediaDataByCod (&SocCom->Media);
}
/*****************************************************************************/

View File

@ -3446,13 +3446,10 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod,
NewMsgCod =
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
" (Subject,Content,"
"MediaName,MediaType,MediaTitle,MediaURL)"
" (Subject,Content,MedCod)"
" VALUES"
" ('%s','%s',"
"'','%s','','')",
Subject,Content,
Med_GetStringTypeForDB (Med_TYPE_NONE));
" ('%s','%s',-1)",
Subject,Content);
/* Insert message in sent messages */
DB_QueryINSERT ("can not create message",