/** * * Field.cc * An Tao * * Copyright 2018, An Tao. All rights reserved. * https://github.com/an-tao/drogon * Use of this source code is governed by a MIT license * that can be found in the License file. * * Drogon * */ #include #include #include #include using namespace drogon::orm; Field::Field(const Row &row, Row::SizeType columnNum) noexcept : row_(Result::SizeType(row.index_)), column_((long)columnNum), result_(row.result_) { } const char *Field::name() const { return result_.columnName(column_); } bool Field::isNull() const { return result_.isNull(row_, column_); } template <> std::string Field::as() const { if (result_.oid(column_) != 17) { auto data_ = result_.getValue(row_, column_); auto dataLength_ = result_.getLength(row_, column_); // LOG_DEBUG << "dataLength_=" << dataLength_ << " str=" << data_; return std::string(data_, dataLength_); } else { // Bytea type of PostgreSQL auto sv = as(); if (sv.length() < 2 || sv[0] != '\\' || sv[1] != 'x') return std::string(); return utils::hexToBinaryString(sv.data() + 2, sv.length() - 2); } } template <> const char *Field::as() const { auto data_ = result_.getValue(row_, column_); return data_; } template <> char *Field::as() const { auto data_ = result_.getValue(row_, column_); return (char *)data_; } template <> std::vector Field::as>() const { if (result_.oid(column_) != 17) { char *first = (char *)result_.getValue(row_, column_); char *last = first + result_.getLength(row_, column_); return std::vector(first, last); } else { // Bytea type of PostgreSQL auto sv = as(); if (sv.length() < 2 || sv[0] != '\\' || sv[1] != 'x') return std::vector(); return utils::hexToBinaryVector(sv.data() + 2, sv.length() - 2); } } const char *Field::c_str() const { return as(); } // template <> // std::vector Field::as>() const // { // auto data_ = result_.getValue(row_, column_); // auto dataLength_ = result_.getLength(row_, column_); // LOG_DEBUG<<"dataLength_="<