2010-10-24 01:12:47 +02:00
/*
* This file is a part of Winix
2014-10-04 20:04:03 +02:00
* and is distributed under the 2 - Clause BSD licence .
* Author : Tomasz Sowa < t . sowa @ ttmath . org >
*/
/*
2021-02-24 01:19:47 +01:00
* Copyright ( c ) 2021 , Tomasz Sowa
2010-10-24 01:12:47 +02:00
* All rights reserved .
*
2014-10-04 20:04:03 +02:00
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*
2010-10-24 01:12:47 +02:00
*/
2021-02-24 01:19:47 +01:00
# include "models/itemcontent.h"
# include "core/crypt.h"
# include "core/misc.h"
2021-06-16 18:07:44 +02:00
# include "templates/misc.h"
# include "core/bbcodeparser.h"
2010-10-24 01:12:47 +02:00
2014-02-12 17:30:49 +01:00
namespace Winix
{
2010-10-24 01:12:47 +02:00
2021-02-24 01:19:47 +01:00
ItemContent : : ItemContent ( )
2010-10-24 01:12:47 +02:00
{
Clear ( ) ;
}
2021-02-24 01:19:47 +01:00
2021-05-13 03:29:41 +02:00
void ItemContent : : fields ( )
2021-02-24 01:19:47 +01:00
{
int content_raw_type_helper = static_cast < int > ( content_raw_type ) ;
int content_parsed_type_helper = static_cast < int > ( content_parsed_type ) ;
2021-03-11 18:48:18 +01:00
field ( L " id " , id , morm : : FT : : no_insertable | morm : : FT : : no_updatable | morm : : FT : : primary_key ) ;
2021-02-24 01:19:47 +01:00
field ( L " references " , references ) ;
field ( L " user_id " , user_id ) ;
field ( L " group_id " , group_id ) ;
field ( L " guest_name " , guest_name ) ;
field ( L " modification_user_id " , modification_user_id ) ;
field ( L " privileges " , privileges ) ;
field ( L " date_creation " , date_creation ) ;
field ( L " date_modification " , date_modification ) ;
field ( L " link_to " , link_to ) ;
field ( L " link_redirect " , link_redirect ) ;
field ( L " file_path " , file_path ) ;
field ( L " file_fs " , file_fs ) ;
field ( L " file_type " , file_type ) ;
field ( L " file_has_thumb " , file_has_thumb ) ;
field ( L " file_hash " , file_hash ) ;
field ( L " file_hash_type " , file_hash_type ) ;
field ( L " file_size " , file_size ) ;
field ( L " content_raw " , content_raw ) ;
field ( L " content_raw_type " , content_raw_type_helper ) ;
field ( L " content_parsed " , content_parsed ) ;
field ( L " content_parsed_type " , content_parsed_type_helper ) ;
2021-03-11 18:48:18 +01:00
field ( L " meta " , meta ) ;
field ( L " meta_admin " , meta_admin ) ;
2021-02-24 01:19:47 +01:00
2021-06-16 18:07:44 +02:00
field ( L " print_content " , & ItemContent : : print_content ) ;
2021-02-24 01:19:47 +01:00
content_raw_type = static_cast < ContentType > ( content_raw_type_helper ) ;
content_parsed_type = static_cast < ContentType > ( content_parsed_type_helper ) ;
}
2021-05-13 03:29:41 +02:00
void ItemContent : : table ( )
2021-02-24 01:19:47 +01:00
{
2021-05-13 03:29:41 +02:00
table_name ( L " core " , L " content " ) ;
2021-02-24 01:19:47 +01:00
}
void ItemContent : : after_insert ( )
{
2021-03-09 18:16:29 +01:00
get_last_sequence_for_primary_key ( L " core.content_id_seq " , id ) ;
2021-02-24 01:19:47 +01:00
}
// !! IMPROVEME
2012-05-27 20:11:34 +02:00
// now we have Request::start_time and Request::start_date
2012-02-17 06:19:24 +01:00
// we can somehow get the current time from the request
// may setting the date should be completetly removed from here?
2021-02-24 01:19:47 +01:00
void ItemContent : : SetDateToNow ( )
2010-10-24 01:12:47 +02:00
{
2012-05-27 01:04:49 +02:00
date_creation = std : : time ( 0 ) ;
2010-10-24 01:12:47 +02:00
date_modification = date_creation ;
}
2021-02-24 01:19:47 +01:00
void ItemContent : : SetDateModifyToNow ( )
2010-10-24 01:12:47 +02:00
{
2012-05-27 01:04:49 +02:00
date_modification = std : : time ( 0 ) ;
2010-10-24 01:12:47 +02:00
}
2021-02-24 01:19:47 +01:00
void ItemContent : : Clear ( )
2010-10-24 01:12:47 +02:00
{
id = - 1 ;
2021-02-24 01:19:47 +01:00
references = 1 ;
2010-10-24 01:12:47 +02:00
user_id = - 1 ;
group_id = - 1 ;
guest_name . clear ( ) ;
2021-02-24 01:19:47 +01:00
modification_user_id = - 1 ;
privileges = 0 ;
2011-01-05 22:24:11 +01:00
link_to . clear ( ) ;
link_redirect = false ;
2010-10-24 01:12:47 +02:00
2010-12-10 22:07:01 +01:00
file_path . clear ( ) ;
file_fs = - 1 ;
file_type = WINIX_ITEM_FILETYPE_NONE ;
2021-02-24 01:19:47 +01:00
file_has_thumb = false ;
file_hash . clear ( ) ;
file_hash_type = WINIX_CRYPT_HASH_NONE ;
2011-06-24 22:53:21 +02:00
file_size = 0 ;
2010-12-11 23:55:48 +01:00
2021-02-24 01:19:47 +01:00
content_raw . clear ( ) ;
content_raw_type = ct_formatted_text ;
content_parsed . clear ( ) ;
content_parsed_type = ct_formatted_text ;
2021-04-09 17:50:58 +02:00
meta . clear ( ) ;
meta_admin . clear ( ) ;
2010-10-24 01:12:47 +02:00
SetDateToNow ( ) ;
}
2010-12-10 22:07:01 +01:00
2016-07-13 15:13:56 +02:00
/*
* we ' re using the HtmlFilter only for those contents
*
*/
2021-02-24 01:19:47 +01:00
bool ItemContent : : CanContentBeHtmlFiltered ( ItemContent : : ContentType ct )
2016-07-13 15:13:56 +02:00
{
return ct = = ct_text | | ct = = ct_formatted_text | | ct = = ct_html | | ct = = ct_bbcode ;
}
2021-02-24 01:19:47 +01:00
bool ItemContent : : CanContentBeHtmlFiltered ( )
2016-07-13 15:13:56 +02:00
{
2021-02-24 01:19:47 +01:00
return CanContentBeHtmlFiltered ( content_raw_type ) ;
2016-07-13 15:13:56 +02:00
}
2014-02-12 17:30:49 +01:00
2021-05-14 03:31:29 +02:00
2021-06-16 18:07:44 +02:00
void ItemContent : : print_content ( HtmlTextStream & out , const std : : wstring & content , ItemContent : : ContentType content_type , bool is_html_filter_on )
{
using TemplatesFunctions : : R ;
if ( is_html_filter_on & & ! ItemContent : : CanContentBeHtmlFiltered ( content_type ) )
out < < R ( " <nofilter> " ) ;
if ( content_type = = ItemContent : : ct_text )
{
out < < content ;
}
else
if ( content_type = = ItemContent : : ct_formatted_text )
{
TemplatesFunctions : : HtmlEscapeFormTxt ( out , content ) ;
}
else
if ( content_type = = ItemContent : : ct_bbcode )
{
static std : : wstring out_temp ;
out_temp . clear ( ) ;
out_temp . reserve ( content . size ( ) * 2 ) ;
BBCODEParser bbcode_parser ; // IMPROVE ME move me to a better place
bbcode_parser . Filter ( content . c_str ( ) , out_temp ) ;
out < < R ( out_temp ) ;
}
else
{
// ct_html, ct_other
out < < R ( content ) ;
}
if ( is_html_filter_on & & ! ItemContent : : CanContentBeHtmlFiltered ( content_type ) )
out < < R ( " </nofilter> " ) ;
}
void ItemContent : : print_content ( Ezc : : FunInfo < HtmlTextStream > & env )
{
print_content ( env . out , content_raw , content_raw_type , true ) ; // IMPROVE ME get the 'true' from the config (config->html_filter)
}
2021-05-14 03:31:29 +02:00
bool ItemContent : : do_migration ( int & current_table_version )
{
bool ok = true ;
ok = ok & & morm : : Model : : do_migration ( current_table_version , 1 , this , & ItemContent : : do_migration_to_1 ) ;
ok = ok & & morm : : Model : : do_migration ( current_table_version , 2 , this , & ItemContent : : do_migration_to_2 ) ;
ok = ok & & morm : : Model : : do_migration ( current_table_version , 3 , this , & ItemContent : : do_migration_to_3 ) ;
return ok ;
}
bool ItemContent : : do_migration_to_1 ( )
{
const char * str = R " sql(
CREATE TABLE core . content (
id serial ,
content text ,
content_type smallint ,
file_path character varying ( 2048 ) ,
file_fs smallint ,
file_type smallint ,
has_thumb smallint ,
ref integer ,
modify_index smallint ,
hash character varying ( 255 ) ,
hash_type smallint ,
file_size bigint
) ;
) sql " ;
db_query ( str ) ;
return true ; // IMPROVEME remove me in the future: this is only for a moment until we do migration on all our sites
}
bool ItemContent : : do_migration_to_2 ( )
{
const char * str = R " sql(
alter table core . content
add column user_id integer ,
add column group_id integer ,
add column guest_name character varying ( 20 ) ,
add column modification_user_id integer ,
add column privileges integer ,
add column date_creation timestamp without time zone ,
add column date_modification timestamp without time zone ,
add column link_to character varying ( 2048 ) ,
add column link_redirect smallint ,
add column meta text ,
add column meta_admin text ,
add column content_parsed text ,
add column content_parsed_type smallint ;
) sql " ;
return db_query ( str ) ;
}
bool ItemContent : : do_migration_to_3 ( )
{
const char * str [ ] = {
" alter table core.content rename column ref to \" references \" ; " ,
" alter table core.content rename column content to content_raw; " ,
" alter table core.content rename column content_type to content_raw_type; " ,
" alter table core.content rename column has_thumb to file_has_thumb; " ,
" alter table core.content rename column hash to file_hash; " ,
" alter table core.content rename column hash_type to file_hash_type; " ,
" alter table core.content drop column modify_index; " ,
" alter table core.content add column file_has_thumb_new boolean; " ,
" update core.content as c1 set file_has_thumb_new = (select case when file_has_thumb <> 0 then true else false end from core.content as c2 where c1.id = c2.id); " ,
" alter table core.content drop column file_has_thumb; " ,
" alter table core.content rename file_has_thumb_new to file_has_thumb; " ,
} ;
size_t len = sizeof ( str ) / sizeof ( const char * ) ;
for ( size_t i = 0 ; i < len ; + + i )
{
if ( ! db_query ( str [ i ] ) )
{
return false ;
}
}
return true ;
}
2014-02-12 17:30:49 +01:00
} // namespace Winix