uint64_t ConstField::value_as_time() const { Internal::check_type(TIME, type()); uint64_t v; throw_if_error(ib_field_value(ib(), ib_ftype_time_out(&v))); return v; }
uint64_t ConstField::value_as_time( const char* arg, size_t arg_length ) const { Internal::check_type(TIME, type()); uint64_t v; throw_if_error(ib_field_value_ex( ib(), ib_ftype_time_out(&v), arg, arg_length )); return v; }
void ib_field_util_log_debug( const char *prefix, const ib_field_t *f ) { assert(prefix != NULL); assert(f != NULL); ib_status_t rc; if (ib_util_get_log_level() < IB_LOG_DEBUG) { return; } if (ib_field_is_dynamic(f)) { ib_util_log_debug( "%s is dynamic: fn_get=%p cbdata_get=%p fn_set=%p cbdata_set=%p", prefix, f->val->fn_get, f->val->cbdata_get, f->val->fn_set, f->val->cbdata_set ); } ib_util_log_debug("%s name=%.*s type=%d", prefix, (int)f->nlen, f->name, f->type ); if (ib_field_is_dynamic(f)) { return; } assert(f->val->pval); if (*(void **)(f->val->pval) == NULL) { ib_util_log_debug( "%s has no value.", prefix ); } else { switch (f->type) { case IB_FTYPE_GENERIC: { void *v; rc = ib_field_value(f, ib_ftype_generic_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%p", prefix, v); } break; } case IB_FTYPE_TIME: { ib_time_t v; rc = ib_field_value(f, ib_ftype_time_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%"PRIu64, prefix, v); } break; } case IB_FTYPE_NUM: { ib_num_t v; rc = ib_field_value(f, ib_ftype_num_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%"PRId64, prefix, v); } break; } case IB_FTYPE_FLOAT: { ib_float_t v; rc = ib_field_value(f, ib_ftype_float_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%Lf", prefix, v); } break; } case IB_FTYPE_NULSTR: { const char *v; rc = ib_field_value(f, ib_ftype_nulstr_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%s", prefix, v); } break; } case IB_FTYPE_BYTESTR: { const ib_bytestr_t *v; rc = ib_field_value(f, ib_ftype_bytestr_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s value=%" IB_BYTESTR_FMT, prefix, IB_BYTESTR_FMT_PARAM(v)); } break; } case IB_FTYPE_LIST: { const ib_list_t* v; rc = ib_field_value(f, ib_ftype_list_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s &value=%p", prefix, v); } break; } case IB_FTYPE_SBUFFER: { const ib_stream_t* v; rc = ib_field_value(f, ib_ftype_sbuffer_out(&v)); if (rc == IB_OK) { ib_util_log_debug("%s &value=%p", prefix, v); } break; } default: ib_util_log_debug("%s Unknown field type: %u", prefix, f->type ); } } }
ib_status_t ib_field_copy( ib_field_t **pf, ib_mpool_t *mp, const char *name, size_t nlen, const ib_field_t *src ) { ib_status_t rc; if (ib_field_is_dynamic(src)) { rc = ib_field_create_dynamic( pf, mp, name, nlen, src->type, src->val->fn_get, src->val->cbdata_get, src->val->fn_set, src->val->cbdata_set ); } else { switch (src->type) { case IB_FTYPE_NUM: { ib_num_t v; rc = ib_field_value(src, ib_ftype_num_out(&v)); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, ib_ftype_num_in(&v) ); break; } case IB_FTYPE_TIME: { ib_time_t v; rc = ib_field_value(src, ib_ftype_time_out(&v)); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, ib_ftype_time_in(&v) ); break; } case IB_FTYPE_FLOAT: { ib_float_t v; rc = ib_field_value(src, ib_ftype_float_out(&v)); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, ib_ftype_float_in(&v) ); break; } default: { void *v; rc = ib_field_value(src, &v); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, v ); } } } if (rc != IB_OK) { goto failed; } ib_field_util_log_debug("FIELD_COPY", (*pf)); return rc; failed: *pf = NULL; return rc; }
ib_status_t ib_field_convert( ib_mpool_t *mp, const ib_ftype_t desired_type, const ib_field_t *in_field, ib_field_t **out_field ) { assert(mp); assert(in_field); ib_status_t rc; /* Holder values for in_field values before being set in out_field. */ size_t sz; const char *str; const ib_bytestr_t *bstr; ib_num_t num; ib_time_t tme; ib_float_t flt; void *new_field_value; if (in_field->type == desired_type) { *out_field = NULL; return IB_OK; } switch (in_field->type) { case IB_FTYPE_NULSTR: /* Extract string. Note that a zero-length nulstr field can * have a NULL value in the union. */ if ( (in_field->val->u.nulstr == NULL) && (in_field->val->pval == NULL) ) { str = ""; } else { rc = ib_field_value(in_field, ib_ftype_nulstr_out(&str)); if (rc != IB_OK){ return rc; } } switch (desired_type) { case IB_FTYPE_BYTESTR: rc = ib_bytestr_dup_nulstr((ib_bytestr_t **)&bstr, mp, str); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_bytestr_in(bstr); break; case IB_FTYPE_TIME: rc = ib_string_to_time(str, &tme); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_time_in(&tme); break; case IB_FTYPE_NUM: rc = ib_string_to_num(str, 0, &num); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_num_in(&num); break; case IB_FTYPE_FLOAT: rc = ib_string_to_float(str, &flt); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_float_in(&flt); break; default: return IB_EINVAL; } break; case IB_FTYPE_BYTESTR: /* Extract bytestr. */ rc = ib_field_value(in_field, ib_ftype_bytestr_out(&bstr)); if (rc != IB_OK){ return rc; } str = (const char *)ib_bytestr_const_ptr(bstr); sz = ib_bytestr_length(bstr); /* Convert byte str. */ switch(desired_type) { case IB_FTYPE_NULSTR: str = ib_mpool_memdup_to_str(mp, str, sz); if (!str) { return rc; } new_field_value = ib_ftype_nulstr_in(str); break; case IB_FTYPE_TIME: rc = ib_string_to_time_ex(str, sz, &tme); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_time_in(&tme); break; case IB_FTYPE_NUM: rc = ib_string_to_num_ex(str, sz, 0, &num); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_num_in(&num); break; case IB_FTYPE_FLOAT: rc = ib_string_to_float_ex(str, sz, &flt); if (rc != IB_OK) { return rc; } new_field_value = ib_ftype_float_in(&flt); break; default: return IB_EINVAL; } break; case IB_FTYPE_TIME: /* Extract time. */ rc = ib_field_value(in_field, ib_ftype_time_out(&tme)); if (rc != IB_OK){ return rc; } switch (desired_type) { case IB_FTYPE_NULSTR: str = ib_time_to_string(mp, tme); if (! str) { return IB_EINVAL; } new_field_value = ib_ftype_nulstr_in(str); break; case IB_FTYPE_BYTESTR: str = ib_time_to_string(mp, tme); if (! str) { return IB_EINVAL; } rc = ib_bytestr_dup_nulstr((ib_bytestr_t **)&bstr, mp, str); if (rc != IB_OK){ return rc; } new_field_value = ib_ftype_bytestr_in(bstr); break; case IB_FTYPE_FLOAT: flt = (ib_float_t)tme; /* Check that our assignment is within error=1, or fail. */ if (llabs(tme - flt) > 1) { return IB_EINVAL; } new_field_value = ib_ftype_float_in(&flt); break; default: return IB_EINVAL; } break; case IB_FTYPE_NUM: /* Extract unum. */ rc = ib_field_value(in_field, ib_ftype_num_out(&num)); if (rc != IB_OK){ return rc; } switch (desired_type) { case IB_FTYPE_NULSTR: str = ib_num_to_string(mp, num); if (! str) { return IB_EINVAL; } new_field_value = ib_ftype_nulstr_in(str); break; case IB_FTYPE_BYTESTR: str = ib_num_to_string(mp, num); if (! str) { return IB_EINVAL; } rc = ib_bytestr_dup_nulstr((ib_bytestr_t **)&bstr, mp, str); if (rc != IB_OK){ return rc; } new_field_value = ib_ftype_bytestr_in(bstr); break; case IB_FTYPE_TIME: if (num < 0) { return IB_EINVAL; } tme = (ib_time_t)num; new_field_value = ib_ftype_time_in(&tme); break; case IB_FTYPE_FLOAT: flt = (ib_float_t)num; if (llabs(flt - num) > 1) { return IB_EINVAL; } new_field_value = ib_ftype_float_in(&flt); break; default: return IB_EINVAL; } break; case IB_FTYPE_FLOAT: /* Extract unum. */ rc = ib_field_value(in_field, ib_ftype_float_out(&flt)); if (rc != IB_OK){ return rc; } switch (desired_type) { case IB_FTYPE_NULSTR: str = ib_float_to_string(mp, flt); if (!str) { return IB_EINVAL; } new_field_value = ib_ftype_nulstr_in(str); break; case IB_FTYPE_BYTESTR: str = ib_float_to_string(mp, flt); if (!str) { return IB_EINVAL; } rc = ib_bytestr_dup_nulstr((ib_bytestr_t **)&bstr, mp, str); if (rc != IB_OK){ return rc; } new_field_value = ib_ftype_bytestr_in(bstr); break; case IB_FTYPE_TIME: if (flt < 0) { return IB_EINVAL; } tme = (ib_float_t)flt; new_field_value = ib_ftype_time_in(&tme); break; case IB_FTYPE_NUM: num = (ib_float_t)flt; new_field_value = ib_ftype_num_in(&num); break; default: return IB_EINVAL; } break; default: return IB_EINVAL; } rc = ib_field_create( out_field, mp, in_field->name, in_field->nlen, desired_type, new_field_value ); return rc; }