From 9b1c0e006f20091f28f3f468cfcab1feb51286bd Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Thu, 2 Oct 2008 16:23:55 -0500 Subject: [svn] * Proper SVN structure --HG-- branch : trunk --- src/shared/Database/QueryResultPostgre.cpp | 139 +++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/shared/Database/QueryResultPostgre.cpp (limited to 'src/shared/Database/QueryResultPostgre.cpp') diff --git a/src/shared/Database/QueryResultPostgre.cpp b/src/shared/Database/QueryResultPostgre.cpp new file mode 100644 index 00000000000..2cb6447b170 --- /dev/null +++ b/src/shared/Database/QueryResultPostgre.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2005-2008 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef DO_POSTGRESQL + +#include "DatabaseEnv.h" + +QueryResultPostgre::QueryResultPostgre(PGresult *result, uint64 rowCount, uint32 fieldCount) : +QueryResult(rowCount, fieldCount), mResult(result), mTableIndex(0) +{ + + mCurrentRow = new Field[mFieldCount]; + ASSERT(mCurrentRow); + + for (uint32 i = 0; i < mFieldCount; i++) + { + mFieldNames[i] = PQfname(result, i); + mCurrentRow[i].SetType(ConvertNativeType(PQftype( result, i ))); + } +} + +QueryResultPostgre::~QueryResultPostgre() +{ + EndQuery(); +} + +bool QueryResultPostgre::NextRow() +{ + if (!mResult) + return false; + + if (mTableIndex >= mRowCount) + { + EndQuery(); + return false; + } + + char* pPQgetvalue; + for (int j = 0; j < mFieldCount; j++) + { + pPQgetvalue = PQgetvalue(mResult, mTableIndex, j); + if(pPQgetvalue && !(*pPQgetvalue)) + pPQgetvalue = NULL; + + mCurrentRow[j].SetValue(pPQgetvalue); + } + ++mTableIndex; + + return true; +} + +void QueryResultPostgre::EndQuery() +{ + if (mCurrentRow) + { + delete [] mCurrentRow; + mCurrentRow = 0; + } + + if (mResult) + { + PQclear(mResult); + mResult = 0; + } +} + +// see types in #include +enum Field::DataTypes QueryResultPostgre::ConvertNativeType(Oid pOid ) const +{ + switch (pOid) + { + case BPCHAROID: + case CIDOID: + case CIDROID: + case CIRCLEOID: + case INETOID: + case NAMEOID: + case TEXTOID: + case VARCHAROID: + return Field::DB_TYPE_STRING; + case CASHOID: + case FLOAT4OID: + case FLOAT8OID: + case NUMERICOID: + return Field::DB_TYPE_FLOAT; + case DATEOID: // Date + case RELTIMEOID: // Date + case TIMEOID: // Time + case TIMETZOID: // Time + case ABSTIMEOID: // DateTime + case INTERVALOID: // DateTime + case TIMESTAMPOID: // DateTime + case TIMESTAMPTZOID: // DateTime + case INT2OID: // Int + case INT2VECTOROID: // Int + case INT4OID: // Int + case OIDOID: // Int + case CHAROID: // UInt + case INT8OID: // LongLong + return Field::DB_TYPE_INTEGER; + case BOOLOID: + return Field::DB_TYPE_BOOL; // Bool +/* + case BOXOID: Rect; + case LINEOID: Rect; + case VARBITOID: BitArray; + case BYTEAOID: ByteArray; +*/ + case LSEGOID: + case OIDVECTOROID: + case PATHOID: + case POINTOID: + case POLYGONOID: + case REGPROCOID: + case TIDOID: + case TINTERVALOID: + case UNKNOWNOID: + case XIDOID: + default: + return Field::DB_TYPE_UNKNOWN; + } + return Field::DB_TYPE_UNKNOWN; +} +#endif -- cgit v1.2.3