294 lines
5.6 KiB
C++
Executable File
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
|
|
|