Beispiel #1
0
static NEOERR* city_cmd_id(struct city_entry *e, QueueEntry *q)
{
	unsigned char *val = NULL; size_t vsize = 0;
    int id;
	NEOERR *err;

    mdb_conn *db = e->db;
    struct cache *cd = e->cd;

    REQ_GET_PARAM_INT(q->hdfrcv, "id", id);

    if (cache_getf(cd, &val, &vsize, PREFIX_CITY"%d", id)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        MDB_QUERY_RAW(db, "city", _COL_CITY, "id=%d", NULL, id);
        err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "citys", NULL, MDB_FLAG_Z);
        if (err != STATUS_OK) return nerr_pass(err);

        /*
         * get city's parents
         */
        int cnt = 0;
        char *pid = hdf_get_valuef(q->hdfsnd, "citys.0.pid");
        while (pid && atoi(pid) > 0) {
            MDB_QUERY_RAW(db, "city", _COL_CITY, "id=%d", NULL, atoi(pid));
            err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "citys", NULL, MDB_FLAG_Z);
            TRACE_NOK(err);
            pid = hdf_get_valuef(q->hdfsnd, "citys.%d.pid", ++cnt);
        }
        
        CACHE_HDF(q->hdfsnd, CITY_CC_SEC, PREFIX_CITY"%d", id);
    }
    
    return STATUS_OK;
}
Beispiel #2
0
NEOERR* blog_index_static_get(HDF *hdf, HASH *dbh)
{
    mdb_conn *conn = (mdb_conn*)hash_lookup(dbh, "aux");
    NEOERR *err;

    LPRE_DBOP(hdf, conn);

    /* set pgtt for caller use */
    MMISC_PAGEDIV_SET(hdf, PRE_OUTPUT, conn, "blog", " state=%d ",
                      NULL, BLOG_ST_NORMAL);
    int ntt = hdf_get_int_value(hdf, PRE_OUTPUT".ntt", 0);
    int pgtt = (ntt+BLOG_NUM_PERPAGE-1) / BLOG_NUM_PERPAGE;
    hdf_set_int_value(hdf, PRE_OUTPUT".pgtt", pgtt);
    
    int offset = 0;
    int pageid = hdf_get_int_value(hdf, PRE_QUERY".pageid", 0);
    if (pageid == 0)
        offset = (pgtt - 1) * BLOG_NUM_PERPAGE;
    else
        offset = (pageid-1) * BLOG_NUM_PERPAGE;
    MDB_QUERY_RAW(conn, "blog", BLOG_COL, " state=%d ORDER BY ID "
                  " LIMIT %d OFFSET %d", NULL,
                  BLOG_ST_NORMAL, BLOG_NUM_PERPAGE, offset);

    return nerr_pass(mdb_set_rows(hdf, conn, BLOG_COL, PRE_OUTPUT".blogs", "0"));
}
Beispiel #3
0
NEOERR* fill_trackarea(HASH *evth, HASH *dbh)
{
    mdb_conn *conn = (mdb_conn*)hash_lookup(dbh, "dyn");
    mevent_t *evt = (mevent_t*)hash_lookup(evth, "place");
    HDF *node; hdf_init(&node);
    char *ip, *aid, *uid, *city, *area;
    NEOERR *err;

    LPRE_ALLOP(node, conn, evt);

    MDB_QUERY_RAW(conn, "track", COL_TRACK, "intime > current_date AND "
                  " area='' GROUP BY aid, uid", NULL);
    err = mdb_set_rows(node, conn, COL_TRACK, NULL, NULL);
    if (err != STATUS_OK) return nerr_pass(err);

    node = hdf_obj_child(node);
    while (node) {
        ip = hdf_get_value(node, "ip", NULL);
        aid = hdf_get_value(node, "aid", "0");
        uid = hdf_get_value(node, "uid", "0");
        if (ip) {
            hdf_set_value(evt->hdfsnd, "ip", ip);
            MEVENT_TRIGGER_NRET(evt, ip, REQ_CMD_PLACEGET, FLAGS_SYNC);
            city = hdf_get_value(evt->hdfrcv, "0.c", "Mars");
            area = city2area(city);
            MDB_EXEC(conn, NULL, "UPDATE track SET area=$1 WHERE aid=$2 AND uid=$3",
                     "sss", area, aid, uid);
        }

        node = hdf_obj_next(node);
    }

    return STATUS_OK;
}
Beispiel #4
0
/*
 * input : aname(STR)
 * return: NORMAL
 * reply : [appfoo: ["aid": "222", "aname": "appfoo", ...]
 */
static NEOERR* aic_cmd_appusers(struct queue_entry *q, struct cache *cd, mdb_conn *db)
{
    unsigned char *val = NULL; size_t vsize = 0;
    int aid, lm = 0;
    char *aname;
    NEOERR *err;

    REQ_GET_PARAM_STR(q->hdfrcv, "aname", aname);
    REQ_FETCH_PARAM_INT(q->hdfrcv, "limit", lm);
    aid = hash_string(aname);
    
    if (cache_getf(cd, &val, &vsize, PREFIX_USERLIST"%d", aid)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        if (lm > 0) {
            MDB_QUERY_RAW(db, "userinfo", USERINFO_COL,
                          "aid=%d ORDER BY uptime DESC LIMIT %d;",
                          NULL, aid, lm);
        } else {
            MDB_QUERY_RAW(db, "userinfo", USERINFO_COL,
                          "aid=%d ORDER BY uptime DESC;", NULL, aid);
        }
        err = mdb_set_rows(q->hdfsnd, db, USERINFO_COL, "userlist", "1");
        if (err != STATUS_OK) return nerr_pass(err);
        CACHE_HDF(q->hdfsnd, AIC_CC_SEC, PREFIX_USERLIST"%d", aid);
    }
    
    return STATUS_OK;
}
Beispiel #5
0
static NEOERR* aux_cmd_impget(struct queue_entry *q, struct cache *cd, mdb_conn *db)
{
    unsigned char *val = NULL; size_t vsize = 0;
    NEOERR *err;
    char *aname;
    int aid, count, offset;

    REQ_GET_PARAM_STR(q->hdfrcv, "aname", aname);
    aid = hash_string(aname);

    mmisc_pagediv(q->hdfrcv, NULL, &count, &offset, NULL, q->hdfsnd);

    if (cache_getf(cd, &val, &vsize, PREFIX_IMP"%d_%d", aid, offset)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        MMISC_PAGEDIV_SET_N(q->hdfsnd, db, "improve", "aid=%d", NULL, aid);

        MDB_QUERY_RAW(db, "improve", IMP_COL, "aid=%d ORDER BY id DESC LIMIT "
                      " %d OFFSET %d", NULL, aid, count, offset);
        err = mdb_set_rows(q->hdfsnd, db, IMP_COL, "imps", "0");
        if (err != STATUS_OK) return nerr_pass(err);

        CACHE_HDF(q->hdfsnd, IMP_CC_SEC, PREFIX_IMP"%d_%d", aid, offset);
    }
    
    return STATUS_OK;
}
Beispiel #6
0
NEOERR* system_who_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    STRING str; string_init(&str);
    mdb_conn *db = hash_lookup(dbh, "trace");
    char *mname;
    NEOERR *err;

    MCS_NOT_NULLB(cgi->hdf, db);
    
    MEMBER_CHECK_ADMIN();
    SET_DASHBOARD_ACTION(cgi->hdf);

    hdf_set_int_value(cgi->hdf, PRE_QUERY".type", TRACE_TYPE_PAGEVIEW);
    err = mdb_build_querycond(hdf_get_obj(cgi->hdf, PRE_QUERY),
                              hdf_get_obj(g_cfg, "Db.QueryCond.system.who"),
                              &str, NULL);
    if (err != STATUS_OK) return nerr_pass(err);

    MDB_QUERY_RAW(db, "emap", _COL_EMAP_WHO,
                  " %s GROUP BY sender ORDER BY min(intime) DESC LIMIT 100",
                  NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_WHO, PRE_OUTPUT".who",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    string_clear(&str);

    hdf_set_attr(cgi->hdf, PRE_OUTPUT".who", "type", "array");

    return STATUS_OK;
}
Beispiel #7
0
NEOERR* system_plan_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    mdb_conn *db = hash_lookup(dbh, "plan");
    STRING str; string_init(&str);
    int count, offset;
    char *mname;
    HDF *node;
    NEOERR *err;

    MCS_NOT_NULLB(cgi->hdf, db);
    
    MEMBER_CHECK_ADMIN();
    SET_DASHBOARD_ACTION(cgi->hdf);

    hdf_get_node(cgi->hdf, PRE_OUTPUT, &node);

    mdb_pagediv(hdf_get_obj(cgi->hdf, PRE_QUERY),
                NULL, &count, &offset, NULL, node);

    err = mdb_build_querycond(hdf_get_obj(cgi->hdf, PRE_QUERY),
                              hdf_get_obj(g_cfg, "Db.QueryCond.system.plan"),
                              &str, "intime > current_date - 1");
    if (err != STATUS_OK) return nerr_pass(err);

    MDB_PAGEDIV_SET_N(node, db, "plan", "%s", NULL, str.buf);

    MDB_QUERY_RAW(db, "plan", _COL_PLAN_ADMIN,
                  "%s ORDER BY id DESC LIMIT %d OFFSET %d",
                  NULL, str.buf, count, offset);
    err = mdb_set_rows(cgi->hdf, db, _COL_PLAN_ADMIN, PRE_OUTPUT".rows",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    return STATUS_OK;
}
Beispiel #8
0
NEOERR* system_comment_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    mdb_conn *db = hash_lookup(dbh, "aux");
    STRING str; string_init(&str);
    char *mname;
    NEOERR *err;

    MCS_NOT_NULLB(cgi->hdf, db);
    
    MEMBER_CHECK_ADMIN();
    SET_DASHBOARD_ACTION(cgi->hdf);

    if (!hdf_get_value(cgi->hdf, PRE_QUERY".times", NULL))
        hdf_set_value(cgi->hdf, PRE_QUERY".timed", "current_date - 7");
    err = mdb_build_querycond(hdf_get_obj(cgi->hdf, PRE_QUERY),
                              hdf_get_obj(g_cfg, "Db.QueryCond.system.comment"),
                              &str, NULL);
    if (err != STATUS_OK) return nerr_pass(err);

    MDB_QUERY_RAW(db, "comment", _COL_CMT, "%s ORDER BY id DESC", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_CMT, PRE_OUTPUT".rows",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    return STATUS_OK;
}
Beispiel #9
0
NEOERR* system_view_detail_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    STRING str; string_init(&str);
    mdb_conn *db = hash_lookup(dbh, "trace");
    char *mname;
    NEOERR *err;

    MCS_NOT_NULLB(cgi->hdf, db);
    
    MEMBER_CHECK_ADMIN();
    SET_DASHBOARD_ACTION(cgi->hdf);

    err = mdb_build_querycond(hdf_get_obj(cgi->hdf, PRE_QUERY),
                              hdf_get_obj(g_cfg, "Db.QueryCond.system.viewdetail"),
                              &str, NULL);
    if (err != STATUS_OK) return nerr_pass(err);

    MDB_QUERY_RAW(db, "emap", _COL_EMAP_VIEW_DETAIL,
                  " %s ORDER BY intime LIMIT 100", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_VIEW_DETAIL, PRE_OUTPUT".details",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    string_clear(&str);

    hdf_set_attr(cgi->hdf, PRE_OUTPUT".details", "type", "array");

    return STATUS_OK;
}
Beispiel #10
0
NEOERR* pos_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    mdb_conn *db = hash_lookup(dbh, "city");
	NEOERR *err;

    if (!cgi || !cgi->hdf || !db) return nerr_raise(NERR_ASSERT, "paramter null");

    MDB_QUERY_RAW(db, "city", _COL_CITY, "geopos ?- point '(0,0)' LIMIT 1000", NULL);
    return nerr_pass(mdb_set_rows(cgi->hdf, db, _COL_CITY, PRE_OUTPUT".cts", NULL));
}
Beispiel #11
0
static NEOERR* aic_cmd_appousers(struct queue_entry *q, struct cache *cd, mdb_conn *db)
{
    unsigned char *val = NULL; size_t vsize = 0;
    int count, offset;
    int pid;
    char *pname, *aname;
    NEOERR *err;

    REQ_GET_PARAM_STR(q->hdfrcv, "pname", pname);
    pid = hash_string(pname);
    
    mmisc_pagediv(q->hdfrcv, NULL, &count, &offset, NULL, q->hdfsnd);
    
    if (cache_getf(cd, &val, &vsize, PREFIX_APPOUSER"%d_%d", pid, offset)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        MMISC_PAGEDIV_SET_N(q->hdfsnd, db, "appinfo", "pid=%d OR aid=%d",
                            NULL, pid, pid);
        MDB_QUERY_RAW(db, "appinfo", APPINFO_COL,
                      "pid=%d OR aid=%d ORDER BY uptime DESC LIMIT %d OFFSET %d",
                      NULL, pid, pid, count, offset);
        err = mdb_set_rows(q->hdfsnd, db, APPINFO_COL, "users", "1");
        if (err != STATUS_OK) return nerr_pass(err);
        HDF *node = hdf_get_child(q->hdfsnd, "users");
        while (node) {
            /* numcamer */
            aname = hdf_get_value(node, "aname", NULL);
            if (aname) {
                MDB_QUERY_RAW(db, "userinfo", " COUNT(*) AS numcamer ",
                              "aid=%d", NULL, hash_string(aname));
                err = mdb_set_row(node, db, " numcamer ", NULL);
                if (err != STATUS_OK) return nerr_pass(err);
            }
            node = hdf_obj_next(node);
        }
        CACHE_HDF(q->hdfsnd, AIC_CC_SEC, PREFIX_APPOUSER"%d_%d", pid, offset);
    }
    
    return STATUS_OK;
}
Beispiel #12
0
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;
}
Beispiel #13
0
/*
 * ids=0:1
 * { "0": { "1": { "ntt": "0", "nst": "0" } }, "success": "1" }
 *
 * ids=0:1,0:20
 * { "0": { "1": { "ntt": "0", "nst": "0" }, "20": { "ntt": "0", "nst": "0" } }, "success": "1" }
 *
 * ids=0:1,1:20
 * { "0": { "1": { "ntt": "0", "nst": "0" } }, "1": { "20": { "ntt": "0", "nst": "0" } }, "success": "1" } 
 */
static NEOERR* aux_cmd_cmtget(struct aux_entry *e, QueueEntry *q)
{
    unsigned char *val = NULL; size_t vsize = 0;
    int count, offset;
    char *ids, *idsdump, tok[128];
    int type = -1, oid = -1;
    NEOERR *err;

    REQ_GET_PARAM_STR(q->hdfrcv, "ids", ids);

    mdb_conn *db = e->db;
    struct cache *cd = e->cd;

    mdb_pagediv(q->hdfrcv, NULL, &count, &offset, NULL, q->hdfsnd);

    if (cache_getf(cd, &val, &vsize, PREFIX_COMMENT"%s_%d", ids, offset)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        idsdump = strdup(ids);
        char *p = ids;
        while (*p) {
            if (*p == ':') {
                *p = '\0';
                type = atoi(ids);
                ids = p+1;
            }
            if (*p == ',') {
                *p = '\0';
                oid = atoi(ids);
                if (type >= 0 && oid >= 0) {
                    sprintf(tok, "%d.%d", type, oid);
                    MDB_PAGEDIV_SET(q->hdfsnd, tok, db, "comment",
                                    "type=%d AND statu=%d AND oid=%d",
                                      NULL, type, CMT_ST_NORMAL, oid);
                    MDB_QUERY_RAW(db, "comment", _COL_CMT,
                                  "type=%d AND statu=%d AND oid=%d "
                                  " ORDER BY intime DESC LIMIT %d OFFSET %d",
                                  NULL, type, CMT_ST_NORMAL, oid, count, offset);
                    sprintf(tok, "%d.%d.cmts", type, oid);
                    err = mdb_set_rows(q->hdfsnd, db, _COL_CMT, tok, NULL);
                    nerr_handle(&err, NERR_NOT_FOUND);
                    if (err != STATUS_OK) return nerr_pass(err);
                    mstr_html_escape(hdf_get_child(q->hdfsnd, tok), "content");
                    type = oid = -1;
                }
                ids = p+1;
            }
            p++;
        }
        oid = atoi(ids);
        if (type >= 0 && oid >=0) {
            sprintf(tok, "%d.%d", type, oid);
            MDB_PAGEDIV_SET(q->hdfsnd, tok, db, "comment",
                            "type=%d AND statu=%d AND oid=%d",
                            NULL, type, CMT_ST_NORMAL, oid);
            MDB_QUERY_RAW(db, "comment", _COL_CMT,
                          "type=%d AND statu=%d AND oid=%d "
                          " ORDER BY intime DESC LIMIT %d OFFSET %d",
                          NULL, type, CMT_ST_NORMAL, oid, count, offset);
            sprintf(tok, "%d.%d.cmts", type, oid);
            err = mdb_set_rows(q->hdfsnd, db, _COL_CMT, tok, NULL);
            nerr_handle(&err, NERR_NOT_FOUND);
            if (err != STATUS_OK) return nerr_pass(err);
            mstr_html_escape(hdf_get_child(q->hdfsnd, tok), "content");
        }
        
        CACHE_HDF(q->hdfsnd, CMT_CC_SEC, PREFIX_COMMENT"%s_%d", idsdump, offset);
        free(idsdump);
    }

    return STATUS_OK;
}
Beispiel #14
0
NEOERR* system_view_data_get(CGI *cgi, HASH *dbh, HASH *evth, session_t *ses)
{
    mdb_conn *db = hash_lookup(dbh, "trace");
    STRING str; string_init(&str);
    char *mname, *s;
    NEOERR *err;

    MCS_NOT_NULLB(cgi->hdf, db);
    
    MEMBER_CHECK_ADMIN();
    SET_DASHBOARD_ACTION(cgi->hdf);

    /*
     * prepare query condition
     */
    hdf_set_int_value(cgi->hdf, PRE_QUERY".type", TRACE_TYPE_PAGEVIEW);
    HDF_FETCH_STR(cgi->hdf, PRE_QUERY".times", s);
    if (!s) hdf_set_value(cgi->hdf, PRE_QUERY".timed", "current_date - 2");
    err = mdb_build_querycond(hdf_get_obj(cgi->hdf, PRE_QUERY),
                              hdf_get_obj(g_cfg, "Db.QueryCond.system.view"),
                              &str, NULL);
    if (err != STATUS_OK) return nerr_pass(err);

    /*
     * pageview
     */
    MDB_QUERY_RAW(db, "emap", _COL_EMAP_PAGEVIEW,
                  " %s GROUP BY date_trunc('hour', intime) "
                  " ORDER BY date_trunc('hour', intime)", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_PAGEVIEW, PRE_OUTPUT".pageviews",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    /*
     * userview
     */
    MDB_QUERY_RAW(db, "emap", _COL_EMAP_USERVIEW,
                  " %s GROUP BY date_trunc('hour', intime) "
                  " ORDER BY date_trunc('hour', intime)", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_USERVIEW, PRE_OUTPUT".userviews",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    /*
     * day count
     */
    MDB_QUERY_RAW(db, "emap", _COL_EMAP_DATEVIEW,
                  " %s GROUP BY date_trunc('day', intime) "
                  " ORDER BY date_trunc('day', intime)", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_DATEVIEW, PRE_OUTPUT".dateviews",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);
    MDB_QUERY_RAW(db, "emap", _COL_EMAP_DATEUSER,
                  " %s GROUP BY date_trunc('day', intime) "
                  " ORDER BY date_trunc('day', intime)", NULL, str.buf);
    err = mdb_set_rows(cgi->hdf, db, _COL_EMAP_DATEUSER, PRE_OUTPUT".dateusers",
                       NULL, MDB_FLAG_EMPTY_OK);
    if (err != STATUS_OK) return nerr_pass(err);

    string_clear(&str);

    hdf_set_attr(cgi->hdf, PRE_OUTPUT".pageviews", "type", "array");
    hdf_set_attr(cgi->hdf, PRE_OUTPUT".userviews", "type", "array");
    
    return STATUS_OK;
}
Beispiel #15
0
static NEOERR* city_cmd_s(struct city_entry *e, QueueEntry *q)
{
	unsigned char *val = NULL; size_t vsize = 0;
    char *p = NULL, *c;
	NEOERR *err;

    mdb_conn *db = e->db;
    struct cache *cd = e->cd;

    REQ_GET_PARAM_STR(q->hdfrcv, "c", c);
    REQ_FETCH_PARAM_STR(q->hdfrcv, "p", p);

    if (cache_getf(cd, &val, &vsize, PREFIX_CITY"%s.%s", p, c)) {
        unpack_hdf(val, vsize, &q->hdfsnd);
    } else {
        if (p) {
            char tok[64] = {0};
            strncpy(tok, p, 64);
            if (!strstr(p, "省") && !strstr(p, "区"))
                snprintf(tok, sizeof(tok), "%s省", p);

            MDB_QUERY_RAW(db, "city", _COL_CITY, "s=$1", "s", tok);
            mdb_set_row(q->hdfsnd, db, _COL_CITY, "province", MDB_FLAG_NO_ERR);
        }

        MDB_QUERY_RAW(db, "city", _COL_CITY, "s=$1", "s", c);
        err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "citys", NULL, MDB_FLAG_Z);
        if (nerr_handle(&err, NERR_NOT_FOUND)) {
            if (strstr(c, "市")) c[strlen(c)-3] = '\0';
            MDB_QUERY_RAW(db, "city", _COL_CITY, "s=$1", "s", c);
            err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "citys",
                               NULL, MDB_FLAG_EMPTY_OK);
        }
        if (err != STATUS_OK) return nerr_pass(err);

        /*
         * get city's parents
         */
        int cnt = 0;
        char *pid = hdf_get_valuef(q->hdfsnd, "citys.0.pid");
        while (pid && atoi(pid) > 0) {
            MDB_QUERY_RAW(db, "city", _COL_CITY, "id=%d", NULL, atoi(pid));
            err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "citys", NULL, MDB_FLAG_Z);
            TRACE_NOK(err);
            pid = hdf_get_valuef(q->hdfsnd, "citys.%d.pid", ++cnt);
        }
        
        /*
         * 北京市 has no subcities
         */
        /*
        int id = hdf_get_int_value(q->hdfsnd, "city.id", 0);
        MDB_QUERY_RAW(db, "city", _COL_CITY, "pid=%d", NULL, id);
        err = mdb_set_rows(q->hdfsnd, db, _COL_CITY, "subcities",
        NULL, MDB_FLAG_EMPTY_OK);
        if (err != STATUS_OK) return nerr_pass(err);
        */
        
        CACHE_HDF(q->hdfsnd, CITY_CC_SEC, PREFIX_CITY"%s.%s", p, c);
    }
    
    return STATUS_OK;
}