Error in SQL query using table inheritance in PostgreSQL

Forum for posting problems using QxOrm library

Error in SQL query using table inheritance in PostgreSQL

Postby nickla » Mon Aug 13, 2012 7:06 pm

I have such tables:
Code: Select all
CREATE TABLE user_system
(
  id bigserial NOT NULL,
  role_id bigint NOT NULL,
  status_id integer NOT NULL,
  username character varying(20) NOT NULL,
  passwd character varying(32) NOT NULL,
  address character varying(255) NOT NULL,
  firstname character varying(50) NOT NULL,
  lastname character varying(50) NOT NULL,
  patronymic character varying(50),
  phone_id bigint NOT NULL,
  CONSTRAINT user_system_pkey PRIMARY KEY (id ),
  CONSTRAINT fk_user_system_phone_id FOREIGN KEY (phone_id)
      REFERENCES phone (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT user_system_status_id_fkey FOREIGN KEY (status_id)
      REFERENCES user_system_status (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT user_system_username_key UNIQUE (username )
)
WITH (
  OIDS=FALSE
);

CREATE TABLE user_system_manager
(
-- Inrehit from table user_system:  id bigint NOT NULL DEFAULT nextval('user_system_id_seq'::regclass),
-- Inrehit from table user_system:  role_id bigint NOT NULL,
-- Inrehit from table user_system:  status_id integer NOT NULL,
-- Inrehit from table user_system:  username character varying(20) NOT NULL,
-- Inrehit  from table user_system:  passwd character varying(32) NOT NULL,
-- Inrehit from table user_system:  address character varying(255) NOT NULL,
-- Inrehit from table user_system:  firstname character varying(50) NOT NULL,
-- Inrehit from table user_system:  lastname character varying(50) NOT NULL,
-- Inrehit from table user_system:  patronymic character varying(50),
-- Inrehit from table user_system:  phone_id bigint NOT NULL,
  CONSTRAINT user_system_manager_pkey PRIMARY KEY (id ),
  CONSTRAINT user_system_manager_phone FOREIGN KEY (phone_id)
      REFERENCES phone (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT user_system_manager_role FOREIGN KEY (role_id)
      REFERENCES user_role (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT user_system_manager_status FOREIGN KEY (status_id)
      REFERENCES user_system_status (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT user_system_manager_username_key UNIQUE (username )
)
INHERITS (user_system)
WITH (
  OIDS=FALSE
);


I created User and UserManager business classes.
User class:
Code: Select all
#ifndef _QX_SERVICE_BO_USER_H_
#define _QX_SERVICE_BO_USER_H_

#include "phone.h"
#include "userrole.h"
#include "userstatus.h"

class QX_SERVICE_DLL_EXPORT User
{
    QX_REGISTER_FRIEND_CLASS(User)

public:

    User() : m_Id(0) { ; }
    virtual ~User() { ; }

    long id() const             { return m_Id; }
    QString firstname() const   { return m_Firstname; }
    QString lastname() const    { return m_Lastname; }
    QString patronymic() const  { return m_Patronymic; }
    QString address() const     { return m_Address; }
    QString username() const    { return m_Username; }
    QString password() const    { return m_Password; }

    void setId(const long id) { m_Id = id; }
    void setFirstname(const QString value)  { m_Firstname = value; }
    void setLastname(const QString value)   { m_Lastname = value; }
    void setPatronymic(const QString value) { m_Patronymic = value; }
    void setAddress(const QString value)    { m_Address = value; }
    void setUsername(const QString value)   { m_Username = value; }
    void setPassword(const QString value)   { m_Password = value; }

protected:
    long m_Id;
    long m_RoleId;
    long m_StatusId;
    QString m_Firstname;
    QString m_Lastname;
    QString m_Patronymic;
    QString m_Address;
    QString m_Username;
    QString m_Password;
    PhonePtr m_Phone;
    UserRolePtr m_Role;
    UserStatusPtr m_Status;
};

QX_REGISTER_HPP_QX_SERVICE(User, qx::trait::no_base_class_defined, 0)

typedef boost::shared_ptr<User> UserPtr;
typedef qx::QxCollection<long, UserPtr> UserList;
typedef boost::shared_ptr<UserList> UserListPtr;

#endif // _QX_SERVICE_BO_USER_H_

/// CPP
#include "../../include/precompiled.h"
#include "../../include/business_object/user.h"

#include <QxMemLeak.h>

QX_REGISTER_CPP_QX_SERVICE(User)

namespace qx {
    template <> void register_class(QxClass<User> & t)
    {
        t.setName("user_system");

        t.id(& User::m_Id, "id");

        t.data(& User::m_Firstname, "first_name");
        t.data(& User::m_Lastname, "last_name");
        t.data(& User::m_Patronymic, "patronymic");
        t.data(& User::m_Address, "patronymic");
        t.data(& User::m_Username, "username");
        t.data(& User::m_Password, "passwd");
    }
}


User manager class:
Code: Select all
#ifndef USERMANAGER_H
#define USERMANAGER_H

#include "user.h"

class QX_SERVICE_DLL_EXPORT UserManager : public User
{
    QX_REGISTER_FRIEND_CLASS(UserManager)

public:

    UserManager() : User() { ; };

};

QX_REGISTER_HPP_QX_SERVICE(UserManager, User, 0)

typedef boost::shared_ptr<UserManager> UserManagerPtr;
typedef qx::QxCollection<long, UserManagerPtr> UserManagerList;
typedef boost::shared_ptr<UserManagerList> UserManagerListPtr;

#endif // USERMANAGER_H

#include "../../include/precompiled.h"
#include "../../include/business_object/usermanager.h"

#include <QxMemLeak.h>

QX_REGISTER_CPP_QX_SERVICE(UserManager)

namespace qx {
    template <> void register_class(QxClass<UserManager> & t)
    {
        t.setName("user_system_manager");
        qDebug() << "We registered UserManager";
    }
}


I use this classes in this form:
Code: Select all
bool UserManagerDao::authenticate(UserManagerPtr user, const QString serviceName, const QString serviceMethodName)
{
    if (! user) {
        qAssert(user);
        return false;
    }

    qx::QxSqlQuery query("WHERE user_system.username = :username AND user_system.passwd = MD5(:password)");
    query.bind(":username", user->username());
    query.bind(":password", user->password());

    qDebug() << "test test test test";

    query.dumpSqlResult();


    qx::dao::fetch_by_query(query, user);
    /*
    if (user.get().id() > 0) {
        //qAssert(userManagerList.count() == 1);
        return false;
    }
    */
    return true;
}


I got this error:
Server is running!
test test test test
[QxOrm] qx::QxSqlDatabase : create new database connection in thread '5316' with key '{5ddd1e02-b5de-4f44-b5b0-cd0c32cb4848}'
ASSERT: "false" in file d:\projects\qtaxi\qxorm\include\qxdatamember\../../inl/QxDataMember/QxDataMemberX.inl, line 69
ASSERT failure in QMutex::lock: "Internal error, infinite wait has timed out.", file thread\qmutex.cpp, line 166


Maybe i made mistake in QX_REGISTER_HPP_QX_SERVICE(UserManager, User, 0) this line? If i change this line to QX_REGISTER_HPP_QX_SERVICE(UserManager, qx::trait::no_base_class_defined, 0) error is not happened, but SQL Query looks like this:
Server is running!
test test test test
[QxOrm] qx::QxSqlDatabase : create new database connection in thread '3508' with key '{1e59ea12-155c-42f1-afba-4a519fff9189}'
We registered UserManager
[QxOrm] execute sql query failed : SELEC FROM user_system_manager WHERE user_system.username = :username AND user_system.passwd = MD5(:password)
QPSQL: Unable to create query
??????: ?????? ?????????? (????????? ?????????: "(")
LINE 1: EXECUTE ('kna', '123')
^


Can you help me to create inherited classes in QxOrm? I saw your example dll2 but can not find what is wrong.
nickla
 
Posts: 52
Joined: Wed Jul 11, 2012 4:19 pm
Location: Russia

Re: Error in SQL query using table inheritance in PostgreSQL

Postby nickla » Mon Aug 13, 2012 7:54 pm

I tried to do like in dll2:

Code: Select all
#ifndef _QX_SERVICE_BO_USER_H_
#define _QX_SERVICE_BO_USER_H_

#include "phone.h"
#include "userrole.h"
#include "userstatus.h"

class QX_SERVICE_DLL_EXPORT User
{
    QX_REGISTER_FRIEND_CLASS(User)

public:

    User() : m_Id(0) { ; }
    virtual ~User() { ; }

    long id() const             { return m_Id; }
    QString firstname() const   { return m_Firstname; }
    QString lastname() const    { return m_Lastname; }
    QString patronymic() const  { return m_Patronymic; }
    QString address() const     { return m_Address; }
    QString username() const    { return m_Username; }
    QString password() const    { return m_Password; }

    void setId(const long id) { m_Id = id; }
    void setFirstname(const QString value)  { m_Firstname = value; }
    void setLastname(const QString value)   { m_Lastname = value; }
    void setPatronymic(const QString value) { m_Patronymic = value; }
    void setAddress(const QString value)    { m_Address = value; }
    void setUsername(const QString value)   { m_Username = value; }
    void setPassword(const QString value)   { m_Password = value; }

    virtual void makeAbstractClass() = 0;

protected:
    long m_Id;
    long m_RoleId;
    long m_StatusId;
    QString m_Firstname;
    QString m_Lastname;
    QString m_Patronymic;
    QString m_Address;
    QString m_Username;
    QString m_Password;
    PhonePtr m_Phone;
    UserRolePtr m_Role;
    UserStatusPtr m_Status;
};

QX_REGISTER_ABSTRACT_CLASS(User)
QX_REGISTER_HPP_QX_SERVICE(User, qx::trait::no_base_class_defined, 0)


#endif // _QX_SERVICE_BO_USER_H_

#ifndef USERMANAGER_H
#define USERMANAGER_H


Code: Select all
#include "user.h"

class QX_SERVICE_DLL_EXPORT UserManager : public User
{
    QX_REGISTER_FRIEND_CLASS(UserManager)

public:

    UserManager() : User() { ; }
    virtual ~UserManager()  { ; }

    virtual void makeAbstractClass() { ; }
};

QX_REGISTER_HPP_QX_SERVICE(UserManager, User, 0)

typedef boost::shared_ptr<UserManager> UserManagerPtr;
typedef qx::QxCollection<long, UserManagerPtr> UserManagerList;
typedef boost::shared_ptr<UserManagerList> UserManagerListPtr;

#endif // USERMANAGER_H


But it is useless. I am realy stuck with this...
nickla
 
Posts: 52
Joined: Wed Jul 11, 2012 4:19 pm
Location: Russia

Re: Error in SQL query using table inheritance in PostgreSQL

Postby qxorm » Wed Aug 15, 2012 11:50 am

Can you help me to create inherited classes in QxOrm ? I saw your example dll2 but can not find what is wrong...
ASSERT: "false" in file d:\projects\qtaxi\qxorm\include\qxdatamember\../../inl/QxDataMember/QxDataMemberX.inl, line 69

If you open QxDataMemberX.inl file, and look at line 69, you will see this code : if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }.
That means that you are trying to add 2 properties with the same key !
Now, if you check your code, you will see those 2 lines :
Code: Select all
t.data(& User::m_Patronymic, "patronymic");
t.data(& User::m_Address, "patronymic");

So your m_Patronymic and m_Address properties use the same key : patronymic.
This is your problem ;)
qxorm
Site Admin
 
Posts: 481
Joined: Mon Apr 12, 2010 7:45 am

Re: Error in SQL query using table inheritance in PostgreSQL

Postby nickla » Wed Aug 15, 2012 12:43 pm

This is copy-paste problem :)
nickla
 
Posts: 52
Joined: Wed Jul 11, 2012 4:19 pm
Location: Russia


Return to QxOrm - Help

Who is online

Users browsing this forum: No registered users and 5 guests

cron