コード例 #1
0
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;
  }
}
コード例 #2
0
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_;
        }
      }
    }
  }
}
コード例 #3
0
ファイル: converter_core.cpp プロジェクト: FLYKingdom/mFAST
    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) );
    }