void field_op::parse_field_op(const XMLElement &field_op_element, arena_allocator &alloc) { typedef std::map<std::string, operator_enum_t> operator_map_t; static const operator_map_t operator_map = map_list_of("none", operator_none)( "constant", operator_constant)("delta", operator_delta)( "default", operator_default)("copy", operator_copy)( "increment", operator_increment)("tail", operator_tail); auto itr = operator_map.find(field_op_element.Name()); if (itr == operator_map.end()) { BOOST_THROW_EXCEPTION( fast_static_error("S1") << reason_info( std::string("Invalid field operator ") + field_op_element.Name())); } op_ = itr->second; const char *opContext_key = get_optional_attr( field_op_element, "key", context_ ? context_->key_ : nullptr); const char *opContext_dict = get_optional_attr(field_op_element, "dictionary", context_ ? context_->dictionary_ : nullptr); const char *opContext_ns = get_optional_attr( field_op_element, "ns", context_ ? context_->ns_ : nullptr); if (opContext_key || opContext_dict || opContext_ns) { auto new_context = new (alloc) op_context_t; new_context->key_ = string_dup(opContext_key, alloc); new_context->ns_ = string_dup(opContext_ns, alloc); new_context->dictionary_ = string_dup(opContext_dict, alloc); context_ = new_context; } }
field_op::field_op(const decimal_field_instruction *inst, const XMLElement *element, arena_allocator &alloc) : op_(inst->field_operator()), context_(inst->op_context()), initial_value_(inst->initial_value()), alloc_(&alloc) { if (element) { const XMLElement *field_op_element = find_field_op_element(*element); if (field_op_element) { parse_field_op(*field_op_element, alloc); const char *init_value_str = get_optional_attr(*field_op_element, "value", nullptr); if (init_value_str) { if (strcmp(element->Name(), "exponent") != 0) initial_value_.set(boost::lexical_cast<int64_t>(init_value_str)); else { short exp = 128; try { exp = boost::lexical_cast<short>(init_value_str); } catch (...) { } if (exp > 63 || exp < -63) { BOOST_THROW_EXCEPTION( fast_dynamic_error("D11") << reason_info(std::string("Invalid exponent initial value: ") + init_value_str)); } initial_value_ = decimal_value_storage(0, static_cast<uint16_t>(exp)).storage_; } } } } }
int converter_core::exec_stmt(const template_info& info) const { #if 0 std::cout << "executing " << info.insert_text_ << "\n" << "with binding : " << format_binding(info.binding_) << "\n"; #endif if (sqlite3_step(info.insert_stmt_) == SQLITE_DONE) { sqlite3_reset(info.insert_stmt_); int rowid = sqlite3_last_insert_rowid(db_); return rowid; } std::string saved_reason=sqlite3_errmsg(db_); if (info.find_key_stmt_) { #if 0 std::cout << "executing " << info.find_key_text_ << "\n" << "with binding : " << format_binding(info.binding_) << "\n"; #endif int ret = sqlite3_step(info.find_key_stmt_); if (ret == SQLITE_ROW) { int result = sqlite3_column_int(info.find_key_stmt_, 0); #if 0 std::cout << "rowid found at " << result << "\n"; #endif sqlite3_reset(info.insert_stmt_); sqlite3_reset(info.find_key_stmt_); return result; } } BOOST_THROW_EXCEPTION(sqlite3_error(db_, "sqlite3_step") << statement_info(info.insert_text_) << binding_info(info.binding_) << reason_info(saved_reason) ); }