void masset_finish() { HASH *mh = hash_lookup(g_datah, ASSET_KEY); hash_destroy(&mh); hash_remove(g_datah, ASSET_KEY); uListDestroyFunc(&asset_drivers, masset_driver_free); asset_drivers = NULL; }
int tjt_get_data(HDF *hdf, HASH *dbh, session_t *ses) { char *buf, tbl[LEN_TB]; size_t datalen; file_t *fl; ULIST *ul = NULL; int count, offset, aid, fid, ret; mdb_conn *dbsys, *dbtjt; dbsys = (mdb_conn*)hash_lookup(dbh, "Sys"); dbtjt = (mdb_conn*)hash_lookup(dbh, "Tjt"); PRE_DBOP(hdf, dbsys); PRE_DBOP(hdf, dbtjt); aid = ses->file->aid; fid = ses->file->id; snprintf(tbl, sizeof(tbl), "tjt_%d", aid); /* TODO ses->file not null all time? */ //if (ses->file != NULL) lutil_fill_layout_by_file(dbsys, ses->file, hdf); if (file_get_info_by_id(dbsys, aid, NULL, -1, &fl) == RET_RBTOP_OK) { hdf_set_value(hdf, PRE_OUTPUT".navtitle", fl->remark); file_del(fl); } file_get_nav_by_id(dbsys, aid, PRE_OUTPUT, hdf); ret = file_check_user_power(hdf, dbsys, ses, ses->file, LMT_APPEND); if (ret == RET_RBTOP_OK) { hdf_set_value(hdf, PRE_OUTPUT".appendable", "1"); } lutil_fetch_countf(hdf, dbtjt, tbl, "fid=%d", fid); mmisc_get_offset(hdf, &count, &offset); buf = mmc_getf(&datalen, 0, PRE_MMC_TJT".%d.%d", fid, offset); if (buf == NULL || datalen < sizeof(tjt_t)) { LDB_QUERY_RAW(dbtjt, "tjt_%d", TJT_QUERY_COL, "fid=%d ORDER BY uptime " " LIMIT %d OFFSET %d", NULL, aid, fid, count, offset); mdb_set_rows(hdf, dbtjt, TJT_QUERY_COL, PRE_OUTPUT".atoms"); lutil_image_expand(hdf, PRE_OUTPUT".atoms", "img", IMG_PATH, IMG_S, "imgurl"); lcs_hdf2list(hdf, PRE_OUTPUT".atoms", tjt_hdf2item, &ul); ret = list_pack(ul, TJT_LEN, tjt_pack_nalloc, &buf, &datalen); if (ret == RET_RBTOP_OK) { mmc_storef(MMC_OP_SET, buf, datalen, HALF_HOUR, 0, PRE_MMC_TJT".%d.%d", fid, offset); } } else { list_unpack(buf, tjt_unpack, datalen, &ul); ret = lcs_list2hdf(ul, PRE_OUTPUT".atoms", tjt_item2hdf, hdf); if (ret != RET_RBTOP_OK) { mtc_err("assembly tjt from mmc error"); return RET_RBTOP_MMCERR; } } uListDestroyFunc(&ul, tjt_del); free(buf); return ret; }