/* * File: LPQResultSet.h * Author: Saleem Edah-Tally - nmset@yandex.com * License : LGPL version 2.1 * Copyright Saleem Edah-Tally, M. D. - © 2014 * * Created on 29 mai 2014, 16:16 */ #ifdef USE_LIBPQ #ifndef LPQRESULTSET_H #define LPQRESULTSET_H #include "LResultSet.h" #include /** * PostgreSQL namespace. * * Please note USE_LIBPQ pre-processor directive must be defined to include the PostgreSQL backend. */ namespace PQ { #define RSPQMC wxString(_T("RSPQM")) #define RS000C wxString(_T("RS000")) #define RS000M wxString(_T("Result set is NULL.")) #define RS001C wxString(_T("RS001")) #define RS001M wxString(_("Insert started\nPlease SAVE or CANCEL first")) #define RS002C wxString(_T("RS002")) #define RS002M wxString(_("Unknown error")) #define RS003C wxString(_T("RS003")) #define RS003M wxString(_("Data altered\nPlease SAVE or CANCEL first")) #define RS004C wxString(_T("RS004")) #define RS004M wxString(_T("Invalid column name :\n")) /** * Scrollable resultset for the PostgreSQL backend. * * This class allows data modification through GUI elements. * The underlying SQL query must not contain table aliases. * * A column alias must still be a real column name of the table specified in SetTableName. * * Ex : SELECT tbl1.pk1, tbl1.text1, list2.text2 AS num1 FROM tbl1 LEFT JOIN list2 ON tbl1.num1 = list2.pk2 */ class LPQResultSet : public LResultSet { public: LPQResultSet(); LPQResultSet(LConnection * newConnection); virtual ~LPQResultSet(); /** * Updates and runs the SQL string. * @param newSql * @return */ bool SetSQL(const wxString& newSql); bool HasData() const; bool Absolute(const unsigned int newRowIndex); bool IsFirst() const; bool IsLast() const; bool First(); bool Next(); bool Previous(); bool Last(); const unsigned int GetRowCount() const; const unsigned int GetColumnCount() const; const wxString GetColumnName(const unsigned int colIndex) const; const int GetColumnIndex(const wxString& colName) const; const wxAny GetData(const unsigned int rowIdx, const unsigned int colIdx) const; /** * At current row. * @param colName * @return database table value or wxEmptyString. */ const wxAny GetData(const wxString& colName) const; /** * Updates registered controls on screen. */ void Display(); bool Save(); inline void InformInserting() const { InformLibMessage(LInformation(RS001C, RS001M)); } inline void InformDirty() const { InformLibMessage(LInformation(RS003C, RS003M)); }; /** * Replaces a single quote ' by two single quotes '' . * @param literal * @return the number of single quotes replaced */ static int EscapeChar(wxString& literal) { return literal.Replace(_T("'"), _T("''")); } private: bool RunSQL(); const wxString MakeUpdateSQL() const; const wxString MakeDeleteSQL() const; /** * Locates a row by the primary key value and returns its index. * @param pkValue * @return row index or -1 if not found. */ const int GetRowByPKValue(const wxAny& pkValue) const; }; } #endif /* LPQRESULTSET_H */ #endif