/**************************************************************************** mod_dav_pgsql (DASL) for apache 2.X CopyRight(C) 2005 SolutionBox Inc. All Rights reserved. Author : sean kim (sean@solutionbox.co.kr) $Id: dbms.h,v 1.3 2007/03/19 08:43:12 elenoa Exp $ Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of SolutionBox Inc. ****************************************************************************/ #ifndef __DBMS_H__ #define __DBMS_H__ #include #include /* ADD 2012-03-20 huibong bool type »ç¿ëÀ» À§ÇÑ Header Ãß°¡ */ #include "apr_dbd.h" #include "mod_dbd.h" #include "dav_repos.h" #include "lock.h" #include "libpq-fe.h" #define dav_repos_FILE 0 #define dav_repos_COLLECTION 1 #define dav_repos_SHARE 2 #define dav_repos_RECYCLE 4 #define dav_repos_TEXT 1 #define dav_repos_BIN 2 #define DB_RESULT_CLEAR 1 #define DB_RESULT_NCLEAR 2 struct dav_repos_property { apr_int64_t m_resource_id; long m_ns_id; const char *m_propname; const char *m_propvalue; struct dav_repos_property *next; }; typedef struct dav_repos_property dav_repos_property; /* ** DBMS data transfer interface */ struct dav_repos_resource { apr_int64_t m_resource_id; int m_resource_type; apr_int64_t m_owner_id; char *m_uri; char *m_fake_uri; const char *m_filename_org; const char *m_filename_hash; int m_depth; apr_int64_t m_creation_date; const char *m_displayname; // 2014.07.09 : »ç¿ëµÇÁö ¾Ê´Â Ä÷³ Á¤¸®(get_content_language,get_etag,supported_lock,lock_discovery) apr_int64_t m_get_content_length; const char *m_get_content_type; apr_int64_t m_get_lastmodified; int m_source; /* 0:regular; 1:source; 3:protected */ const char *m_host_name; char m_is_deleted; /* N:not deleted Y: deleted */ apr_hash_t *lpr_hash; /* live property hash */ dav_repos_property *pr; /* for dead property data */ apr_hash_t *pr_hash; /* use for output value */ apr_hash_index_t *pr_hash_index; /* pr_hash_index to get first and next */ apr_hash_t *ns_hash; /* namespace(URI) to ns_id hash */ apr_hash_t *ns_id_hash; /* ns_id to namespace(URI) hash */ struct dav_repos_resource *next; /* for multiful result */ apr_pool_t *p; /* apache pool */ // 2013.09.27 dadamin // sibling ¹× sync_host ±â´É Á¦°Å //apr_socket_t *sock; /* Elenoa 2006. 09. 18 : file descriptor for sync */ //dav_resource *res; //server_rec *server; request_rec *r; }; typedef struct dav_repos_resource dav_repos_resource; /* dav_repos_server_conf is in repos.h */ /* typedef dav_repos_server_conf dav_repos_db; */ /* context needed to identify a resource */ struct dav_resource_private { apr_pool_t *pool; /* memory storage pool associated with request */ const char *pathname; /* full pathname to resource */ apr_finfo_t finfo; /* filesystem info */ const dav_repos_resource *db_r; apr_int64_t user_id; /* opendisk user id */ request_rec *rec; /* Save rec */ }; /* define the dav_stream structure for our use */ struct dav_stream { apr_pool_t *p; apr_file_t *f; const dav_resource *resource; const char *pathname; /* we may need to remove it at close time */ int test_flag; /* test flag */ int is_write; apr_off_t data_read; /* Keep size of read */ apr_off_t start_pos; }; //int dbms_get_result(PGresult *pResult, unsigned int flag); void db_error_message(ap_dbd_t *db, char *message_str, int errnum); /* int dbms_opendb(dav_repos_db * d); int dbms_checkdb(dav_repos_db * d); int dbms_closedb(dav_repos_db * d); */ int dbms_get_property(dav_repos_resource * r, bool is_uricaseignore ); // CHG 2012.07.13 dadamin // close ±¸ºÐ ÀÎÀÚ Ãß°¡ // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ // CHG 2014-06-16 dadamin // ù¹øÀç ÀÎÀÚÀÇ const ¼Ó¼º Á¦°Å(ÇØ´ç °ª Áß m_get_content_length º¯°æ ·ÎÁ÷ Æ÷ÇÔ) // flag ÀÎÀÚ Ãß°¡(write trunc °æ¿ì¿¡ ´ëÇÑ »çÀÌÁî ¿À·ù ¹æÁö) // CHG 2015.06.04 dadamin // end_pos ÀÎÀÚ Ãß°¡ (¿äû ó¸® ÈÄ file end position Ãß°¡) apr_int64_t dbms_set_property(dav_repos_resource *db_r, const dav_resource *resource, bool is_uricaseignore, bool is_close, int flag, apr_off_t end_pos); // NEW 2010-01-18 huibong // SBFS client send ModifyTime to dav... // This data is file attribute. // So t_dav_resource add file_lastmodified column and save this data... // SBFS use dbms_update_file_lastmodified function. not use dbms_update_getlastmodified. // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ int dbms_update_file_lastmodified(const dav_repos_resource *db_r, apr_int64_t mtime, bool is_uricaseignore ); // 2013.08.21 dadamin // Set hidden property of DAV:(t_dav_resource) // hidden : 1, not hidden : 0 int dbms_update_hidden(const dav_repos_resource *db_r, int hidden , bool is_uricaseignore); int dbms_fill_dead_property(dav_repos_resource * db_r); // CHG 2010-03-29 huibong // PROPFIND ¿¡ ÀÇÇÑ Á¶È¸½Ã Á¶È¸ ½ÃÀÛ ½Ã°£ Á¤º¸¸¦ ÀÎÀÚ·Î Ãß°¡ÇÔ. // º» ±â´ÉÀº ¿¬ÇÕ´º½º ¿ä±¸»çÇ×À» ¹Ý¿µÇϱâ À§ÇØ ¼öÁ¤ÇÔ. // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ int dbms_get_collection_resource(dav_repos_resource * db_r, int depth, const char * startTime, bool is_uricaseignore ); /* I'll fill all d and r_src and r_des->uri */ // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ int dbms_move_resource(const dav_repos_resource * r_src, const dav_repos_resource * r_des, const dav_resource * resource, bool is_uricaseignore ); /* I'll fill all d and r_src and r_des->uri */ // CHG 2012-03-23 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ int dbms_copy_resource(const dav_repos_resource * r_src, const dav_repos_resource * r_des, bool is_uricaseignore ); /* I'll fill pr->name and you will fill pr->value */ int dbms_get_dead_property(const dav_repos_resource * r, dav_repos_property * pr); /* I'll fill pr->name and you will fill pr->value */ int dbms_get_all_dead_property(const dav_repos_resource * r, dav_repos_property ** pr); int db_insert_property(const dav_repos_resource * r, const dav_repos_property * pr); /* I'll fill pr->name and pr->value */ int dbms_set_dead_property(const dav_repos_resource * r, const dav_repos_property * pr); /* I'll fill pr->name */ int dbms_del_dead_property(const dav_repos_resource * r, const dav_repos_property * pr); /* Pan */ // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ int dbms_remove_resource(const dav_repos_resource * r, bool is_uricaseignore ); /* remove all files if the resource is collection */ // NEW 2010-03-24 webting // ÀÌ ÇÔ¼ö´Â NÁßÈ­ ¸ðµâ °³¹ß ÈÄ ¾ß±âµÉ¼ö ÀÖ´Â ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ // ¸¸µé¾î Á³´Ù. // ³»¿ë : À̾î¿Ã¸®±â ±â´ÉÀ¸·Î ¾÷·Îµå ÇÒ °æ¿ì¿¡¸¸ È£ÃâÀÌ µÇµµ·Ï µÇ¾î ÀÖÀ¸¸ç, // À̾î¿Ã¸®±â¸¦ ½ÃÀÛ ÇÒ ´ç½Ã¿¡ ÀÌÀüÀÇ ÄÁÅÙÃ÷ÀÇ replicate°¡ ÀÖ´Â °æ¿ì // ÇØ´ç º¹Á¦º»Àº deleted_yn = 'Y'·Î µÇµµ·Ï ¸¸µé¾îÁ³´Ù. // * Ãß°¡ Âü°í»çÇ×: // ¶ÇÇÑ ¶È°°Àº ÇØ½¬¸íÀ¸·Î »ý¼ºÀÌ µÊ¿¡µû¶ó °°Àº FHS¿¡ replicate°¡ µÇ´õ¶óµµ // »èÁ¦°¡ µÇÁö ¾ÊÀ½À» È®ÀÎÇß´Ù. csa(»èÁ¦) µ¥¸ó. // CHG 2012-03-21 huibong // ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ // QUERY_AND_RETRY ¸ÅÅ©·ÎÀÇ ¹Ýȯ°ª 󸮷ΠÀÎÇØ... ¹Ýȯ°ª void -> int ·Î ¼öÁ¤ ó¸® int dbms_remove_replicate(const dav_repos_resource* r, bool is_uricaseignore ); const char *dav_repos_getetag_dbr(const dav_repos_resource * db_r); int dbms_get_resourcetype(dav_repos_resource * r); int dbms_search(char *search_command, dav_repos_resource * db_r); // CHG 2018-02-14 huibong °¢ ¿À·ùº° HTTP reponse code ¸¦ output ÀÎÀÚ·Î Àü´Þ. // CHG 2012-04-19 dadamin :·¥´ý ó¸® ÀÎÀÚ Ãß°¡ // CHG 2012-03-20 huibong: ¼­ºñ½ºº° URI ´ë¼Ò¹®ÀÚ ±¸ºÐ, ¹«½Ã ¿©ºÎ ó¸® °ü·Ã ÀÎÀÚ°ª Ãß°¡ //char *dbms_get_redirect(dav_repos_resource *db_r, bool is_uricaseignore, bool is_random ); char * dbms_get_redirect( dav_repos_resource *db_r, bool is_uricaseignore, bool is_random, int *error_code ); /* NEW 2011-03-23 dadamin * °¢ µð·ºÅ丮 ¼­ºñ½º ¿ë·®Á¤º¸( Total, ÇöÀç»ç¿ë·®, Used ¿ë·®)¸¦ Á¶È¸Çϱâ À§ÇÑ ÇÔ¼ö(´Ü t_sms_sp_svc_productÀÇ cal_used_depth ±âÁØ) * tran_id [in] ¼­ºñ½º Tran ID Á¤º¸ * is_uricaseignore URI ¿¡ ´ëÇÑ ´ë¼Ò¹®ÀÚ ±¸ºÐ ¿©ºÎ, true : ´ë¼Ò¹®ÀÚ ¹«½Ã, false: ´ë¼Ò¹®ÀÚ ±¸ºÐ * total_byte [out] ÇØ´ç ¼­ºñ½º Tran ID ÀÇ Total ½ºÅ丮Áö °è¾à ¿ë·® Á¤º¸ * used_tbyte [out] ÇØ´ç uri°¡ »ç¿ëÇϰíÀÖ´Â ¿ë·® Á¤º¸ * return ¿À·ù¹ß»ý½Ã -1, ÇØ´çÁ¤º¸°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì 0 À» ¹Ýȯ, Á¤»ó ó¸®µÈ °æ¿ì 1 À» ¹ÝȯÇÔ. */ int dbms_get_service_quotaex( const dav_repos_resource * db_r, const char * tran_id, bool is_uricaseignore, apr_int64_t * total_byte, apr_int64_t * used_byte ); /* Build namespace * * Read namespace infor from DB and fill hash * db_r must have pool * This hash is for PROPFIND * */ void dbms_build_ns_id_hash(dav_repos_resource * db_r); // 2013.08.22 dadamin // set namespace void dbms_set_namespace(dav_repos_resource * db_r, dav_repos_property *pr, const char *snamespace); // set ns_id void dbms_set_ns_id(dav_repos_resource * db_r, const char *snamespace, dav_repos_property *pr); const char *dbms_get_ns(dav_repos_resource * db_r, const long ns_id); long dbms_get_ns_id(dav_repos_resource * db_r, const char *namespace); /* NULL Lock */ dav_error *dbms_load_locknull_list(request_rec *r, const char *path, apr_text_header * thead, apr_pool_t * pool); dav_error *dbms_save_locknull_member(request_rec *r, const char *filename, apr_pool_t * pool); dav_error *dbms_remove_locknull_member(request_rec *r, const char *filename, apr_pool_t * pool); dav_error *dbms_load_lock_record(request_rec *r, const char *key, dav_lock_discovery ** direct, dav_lock_indirect ** indirect, int *need_save, apr_pool_t * pool); dav_error *dbms_save_lock_record(request_rec *r, const char *key, const dav_lock_discovery * direct, const dav_lock_indirect * indirect, apr_pool_t * pool); dav_error *dbms_remove_lock_record(request_rec *r, const char *key, apr_pool_t * pool); int dbms_lock_exists(request_rec *r, const char *key, apr_pool_t * pool); int dbms_modify_resource(const dav_resource * resource); #endif