AbstractQoreNode* QoreValue::takeNode() { switch (type) { case QV_Bool: return get_bool_node(v.b); case QV_Int: return new QoreBigIntNode(v.i); case QV_Float: return new QoreFloatNode(v.f); case QV_Node: return takeNodeIntern(); default: assert(false); // no break } return 0; }
AbstractQoreNode* QoreValue::getReferencedValue() const { switch (type) { case QV_Bool: return get_bool_node(v.b); case QV_Int: return new QoreBigIntNode(v.i); case QV_Float: return new QoreFloatNode(v.f); case QV_Node: return v.n ? v.n->refSelf() : 0; default: assert(false); // no break } return 0; }
AbstractQoreNode *javaToQore(jboolean b) { return get_bool_node(b); }
AbstractQoreNode *command::get_node(const CS_DATAFMT_EX& datafmt, const output_value_buffer& buffer, ExceptionSink* xsink) { if (buffer.indicator == -1) { // SQL NULL return null(); } const QoreEncoding *encoding = m_conn.getEncoding(); switch (datafmt.datatype) { case CS_LONGCHAR_TYPE: case CS_VARCHAR_TYPE: case CS_TEXT_TYPE: { CS_CHAR* value = (CS_CHAR*)(buffer.value); if (use_numbers(m_conn) && is_number(datafmt)) return new QoreNumberNode(value); ReferenceHolder<QoreStringNode> s(new QoreStringNode(value, buffer.value_len - 1, encoding), xsink); if (need_trim(datafmt)) s->trim_trailing(' '); return s.release(); } case CS_CHAR_TYPE: { CS_CHAR* value = (CS_CHAR*)(buffer.value); if (use_numbers(m_conn) && is_number(datafmt)) return new QoreNumberNode(value); ReferenceHolder<QoreStringNode> s(new QoreStringNode(value, buffer.value_len, encoding), xsink); if (need_trim(datafmt)) s->trim_trailing(' '); return s.release(); } case CS_VARBINARY_TYPE: case CS_BINARY_TYPE: case CS_LONGBINARY_TYPE: case CS_IMAGE_TYPE: { CS_BINARY* value = (CS_BINARY*)(buffer.value); int size = buffer.value_len; void* block = malloc(size); if (!block) { xsink->outOfMemory(); return 0; } memcpy(block, value, size); return new BinaryNode(block, size); } case CS_TINYINT_TYPE: { CS_TINYINT* value = (CS_TINYINT*)(buffer.value); return new QoreBigIntNode(*value); } case CS_SMALLINT_TYPE: { CS_SMALLINT* value = (CS_SMALLINT*)(buffer.value); return new QoreBigIntNode(*value); } case CS_INT_TYPE: { CS_INT* value = (CS_INT*)(buffer.value); return new QoreBigIntNode(*value); } #ifdef CS_BIGINT_TYPE case CS_BIGINT_TYPE: { int64 *value = (int64 *)(buffer.value); return new QoreBigIntNode(*value); } #endif case CS_REAL_TYPE: { CS_REAL* value = (CS_REAL*)(buffer.value); return new QoreFloatNode((double)*value); } case CS_FLOAT_TYPE: { CS_FLOAT* value = (CS_FLOAT*)(buffer.value); return new QoreFloatNode((double)*value); } case CS_BIT_TYPE: { CS_BIT* value = (CS_BIT*)(buffer.value); return get_bool_node(*value != 0); } case CS_DATETIME_TYPE: { CS_DATETIME* value = (CS_DATETIME*)(buffer.value); ss::Conversions conv; // NOTE: can't find a USER_* define for 38! if (datafmt.usertype == 38) return conv.TIME_to_DateTime(*value, m_conn.getTZ()); return conv.DATETIME_to_DateTime(*value, m_conn.getTZ()); } case CS_DATETIME4_TYPE: { ss::Conversions conv; CS_DATETIME4* value = (CS_DATETIME4*)(buffer.value); return conv.DATETIME4_to_DateTime(*value); } default: xsink->raiseException("DBI-EXEC-EXCEPTION", "Unknown data type %d", (int)datafmt.datatype); return 0; } // switch }