34 #if defined(CUBRID_OWFS) && !defined(WINDOWS) 36 #include <owfs/owfs.h> 37 #include <owfs/owfs_errno.h> 41 #define ES_OWFS_HASH (786433) 42 #define ES_OWFS_MAX_APPEND_SIZE (128 * 1024) 48 char svc_code[MAXSVCCODELEN];
53 static char es_base_svc_code[MAXSVCCODELEN];
55 pthread_mutex_t es_lock = PTHREAD_MUTEX_INITIALIZER;
58 static bool es_owfs_initialized =
false;
60 static const char *es_get_token (
const char *base_path,
char *token,
size_t maxlen);
61 static int es_parse_owfs_path (
const char *base_path,
char *mds_ip,
char *svc_code,
char *owner_name,
char *file_name);
62 static ES_OWFS_FSH *es_new_fsh (
const char *mds_ip,
const char *svc_code);
63 static void es_make_unique_name (
char *owner_name,
const char *metaname,
char *file_name);
64 static ES_OWFS_FSH *es_open_owfs (
const char *mds_ip,
const char *svc_code);
81 es_get_token (
const char *base_path,
char *token,
size_t maxlen)
87 if (*base_path !=
'/')
94 s = strchr (base_path,
'/');
116 strlcpy (token, base_path, len + 1);
136 es_parse_owfs_path (
const char *base_path,
char *mds_ip,
char *svc_code,
char *owner_name,
char *file_name)
139 if (!(base_path[0] ==
'/' && base_path[1] ==
'/'))
146 if (base_path ==
NULL)
151 base_path = es_get_token (base_path, svc_code, MAXSVCCODELEN);
152 if (base_path ==
NULL)
157 base_path = es_get_token (base_path, owner_name, NAME_MAX);
158 if (base_path ==
NULL)
163 base_path = es_get_token (base_path, file_name, NAME_MAX);
164 if (base_path ==
NULL)
176 es_make_unique_name (
char *owner_name,
const char *metaname,
char *file_name)
183 #if defined(SERVER_MODE) 189 r = rand_r (&thread_p->rand_seed);
197 base = (
unsigned int) (unum >> 45);
200 snprintf (file_name, NAME_MAX,
"%s.%020llu_%04d", metaname, unum, r % 10000);
202 snprintf (owner_name, NAME_MAX,
"ces_%010u_%06d", base, hashval);
209 es_new_fsh (
const char *mds_ip,
const char *svc_code)
214 es_fsh = (ES_OWFS_FSH *) malloc (
sizeof (ES_OWFS_FSH));
221 ret = owfs_open_fs ((
char *) mds_ip, (
char *) svc_code, &es_fsh->fsh);
229 strcpy (es_fsh->mds_ip, mds_ip);
230 strcpy (es_fsh->svc_code, svc_code);
244 es_open_owfs (
const char *mds_ip,
const char *svc_code)
254 if (!es_owfs_initialized)
260 owfs_get_param (¶m);
261 param.use_mdcache = OWFS_TRUE;
262 ret = owfs_init (¶m);
270 es_owfs_initialized =
true;
279 if (!strcmp (fsh->mds_ip, mds_ip) && !strcmp (fsh->svc_code, svc_code))
289 fsh = es_new_fsh (mds_ip, svc_code);
318 if (!(base_path[0] ==
'/' && base_path[1] ==
'/'))
326 if (base_path !=
NULL)
329 base_path = es_get_token (base_path, es_base_svc_code, MAXSVCCODELEN);
331 if (base_path ==
NULL)
356 owfs_close_fs (es_fsh->fsh);
361 es_owfs_initialized =
false;
374 char owner_name[NAME_MAX], file_name[NAME_MAX];
380 fsh = es_open_owfs (es_base_mds_ip, es_base_svc_code);
388 es_make_unique_name (owner_name,
"ces_temp", file_name);
391 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
392 if (ret == -OWFS_ENOENTOWNER)
394 ret = owfs_create_owner (fsh->fsh, owner_name, &oh);
395 if (ret == -OWFS_EEXIST)
397 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
408 ret = owfs_open_file (oh, file_name, OWFS_CREAT, &fh);
411 owfs_close_owner (oh);
412 if (ret == -OWFS_EEXIST)
420 ret = owfs_close_file (fh);
421 owfs_close_owner (oh);
430 snprintf (new_path, PATH_MAX,
"//%s/%s/%s/%s", fsh->mds_ip, fsh->svc_code, owner_name, file_name);
443 char mds_ip[
CUB_MAXHOSTNAMELEN], svc_code[MAXSVCCODELEN], owner_name[NAME_MAX], file_name[NAME_MAX];
446 owfs_file_stat ostat;
447 size_t total = 0, append_size;
450 if (es_parse_owfs_path (path, mds_ip, svc_code, owner_name, file_name) !=
NO_ERROR)
455 fsh = es_open_owfs (mds_ip, svc_code);
462 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
471 ret = owfs_stat (oh, file_name, &ostat);
474 owfs_close_owner (oh);
480 if (ostat.s_size != offset)
482 owfs_close_owner (oh);
489 while (total < count)
491 append_size = MIN (count - total, ES_OWFS_MAX_APPEND_SIZE);
493 ret = owfs_append_file (oh, file_name, (
char *) buf + total, append_size);
494 if (ret == -OWFS_ELOCK)
500 owfs_close_owner (oh);
505 total += append_size;
508 owfs_close_owner (oh);
521 char mds_ip[
CUB_MAXHOSTNAMELEN], svc_code[MAXSVCCODELEN], owner_name[NAME_MAX], file_name[NAME_MAX];
527 if (es_parse_owfs_path (path, mds_ip, svc_code, owner_name, file_name) !=
NO_ERROR)
532 fsh = es_open_owfs (mds_ip, svc_code);
539 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
548 ret = owfs_open_file (oh, file_name, OWFS_READ, &fh);
551 owfs_close_owner (oh);
553 if (ret == -OWFS_ENOENT)
565 ret = owfs_lseek (fh, offset, OWFS_SEEK_SET);
568 owfs_close_file (fh);
569 owfs_close_owner (oh);
576 ret = owfs_read_file (fh, (
char *) buf, (
unsigned int) count);
577 owfs_close_file (fh);
578 owfs_close_owner (oh);
597 char mds_ip[
CUB_MAXHOSTNAMELEN], svc_code[MAXSVCCODELEN], owner_name[NAME_MAX], file_name[NAME_MAX];
602 if (es_parse_owfs_path (path, mds_ip, svc_code, owner_name, file_name) !=
NO_ERROR)
607 fsh = es_open_owfs (mds_ip, svc_code);
614 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
622 ret = owfs_delete_file (oh, file_name);
623 owfs_close_owner (oh);
625 if (ret == -OWFS_ENOENT)
647 char src_mds_ip[
CUB_MAXHOSTNAMELEN], src_svc_code[MAXSVCCODELEN], src_owner_name[NAME_MAX], src_file_name[NAME_MAX];
648 char new_owner_name[NAME_MAX], new_file_name[NAME_MAX];
649 ES_OWFS_FSH *src_fsh, *dest_fsh;
650 owner_handle src_oh, dest_oh;
654 if (es_parse_owfs_path (src_path, src_mds_ip, src_svc_code, src_owner_name, src_file_name) !=
NO_ERROR)
659 src_fsh = es_open_owfs (src_mds_ip, src_svc_code);
665 ret = owfs_open_owner (src_fsh->fsh, src_owner_name, &src_oh);
673 dest_fsh = es_open_owfs (es_base_mds_ip, es_base_svc_code);
674 if (dest_fsh ==
NULL)
676 owfs_close_owner (src_oh);
682 es_make_unique_name (new_owner_name, metaname, new_file_name);
685 ret = owfs_open_owner (dest_fsh->fsh, new_owner_name, &dest_oh);
686 if (ret == -OWFS_ENOENTOWNER)
688 ret = owfs_create_owner (dest_fsh->fsh, new_owner_name, &dest_oh);
689 if (ret == -OWFS_EEXIST)
691 ret = owfs_open_owner (dest_fsh->fsh, new_owner_name, &dest_oh);
697 owfs_close_owner (src_oh);
703 ret = owfs_open_copy_operation (src_oh, src_file_name, dest_oh, new_file_name, OWFS_CREAT, &oph);
706 owfs_close_owner (dest_oh);
707 if (ret == -OWFS_EEXIST)
712 owfs_close_owner (src_oh);
717 ret = owfs_copy_operation (oph, 0);
720 owfs_release_copy_operation (oph);
721 owfs_close_owner (dest_oh);
722 owfs_close_owner (src_oh);
727 ret = owfs_close_copy_operation (oph);
728 owfs_close_owner (dest_oh);
729 owfs_close_owner (src_oh);
739 snprintf (new_path, PATH_MAX,
"//%s/%s/%s/%s", dest_fsh->mds_ip, dest_fsh->svc_code, new_owner_name, new_file_name);
754 char src_mds_ip[
CUB_MAXHOSTNAMELEN], src_svc_code[MAXSVCCODELEN], src_owner_name[NAME_MAX], src_file_name[NAME_MAX],
755 tgt_file_name[NAME_MAX];
757 ES_OWFS_FSH *src_fsh;
761 if (es_parse_owfs_path (src_path, src_mds_ip, src_svc_code, src_owner_name, src_file_name) !=
NO_ERROR)
766 src_fsh = es_open_owfs (src_mds_ip, src_svc_code);
772 ret = owfs_open_owner (src_fsh->fsh, src_owner_name, &src_oh);
781 s = strchr (src_file_name,
'.');
785 strcpy (tgt_file_name, src_file_name);
787 sprintf (tgt_file_name,
"%s%s", metaname, s);
788 ret = owfs_rename (src_oh, src_file_name, tgt_file_name);
790 owfs_close_owner (src_oh);
799 snprintf (new_path, PATH_MAX,
"//%s/%s/%s/%s", src_fsh->mds_ip, src_fsh->svc_code, src_owner_name, tgt_file_name);
813 char mds_ip[
CUB_MAXHOSTNAMELEN], svc_code[MAXSVCCODELEN], owner_name[NAME_MAX], file_name[NAME_MAX];
816 owfs_file_stat ostat;
819 if (es_parse_owfs_path (path, mds_ip, svc_code, owner_name, file_name) !=
NO_ERROR)
824 fsh = es_open_owfs (mds_ip, svc_code);
831 ret = owfs_open_owner (fsh->fsh, owner_name, &oh);
840 ret = owfs_stat (oh, file_name, &ostat);
841 owfs_close_owner (oh);
cubthread::entry * thread_get_thread_entry_info(void)
ssize_t es_owfs_write_file(const char *path, const void *buf, size_t count, off_t offset)
int es_owfs_init(const char *base_path)
static void es_list_del(struct es_list_head *entry)
UINT64 es_get_unique_num(void)
#define ER_ES_INVALID_PATH
#define pthread_mutex_unlock(a)
#define ES_INIT_LIST_HEAD(ptr)
off_t es_owfs_get_file_size(const char *path)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define ES_LIST_ENTRY(ptr, type, member)
#define ER_OUT_OF_VIRTUAL_MEMORY
int es_owfs_rename_file(const char *src_path, const char *metaname, char *new_path)
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
size_t strlcpy(char *dst, const char *src, size_t siz)
int es_owfs_create_file(char *new_path)
int es_owfs_copy_file(const char *src_path, const char *metaname, char *new_path)
#define ER_ES_FILE_NOT_FOUND
#define pthread_mutex_lock(a)
#define CUB_MAXHOSTNAMELEN
int es_owfs_delete_file(const char *path)
unsigned int es_name_hash_func(int size, const char *name)
#define ES_LIST_FOR_EACH(pos, head)
static void es_list_add(struct es_list_head *new_item, struct es_list_head *head)
ssize_t es_owfs_read_file(const char *path, void *buf, size_t count, off_t offset)
static int es_list_empty(struct es_list_head *head)
struct es_list_head * next