winix/plugins/ticket/tdb.cpp

294 lines
5.6 KiB
C++
Executable File

#include "tdb.h"
#include "core/log.h"
//#include "core/misc.h"
namespace Ticket
{
Error TDb::GetTicketByDirId(long dir_id, Ticket & ticket)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("select ticket.id, ticket.dir_id, ticket.parent_id, ticket.type, ticket.status, ticket.priority, "
"ticket.category, ticket.expected, ticket.progress, ticket.item_id "
"from core.ticket "
"where ticket.dir_id=") << dir_id << R(";");
r = AssertQuery(query);
AssertResult(r, PGRES_TUPLES_OK);
int rows = Rows(r);
if( rows > 1 )
log << log1 << "Db: there is more than one ticket with dir_id: " << dir_id << logend;
else
if( rows == 0 )
throw Error(WINIX_ERR_NO_TICKET);
TicketColumns tc;
tc.SetColumns(r);
tc.SetTicket(r, 0, ticket);
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
Error TDb::GetTickets(long parent_id, std::vector<Ticket> & ticket_tab)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("select ticket.id, ticket.dir_id, ticket.parent_id, ticket.type, ticket.status, ticket.priority, "
"ticket.category, ticket.expected, ticket.progress, ticket.item_id "
"from core.ticket "
"where ticket.parent_id = ") << parent_id << R(";");
r = AssertQuery(query);
AssertResult(r, PGRES_TUPLES_OK);
int rows = Rows(r);
Ticket ticket;
TicketColumns tc;
tc.SetColumns(r);
for(int i=0 ; i<rows ; ++i)
{
tc.SetTicket(r, i, ticket);
ticket_tab.push_back(ticket);
}
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
/*
bool TDb::IsTicket(long dir_id)
{
PGresult * r = 0;
bool is_ticket = false;
try
{
query.Clear();
query << "select ticket.id from core.ticket "
"where ticket.dir_id = '" << dir_id << "';";
r = AssertQuery(query);
AssertResult(r, PGRES_TUPLES_OK);
is_ticket = (Rows(r) == 1);
}
catch(const Error &)
{
}
ClearResult(r);
return is_ticket;
}
*/
Error TDb::AddTicket(Ticket & ticket)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("insert into core.ticket (dir_id, parent_id, type, status, priority, "
"category, expected, progress, item_id) values (")
<< ticket.dir_id
<< ticket.parent_id
<< ticket.type
<< ticket.status
<< ticket.priority
<< ticket.category
<< ticket.expected
<< ticket.progress
<< ticket.item_id
<< R(");");
r = AssertQuery(query);
AssertResult(r, PGRES_COMMAND_OK);
ticket.id = AssertCurrval("core.ticket_id_seq");
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
Error TDb::EditTicketById(Ticket & ticket)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("update core.ticket set (dir_id, parent_id, type, status, "
"priority, category, expected, progress, item_id) = (")
<< ticket.dir_id
<< ticket.parent_id
<< ticket.type
<< ticket.status
<< ticket.priority
<< ticket.category
<< ticket.expected
<< ticket.progress
<< ticket.item_id
<< R(") where id=")
<< ticket.id
<< R(";");
r = AssertQuery(query);
AssertResult(r, PGRES_COMMAND_OK);
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
Error TDb::EditTicketRemoveItem(long item_id)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("update core.ticket set item_id = -1 where item_id=") << item_id << R(";");
r = AssertQuery(query);
AssertResult(r, PGRES_COMMAND_OK);
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
Error TDb::RemoveTicket(long dir_id)
{
PGresult * r = 0;
Error status = WINIX_ERR_OK;
try
{
query.Clear();
query << R("delete from core.ticket where dir_id=") << dir_id << R(";");
r = AssertQuery(query);
AssertResult(r, PGRES_COMMAND_OK);
long rows = AffectedRows(r);
if( rows > 0 )
log << log2 << "Db: deleted " << rows << " rows from core.ticket" << logend;
}
catch(const Error & e)
{
status = e;
}
ClearResult(r);
return status;
}
void TDb::TicketColumns::SetColumns(PGresult * r)
{
// PQfnumber returns -1 if there is no such a column
id = PQfnumber(r, "id");
dir_id = PQfnumber(r, "dir_id");
parent_id = PQfnumber(r, "parent_id");
type = PQfnumber(r, "type");
status = PQfnumber(r, "status");
priority = PQfnumber(r, "priority");
category = PQfnumber(r, "category");
expected = PQfnumber(r, "expected");
progress = PQfnumber(r, "progress");
item_id = PQfnumber(r, "item_id");
}
void TDb::TicketColumns::SetTicket(PGresult * r, long row, Ticket & ticket)
{
if( id != -1 ) ticket.id = DbBase::AssertValueLong(r, row, id);
if( dir_id != -1 ) ticket.dir_id = DbBase::AssertValueLong(r, row, dir_id);
if( parent_id != -1 ) ticket.parent_id = DbBase::AssertValueLong(r, row, parent_id);
if( type != -1 ) ticket.type = DbBase::AssertValueInt(r, row, type);
if( status != -1 ) ticket.status = DbBase::AssertValueInt(r, row, status);
if( priority != -1 ) ticket.priority = DbBase::AssertValueInt(r, row, priority);
if( category != -1 ) ticket.category = DbBase::AssertValueInt(r, row, category);
if( expected != -1 ) ticket.expected = DbBase::AssertValueInt(r, row, expected);
if( progress != -1 ) ticket.progress = DbBase::AssertValueInt(r, row, progress);
if( item_id != -1 ) ticket.item_id = DbBase::AssertValueLong(r, row, item_id);
}
} // namespace