int dbrelay_db_fill_data(json_t *json, dbrelay_connection_t *conn) { int numcols, colnum; char tmp[256]; int maxcolname; json_add_key(json, "data"); json_new_array(json); while (api->has_results(conn->db)) { maxcolname = 0; json_new_object(json); json_add_key(json, "fields"); json_new_array(json); numcols = api->numcols(conn->db); for (colnum=1; colnum<=numcols; colnum++) { dbrelay_write_json_colinfo(json, conn->db, colnum, &maxcolname); } json_end_array(json); json_add_key(json, "rows"); if (json_get_mode(json)==DBRELAY_JSON_MODE_STD) json_new_array(json); else json_add_json(json, "\""); while (api->fetch_row(conn->db)) { maxcolname = 0; if (json_get_mode(json)==DBRELAY_JSON_MODE_STD) json_new_object(json); for (colnum=1; colnum<=numcols; colnum++) { dbrelay_write_json_column(json, conn->db, colnum, &maxcolname); if (json_get_mode(json)==DBRELAY_JSON_MODE_CSV && colnum!=numcols) json_add_json(json, ","); } if (json_get_mode(json)==DBRELAY_JSON_MODE_STD) json_end_object(json); else json_add_json(json, "\\n"); } if (json_get_mode(json)==DBRELAY_JSON_MODE_STD) json_end_array(json); else json_add_json(json, "\","); if (api->rowcount(conn->db)==-1) { json_add_null(json, "count"); } else { sprintf(tmp, "%d", api->rowcount(conn->db)); json_add_number(json, "count", tmp); } json_end_object(json); } /* sprintf(error_string, "rc = %d", rc); */ json_end_array(json); return 0; }
static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, QJSON *vmdesc) { const VMStateDescription **sub = vmsd->subsections; bool subsection_found = false; int ret = 0; trace_vmstate_subsection_save_top(vmsd->name); while (sub && *sub) { if (vmstate_save_needed(*sub, opaque)) { const VMStateDescription *vmsdsub = *sub; uint8_t len; trace_vmstate_subsection_save_loop(vmsd->name, vmsdsub->name); if (vmdesc) { /* Only create subsection array when we have any */ if (!subsection_found) { json_start_array(vmdesc, "subsections"); subsection_found = true; } json_start_object(vmdesc, NULL); } qemu_put_byte(f, QEMU_VM_SUBSECTION); len = strlen(vmsdsub->name); qemu_put_byte(f, len); qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len); qemu_put_be32(f, vmsdsub->version_id); ret = vmstate_save_state(f, vmsdsub, opaque, vmdesc); if (ret) { return ret; } if (vmdesc) { json_end_object(vmdesc); } } sub++; } if (vmdesc && subsection_found) { json_end_array(vmdesc); } return ret; }
u_char *dbrelay_db_status(dbrelay_request_t *request) { dbrelay_connection_t *connections; dbrelay_connection_t *conn; json_t *json = json_new(); int i; char tmpstr[100]; u_char *json_output; struct tm *ts; json_new_object(json); json_add_key(json, "status"); json_new_object(json); json_add_key(json, "info"); json_new_object(json); json_add_string(json, "build", DBRELAY_BUILD); sprintf(tmpstr, "0x%08x", dbrelay_get_ipc_key()); json_add_string(json, "ipckey", tmpstr); json_end_object(json); json_add_key(json, "connections"); json_new_array(json); connections = dbrelay_time_get_shmem(request); for (i=0; i<DBRELAY_MAX_CONN; i++) { conn = &connections[i]; if (connections[i].pid!=0) { json_new_object(json); sprintf(tmpstr, "%u", conn->slot); json_add_number(json, "slot", tmpstr); sprintf(tmpstr, "%u", conn->pid); json_add_number(json, "pid", tmpstr); json_add_string(json, "name", conn->connection_name ? conn->connection_name : ""); ts = localtime(&conn->tm_create); strftime(tmpstr, sizeof(tmpstr), "%Y-%m-%d %H:%M:%S", ts); json_add_string(json, "tm_created", tmpstr); ts = localtime(&conn->tm_accessed); strftime(tmpstr, sizeof(tmpstr), "%Y-%m-%d %H:%M:%S", ts); json_add_string(json, "tm_accessed", tmpstr); json_add_string(json, "sql_server", conn->sql_server ? conn->sql_server : ""); json_add_string(json, "sql_port", conn->sql_port ? conn->sql_port : ""); json_add_string(json, "sql_database", conn->sql_database ? conn->sql_database : ""); json_add_string(json, "sql_user", conn->sql_user ? conn->sql_user : ""); sprintf(tmpstr, "%ld", conn->connection_timeout); json_add_number(json, "connection_timeout", tmpstr); sprintf(tmpstr, "%u", conn->in_use); json_add_number(json, "in_use", tmpstr); json_add_string(json, "sock_path", conn->sock_path); sprintf(tmpstr, "%u", conn->helper_pid); json_add_number(json, "helper_pid", tmpstr); json_end_object(json); } } dbrelay_time_release_shmem(request, connections); json_end_array(json); json_end_object(json); json_end_object(json); json_output = (u_char *) json_to_string(json); json_free(json); return json_output; }
int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, QJSON *vmdesc, int version_id) { int ret = 0; const VMStateField *field = vmsd->fields; trace_vmstate_save_state_top(vmsd->name); if (vmsd->pre_save) { ret = vmsd->pre_save(opaque); trace_vmstate_save_state_pre_save_res(vmsd->name, ret); if (ret) { error_report("pre-save failed: %s", vmsd->name); return ret; } } if (vmdesc) { json_prop_str(vmdesc, "vmsd_name", vmsd->name); json_prop_int(vmdesc, "version", version_id); json_start_array(vmdesc, "fields"); } while (field->name) { if ((field->field_exists && field->field_exists(opaque, version_id)) || (!field->field_exists && field->version_id <= version_id)) { void *first_elem = opaque + field->offset; int i, n_elems = vmstate_n_elems(opaque, field); int size = vmstate_size(opaque, field); int64_t old_offset, written_bytes; QJSON *vmdesc_loop = vmdesc; trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); if (field->flags & VMS_POINTER) { first_elem = *(void **)first_elem; assert(first_elem || !n_elems || !size); } for (i = 0; i < n_elems; i++) { void *curr_elem = first_elem + size * i; ret = 0; vmsd_desc_field_start(vmsd, vmdesc_loop, field, i, n_elems); old_offset = qemu_ftell_fast(f); if (field->flags & VMS_ARRAY_OF_POINTER) { assert(curr_elem); curr_elem = *(void **)curr_elem; } if (!curr_elem && size) { /* if null pointer write placeholder and do not follow */ assert(field->flags & VMS_ARRAY_OF_POINTER); ret = vmstate_info_nullptr.put(f, curr_elem, size, NULL, NULL); } else if (field->flags & VMS_STRUCT) { ret = vmstate_save_state(f, field->vmsd, curr_elem, vmdesc_loop); } else if (field->flags & VMS_VSTRUCT) { ret = vmstate_save_state_v(f, field->vmsd, curr_elem, vmdesc_loop, field->struct_version_id); } else { ret = field->info->put(f, curr_elem, size, field, vmdesc_loop); } if (ret) { error_report("Save of field %s/%s failed", vmsd->name, field->name); if (vmsd->post_save) { vmsd->post_save(opaque); } return ret; } written_bytes = qemu_ftell_fast(f) - old_offset; vmsd_desc_field_end(vmsd, vmdesc_loop, field, written_bytes, i); /* Compressed arrays only care about the first element */ if (vmdesc_loop && vmsd_can_compress(field)) { vmdesc_loop = NULL; } } } else { if (field->flags & VMS_MUST_EXIST) { error_report("Output state validation failed: %s/%s", vmsd->name, field->name); assert(!(field->flags & VMS_MUST_EXIST)); } } field++; } if (vmdesc) { json_end_array(vmdesc); } ret = vmstate_subsection_save(f, vmsd, opaque, vmdesc); if (vmsd->post_save) { int ps_ret = vmsd->post_save(opaque); if (!ret) { ret = ps_ret; } } return ret; }
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, QJSON *vmdesc) { VMStateField *field = vmsd->fields; trace_vmstate_save_state_top(vmsd->name); if (vmsd->pre_save) { vmsd->pre_save(opaque); } if (vmdesc) { json_prop_str(vmdesc, "vmsd_name", vmsd->name); json_prop_int(vmdesc, "version", vmsd->version_id); json_start_array(vmdesc, "fields"); } while (field->name) { if (!field->field_exists || field->field_exists(opaque, vmsd->version_id)) { void *base_addr = vmstate_base_addr(opaque, field, false); int i, n_elems = vmstate_n_elems(opaque, field); int size = vmstate_size(opaque, field); int64_t old_offset, written_bytes; QJSON *vmdesc_loop = vmdesc; trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); for (i = 0; i < n_elems; i++) { void *addr = base_addr + size * i; vmsd_desc_field_start(vmsd, vmdesc_loop, field, i, n_elems); old_offset = qemu_ftell_fast(f); if (field->flags & VMS_ARRAY_OF_POINTER) { addr = *(void **)addr; } if (field->flags & VMS_STRUCT) { vmstate_save_state(f, field->vmsd, addr, vmdesc_loop); } else { field->info->put(f, addr, size, field, vmdesc_loop); } written_bytes = qemu_ftell_fast(f) - old_offset; vmsd_desc_field_end(vmsd, vmdesc_loop, field, written_bytes, i); /* Compressed arrays only care about the first element */ if (vmdesc_loop && vmsd_can_compress(field)) { vmdesc_loop = NULL; } } } else { if (field->flags & VMS_MUST_EXIST) { error_report("Output state validation failed: %s/%s", vmsd->name, field->name); assert(!(field->flags & VMS_MUST_EXIST)); } } field++; } if (vmdesc) { json_end_array(vmdesc); } vmstate_subsection_save(f, vmsd, opaque, vmdesc); }