added: now plugin ticket uses a new horizontal table (plugins.ticket)
columns: dir_id, param, value we are able to build complicated tickets git-svn-id: svn://ttmath.org/publicrep/winix/trunk@664 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
@@ -17,17 +17,16 @@ namespace Ticket
|
||||
|
||||
|
||||
|
||||
Error TDb::GetTicketByDirId(long dir_id, Ticket & ticket)
|
||||
Error TDb::GetTicket(long dir_id, Ticket & ticket)
|
||||
{
|
||||
PGresult * r = 0;
|
||||
Error status = WINIX_ERR_OK;
|
||||
ticket.Clear();
|
||||
|
||||
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 "
|
||||
query << R("select dir_id, param, value from plugins.ticket "
|
||||
"where ticket.dir_id=") << dir_id << R(";");
|
||||
|
||||
r = AssertQuery(query);
|
||||
@@ -35,57 +34,20 @@ Error TDb::GetTicketByDirId(long dir_id, Ticket & ticket)
|
||||
|
||||
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;
|
||||
Ticket::TicketParam par;
|
||||
ticket.dir_id = dir_id;
|
||||
|
||||
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);
|
||||
int cparam = AssertColumn(r, "param");
|
||||
int cvalue = AssertColumn(r, "value");
|
||||
|
||||
for(int i=0 ; i<rows ; ++i)
|
||||
{
|
||||
tc.SetTicket(r, i, ticket);
|
||||
ticket_tab.push_back(ticket);
|
||||
par.param = AssertValueInt(r, i, cparam);
|
||||
par.value = AssertValueInt(r, i, cvalue);
|
||||
ticket.par_tab.push_back(par);
|
||||
}
|
||||
}
|
||||
catch(const Error & e)
|
||||
@@ -95,66 +57,92 @@ Error TDb::GetTickets(long parent_id, std::vector<Ticket> & ticket_tab)
|
||||
|
||||
ClearResult(r);
|
||||
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
bool TDb::IsTicket(long dir_id)
|
||||
|
||||
|
||||
|
||||
Error TDb::GetTickets(const std::vector<long> & dir_id_tab, std::vector<Ticket> & ticket_tab)
|
||||
{
|
||||
PGresult * r = 0;
|
||||
bool is_ticket = false;
|
||||
PGresult * r = 0;
|
||||
Error status = WINIX_ERR_OK;
|
||||
ticket_tab.clear();
|
||||
|
||||
if( dir_id_tab.empty() )
|
||||
return status;
|
||||
|
||||
try
|
||||
{
|
||||
query.Clear();
|
||||
query << "select ticket.id from core.ticket "
|
||||
"where ticket.dir_id = '" << dir_id << "';";
|
||||
CreateIdList(dir_id_tab, dir_list);
|
||||
query << R("select dir_id, param, value from plugins.ticket "
|
||||
"where ticket.dir_id in ") << R(dir_list) << R(" order by dir_id;");
|
||||
|
||||
// !! moze dodac operator <<(std::vector(long)) do query?
|
||||
|
||||
r = AssertQuery(query);
|
||||
AssertResult(r, PGRES_TUPLES_OK);
|
||||
|
||||
is_ticket = (Rows(r) == 1);
|
||||
int rows = Rows(r);
|
||||
Ticket::TicketParam par;
|
||||
|
||||
int cdir_id = AssertColumn(r, "dir_id");
|
||||
int cparam = AssertColumn(r, "param");
|
||||
int cvalue = AssertColumn(r, "value");
|
||||
long last_dir_id = -1;
|
||||
|
||||
for(int i=0 ; i<rows ; ++i)
|
||||
{
|
||||
long dir_id = AssertValueLong(r, i, cdir_id);
|
||||
|
||||
if( i==0 || last_dir_id != dir_id )
|
||||
{
|
||||
ticket_tab.push_back(Ticket());
|
||||
ticket_tab.back().dir_id = dir_id;
|
||||
last_dir_id = dir_id;
|
||||
}
|
||||
|
||||
par.param = AssertValueInt(r, i, cparam);
|
||||
par.value = AssertValueInt(r, i, cvalue);
|
||||
ticket_tab.back().par_tab.push_back(par);
|
||||
}
|
||||
}
|
||||
catch(const Error &)
|
||||
catch(const Error & e)
|
||||
{
|
||||
status = e;
|
||||
}
|
||||
|
||||
ClearResult(r);
|
||||
dir_list.clear();
|
||||
|
||||
return is_ticket;
|
||||
return status;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
Error TDb::AddTicket(Ticket & ticket)
|
||||
|
||||
Error TDb::AddTicket(const 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");
|
||||
for(size_t i=0 ; i<ticket.par_tab.size() ; ++i)
|
||||
{
|
||||
query.Clear();
|
||||
query << R("insert into plugins.ticket (dir_id, param, value) values (")
|
||||
<< ticket.dir_id
|
||||
<< ticket.par_tab[i].param
|
||||
<< ticket.par_tab[i].value
|
||||
<< R(");");
|
||||
|
||||
r = AssertQuery(query);
|
||||
AssertResult(r, PGRES_COMMAND_OK);
|
||||
}
|
||||
}
|
||||
catch(const Error & e)
|
||||
{
|
||||
@@ -169,67 +157,28 @@ return status;
|
||||
|
||||
|
||||
|
||||
Error TDb::EditTicketById(Ticket & ticket)
|
||||
Error TDb::RemoveAddTicket(const Ticket & ticket)
|
||||
{
|
||||
PGresult * r = 0;
|
||||
Error status = WINIX_ERR_OK;
|
||||
Error status = BeginTrans();
|
||||
|
||||
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(";");
|
||||
if( status != WINIX_ERR_OK )
|
||||
return status;
|
||||
|
||||
r = AssertQuery(query);
|
||||
AssertResult(r, PGRES_COMMAND_OK);
|
||||
}
|
||||
catch(const Error & e)
|
||||
{
|
||||
status = e;
|
||||
}
|
||||
|
||||
ClearResult(r);
|
||||
status = RemoveTicket(ticket.dir_id);
|
||||
|
||||
if( status == WINIX_ERR_OK )
|
||||
status = AddTicket(ticket);
|
||||
|
||||
if( status == WINIX_ERR_OK )
|
||||
status = CommitTrans();
|
||||
else
|
||||
RollbackTrans();
|
||||
|
||||
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)
|
||||
@@ -240,7 +189,7 @@ Error TDb::RemoveTicket(long dir_id)
|
||||
try
|
||||
{
|
||||
query.Clear();
|
||||
query << R("delete from core.ticket where dir_id=") << dir_id << R(";");
|
||||
query << R("delete from plugins.ticket where dir_id=") << dir_id << R(";");
|
||||
|
||||
r = AssertQuery(query);
|
||||
AssertResult(r, PGRES_COMMAND_OK);
|
||||
@@ -248,7 +197,7 @@ Error TDb::RemoveTicket(long dir_id)
|
||||
long rows = AffectedRows(r);
|
||||
|
||||
if( rows > 0 )
|
||||
log << log2 << "Db: deleted " << rows << " rows from core.ticket" << logend;
|
||||
log << log2 << "Db: deleted " << rows << " rows from plugins.ticket" << logend;
|
||||
|
||||
}
|
||||
catch(const Error & e)
|
||||
@@ -265,36 +214,5 @@ 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
|
||||
|
||||
|
Reference in New Issue
Block a user