Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 135ecf8

Browse files
author
Michael Meskes
committed
Re-added forgotten cache.
1 parent 7da19ca commit 135ecf8

File tree

1 file changed

+78
-106
lines changed

1 file changed

+78
-106
lines changed

src/interfaces/ecpg/ecpglib/execute.c

+78-106
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.27 2003/11/08 19:46:27 meskes Exp $ */
1+
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.28 2003/11/10 20:28:30 meskes Exp $ */
22

33
/*
44
* The aim is to get a simpler inteface to the database routines.
@@ -230,12 +230,25 @@ next_insert(char *text)
230230
return (*ptr == '\0') ? NULL : ptr;
231231
}
232232

233+
static void
234+
ECPGtypeinfocache_push(struct ECPGtype_information_cache ** cache, int oid, bool isarray, int lineno)
235+
{
236+
struct ECPGtype_information_cache *new_entry
237+
= (struct ECPGtype_information_cache *) ECPGalloc(sizeof(struct ECPGtype_information_cache), lineno);
238+
239+
new_entry->oid = oid;
240+
new_entry->isarray = isarray;
241+
new_entry->next = *cache;
242+
*cache = new_entry;
243+
}
244+
233245
static enum ARRAY_TYPE
234246
ECPGis_type_an_array(int type, const struct statement * stmt, const struct variable * var)
235247
{
236248
char *array_query;
237249
enum ARRAY_TYPE isarray = ECPG_ARRAY_NOT_SET;
238250
PGresult *query;
251+
struct ECPGtype_information_cache *cache_entry;
239252

240253
if ((stmt->connection->cache_head) == NULL)
241254
{
@@ -245,117 +258,76 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
245258
* these values.
246259
*/
247260
#define not_an_array_in_ecpg ECPG_ARRAY_NONE
248-
249-
switch (type)
250-
{
251-
case BOOLOID: isarray = ECPG_ARRAY_NONE;
252-
break;
253-
case BYTEAOID: isarray = ECPG_ARRAY_NONE;
254-
break;
255-
case CHAROID: isarray = ECPG_ARRAY_NONE;
256-
break;
257-
case NAMEOID: isarray = not_an_array_in_ecpg;
258-
break;
259-
case INT8OID: isarray = ECPG_ARRAY_NONE;
260-
break;
261-
case INT2OID: isarray = ECPG_ARRAY_NONE;
262-
break;
263-
case INT2VECTOROID: isarray = ECPG_ARRAY_VECTOR;
264-
break;
265-
case INT4OID: isarray = ECPG_ARRAY_NONE;
266-
break;
267-
case REGPROCOID: isarray = ECPG_ARRAY_NONE;
268-
break;
269-
case TEXTOID: isarray = ECPG_ARRAY_NONE;
270-
break;
271-
case OIDOID: isarray = ECPG_ARRAY_NONE;
272-
break;
273-
case TIDOID: isarray = ECPG_ARRAY_NONE;
274-
break;
275-
case XIDOID: isarray = ECPG_ARRAY_NONE;
276-
break;
277-
case CIDOID: isarray = ECPG_ARRAY_NONE;
278-
break;
279-
case OIDVECTOROID: isarray = ECPG_ARRAY_VECTOR;
280-
break;
281-
case POINTOID: isarray = ECPG_ARRAY_VECTOR;
282-
break;
283-
case LSEGOID: isarray = ECPG_ARRAY_VECTOR;
284-
break;
285-
case PATHOID: isarray = ECPG_ARRAY_NONE;
286-
break;
287-
case BOXOID: isarray = ECPG_ARRAY_VECTOR;
288-
break;
289-
case POLYGONOID: isarray = ECPG_ARRAY_NONE;
290-
break;
291-
case LINEOID: isarray = ECPG_ARRAY_VECTOR;
292-
break;
293-
case FLOAT4OID: isarray = ECPG_ARRAY_NONE;
294-
break;
295-
case FLOAT8OID: isarray = ECPG_ARRAY_NONE;
296-
break;
297-
case ABSTIMEOID: isarray = ECPG_ARRAY_NONE;
298-
break;
299-
case RELTIMEOID: isarray = ECPG_ARRAY_NONE;
300-
break;
301-
case TINTERVALOID: isarray = ECPG_ARRAY_NONE;
302-
break;
303-
case UNKNOWNOID: isarray = ECPG_ARRAY_NONE;
304-
break;
305-
case CIRCLEOID: isarray = ECPG_ARRAY_NONE;
306-
break;
307-
case CASHOID: isarray = ECPG_ARRAY_NONE;
308-
break;
309-
case INETOID: isarray = ECPG_ARRAY_NONE;
310-
break;
311-
case CIDROID: isarray = ECPG_ARRAY_NONE;
312-
break;
313-
case BPCHAROID: isarray = ECPG_ARRAY_NONE;
314-
break;
315-
case VARCHAROID: isarray = ECPG_ARRAY_NONE;
316-
break;
317-
case DATEOID: isarray = ECPG_ARRAY_NONE;
318-
break;
319-
case TIMEOID: isarray = ECPG_ARRAY_NONE;
320-
break;
321-
case TIMESTAMPOID: isarray = ECPG_ARRAY_NONE;
322-
break;
323-
case TIMESTAMPTZOID: isarray = ECPG_ARRAY_NONE;
324-
break;
325-
case INTERVALOID: isarray = ECPG_ARRAY_NONE;
326-
break;
327-
case TIMETZOID: isarray = ECPG_ARRAY_NONE;
328-
break;
329-
case ZPBITOID: isarray = ECPG_ARRAY_NONE;
330-
break;
331-
case VARBITOID: isarray = ECPG_ARRAY_NONE;
332-
break;
333-
case NUMERICOID: isarray = ECPG_ARRAY_NONE;
334-
break;
335-
default: break;
336-
}
261+
262+
/* populate cache with well known types to speed things up */
263+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOOLOID, ECPG_ARRAY_NONE, stmt->lineno);
264+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), BYTEAOID, ECPG_ARRAY_NONE, stmt->lineno);
265+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), CHAROID, ECPG_ARRAY_NONE, stmt->lineno);
266+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), NAMEOID, not_an_array_in_ecpg, stmt->lineno);
267+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT8OID, ECPG_ARRAY_NONE, stmt->lineno);
268+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2OID, ECPG_ARRAY_NONE, stmt->lineno);
269+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2VECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno);
270+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT4OID, ECPG_ARRAY_NONE, stmt->lineno);
271+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), REGPROCOID, ECPG_ARRAY_NONE, stmt->lineno);
272+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TEXTOID, ECPG_ARRAY_NONE, stmt->lineno);
273+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDOID, ECPG_ARRAY_NONE, stmt->lineno);
274+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIDOID, ECPG_ARRAY_NONE, stmt->lineno);
275+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), XIDOID, ECPG_ARRAY_NONE, stmt->lineno);
276+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDOID, ECPG_ARRAY_NONE, stmt->lineno);
277+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDVECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno);
278+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), POINTOID, ECPG_ARRAY_VECTOR, stmt->lineno);
279+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), LSEGOID, ECPG_ARRAY_VECTOR, stmt->lineno);
280+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), PATHOID, ECPG_ARRAY_NONE, stmt->lineno);
281+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOXOID, ECPG_ARRAY_VECTOR, stmt->lineno);
282+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), POLYGONOID, ECPG_ARRAY_NONE, stmt->lineno);
283+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), LINEOID, ECPG_ARRAY_VECTOR, stmt->lineno);
284+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT4OID, ECPG_ARRAY_NONE, stmt->lineno);
285+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT8OID, ECPG_ARRAY_NONE, stmt->lineno);
286+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), ABSTIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
287+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), RELTIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
288+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TINTERVALOID, ECPG_ARRAY_NONE, stmt->lineno);
289+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), UNKNOWNOID, ECPG_ARRAY_NONE, stmt->lineno);
290+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIRCLEOID, ECPG_ARRAY_NONE, stmt->lineno);
291+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), CASHOID, ECPG_ARRAY_NONE, stmt->lineno);
292+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INETOID, ECPG_ARRAY_NONE, stmt->lineno);
293+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDROID, ECPG_ARRAY_NONE, stmt->lineno);
294+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), BPCHAROID, ECPG_ARRAY_NONE, stmt->lineno);
295+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARCHAROID, ECPG_ARRAY_NONE, stmt->lineno);
296+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), DATEOID, ECPG_ARRAY_NONE, stmt->lineno);
297+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
298+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPOID, ECPG_ARRAY_NONE, stmt->lineno);
299+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPTZOID, ECPG_ARRAY_NONE, stmt->lineno);
300+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), INTERVALOID, ECPG_ARRAY_NONE, stmt->lineno);
301+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMETZOID, ECPG_ARRAY_NONE, stmt->lineno);
302+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), ZPBITOID, ECPG_ARRAY_NONE, stmt->lineno);
303+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARBITOID, ECPG_ARRAY_NONE, stmt->lineno);
304+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), NUMERICOID, ECPG_ARRAY_NONE, stmt->lineno);
337305
}
338306

339-
if (isarray == ECPG_ARRAY_NOT_SET)
307+
for (cache_entry = (stmt->connection->cache_head); cache_entry != NULL; cache_entry = cache_entry->next)
308+
{
309+
if (cache_entry->oid == type)
310+
return cache_entry->isarray;
311+
}
312+
313+
array_query = (char *) ECPGalloc(strlen("select typlen from pg_type where oid= and typelem<>0") + 11, stmt->lineno);
314+
sprintf(array_query, "select typlen from pg_type where oid=%d and typelem<>0", type);
315+
query = PQexec(stmt->connection->connection, array_query);
316+
ECPGfree(array_query);
317+
if (PQresultStatus(query) == PGRES_TUPLES_OK)
340318
{
341-
array_query = (char *) ECPGalloc(strlen("select typlen from pg_type where oid= and typelem<>0") + 11, stmt->lineno);
342-
sprintf(array_query, "select typlen from pg_type where oid=%d and typelem<>0", type);
343-
query = PQexec(stmt->connection->connection, array_query);
344-
ECPGfree(array_query);
345-
if (PQresultStatus(query) == PGRES_TUPLES_OK)
319+
isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
320+
if (ECPGDynamicType(type) == SQL3_CHARACTER ||
321+
ECPGDynamicType(type) == SQL3_CHARACTER_VARYING)
346322
{
347-
isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
348-
if (ECPGDynamicType(type) == SQL3_CHARACTER ||
349-
ECPGDynamicType(type) == SQL3_CHARACTER_VARYING)
350-
{
351-
/*
352-
* arrays of character strings are not yet implemented
353-
*/
354-
isarray = ECPG_ARRAY_NONE;
355-
}
323+
/*
324+
* arrays of character strings are not yet implemented
325+
*/
326+
isarray = ECPG_ARRAY_NONE;
356327
}
357-
PQclear(query);
358328
}
329+
PQclear(query);
330+
ECPGtypeinfocache_push(&(stmt->connection->cache_head), type, isarray, stmt->lineno);
359331
ECPGlog("ECPGexecute line %d: TYPE database: %d C: %d array: %d\n", stmt->lineno, type, var->type, isarray);
360332
return isarray;
361333
}

0 commit comments

Comments
 (0)