|
|
| version 1.4, 2001/07/31 12:44:36 | version 1.5, 2001/07/31 12:51:45 |
|---|---|
| Line 151 public: | Line 151 public: |
| SQL_Driver_query_event_handlers& handlers) { | SQL_Driver_query_event_handlers& handlers) { |
| PGconn *conn=(PGconn *)connection; | PGconn *conn=(PGconn *)connection; |
| #define PQclear_throwPQerror { \ | |
| PQclear(res); \ | |
| services._throw(PQerrorMessage(conn)); \ | |
| } | |
| #define PQclear_throw(msg) { \ | |
| PQclear(res); \ | |
| services._throw(msg); \ | |
| } | |
| const char *statement; | const char *statement; |
| if(offset || limit) { | if(offset || limit) { |
| Line 173 public: | Line 182 public: |
| switch(PQresultStatus(res)) { | switch(PQresultStatus(res)) { |
| case PGRES_EMPTY_QUERY: | case PGRES_EMPTY_QUERY: |
| PQclear(res); | PQclear_throw("no query"); |
| services._throw("no query"); | |
| break; | break; |
| case PGRES_COMMAND_OK: | case PGRES_COMMAND_OK: |
| // empty result: insert|delete|update|... | // empty result: insert|delete|update|... |
| Line 182 public: | Line 190 public: |
| case PGRES_TUPLES_OK: | case PGRES_TUPLES_OK: |
| break; | break; |
| default: | default: |
| PQclear(res); | PQclear_throw("unknown PQexec error"); |
| services._throw("unknown PQexec error"); | |
| break; | break; |
| } | } |
| int column_count=PQnfields(res); | int column_count=PQnfields(res); |
| if(!column_count) { | if(!column_count) |
| PQclear(res); | PQclear_throw("result contains no columns"); |
| services._throw("result contains no columns"); | |
| } | |
| for(int i=0; i<column_count; i++){ | for(int i=0; i<column_count; i++){ |
| char *name=PQfname(res, i); | char *name=PQfname(res, i); |
| Line 214 public: | Line 219 public: |
| // ObjectID column, read object bytes | // ObjectID column, read object bytes |
| // _asm int 3; | // _asm int 3; |
| #define PQclear_n_throw { \ | |
| PQclear(res); \ | |
| services._throw(PQerrorMessage(conn)); \ | |
| } | |
| char *error_pos=0; | char *error_pos=0; |
| Oid oid=cell?atoi(cell):0; | Oid oid=cell?atoi(cell):0; |
| int fd=lo_open(conn, oid, INV_READ); | int fd=lo_open(conn, oid, INV_READ); |
| if(fd>=0) { | if(fd>=0) { |
| // seek to end | // seek to end |
| if(lo_lseek(conn, fd, 0, SEEK_END)<0) | if(lo_lseek(conn, fd, 0, SEEK_END)<0) |
| PQclear_n_throw; | PQclear_throwPQerror; |
| // get size | // get size |
| int size_tell=lo_tell(conn, fd); | int size_tell=lo_tell(conn, fd); |
| if(size_tell<0) | if(size_tell<0) |
| PQclear_n_throw; | PQclear_throwPQerror; |
| // seek to begin | // seek to begin |
| if(lo_lseek(conn, fd, 0, SEEK_SET)<0) | if(lo_lseek(conn, fd, 0, SEEK_SET)<0) |
| PQclear_n_throw; | PQclear_throwPQerror; |
| size=(size_t)size_tell; | size=(size_t)size_tell; |
| if(size) { | if(size) { |
| // read | // read |
| Line 244 public: | Line 244 public: |
| buf+=size_read; | buf+=size_read; |
| countdown-=size_read; | countdown-=size_read; |
| } | } |
| if(countdown) { | if(countdown) |
| PQclear(res); | PQclear_throw("lo_read can not read all bytes of object"); |
| services._throw("lo_read can not read all of object bytes"); | |
| } | |
| } else | } else |
| ptr=0; | ptr=0; |
| if(lo_close(conn, fd)<0) | if(lo_close(conn, fd)<0) |
| PQclear_n_throw; | PQclear_throwPQerror; |
| } else | } else |
| PQclear_n_throw; | PQclear_throwPQerror; |
| } else { | } else { |
| // normal column, read it as ASCII string | // normal column, read it as ASCII string |
| size=(size_t)PQgetlength(res, r, i); | size=(size_t)PQgetlength(res, r, i); |