|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.179 2006/01/25 20:44:32 tgl Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.180 2006/03/03 20:57:32 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
15 | 15 | #include"postgres_fe.h" |
16 | 16 |
|
17 | | -#include<errno.h> |
18 | 17 | #include<ctype.h> |
19 | 18 | #include<fcntl.h> |
20 | 19 |
|
@@ -2168,49 +2167,57 @@ PQoidValue(const PGresult *res) |
2168 | 2167 |
|
2169 | 2168 | /* |
2170 | 2169 | * PQcmdTuples - |
2171 | | - *If the last command wasanINSERT/UPDATE/DELETE/MOVE/FETCH, return a |
2172 | | - *string containing the number of inserted/affected tuples. If not, |
| 2170 | + *If the last command was INSERT/UPDATE/DELETE/MOVE/FETCH/COPY, return |
| 2171 | + *astring containing the number of inserted/affected tuples. If not, |
2173 | 2172 | *return "". |
2174 | 2173 | * |
2175 | 2174 | *XXX: this should probably return an int |
2176 | 2175 | */ |
2177 | 2176 | char* |
2178 | 2177 | PQcmdTuples(PGresult*res) |
2179 | 2178 | { |
2180 | | -char*p; |
| 2179 | +char*p,*c; |
2181 | 2180 |
|
2182 | 2181 | if (!res) |
2183 | 2182 | return""; |
2184 | 2183 |
|
2185 | 2184 | if (strncmp(res->cmdStatus,"INSERT ",7)==0) |
2186 | 2185 | { |
2187 | | -p=res->cmdStatus+6; |
2188 | | -p++; |
2189 | | -/* INSERT: skip oid */ |
2190 | | -while (*p!=' '&&*p) |
| 2186 | +p=res->cmdStatus+7; |
| 2187 | +/* INSERT: skip oid and space */ |
| 2188 | +while (*p&&*p!=' ') |
2191 | 2189 | p++; |
| 2190 | +if (*p==0) |
| 2191 | +gotointerpret_error;/* no space? */ |
| 2192 | +p++; |
2192 | 2193 | } |
2193 | 2194 | elseif (strncmp(res->cmdStatus,"DELETE ",7)==0|| |
2194 | 2195 | strncmp(res->cmdStatus,"UPDATE ",7)==0) |
2195 | | -p=res->cmdStatus+6; |
| 2196 | +p=res->cmdStatus+7; |
2196 | 2197 | elseif (strncmp(res->cmdStatus,"FETCH ",6)==0) |
| 2198 | +p=res->cmdStatus+6; |
| 2199 | +elseif (strncmp(res->cmdStatus,"MOVE ",5)==0|| |
| 2200 | +strncmp(res->cmdStatus,"COPY ",5)==0) |
2197 | 2201 | p=res->cmdStatus+5; |
2198 | | -elseif (strncmp(res->cmdStatus,"MOVE ",5)==0) |
2199 | | -p=res->cmdStatus+4; |
2200 | 2202 | else |
2201 | 2203 | return""; |
2202 | 2204 |
|
2203 | | -p++; |
2204 | | - |
2205 | | -if (*p==0) |
| 2205 | +/* check that we have an integer (at least one digit, nothing else) */ |
| 2206 | +for (c=p;*c;c++) |
2206 | 2207 | { |
2207 | | -pqInternalNotice(&res->noticeHooks, |
2208 | | -"could not interpret result from server: %s", |
2209 | | -res->cmdStatus); |
2210 | | -return""; |
| 2208 | +if (!isdigit((unsignedchar)*c)) |
| 2209 | +gotointerpret_error; |
2211 | 2210 | } |
| 2211 | +if (c==p) |
| 2212 | +gotointerpret_error; |
2212 | 2213 |
|
2213 | 2214 | returnp; |
| 2215 | + |
| 2216 | +interpret_error: |
| 2217 | +pqInternalNotice(&res->noticeHooks, |
| 2218 | +"could not interpret result from server: %s", |
| 2219 | +res->cmdStatus); |
| 2220 | +return""; |
2214 | 2221 | } |
2215 | 2222 |
|
2216 | 2223 | /* |
|