int file_get_info_by_id(mdb_conn *conn, int id, char *url, int pid, file_t **file) { char mmckey[LEN_MMC_KEY]; file_t *fl; size_t datalen; char *buf; int ret; if (id < 0 && (url == NULL || pid < 0)) return RET_RBTOP_INPUTE; if (id <= 0) snprintf(mmckey, LEN_MMC_KEY, "%s.%d.%s", PRE_MMC_FILE, pid, url); else snprintf(mmckey, LEN_MMC_KEY, "%s.%d", PRE_MMC_FILE, id); buf = mmc_get(mmckey, &datalen, 0); if (buf == NULL || datalen < sizeof(file_t)) { if (buf != NULL && datalen < sizeof(file_t)) { mtc_warn("get %d %d.%s info error from mmc %d", id, pid, url, datalen); } if (mdb_get_errcode(conn) != MDB_ERR_NONE) { mtc_err("conn err %s", mdb_get_errmsg(conn)); return RET_RBTOP_INPUTE; } fl = file_new(); if (fl == NULL) return RET_RBTOP_MEMALLOCE; if (id <= 0) { LDB_QUERY_RAW(conn, "fileinfo", FILE_QUERY_COL, "pid=%d AND name=$1", "s", pid, url); } else { LDB_QUERY_RAW(conn, "fileinfo", FILE_QUERY_COL, "id=%d", NULL, id); } ret = FILE_GET_RAW(conn, fl); if (ret != MDB_ERR_NONE) { mtc_err("get %d %d.%s info failure from db %s", id, pid, url, mdb_get_errmsg(conn)); if (ret == MDB_ERR_NORESULT) return RET_RBTOP_NEXIST; return RET_RBTOP_SELECTE; } else { file_pack(fl, &buf, &datalen); mmc_store(MMC_OP_SET, mmckey, (void*)buf, datalen, ONE_HOUR, 0); } } else { ret = file_unpack(buf, datalen, &fl, NULL); if (ret != RET_RBTOP_OK) { mtc_err("assembly file from mmc error"); return RET_RBTOP_MMCERR; } } free(buf); *file = fl; return RET_RBTOP_OK; }
int file_get_info_by_uri(mdb_conn *conn, char *uri, file_t **file) { file_t *fl; size_t datalen; char *buf; int ret; if (uri == NULL) return RET_RBTOP_INPUTE; buf = mmc_getf(&datalen, 0, PRE_MMC_FILE".%s", uri); if (buf == NULL || datalen < sizeof(file_t)) { if (buf != NULL && datalen < sizeof(file_t)) { mtc_warn("get %s info error from mmc %d", uri, datalen); } if (mdb_get_errcode(conn) != MDB_ERR_NONE) { mtc_err("conn err %s", mdb_get_errmsg(conn)); return RET_RBTOP_INPUTE; } fl = file_new(); if (fl == NULL) return RET_RBTOP_MEMALLOCE; LDB_QUERY_RAW(conn, "fileinfo", FILE_QUERY_COL, "uri=$1", "s", uri); ret = FILE_GET_RAW(conn, fl); if (ret != MDB_ERR_NONE) { mtc_err("get %s info failure from db %s", uri, mdb_get_errmsg(conn)); if (ret == MDB_ERR_NORESULT) return RET_RBTOP_NEXIST; return RET_RBTOP_SELECTE; } else { file_pack(fl, &buf, &datalen); mmc_storef(MMC_OP_SET, (void*)buf, datalen, ONE_HOUR, 0, PRE_MMC_FILE".%s", uri); } } else { ret = file_unpack(buf, datalen, &fl, NULL); if (ret != RET_RBTOP_OK) { mtc_err("assembly file from mmc error"); return RET_RBTOP_MMCERR; } } free(buf); *file = fl; return RET_RBTOP_OK; }
/* Unpack caller's information on the server, or server's information returned to the client */ struct call_info * callinfo_unpack(xmlrpc_env *envP, xmlrpc_value *s) { struct call_info *cip = callinfo_new(); xmlrpc_value *methargs, *files; int i; unpack(envP, s, "clientIP", (char **)&cip->clientIP); unpack(envP, s, "serverURL", &cip->serverURL); unpack(envP, s, "session", &cip->session); unpack(envP, s, "method", &cip->method); unpack(envP, s, "user", &cip->user); unpack(envP, s, "password", &cip->password); unpack(envP, s, "project", &cip->project); unpack(envP, s, "version", &cip->version); xmlrpc_struct_find_value(envP, s, "method-args", &methargs); if (methargs) { cip->nargs = xmlrpc_array_size(envP, methargs); cip->methodargs = malloc((cip->nargs + 1) * sizeof(char *)); for (i = 0; i < cip->nargs; ++i) { xmlrpc_value *v; char *arg; xmlrpc_array_read_item(envP, methargs, i, &v); xmlrpc_read_string(envP, v, (const char **const)&arg); cip->methodargs[i] = arg; fprintf(stderr, "unpacked methodargs[%d] as %s\n", i, arg); } cip->methodargs[cip->nargs] = NULL; } else { cip->nargs = 0; cip->methodargs = NULL; } xmlrpc_struct_find_value(envP, s, "method-data", &files); if (files) { for (i = 0; i < xmlrpc_array_size(envP, files); ++i) { struct file_data *this_file; xmlrpc_value * fstruct; xmlrpc_array_read_item(envP, files, i, &fstruct); this_file = file_unpack(envP, fstruct); if (cip->files == NULL) { cip->files = this_file; cip->files_last = cip->files->next; } else { cip->files_last->next = this_file; cip->files_last = cip->files->next; } } } return cip; }
void main() { hires(); //file_unpackc((unsigned char*)0xa000,LabelPicture); file_unpack((unsigned char*)0xa000,LabelPicture); }