void ResultSet::operator = (ResultSet &res) { /* Mark the result parameter as copied, avoiding the sql_result attribute to be deallocated */ res.is_res_copied=true; /* If the resultset 'this' is allocated, it will be deallocated to avoid memory leaks */ destroyResultSet(); //Copy the parameter restulset attributes to 'this' resultset this->current_tuple=res.current_tuple; this->empty_result=res.empty_result; this->sql_result=PQcopyResult(res.sql_result, PG_COPYRES_TUPLES | PG_COPYRES_ATTRS | PG_COPYRES_EVENTS); this->is_res_copied=false; }
PGresult * pqt_copyresult(PGtypeArgs *args, int nattrs) { int i; PGresult *res; int tableid, columnid, format; PGresAttDesc *ad = (PGresAttDesc *) malloc(nattrs * sizeof(PGresAttDesc)); if (!ad) { PQseterror(args->err, PQT_OUTOFMEMORY); return NULL; } tableid = PQftable(args->get.result, args->get.field_num); columnid = PQftablecol(args->get.result, args->get.field_num); format = PQfformat(args->get.result, args->get.field_num); for (i=0; i < nattrs; i++) { ad[i].tableid = tableid; ad[i].columnid = columnid; ad[i].format = format; /* simple array */ if (args->typhandler->nattrs == 0) { ad[i].typid = args->typhandler->typoid; ad[i].typlen = args->typhandler->typlen; ad[i].name = NULL; ad[i].atttypmod = -1; } /* composite/record */ else { ad[i].typid = args->typhandler->attDescs[i].attoid; ad[i].typlen = args->typhandler->attDescs[i].attlen; ad[i].name = args->typhandler->attDescs[i].attname; ad[i].atttypmod = args->typhandler->attDescs[i].atttypmod; } } res = PQcopyResult(args->get.result, PG_COPYRES_EVENTS | PG_COPYRES_NOTICEHOOKS); if (!res) { free(ad); PQseterror(args->err, PQT_OUTOFMEMORY); return NULL; } if (!PQsetResultAttrs(res, nattrs, ad)) { PQclear(res); PQseterror(args->err, PQT_OUTOFMEMORY); res = NULL; } free(ad); return res; }