Forgot some files...
This commit is contained in:
parent
a4f25b6a9c
commit
bb3730893b
3
src/interfaces/ecpg/include/pgtypes_error.h
Normal file
3
src/interfaces/ecpg/include/pgtypes_error.h
Normal file
@ -0,0 +1,3 @@
|
||||
#define PGTYPES_OVERFLOW 201
|
||||
#define PGTYPES_BAD_NUMERIC 202
|
||||
#define PGTYPES_DIVIDE_ZERO 203
|
48
src/interfaces/ecpg/include/pgtypes_numeric.h
Normal file
48
src/interfaces/ecpg/include/pgtypes_numeric.h
Normal file
@ -0,0 +1,48 @@
|
||||
#ifndef PGTYPES_NUMERIC
|
||||
#define PGTYPES_NUMERIC
|
||||
|
||||
typedef unsigned char NumericDigit;
|
||||
typedef struct NumericVar
|
||||
{
|
||||
int ndigits; /* number of digits in digits[] - can be 0! */
|
||||
int weight; /* weight of first digit */
|
||||
int rscale; /* result scale */
|
||||
int dscale; /* display scale */
|
||||
int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
|
||||
NumericDigit *buf; /* start of alloc'd space for digits[] */
|
||||
NumericDigit *digits; /* decimal digits */
|
||||
} NumericVar;
|
||||
|
||||
NumericVar *PGTYPESnew(void);
|
||||
void PGTYPESnumeric_free(NumericVar *);
|
||||
NumericVar *PGTYPESnumeric_aton(char *, char **);
|
||||
char *PGTYPESnumeric_ntoa(NumericVar *);
|
||||
int PGTYPESnumeric_add(NumericVar *, NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_sub(NumericVar *, NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_mul(NumericVar *, NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_div(NumericVar *, NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_cmp(NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_iton(signed int, NumericVar *);
|
||||
int PGTYPESnumeric_lton(signed long int, NumericVar *);
|
||||
int PGTYPESnumeric_copy(NumericVar *, NumericVar *);
|
||||
int PGTYPESnumeric_dton(double, NumericVar *);
|
||||
int PGTYPESnumeric_ntod(NumericVar *, double *);
|
||||
int PGTYPESnumeric_ntoi(NumericVar *, int *);
|
||||
int PGTYPESnumeric_ntol(NumericVar *, long *);
|
||||
|
||||
int decadd(NumericVar *, NumericVar *, NumericVar *);
|
||||
int deccmp(NumericVar *, NumericVar *);
|
||||
void deccopy(NumericVar *, NumericVar *);
|
||||
int deccvasc(char *, int, NumericVar *);
|
||||
int deccvdbl(double, NumericVar *);
|
||||
int deccvint(int, NumericVar *);
|
||||
int deccvlong(long, NumericVar *);
|
||||
int decdiv(NumericVar *, NumericVar *, NumericVar *);
|
||||
int decmul(NumericVar *, NumericVar *, NumericVar *);
|
||||
int decsub(NumericVar *, NumericVar *, NumericVar *);
|
||||
int dectoasc(NumericVar *, char *, int, int);
|
||||
int dectodbl(NumericVar *, double *);
|
||||
int dectoint(NumericVar *, int *);
|
||||
int dectolong(NumericVar *, long *);
|
||||
|
||||
#endif /* PGTYPES_NUMERIC */
|
@ -1,47 +0,0 @@
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Makefile for ecpg library
|
||||
#
|
||||
# Copyright (c) 1994, Regents of the University of California
|
||||
#
|
||||
# $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile,v 1.19 2003/02/13 13:11:52 meskes Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
subdir = src/interfaces/ecpg/lib
|
||||
top_builddir = ../../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
|
||||
NAME= ecpg
|
||||
SO_MAJOR_VERSION= 3
|
||||
SO_MINOR_VERSION= 4.2
|
||||
|
||||
override CPPFLAGS := -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(libpq_srcdir) $(CPPFLAGS)
|
||||
|
||||
|
||||
OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
|
||||
connect.o misc.o
|
||||
|
||||
SHLIB_LINK= $(libpq)
|
||||
|
||||
all: all-lib
|
||||
|
||||
# Shared library stuff
|
||||
include $(top_srcdir)/src/Makefile.shlib
|
||||
|
||||
install: all installdirs install-lib
|
||||
|
||||
installdirs:
|
||||
$(mkinstalldirs) $(DESTDIR)$(libdir)
|
||||
|
||||
uninstall: uninstall-lib
|
||||
|
||||
clean distclean maintainer-clean: clean-lib
|
||||
rm -f $(OBJS)
|
||||
|
||||
depend dep:
|
||||
$(CC) -MM $(CFLAGS) *.c >depend
|
||||
|
||||
ifeq (depend,$(wildcard depend))
|
||||
include depend
|
||||
endif
|
@ -1,495 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.20 2003/02/13 13:11:52 meskes Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
|
||||
static struct connection *all_connections = NULL,
|
||||
*actual_connection = NULL;
|
||||
|
||||
struct connection *
|
||||
ECPGget_connection(const char *connection_name)
|
||||
{
|
||||
struct connection *con = all_connections;
|
||||
|
||||
if (connection_name == NULL || strcmp(connection_name, "CURRENT") == 0)
|
||||
return actual_connection;
|
||||
|
||||
for (; con && strcmp(connection_name, con->name) != 0; con = con->next);
|
||||
if (con)
|
||||
return con;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
ecpg_finish(struct connection * act)
|
||||
{
|
||||
if (act != NULL)
|
||||
{
|
||||
struct ECPGtype_information_cache *cache,
|
||||
*ptr;
|
||||
|
||||
ECPGlog("ecpg_finish: finishing %s.\n", act->name);
|
||||
PQfinish(act->connection);
|
||||
|
||||
/* remove act from the list */
|
||||
if (act == all_connections)
|
||||
all_connections = act->next;
|
||||
else
|
||||
{
|
||||
struct connection *con;
|
||||
|
||||
for (con = all_connections; con->next && con->next != act; con = con->next);
|
||||
if (con->next)
|
||||
con->next = act->next;
|
||||
}
|
||||
|
||||
if (actual_connection == act)
|
||||
actual_connection = all_connections;
|
||||
|
||||
for (cache = act->cache_head; cache; ptr = cache, cache = cache->next, ECPGfree(ptr));
|
||||
ECPGfree(act->name);
|
||||
ECPGfree(act);
|
||||
}
|
||||
else
|
||||
ECPGlog("ecpg_finish: called an extra time.\n");
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGsetcommit(int lineno, const char *mode, const char *connection_name)
|
||||
{
|
||||
struct connection *con = ECPGget_connection(connection_name);
|
||||
PGresult *results;
|
||||
|
||||
if (!ECPGinit(con, connection_name, lineno))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGsetcommit line %d action = %s connection = %s\n", lineno, mode, con->name);
|
||||
|
||||
if (con->autocommit == true && strncmp(mode, "off", strlen("off")) == 0)
|
||||
{
|
||||
if (con->committed)
|
||||
{
|
||||
if ((results = PQexec(con->connection, "begin transaction")) == NULL)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_TRANS, NULL);
|
||||
return false;
|
||||
}
|
||||
PQclear(results);
|
||||
con->committed = false;
|
||||
}
|
||||
con->autocommit = false;
|
||||
}
|
||||
else if (con->autocommit == false && strncmp(mode, "on", strlen("on")) == 0)
|
||||
{
|
||||
if (!con->committed)
|
||||
{
|
||||
if ((results = PQexec(con->connection, "commit")) == NULL)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_TRANS, NULL);
|
||||
return false;
|
||||
}
|
||||
PQclear(results);
|
||||
con->committed = true;
|
||||
}
|
||||
con->autocommit = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGsetconn(int lineno, const char *connection_name)
|
||||
{
|
||||
struct connection *con = ECPGget_connection(connection_name);
|
||||
|
||||
if (!ECPGinit(con, connection_name, lineno))
|
||||
return (false);
|
||||
|
||||
actual_connection = con;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
ECPGnoticeProcessor_raise(int code, const char *message)
|
||||
{
|
||||
sqlca.sqlcode = code;
|
||||
strncpy(sqlca.sqlerrm.sqlerrmc, message, sizeof(sqlca.sqlerrm.sqlerrmc));
|
||||
sqlca.sqlerrm.sqlerrmc[sizeof(sqlca.sqlerrm.sqlerrmc) - 1] = 0;
|
||||
sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
/* remove trailing newline */
|
||||
if (sqlca.sqlerrm.sqlerrml
|
||||
&& sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml - 1] == '\n')
|
||||
{
|
||||
sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml - 1] = 0;
|
||||
sqlca.sqlerrm.sqlerrml--;
|
||||
}
|
||||
|
||||
ECPGlog("raising sqlcode %d\n", code);
|
||||
}
|
||||
|
||||
/*
|
||||
* I know this is a mess, but we can't redesign the backend
|
||||
*/
|
||||
|
||||
static void
|
||||
ECPGnoticeProcessor(void *arg, const char *message)
|
||||
{
|
||||
/* these notices raise an error */
|
||||
if (strncmp(message, "WARNING: ", 9))
|
||||
{
|
||||
ECPGlog("ECPGnoticeProcessor: strange warning '%s'\n", message);
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_UNRECOGNIZED, message);
|
||||
return;
|
||||
}
|
||||
|
||||
message += 8;
|
||||
while (*message == ' ')
|
||||
message++;
|
||||
ECPGlog("WARNING: %s", message);
|
||||
|
||||
/* WARNING: (transaction aborted): queries ignored until END */
|
||||
|
||||
/*
|
||||
* WARNING: current transaction is aborted, queries ignored until end
|
||||
* of transaction block
|
||||
*/
|
||||
if (strstr(message, "queries ignored") && strstr(message, "transaction")
|
||||
&& strstr(message, "aborted"))
|
||||
{
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_QUERY_IGNORED, message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* WARNING: PerformPortalClose: portal "*" not found */
|
||||
if ((!strncmp(message, "PerformPortalClose: portal", 26)
|
||||
|| !strncmp(message, "PerformPortalFetch: portal", 26))
|
||||
&& strstr(message + 26, "not found"))
|
||||
{
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_UNKNOWN_PORTAL, message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* WARNING: BEGIN: already a transaction in progress */
|
||||
if (!strncmp(message, "BEGIN: already a transaction in progress", 40))
|
||||
{
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_IN_TRANSACTION, message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* WARNING: AbortTransaction and not in in-progress state */
|
||||
/* WARNING: COMMIT: no transaction in progress */
|
||||
/* WARNING: ROLLBACK: no transaction in progress */
|
||||
if (!strncmp(message, "AbortTransaction and not in in-progress state", 45)
|
||||
|| !strncmp(message, "COMMIT: no transaction in progress", 34)
|
||||
|| !strncmp(message, "ROLLBACK: no transaction in progress", 36))
|
||||
{
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_NO_TRANSACTION, message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* WARNING: BlankPortalAssignName: portal * already exists */
|
||||
if (!strncmp(message, "BlankPortalAssignName: portal", 29)
|
||||
&& strstr(message + 29, "already exists"))
|
||||
{
|
||||
ECPGnoticeProcessor_raise(ECPG_WARNING_PORTAL_EXISTS, message);
|
||||
return;
|
||||
}
|
||||
|
||||
/* these are harmless - do nothing */
|
||||
|
||||
/*
|
||||
* WARNING: CREATE TABLE / PRIMARY KEY will create implicit index '*'
|
||||
* for table '*'
|
||||
*/
|
||||
|
||||
/*
|
||||
* WARNING: ALTER TABLE ... ADD CONSTRAINT will create implicit
|
||||
* trigger(s) for FOREIGN KEY check(s)
|
||||
*/
|
||||
|
||||
/*
|
||||
* WARNING: CREATE TABLE will create implicit sequence '*' for SERIAL
|
||||
* column '*.*'
|
||||
*/
|
||||
|
||||
/*
|
||||
* WARNING: CREATE TABLE will create implicit trigger(s) for FOREIGN
|
||||
* KEY check(s)
|
||||
*/
|
||||
if ((!strncmp(message, "CREATE TABLE", 12) || !strncmp(message, "ALTER TABLE", 11))
|
||||
&& strstr(message + 11, "will create implicit"))
|
||||
return;
|
||||
|
||||
/* WARNING: QUERY PLAN: */
|
||||
if (!strncmp(message, "QUERY PLAN:", 11)) /* do we really see these? */
|
||||
return;
|
||||
|
||||
/*
|
||||
* WARNING: DROP TABLE implicitly drops referential integrity trigger
|
||||
* from table "*"
|
||||
*/
|
||||
if (!strncmp(message, "DROP TABLE implicitly drops", 27))
|
||||
return;
|
||||
|
||||
/*
|
||||
* WARNING: Caution: DROP INDEX cannot be rolled back, so don't abort
|
||||
* now
|
||||
*/
|
||||
if (strstr(message, "cannot be rolled back"))
|
||||
return;
|
||||
|
||||
/* these and other unmentioned should set sqlca.sqlwarn[2] */
|
||||
/* WARNING: The ':' operator is deprecated. Use exp(x) instead. */
|
||||
/* WARNING: Rel *: Uninitialized page 0 - fixing */
|
||||
/* WARNING: PortalHeapMemoryFree: * not in alloc set! */
|
||||
/* WARNING: Too old parent tuple found - can't continue vc_repair_frag */
|
||||
/* WARNING: identifier "*" will be truncated to "*" */
|
||||
/* WARNING: InvalidateSharedInvalid: cache state reset */
|
||||
/* WARNING: RegisterSharedInvalid: SI buffer overflow */
|
||||
sqlca.sqlwarn[2] = 'W';
|
||||
sqlca.sqlwarn[0] = 'W';
|
||||
}
|
||||
|
||||
/* this contains some quick hacks, needs to be cleaned up, but it works */
|
||||
bool
|
||||
ECPGconnect(int lineno, const char *name, const char *user, const char *passwd, const char *connection_name, int autocommit)
|
||||
{
|
||||
struct connection *this;
|
||||
char *dbname = strdup(name),
|
||||
*host = NULL,
|
||||
*tmp,
|
||||
*port = NULL,
|
||||
*realname = NULL,
|
||||
*options = NULL;
|
||||
|
||||
ECPGinit_sqlca();
|
||||
|
||||
if ((this = (struct connection *) ECPGalloc(sizeof(struct connection), lineno)) == NULL)
|
||||
return false;
|
||||
|
||||
if (dbname == NULL && connection_name == NULL)
|
||||
connection_name = "DEFAULT";
|
||||
|
||||
/* get the detail information out of dbname */
|
||||
if (strchr(dbname, '@') != NULL)
|
||||
{
|
||||
/* old style: dbname[@server][:port] */
|
||||
tmp = strrchr(dbname, ':');
|
||||
if (tmp != NULL) /* port number given */
|
||||
{
|
||||
port = strdup(tmp + 1);
|
||||
*tmp = '\0';
|
||||
}
|
||||
|
||||
tmp = strrchr(dbname, '@');
|
||||
if (tmp != NULL) /* host name given */
|
||||
{
|
||||
host = strdup(tmp + 1);
|
||||
*tmp = '\0';
|
||||
}
|
||||
realname = strdup(dbname);
|
||||
}
|
||||
else if (strncmp(dbname, "tcp:", 4) == 0 || strncmp(dbname, "unix:", 5) == 0)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
/*
|
||||
* only allow protocols tcp and unix
|
||||
*/
|
||||
if (strncmp(dbname, "tcp:", 4) == 0)
|
||||
offset = 4;
|
||||
else if (strncmp(dbname, "unix:", 5) == 0)
|
||||
offset = 5;
|
||||
|
||||
if (strncmp(dbname + offset, "postgresql://", strlen("postgresql://")) == 0)
|
||||
{
|
||||
|
||||
/*------
|
||||
* new style:
|
||||
* <tcp|unix>:postgresql://server[:port|:/unixsocket/path:]
|
||||
* [/db name][?options]
|
||||
*------
|
||||
*/
|
||||
offset += strlen("postgresql://");
|
||||
|
||||
tmp = strrchr(dbname + offset, '?');
|
||||
if (tmp != NULL) /* options given */
|
||||
{
|
||||
options = strdup(tmp + 1);
|
||||
*tmp = '\0';
|
||||
}
|
||||
|
||||
tmp = strrchr(dbname + offset, '/');
|
||||
if (tmp != NULL) /* database name given */
|
||||
{
|
||||
realname = strdup(tmp + 1);
|
||||
*tmp = '\0';
|
||||
}
|
||||
|
||||
tmp = strrchr(dbname + offset, ':');
|
||||
if (tmp != NULL) /* port number or Unix socket path given */
|
||||
{
|
||||
char *tmp2;
|
||||
|
||||
*tmp = '\0';
|
||||
if ((tmp2 = strchr(tmp + 1, ':')) != NULL)
|
||||
{
|
||||
*tmp2 = '\0';
|
||||
host = strdup(tmp + 1);
|
||||
if (strncmp(dbname, "unix:", 5) != 0)
|
||||
{
|
||||
ECPGlog("connect: socketname %s given for TCP connection in line %d\n", host, lineno);
|
||||
ECPGraise(lineno, ECPG_CONNECT, realname ? realname : "<DEFAULT>");
|
||||
if (host)
|
||||
ECPGfree(host);
|
||||
if (port)
|
||||
ECPGfree(port);
|
||||
if (options)
|
||||
ECPGfree(options);
|
||||
if (realname)
|
||||
ECPGfree(realname);
|
||||
if (dbname)
|
||||
ECPGfree(dbname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
port = strdup(tmp + 1);
|
||||
}
|
||||
|
||||
if (strncmp(dbname, "unix:", 5) == 0)
|
||||
{
|
||||
if (strcmp(dbname + offset, "localhost") != 0 && strcmp(dbname + offset, "127.0.0.1") != 0)
|
||||
{
|
||||
ECPGlog("connect: non-localhost access via sockets in line %d\n", lineno);
|
||||
ECPGraise(lineno, ECPG_CONNECT, realname ? realname : "<DEFAULT>");
|
||||
if (host)
|
||||
ECPGfree(host);
|
||||
if (port)
|
||||
ECPGfree(port);
|
||||
if (options)
|
||||
ECPGfree(options);
|
||||
if (realname)
|
||||
ECPGfree(realname);
|
||||
if (dbname)
|
||||
ECPGfree(dbname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
host = strdup(dbname + offset);
|
||||
|
||||
}
|
||||
else
|
||||
realname = strdup(dbname);
|
||||
}
|
||||
else
|
||||
realname = strdup(dbname);
|
||||
|
||||
/* add connection to our list */
|
||||
if (connection_name != NULL)
|
||||
this->name = ECPGstrdup(connection_name, lineno);
|
||||
else
|
||||
this->name = ECPGstrdup(realname, lineno);
|
||||
|
||||
this->cache_head = NULL;
|
||||
|
||||
if (all_connections == NULL)
|
||||
this->next = NULL;
|
||||
else
|
||||
this->next = all_connections;
|
||||
|
||||
actual_connection = all_connections = this;
|
||||
|
||||
ECPGlog("ECPGconnect: opening database %s on %s port %s %s%s%s%s\n",
|
||||
realname ? realname : "<DEFAULT>",
|
||||
host ? host : "<DEFAULT>",
|
||||
port ? port : "<DEFAULT>",
|
||||
options ? "with options " : "", options ? options : "",
|
||||
user ? "for user " : "", user ? user : "");
|
||||
|
||||
this->connection = PQsetdbLogin(host, port, options, NULL, realname, user, passwd);
|
||||
|
||||
if (PQstatus(this->connection) == CONNECTION_BAD)
|
||||
{
|
||||
const char *errmsg = PQerrorMessage(this->connection);
|
||||
char *db = realname ? realname : "<DEFAULT>";
|
||||
|
||||
set_backend_err(errmsg, lineno);
|
||||
ecpg_finish(this);
|
||||
ECPGlog("connect: could not open database %s on %s port %s %s%s%s%s in line %d\n\t%s\n",
|
||||
db,
|
||||
host ? host : "<DEFAULT>",
|
||||
port ? port : "<DEFAULT>",
|
||||
options ? "with options " : "", options ? options : "",
|
||||
user ? "for user " : "", user ? user : "",
|
||||
lineno, errmsg);
|
||||
|
||||
ECPGraise(lineno, ECPG_CONNECT, db);
|
||||
if (host)
|
||||
ECPGfree(host);
|
||||
if (port)
|
||||
ECPGfree(port);
|
||||
if (options)
|
||||
ECPGfree(options);
|
||||
if (realname)
|
||||
ECPGfree(realname);
|
||||
if (dbname)
|
||||
ECPGfree(dbname);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (host)
|
||||
ECPGfree(host);
|
||||
if (port)
|
||||
ECPGfree(port);
|
||||
if (options)
|
||||
ECPGfree(options);
|
||||
if (realname)
|
||||
ECPGfree(realname);
|
||||
if (dbname)
|
||||
ECPGfree(dbname);
|
||||
|
||||
this->committed = true;
|
||||
this->autocommit = autocommit;
|
||||
|
||||
PQsetNoticeProcessor(this->connection, &ECPGnoticeProcessor, (void *) this);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGdisconnect(int lineno, const char *connection_name)
|
||||
{
|
||||
struct connection *con;
|
||||
|
||||
if (strcmp(connection_name, "ALL") == 0)
|
||||
{
|
||||
ECPGinit_sqlca();
|
||||
for (con = all_connections; con;)
|
||||
{
|
||||
struct connection *f = con;
|
||||
|
||||
con = con->next;
|
||||
ecpg_finish(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
con = ECPGget_connection(connection_name);
|
||||
|
||||
if (!ECPGinit(con, connection_name, lineno))
|
||||
return (false);
|
||||
else
|
||||
ecpg_finish(con);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
@ -1,398 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.24 2002/09/04 20:31:46 momjian Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
|
||||
bool
|
||||
ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
|
||||
enum ECPGttype type, enum ECPGttype ind_type,
|
||||
char *var, char *ind, long varcharsize, long offset,
|
||||
long ind_offset, bool isarray)
|
||||
{
|
||||
char *pval = (char *) PQgetvalue(results, act_tuple, act_field);
|
||||
|
||||
ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld\n", lineno, pval ? pval : "", offset);
|
||||
|
||||
/* pval is a pointer to the value */
|
||||
/* let's check is it really is an array if it should be one */
|
||||
if (isarray)
|
||||
{
|
||||
if (*pval != '{')
|
||||
{
|
||||
ECPGraise(lineno, ECPG_DATA_NOT_ARRAY, NULL);
|
||||
return (false);
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ECPGt_char:
|
||||
case ECPGt_unsigned_char:
|
||||
case ECPGt_varchar:
|
||||
break;
|
||||
|
||||
default:
|
||||
pval++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* We will have to decode the value */
|
||||
|
||||
/*
|
||||
* check for null value and set indicator accordingly
|
||||
*/
|
||||
switch (ind_type)
|
||||
{
|
||||
case ECPGt_short:
|
||||
case ECPGt_unsigned_short:
|
||||
/* ((short *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/
|
||||
*((short *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field);
|
||||
break;
|
||||
case ECPGt_int:
|
||||
case ECPGt_unsigned_int:
|
||||
/* ((int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/
|
||||
*((int *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field);
|
||||
break;
|
||||
case ECPGt_long:
|
||||
case ECPGt_unsigned_long:
|
||||
/* ((long *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/
|
||||
*((long *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field);
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG_INT_64
|
||||
case ECPGt_long_long:
|
||||
case ECPGt_unsigned_long_long:
|
||||
/* ((long long int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/
|
||||
*((long long int *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field);
|
||||
break;
|
||||
/* case ECPGt_unsigned_long_long:
|
||||
((unsigned long long int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);
|
||||
break;*/
|
||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||
case ECPGt_NO_INDICATOR:
|
||||
if (PQgetisnull(results, act_tuple, act_field))
|
||||
{
|
||||
ECPGraise(lineno, ECPG_MISSING_INDICATOR, NULL);
|
||||
return (false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ECPGraise(lineno, ECPG_UNSUPPORTED, ECPGtype_name(ind_type));
|
||||
return (false);
|
||||
break;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
long res;
|
||||
unsigned long ures;
|
||||
double dres;
|
||||
char *scan_length;
|
||||
|
||||
case ECPGt_short:
|
||||
case ECPGt_int:
|
||||
case ECPGt_long:
|
||||
if (pval)
|
||||
{
|
||||
res = strtol(pval, &scan_length, 10);
|
||||
if ((isarray && *scan_length != ',' && *scan_length != '}')
|
||||
|| (!isarray && *scan_length != '\0')) /* Garbage left */
|
||||
{
|
||||
ECPGraise(lineno, ECPG_INT_FORMAT, pval);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
else
|
||||
res = 0L;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ECPGt_short:
|
||||
/* ((short *) var)[act_tuple] = (short) res;*/
|
||||
*((short *) (var + offset * act_tuple)) = (short) res;
|
||||
break;
|
||||
case ECPGt_int:
|
||||
/* ((int *) var)[act_tuple] = (int) res;*/
|
||||
*((int *) (var + offset * act_tuple)) = (int) res;
|
||||
break;
|
||||
case ECPGt_long:
|
||||
/* ((long *) var)[act_tuple] = res;*/
|
||||
*((long *) (var + offset * act_tuple)) = (long) res;
|
||||
break;
|
||||
default:
|
||||
/* Cannot happen */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ECPGt_unsigned_short:
|
||||
case ECPGt_unsigned_int:
|
||||
case ECPGt_unsigned_long:
|
||||
if (pval)
|
||||
{
|
||||
ures = strtoul(pval, &scan_length, 10);
|
||||
if ((isarray && *scan_length != ',' && *scan_length != '}')
|
||||
|| (!isarray && *scan_length != '\0')) /* Garbage left */
|
||||
{
|
||||
ECPGraise(lineno, ECPG_UINT_FORMAT, pval);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
else
|
||||
ures = 0L;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ECPGt_unsigned_short:
|
||||
/* ((unsigned short *) var)[act_tuple] = (unsigned short) ures;*/
|
||||
*((unsigned short *) (var + offset * act_tuple)) = (unsigned short) ures;
|
||||
break;
|
||||
case ECPGt_unsigned_int:
|
||||
/* ((unsigned int *) var)[act_tuple] = (unsigned int) ures;*/
|
||||
*((unsigned int *) (var + offset * act_tuple)) = (unsigned int) ures;
|
||||
break;
|
||||
case ECPGt_unsigned_long:
|
||||
/* ((unsigned long *) var)[act_tuple] = ures;*/
|
||||
*((unsigned long *) (var + offset * act_tuple)) = (unsigned long) ures;
|
||||
break;
|
||||
default:
|
||||
/* Cannot happen */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef HAVE_LONG_LONG_INT_64
|
||||
#ifdef HAVE_STRTOLL
|
||||
case ECPGt_long_long:
|
||||
if (pval)
|
||||
{
|
||||
/* ((long long int *) var)[act_tuple] = strtoll(pval, &scan_length, 10);*/
|
||||
*((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10);
|
||||
if ((isarray && *scan_length != ',' && *scan_length != '}')
|
||||
|| (!isarray && *scan_length != '\0')) /* Garbage left */
|
||||
{
|
||||
ECPGraise(lineno, ECPG_INT_FORMAT, pval);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
else
|
||||
/* ((long long int *) var)[act_tuple] = (long long) 0;*/
|
||||
*((long long int *) (var + offset * act_tuple)) = (long long) 0;
|
||||
|
||||
break;
|
||||
#endif /* HAVE_STRTOLL */
|
||||
#ifdef HAVE_STRTOULL
|
||||
case ECPGt_unsigned_long_long:
|
||||
if (pval)
|
||||
{
|
||||
/* ((unsigned long long int *) var)[act_tuple] = strtoull(pval, &scan_length, 10);*/
|
||||
*((unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10);
|
||||
if ((isarray && *scan_length != ',' && *scan_length != '}')
|
||||
|| (!isarray && *scan_length != '\0')) /* Garbage left */
|
||||
{
|
||||
ECPGraise(lineno, ECPG_UINT_FORMAT, pval);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
else
|
||||
/* ((unsigned long long int *) var)[act_tuple] = (long long) 0;*/
|
||||
*((unsigned long long int *) (var + offset * act_tuple)) = (long long) 0;
|
||||
|
||||
break;
|
||||
#endif /* HAVE_STRTOULL */
|
||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||
|
||||
case ECPGt_float:
|
||||
case ECPGt_double:
|
||||
if (pval)
|
||||
{
|
||||
if (isarray && *pval == '"')
|
||||
dres = strtod(pval + 1, &scan_length);
|
||||
else
|
||||
dres = strtod(pval, &scan_length);
|
||||
|
||||
if (isarray && *scan_length == '"')
|
||||
scan_length++;
|
||||
|
||||
if ((isarray && *scan_length != ',' && *scan_length != '}')
|
||||
|| (!isarray && *scan_length != '\0')) /* Garbage left */
|
||||
{
|
||||
ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
else
|
||||
dres = 0.0;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ECPGt_float:
|
||||
/* ((float *) var)[act_tuple] = dres;*/
|
||||
*((float *) (var + offset * act_tuple)) = dres;
|
||||
break;
|
||||
case ECPGt_double:
|
||||
/* ((double *) var)[act_tuple] = dres;*/
|
||||
*((double *) (var + offset * act_tuple)) = dres;
|
||||
break;
|
||||
default:
|
||||
/* Cannot happen */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ECPGt_bool:
|
||||
if (pval)
|
||||
{
|
||||
if (pval[0] == 'f' && pval[1] == '\0')
|
||||
{
|
||||
if (offset == sizeof(char))
|
||||
/* ((char *) var)[act_tuple] = false;*/
|
||||
*((char *) (var + offset * act_tuple)) = false;
|
||||
else if (offset == sizeof(int))
|
||||
/* ((int *) var)[act_tuple] = false;*/
|
||||
*((int *) (var + offset * act_tuple)) = false;
|
||||
else
|
||||
ECPGraise(lineno, ECPG_CONVERT_BOOL, "different size");
|
||||
break;
|
||||
}
|
||||
else if (pval[0] == 't' && pval[1] == '\0')
|
||||
{
|
||||
if (offset == sizeof(char))
|
||||
/* ((char *) var)[act_tuple] = true;*/
|
||||
*((char *) (var + offset * act_tuple)) = true;
|
||||
else if (offset == sizeof(int))
|
||||
/* ((int *) var)[act_tuple] = true;*/
|
||||
*((int *) (var + offset * act_tuple)) = true;
|
||||
else
|
||||
ECPGraise(lineno, ECPG_CONVERT_BOOL, "different size");
|
||||
break;
|
||||
}
|
||||
else if (pval[0] == '\0' && PQgetisnull(results, act_tuple, act_field))
|
||||
{
|
||||
/* NULL is valid */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ECPGraise(lineno, ECPG_CONVERT_BOOL, pval);
|
||||
return (false);
|
||||
break;
|
||||
|
||||
case ECPGt_char:
|
||||
case ECPGt_unsigned_char:
|
||||
{
|
||||
strncpy((char *) ((long) var + offset * act_tuple), pval, varcharsize);
|
||||
if (varcharsize && varcharsize < strlen(pval))
|
||||
{
|
||||
/* truncation */
|
||||
switch (ind_type)
|
||||
{
|
||||
case ECPGt_short:
|
||||
case ECPGt_unsigned_short:
|
||||
/* ((short *) ind)[act_tuple] = strlen(pval);*/
|
||||
*((short *) (ind + ind_offset * act_tuple)) = strlen(pval);
|
||||
break;
|
||||
case ECPGt_int:
|
||||
case ECPGt_unsigned_int:
|
||||
/* ((int *) ind)[act_tuple] = strlen(pval);*/
|
||||
*((int *) (ind + ind_offset * act_tuple)) = strlen(pval);
|
||||
break;
|
||||
case ECPGt_long:
|
||||
case ECPGt_unsigned_long:
|
||||
/* ((long *) ind)[act_tuple] = strlen(pval);*/
|
||||
*((long *) (ind + ind_offset * act_tuple)) = strlen(pval);
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG_INT_64
|
||||
case ECPGt_long_long:
|
||||
case ECPGt_unsigned_long_long:
|
||||
*((long long int *) (ind + ind_offset * act_tuple)) = strlen(pval);
|
||||
break;
|
||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sqlca.sqlwarn[0] = sqlca.sqlwarn[1] = 'W';
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ECPGt_varchar:
|
||||
{
|
||||
struct ECPGgeneric_varchar *variable =
|
||||
(struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple);
|
||||
|
||||
variable->len = strlen(pval);
|
||||
if (varcharsize == 0)
|
||||
strncpy(variable->arr, pval, variable->len);
|
||||
else
|
||||
strncpy(variable->arr, pval, varcharsize);
|
||||
|
||||
if (varcharsize > 0 && variable->len > varcharsize)
|
||||
{
|
||||
/* truncation */
|
||||
switch (ind_type)
|
||||
{
|
||||
case ECPGt_short:
|
||||
case ECPGt_unsigned_short:
|
||||
/* ((short *) ind)[act_tuple] = variable->len;*/
|
||||
*((short *) (ind + offset * act_tuple)) = variable->len;
|
||||
break;
|
||||
case ECPGt_int:
|
||||
case ECPGt_unsigned_int:
|
||||
/* ((int *) ind)[act_tuple] = variable->len;*/
|
||||
*((int *) (ind + offset * act_tuple)) = variable->len;
|
||||
break;
|
||||
case ECPGt_long:
|
||||
case ECPGt_unsigned_long:
|
||||
/* ((long *) ind)[act_tuple] = variable->len;*/
|
||||
*((long *) (ind + offset * act_tuple)) = variable->len;
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG_INT_64
|
||||
case ECPGt_long_long:
|
||||
case ECPGt_unsigned_long_long:
|
||||
*((long long int *) (ind + ind_offset * act_tuple)) = variable->len;
|
||||
break;
|
||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sqlca.sqlwarn[0] = sqlca.sqlwarn[1] = 'W';
|
||||
|
||||
variable->len = varcharsize;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ECPGraise(lineno, ECPG_UNSUPPORTED, ECPGtype_name(type));
|
||||
return (false);
|
||||
break;
|
||||
}
|
||||
if (isarray)
|
||||
{
|
||||
bool string = false;
|
||||
|
||||
/* set array to next entry */
|
||||
++act_tuple;
|
||||
|
||||
/* set pval to the next entry */
|
||||
for (; string || (*pval != ',' && *pval != '}'); ++pval)
|
||||
if (*pval == '"')
|
||||
string = string ? false : true;
|
||||
|
||||
if (*pval == ',')
|
||||
++pval;
|
||||
}
|
||||
} while (isarray && *pval != '}');
|
||||
|
||||
return (true);
|
||||
}
|
@ -1,449 +0,0 @@
|
||||
/* dynamic SQL support routines
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.23 2002/09/04 20:31:46 momjian Exp $
|
||||
*/
|
||||
|
||||
#include "postgres_fe.h"
|
||||
#include "pg_type.h"
|
||||
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
#include "sql3types.h"
|
||||
|
||||
struct descriptor *all_descriptors = NULL;
|
||||
|
||||
/* old internal convenience function that might go away later */
|
||||
static PGresult
|
||||
*
|
||||
ECPGresultByDescriptor(int line, const char *name)
|
||||
{
|
||||
PGresult **resultpp = ECPGdescriptor_lvalue(line, name);
|
||||
|
||||
if (resultpp)
|
||||
return *resultpp;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
ECPGDynamicType_DDT(Oid type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATEOID:
|
||||
return SQL3_DDT_DATE;
|
||||
case TIMEOID:
|
||||
return SQL3_DDT_TIME;
|
||||
case TIMESTAMPOID:
|
||||
return SQL3_DDT_TIMESTAMP;
|
||||
case TIMESTAMPTZOID:
|
||||
return SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE;
|
||||
case TIMETZOID:
|
||||
return SQL3_DDT_TIME_WITH_TIME_ZONE;
|
||||
default:
|
||||
return SQL3_DDT_ILLEGAL;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGget_desc_header(int lineno, char *desc_name, int *count)
|
||||
{
|
||||
PGresult *ECPGresult;
|
||||
|
||||
ECPGinit_sqlca();
|
||||
ECPGresult = ECPGresultByDescriptor(lineno, desc_name);
|
||||
if (!ECPGresult)
|
||||
return false;
|
||||
|
||||
*count = PQnfields(ECPGresult);
|
||||
sqlca.sqlerrd[2] = 1;
|
||||
ECPGlog("ECPGget_desc_header: found %d attributes.\n", *count);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
get_int_item(int lineno, void *var, enum ECPGttype vartype, int value)
|
||||
{
|
||||
switch (vartype)
|
||||
{
|
||||
case ECPGt_short:
|
||||
*(short *) var = (short) value;
|
||||
break;
|
||||
case ECPGt_int:
|
||||
*(int *) var = (int) value;
|
||||
break;
|
||||
case ECPGt_long:
|
||||
*(long *) var = (long) value;
|
||||
break;
|
||||
case ECPGt_unsigned_short:
|
||||
*(unsigned short *) var = (unsigned short) value;
|
||||
break;
|
||||
case ECPGt_unsigned_int:
|
||||
*(unsigned int *) var = (unsigned int) value;
|
||||
break;
|
||||
case ECPGt_unsigned_long:
|
||||
*(unsigned long *) var = (unsigned long) value;
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG_INT_64
|
||||
case ECPGt_long_long:
|
||||
*(long long int *) var = (long long int) value;
|
||||
break;
|
||||
case ECPGt_unsigned_long_long:
|
||||
*(unsigned long long int *) var = (unsigned long long int) value;
|
||||
break;
|
||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||
case ECPGt_float:
|
||||
*(float *) var = (float) value;
|
||||
break;
|
||||
case ECPGt_double:
|
||||
*(double *) var = (double) value;
|
||||
break;
|
||||
default:
|
||||
ECPGraise(lineno, ECPG_VAR_NOT_NUMERIC, NULL);
|
||||
return (false);
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
static bool
|
||||
get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int varcharsize)
|
||||
{
|
||||
switch (vartype)
|
||||
{
|
||||
case ECPGt_char:
|
||||
case ECPGt_unsigned_char:
|
||||
strncpy((char *) var, value, varcharsize);
|
||||
break;
|
||||
case ECPGt_varchar:
|
||||
{
|
||||
struct ECPGgeneric_varchar *variable =
|
||||
(struct ECPGgeneric_varchar *) var;
|
||||
|
||||
if (varcharsize == 0)
|
||||
strncpy(variable->arr, value, strlen(value));
|
||||
else
|
||||
strncpy(variable->arr, value, varcharsize);
|
||||
|
||||
variable->len = strlen(value);
|
||||
if (varcharsize > 0 && variable->len > varcharsize)
|
||||
variable->len = varcharsize;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ECPGraise(lineno, ECPG_VAR_NOT_CHAR, NULL);
|
||||
return (false);
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGget_desc(int lineno, char *desc_name, int index,...)
|
||||
{
|
||||
va_list args;
|
||||
PGresult *ECPGresult;
|
||||
enum ECPGdtype type;
|
||||
int ntuples,
|
||||
act_tuple;
|
||||
struct variable data_var;
|
||||
|
||||
va_start(args, index);
|
||||
ECPGinit_sqlca();
|
||||
ECPGresult = ECPGresultByDescriptor(lineno, desc_name);
|
||||
if (!ECPGresult)
|
||||
return (false);
|
||||
|
||||
ntuples = PQntuples(ECPGresult);
|
||||
if (ntuples < 1)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_NOT_FOUND, NULL);
|
||||
return (false);
|
||||
}
|
||||
|
||||
if (index < 1 || index > PQnfields(ECPGresult))
|
||||
{
|
||||
ECPGraise(lineno, ECPG_INVALID_DESCRIPTOR_INDEX, NULL);
|
||||
return (false);
|
||||
}
|
||||
|
||||
ECPGlog("ECPGget_desc: reading items for tuple %d\n", index);
|
||||
--index;
|
||||
|
||||
type = va_arg(args, enum ECPGdtype);
|
||||
|
||||
memset(&data_var, 0, sizeof data_var);
|
||||
data_var.type = ECPGt_EORT;
|
||||
data_var.ind_type = ECPGt_NO_INDICATOR;
|
||||
|
||||
while (type != ECPGd_EODT)
|
||||
{
|
||||
char type_str[20];
|
||||
long varcharsize;
|
||||
long offset;
|
||||
long arrsize;
|
||||
enum ECPGttype vartype;
|
||||
void *var;
|
||||
|
||||
vartype = va_arg(args, enum ECPGttype);
|
||||
var = va_arg(args, void *);
|
||||
varcharsize = va_arg(args, long);
|
||||
arrsize = va_arg(args, long);
|
||||
offset = va_arg(args, long);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case (ECPGd_indicator):
|
||||
data_var.ind_type = vartype;
|
||||
data_var.ind_pointer = var;
|
||||
data_var.ind_varcharsize = varcharsize;
|
||||
data_var.ind_arrsize = arrsize;
|
||||
data_var.ind_offset = offset;
|
||||
if (data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0)
|
||||
data_var.ind_value = *((void **) (data_var.ind_pointer));
|
||||
else
|
||||
data_var.ind_value = data_var.ind_pointer;
|
||||
break;
|
||||
|
||||
case ECPGd_data:
|
||||
data_var.type = vartype;
|
||||
data_var.pointer = var;
|
||||
data_var.varcharsize = varcharsize;
|
||||
data_var.arrsize = arrsize;
|
||||
data_var.offset = offset;
|
||||
if (data_var.arrsize == 0 || data_var.varcharsize == 0)
|
||||
data_var.value = *((void **) (data_var.pointer));
|
||||
else
|
||||
data_var.value = data_var.pointer;
|
||||
break;
|
||||
|
||||
case ECPGd_name:
|
||||
if (!get_char_item(lineno, var, vartype, PQfname(ECPGresult, index), varcharsize))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: NAME = %s\n", PQfname(ECPGresult, index));
|
||||
break;
|
||||
|
||||
case ECPGd_nullable:
|
||||
if (!get_int_item(lineno, var, vartype, 1))
|
||||
return (false);
|
||||
|
||||
break;
|
||||
|
||||
case ECPGd_key_member:
|
||||
if (!get_int_item(lineno, var, vartype, 0))
|
||||
return (false);
|
||||
|
||||
break;
|
||||
|
||||
case ECPGd_scale:
|
||||
if (!get_int_item(lineno, var, vartype, (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: SCALE = %d\n", (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff);
|
||||
break;
|
||||
|
||||
case ECPGd_precision:
|
||||
if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) >> 16))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: PRECISION = %d\n", PQfmod(ECPGresult, index) >> 16);
|
||||
break;
|
||||
|
||||
case ECPGd_octet:
|
||||
if (!get_int_item(lineno, var, vartype, PQfsize(ECPGresult, index)))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: OCTET_LENGTH = %d\n", PQfsize(ECPGresult, index));
|
||||
break;
|
||||
|
||||
case ECPGd_length:
|
||||
if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) - VARHDRSZ))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: LENGTH = %d\n", PQfmod(ECPGresult, index) - VARHDRSZ);
|
||||
break;
|
||||
|
||||
case ECPGd_type:
|
||||
if (!get_int_item(lineno, var, vartype, ECPGDynamicType(PQftype(ECPGresult, index))))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: TYPE = %d\n", ECPGDynamicType(PQftype(ECPGresult, index)));
|
||||
break;
|
||||
|
||||
case ECPGd_di_code:
|
||||
if (!get_int_item(lineno, var, vartype, ECPGDynamicType_DDT(PQftype(ECPGresult, index))))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: TYPE = %d\n", ECPGDynamicType_DDT(PQftype(ECPGresult, index)));
|
||||
break;
|
||||
|
||||
case ECPGd_cardinality:
|
||||
if (!get_int_item(lineno, var, vartype, PQntuples(ECPGresult)))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGget_desc: CARDINALITY = %d\n", PQntuples(ECPGresult));
|
||||
break;
|
||||
|
||||
case ECPGd_ret_length:
|
||||
case ECPGd_ret_octet:
|
||||
|
||||
/*
|
||||
* this is like ECPGstore_result
|
||||
*/
|
||||
if (arrsize > 0 && ntuples > arrsize)
|
||||
{
|
||||
ECPGlog("ECPGget_desc line %d: Incorrect number of matches: %d don't fit into array of %d\n",
|
||||
lineno, ntuples, arrsize);
|
||||
ECPGraise(lineno, ECPG_TOO_MANY_MATCHES, NULL);
|
||||
return false;
|
||||
}
|
||||
/* allocate storage if needed */
|
||||
if (arrsize == 0 && var != NULL && *(void **) var == NULL)
|
||||
{
|
||||
void *mem = (void *) ECPGalloc(offset * ntuples, lineno);
|
||||
|
||||
*(void **) var = mem;
|
||||
ECPGadd_mem(mem, lineno);
|
||||
var = mem;
|
||||
}
|
||||
|
||||
for (act_tuple = 0; act_tuple < ntuples; act_tuple++)
|
||||
{
|
||||
if (!get_int_item(lineno, var, vartype, PQgetlength(ECPGresult, act_tuple, index)))
|
||||
return (false);
|
||||
var = (char *) var + offset;
|
||||
ECPGlog("ECPGget_desc: RETURNED[%d] = %d\n", act_tuple, PQgetlength(ECPGresult, act_tuple, index));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
snprintf(type_str, sizeof(type_str), "%d", type);
|
||||
ECPGraise(lineno, ECPG_UNKNOWN_DESCRIPTOR_ITEM, type_str);
|
||||
return (false);
|
||||
}
|
||||
|
||||
type = va_arg(args, enum ECPGdtype);
|
||||
}
|
||||
|
||||
if (data_var.type != ECPGt_EORT)
|
||||
{
|
||||
struct statement stmt;
|
||||
char *oldlocale;
|
||||
|
||||
/* Make sure we do NOT honor the locale for numeric input */
|
||||
/* since the database gives the standard decimal point */
|
||||
oldlocale = strdup(setlocale(LC_NUMERIC, NULL));
|
||||
setlocale(LC_NUMERIC, "C");
|
||||
|
||||
memset(&stmt, 0, sizeof stmt);
|
||||
stmt.lineno = lineno;
|
||||
|
||||
/* desparate try to guess something sensible */
|
||||
stmt.connection = ECPGget_connection(NULL);
|
||||
ECPGstore_result(ECPGresult, index, &stmt, &data_var);
|
||||
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
ECPGfree(oldlocale);
|
||||
}
|
||||
else if (data_var.ind_type != ECPGt_NO_INDICATOR)
|
||||
{
|
||||
/*
|
||||
* this is like ECPGstore_result but since we don't have a data
|
||||
* variable at hand, we can't call it
|
||||
*/
|
||||
if (data_var.ind_arrsize > 0 && ntuples > data_var.ind_arrsize)
|
||||
{
|
||||
ECPGlog("ECPGget_desc line %d: Incorrect number of matches (indicator): %d don't fit into array of %d\n",
|
||||
lineno, ntuples, data_var.ind_arrsize);
|
||||
ECPGraise(lineno, ECPG_TOO_MANY_MATCHES, NULL);
|
||||
return false;
|
||||
}
|
||||
/* allocate storage if needed */
|
||||
if (data_var.ind_arrsize == 0 && data_var.ind_pointer != NULL && data_var.ind_value == NULL)
|
||||
{
|
||||
void *mem = (void *) ECPGalloc(data_var.ind_offset * ntuples, lineno);
|
||||
|
||||
*(void **) data_var.ind_pointer = mem;
|
||||
ECPGadd_mem(mem, lineno);
|
||||
data_var.ind_value = mem;
|
||||
}
|
||||
for (act_tuple = 0; act_tuple < ntuples; act_tuple++)
|
||||
{
|
||||
if (!get_int_item(lineno, data_var.ind_value, data_var.ind_type, -PQgetisnull(ECPGresult, act_tuple, index)))
|
||||
return (false);
|
||||
data_var.ind_value = (char *) data_var.ind_value + data_var.ind_offset;
|
||||
ECPGlog("ECPGget_desc: INDICATOR[%d] = %d\n", act_tuple, -PQgetisnull(ECPGresult, act_tuple, index));
|
||||
}
|
||||
}
|
||||
sqlca.sqlerrd[2] = ntuples;
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGdeallocate_desc(int line, const char *name)
|
||||
{
|
||||
struct descriptor *i;
|
||||
struct descriptor **lastptr = &all_descriptors;
|
||||
|
||||
ECPGinit_sqlca();
|
||||
for (i = all_descriptors; i; lastptr = &i->next, i = i->next)
|
||||
{
|
||||
if (!strcmp(name, i->name))
|
||||
{
|
||||
*lastptr = i->next;
|
||||
ECPGfree(i->name);
|
||||
PQclear(i->result);
|
||||
ECPGfree(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGallocate_desc(int line, const char *name)
|
||||
{
|
||||
struct descriptor *new;
|
||||
|
||||
ECPGinit_sqlca();
|
||||
new = (struct descriptor *) ECPGalloc(sizeof(struct descriptor), line);
|
||||
if (!new)
|
||||
return false;
|
||||
new->next = all_descriptors;
|
||||
new->name = ECPGalloc(strlen(name) + 1, line);
|
||||
if (!new->name)
|
||||
{
|
||||
ECPGfree(new);
|
||||
return false;
|
||||
}
|
||||
new->result = PQmakeEmptyPGresult(NULL, 0);
|
||||
if (!new->result)
|
||||
{
|
||||
ECPGfree(new->name);
|
||||
ECPGfree(new);
|
||||
ECPGraise(line, ECPG_OUT_OF_MEMORY, NULL);
|
||||
return false;
|
||||
}
|
||||
strcpy(new->name, name);
|
||||
all_descriptors = new;
|
||||
return true;
|
||||
}
|
||||
|
||||
PGresult **
|
||||
ECPGdescriptor_lvalue(int line, const char *descriptor)
|
||||
{
|
||||
struct descriptor *i;
|
||||
|
||||
for (i = all_descriptors; i != NULL; i = i->next)
|
||||
{
|
||||
if (!strcmp(descriptor, i->name))
|
||||
return &i->result;
|
||||
}
|
||||
|
||||
ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, (char *) descriptor);
|
||||
return NULL;
|
||||
}
|
@ -1,198 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/error.c,v 1.19 2003/02/14 13:17:13 meskes Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ecpgerrno.h"
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
|
||||
/* This should hold the back-end error message from
|
||||
* the last back-end operation. */
|
||||
static char *ECPGerr;
|
||||
|
||||
void
|
||||
ECPGraise(int line, int code, const char *str)
|
||||
{
|
||||
sqlca.sqlcode = code;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case ECPG_NOT_FOUND:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"No data found in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_OUT_OF_MEMORY:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Out of memory in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_UNSUPPORTED:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Unsupported type %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_TOO_MANY_ARGUMENTS:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Too many arguments in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_TOO_FEW_ARGUMENTS:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Too few arguments in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_INT_FORMAT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Not correctly formatted int type: %s line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_UINT_FORMAT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Not correctly formatted unsigned type: %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_FLOAT_FORMAT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Not correctly formatted floating-point type: %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_CONVERT_BOOL:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Unable to convert %s to bool on line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_EMPTY:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Empty query in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_MISSING_INDICATOR:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"NULL value without indicator in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_NO_ARRAY:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Variable is not an array in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_DATA_NOT_ARRAY:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Data read from backend is not an array in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_ARRAY_INSERT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Trying to insert an array of variables in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_NO_CONN:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"No such connection %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_NOT_CONN:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Not connected to '%s' in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_INVALID_STMT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Invalid statement name %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_UNKNOWN_DESCRIPTOR:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Descriptor %s not found in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_INVALID_DESCRIPTOR_INDEX:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Descriptor index out of range in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Unknown descriptor item %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
case ECPG_VAR_NOT_NUMERIC:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Variable is not a numeric type in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_VAR_NOT_CHAR:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Variable is not a character type in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_PGSQL:
|
||||
{
|
||||
int slen = strlen(str);
|
||||
|
||||
/* strip trailing newline */
|
||||
if (slen > 0 && str[slen - 1] == '\n')
|
||||
slen--;
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"'%.*s' in line %d.", slen, str, line);
|
||||
break;
|
||||
}
|
||||
|
||||
case ECPG_TRANS:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Error in transaction processing in line %d.", line);
|
||||
break;
|
||||
|
||||
case ECPG_CONNECT:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"Could not connect to database %s in line %d.", str, line);
|
||||
break;
|
||||
|
||||
default:
|
||||
snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
|
||||
"SQL error #%d in line %d.", code, line);
|
||||
break;
|
||||
}
|
||||
|
||||
sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc);
|
||||
ECPGlog("raising sqlcode %d in line %d, '%s'.\n", code, line, sqlca.sqlerrm.sqlerrmc);
|
||||
|
||||
/* free all memory we have allocated for the user */
|
||||
ECPGfree_auto_mem();
|
||||
}
|
||||
|
||||
/* Set the error message string from the backend */
|
||||
void
|
||||
set_backend_err(const char *err, int lineno)
|
||||
{
|
||||
if (ECPGerr)
|
||||
ECPGfree(ECPGerr);
|
||||
|
||||
if (!err)
|
||||
{
|
||||
ECPGerr = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
ECPGerr = ECPGstrdup(err, lineno);
|
||||
}
|
||||
|
||||
/* Retrieve the error message from the backend. */
|
||||
char *
|
||||
ECPGerrmsg(void)
|
||||
{
|
||||
return ECPGerr;
|
||||
}
|
||||
|
||||
/* print out an error message */
|
||||
void
|
||||
sqlprint(void)
|
||||
{
|
||||
sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
|
||||
fprintf(stderr, "sql error %s\n", sqlca.sqlerrm.sqlerrmc);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,102 +0,0 @@
|
||||
#ifndef _ECPG_LIB_EXTERN_H
|
||||
#define _ECPG_LIB_EXTERN_H
|
||||
|
||||
#include "postgres_fe.h"
|
||||
#include "libpq-fe.h"
|
||||
|
||||
/* Here are some methods used by the lib. */
|
||||
|
||||
/* Stores the backend error message for client access */
|
||||
void set_backend_err(const char *err, int lineon);
|
||||
|
||||
/* Store and retrieve the backend error message for client access */
|
||||
void set_backend_err(const char *err, int lineon);
|
||||
char *ECPGerrmsg(void);
|
||||
|
||||
/* Returns a pointer to a string containing a simple type name. */
|
||||
void ECPGadd_mem(void *ptr, int lineno);
|
||||
|
||||
bool ECPGget_data(const PGresult *, int, int, int, enum ECPGttype type,
|
||||
enum ECPGttype, char *, char *, long, long, long, bool);
|
||||
struct connection *ECPGget_connection(const char *);
|
||||
void ECPGinit_sqlca(void);
|
||||
char *ECPGalloc(long, int);
|
||||
void ECPGfree(void *);
|
||||
bool ECPGinit(const struct connection *, const char *, const int);
|
||||
char *ECPGstrdup(const char *, int);
|
||||
const char *ECPGtype_name(enum ECPGttype);
|
||||
unsigned int ECPGDynamicType(Oid);
|
||||
void ECPGfree_auto_mem(void);
|
||||
void ECPGclear_auto_mem(void);
|
||||
|
||||
/* A generic varchar type. */
|
||||
struct ECPGgeneric_varchar
|
||||
{
|
||||
int len;
|
||||
char arr[1];
|
||||
};
|
||||
|
||||
/*
|
||||
* type information cache
|
||||
*/
|
||||
|
||||
struct ECPGtype_information_cache
|
||||
{
|
||||
struct ECPGtype_information_cache *next;
|
||||
int oid;
|
||||
bool isarray;
|
||||
};
|
||||
|
||||
/* structure to store one statement */
|
||||
struct statement
|
||||
{
|
||||
int lineno;
|
||||
char *command;
|
||||
struct connection *connection;
|
||||
struct variable *inlist;
|
||||
struct variable *outlist;
|
||||
};
|
||||
|
||||
/* structure to store connections */
|
||||
struct connection
|
||||
{
|
||||
char *name;
|
||||
PGconn *connection;
|
||||
bool committed;
|
||||
int autocommit;
|
||||
struct ECPGtype_information_cache *cache_head;
|
||||
struct connection *next;
|
||||
};
|
||||
|
||||
/* structure to store descriptors */
|
||||
struct descriptor
|
||||
{
|
||||
char *name;
|
||||
PGresult *result;
|
||||
struct descriptor *next;
|
||||
};
|
||||
|
||||
struct variable
|
||||
{
|
||||
enum ECPGttype type;
|
||||
void *value;
|
||||
void *pointer;
|
||||
long varcharsize;
|
||||
long arrsize;
|
||||
long offset;
|
||||
enum ECPGttype ind_type;
|
||||
void *ind_value;
|
||||
void *ind_pointer;
|
||||
long ind_varcharsize;
|
||||
long ind_arrsize;
|
||||
long ind_offset;
|
||||
struct variable *next;
|
||||
};
|
||||
|
||||
PGresult **
|
||||
ECPGdescriptor_lvalue(int line, const char *descriptor);
|
||||
|
||||
bool ECPGstore_result(const PGresult *results, int act_field,
|
||||
const struct statement * stmt, struct variable * var);
|
||||
|
||||
#endif /* _ECPG_LIB_EXTERN_H */
|
@ -1,95 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/memory.c,v 1.9 2002/09/04 20:31:46 momjian Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
|
||||
void
|
||||
ECPGfree(void *ptr)
|
||||
{
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
char *
|
||||
ECPGalloc(long size, int lineno)
|
||||
{
|
||||
char *new = (char *) calloc(1L, size);
|
||||
|
||||
if (!new)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_OUT_OF_MEMORY, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(new, '\0', size);
|
||||
return (new);
|
||||
}
|
||||
|
||||
char *
|
||||
ECPGstrdup(const char *string, int lineno)
|
||||
{
|
||||
char *new = strdup(string);
|
||||
|
||||
if (!new)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_OUT_OF_MEMORY, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (new);
|
||||
}
|
||||
|
||||
/* keep a list of memory we allocated for the user */
|
||||
static struct auto_mem
|
||||
{
|
||||
void *pointer;
|
||||
struct auto_mem *next;
|
||||
} *auto_allocs = NULL;
|
||||
|
||||
void
|
||||
ECPGadd_mem(void *ptr, int lineno)
|
||||
{
|
||||
struct auto_mem *am = (struct auto_mem *) ECPGalloc(sizeof(struct auto_mem), lineno);
|
||||
|
||||
am->pointer = ptr;
|
||||
am->next = auto_allocs;
|
||||
auto_allocs = am;
|
||||
}
|
||||
|
||||
void
|
||||
ECPGfree_auto_mem(void)
|
||||
{
|
||||
struct auto_mem *am;
|
||||
|
||||
/* free all memory we have allocated for the user */
|
||||
for (am = auto_allocs; am;)
|
||||
{
|
||||
struct auto_mem *act = am;
|
||||
|
||||
am = am->next;
|
||||
ECPGfree(act->pointer);
|
||||
ECPGfree(act);
|
||||
}
|
||||
|
||||
auto_allocs = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ECPGclear_auto_mem(void)
|
||||
{
|
||||
struct auto_mem *am;
|
||||
|
||||
/* free just our own structure */
|
||||
for (am = auto_allocs; am;)
|
||||
{
|
||||
struct auto_mem *act = am;
|
||||
|
||||
am = am->next;
|
||||
ECPGfree(act);
|
||||
}
|
||||
|
||||
auto_allocs = NULL;
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/misc.c,v 1.13 2002/09/04 20:31:46 momjian Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
|
||||
static struct sqlca sqlca_init =
|
||||
{
|
||||
{
|
||||
'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '
|
||||
},
|
||||
sizeof(struct sqlca),
|
||||
0,
|
||||
{
|
||||
0,
|
||||
{
|
||||
0
|
||||
}
|
||||
},
|
||||
{
|
||||
'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
static int simple_debug = 0;
|
||||
static FILE *debugstream = NULL;
|
||||
|
||||
void
|
||||
ECPGinit_sqlca(void)
|
||||
{
|
||||
memcpy((char *) &sqlca, (char *) &sqlca_init, sizeof(sqlca));
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGinit(const struct connection * con, const char *connection_name, const int lineno)
|
||||
{
|
||||
ECPGinit_sqlca();
|
||||
if (con == NULL)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_NO_CONN, connection_name ? connection_name : "NULL");
|
||||
return (false);
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGstatus(int lineno, const char *connection_name)
|
||||
{
|
||||
struct connection *con = ECPGget_connection(connection_name);
|
||||
|
||||
if (!ECPGinit(con, connection_name, lineno))
|
||||
return (false);
|
||||
|
||||
/* are we connected? */
|
||||
if (con->connection == NULL)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_NOT_CONN, con->name);
|
||||
return false;
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGtrans(int lineno, const char *connection_name, const char *transaction)
|
||||
{
|
||||
PGresult *res;
|
||||
struct connection *con = ECPGget_connection(connection_name);
|
||||
|
||||
if (!ECPGinit(con, connection_name, lineno))
|
||||
return (false);
|
||||
|
||||
ECPGlog("ECPGtrans line %d action = %s connection = %s\n", lineno, transaction, con->name);
|
||||
|
||||
/* if we have no connection we just simulate the command */
|
||||
if (con && con->connection)
|
||||
{
|
||||
/*
|
||||
* if we are not in autocommit mode, already have committed the
|
||||
* transaction and get another commit, just ignore it
|
||||
*/
|
||||
if (!con->committed || con->autocommit)
|
||||
{
|
||||
if ((res = PQexec(con->connection, transaction)) == NULL)
|
||||
{
|
||||
ECPGraise(lineno, ECPG_TRANS, NULL);
|
||||
return FALSE;
|
||||
}
|
||||
PQclear(res);
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(transaction, "commit") == 0 || strcmp(transaction, "rollback") == 0)
|
||||
{
|
||||
con->committed = true;
|
||||
|
||||
/* deallocate all prepared statements */
|
||||
if (!ECPGdeallocate_all(lineno))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ECPGdebug(int n, FILE *dbgs)
|
||||
{
|
||||
simple_debug = n;
|
||||
debugstream = dbgs;
|
||||
ECPGlog("ECPGdebug: set to %d\n", simple_debug);
|
||||
}
|
||||
|
||||
void
|
||||
ECPGlog(const char *format,...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (simple_debug)
|
||||
{
|
||||
char *f = (char *) malloc(strlen(format) + 100);
|
||||
|
||||
if (!f)
|
||||
return;
|
||||
|
||||
sprintf(f, "[%d]: %s", (int) getpid(), format);
|
||||
|
||||
va_start(ap, format);
|
||||
vfprintf(debugstream, f, ap);
|
||||
va_end(ap);
|
||||
|
||||
ECPGfree(f);
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* pg_type.h
|
||||
* definition of the system "type" relation (pg_type)
|
||||
* along with the relation's initial contents.
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: pg_type.h,v 1.7 2002/06/20 20:29:53 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* the genbki.sh script reads this file and generates .bki
|
||||
* information from the DATA() statements.
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef PG_TYPE_H
|
||||
#define PG_TYPE_H
|
||||
|
||||
/* ----------------
|
||||
* initial contents of pg_type
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
/* keep the following ordered by OID so that later changes can be made easier*/
|
||||
|
||||
/* OIDS 1 - 99 */
|
||||
#define BOOLOID 16
|
||||
#define BYTEAOID 17
|
||||
#define CHAROID 18
|
||||
#define NAMEOID 19
|
||||
#define INT8OID 20
|
||||
#define INT2OID 21
|
||||
#define INT2VECTOROID 22
|
||||
#define INT4OID 23
|
||||
#define REGPROCOID 24
|
||||
#define TEXTOID 25
|
||||
#define OIDOID 26
|
||||
#define TIDOID 27
|
||||
#define XIDOID 28
|
||||
#define CIDOID 29
|
||||
#define OIDVECTOROID 30
|
||||
#define POINTOID 600
|
||||
#define LSEGOID 601
|
||||
#define PATHOID 602
|
||||
#define BOXOID 603
|
||||
#define POLYGONOID 604
|
||||
#define LINEOID 628
|
||||
#define FLOAT4OID 700
|
||||
#define FLOAT8OID 701
|
||||
#define ABSTIMEOID 702
|
||||
#define RELTIMEOID 703
|
||||
#define TINTERVALOID 704
|
||||
#define UNKNOWNOID 705
|
||||
#define CIRCLEOID 718
|
||||
#define CASHOID 790
|
||||
#define INETOID 869
|
||||
#define CIDROID 650
|
||||
#define BPCHAROID 1042
|
||||
#define VARCHAROID 1043
|
||||
#define DATEOID 1082
|
||||
#define TIMEOID 1083
|
||||
#define TIMESTAMPOID 1114
|
||||
#define TIMESTAMPTZOID 1184
|
||||
#define INTERVALOID 1186
|
||||
#define TIMETZOID 1266
|
||||
#define ZPBITOID 1560
|
||||
#define VARBITOID 1562
|
||||
#define NUMERICOID 1700
|
||||
|
||||
#endif /* PG_TYPE_H */
|
@ -1,155 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/prepare.c,v 1.12 2001/12/23 12:17:41 meskes Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "ecpgerrno.h"
|
||||
#include "extern.h"
|
||||
#include "sqlca.h"
|
||||
|
||||
static struct prepared_statement
|
||||
{
|
||||
char *name;
|
||||
struct statement *stmt;
|
||||
struct prepared_statement *next;
|
||||
} *prep_stmts = NULL;
|
||||
|
||||
static bool
|
||||
isvarchar(unsigned char c)
|
||||
{
|
||||
if (isalnum(c))
|
||||
return true;
|
||||
|
||||
if (c == '_' || c == '>' || c == '-' || c == '.')
|
||||
return true;
|
||||
|
||||
if (c >= 128)
|
||||
return true;
|
||||
|
||||
return (false);
|
||||
}
|
||||
|
||||
static void
|
||||
replace_variables(char *text)
|
||||
{
|
||||
char *ptr = text;
|
||||
bool string = false;
|
||||
|
||||
for (; *ptr != '\0'; ptr++)
|
||||
{
|
||||
if (*ptr == '\'')
|
||||
string = string ? false : true;
|
||||
|
||||
if (!string && *ptr == ':')
|
||||
{
|
||||
*ptr = '?';
|
||||
for (++ptr; *ptr && isvarchar(*ptr); ptr++)
|
||||
*ptr = ' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* handle the EXEC SQL PREPARE statement */
|
||||
bool
|
||||
ECPGprepare(int lineno, char *name, char *variable)
|
||||
{
|
||||
struct statement *stmt;
|
||||
struct prepared_statement *this;
|
||||
|
||||
/* check if we already have prepared this statement */
|
||||
for (this = prep_stmts; this != NULL && strcmp(this->name, name) != 0; this = this->next);
|
||||
if (this)
|
||||
{
|
||||
bool b = ECPGdeallocate(lineno, name);
|
||||
|
||||
if (!b)
|
||||
return false;
|
||||
}
|
||||
|
||||
this = (struct prepared_statement *) ECPGalloc(sizeof(struct prepared_statement), lineno);
|
||||
if (!this)
|
||||
return false;
|
||||
|
||||
stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno);
|
||||
if (!stmt)
|
||||
{
|
||||
ECPGfree(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* create statement */
|
||||
stmt->lineno = lineno;
|
||||
stmt->connection = NULL;
|
||||
stmt->command = ECPGstrdup(variable, lineno);
|
||||
stmt->inlist = stmt->outlist = NULL;
|
||||
|
||||
/* if we have C variables in our statment replace them with '?' */
|
||||
replace_variables(stmt->command);
|
||||
|
||||
/* add prepared statement to our list */
|
||||
this->name = ECPGstrdup(name, lineno);
|
||||
this->stmt = stmt;
|
||||
|
||||
if (prep_stmts == NULL)
|
||||
this->next = NULL;
|
||||
else
|
||||
this->next = prep_stmts;
|
||||
|
||||
prep_stmts = this;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* handle the EXEC SQL DEALLOCATE PREPARE statement */
|
||||
bool
|
||||
ECPGdeallocate(int lineno, char *name)
|
||||
{
|
||||
struct prepared_statement *this,
|
||||
*prev;
|
||||
|
||||
/* check if we really have prepared this statement */
|
||||
for (this = prep_stmts, prev = NULL; this != NULL && strcmp(this->name, name) != 0; prev = this, this = this->next);
|
||||
if (this)
|
||||
{
|
||||
/* okay, free all the resources */
|
||||
ECPGfree(this->name);
|
||||
ECPGfree(this->stmt->command);
|
||||
ECPGfree(this->stmt);
|
||||
if (prev != NULL)
|
||||
prev->next = this->next;
|
||||
else
|
||||
prep_stmts = this->next;
|
||||
|
||||
ECPGfree(this);
|
||||
return true;
|
||||
}
|
||||
ECPGraise(lineno, ECPG_INVALID_STMT, name);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
ECPGdeallocate_all(int lineno)
|
||||
{
|
||||
/* deallocate all prepared statements */
|
||||
while (prep_stmts != NULL)
|
||||
{
|
||||
bool b = ECPGdeallocate(lineno, prep_stmts->name);
|
||||
|
||||
if (!b)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* return the prepared statement */
|
||||
char *
|
||||
ECPGprepared_statement(char *name)
|
||||
{
|
||||
struct prepared_statement *this;
|
||||
|
||||
for (this = prep_stmts; this != NULL && strcmp(this->name, name) != 0; this = this->next);
|
||||
return (this) ? this->stmt->command : NULL;
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/typename.c,v 1.21 2001/10/28 06:26:11 momjian Exp $ */
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "ecpgtype.h"
|
||||
#include "ecpglib.h"
|
||||
#include "extern.h"
|
||||
#include "sql3types.h"
|
||||
#include "pg_type.h"
|
||||
|
||||
/*
|
||||
* This function is used to generate the correct type names.
|
||||
*/
|
||||
const char *
|
||||
ECPGtype_name(enum ECPGttype typ)
|
||||
{
|
||||
switch (typ)
|
||||
{
|
||||
case ECPGt_char:
|
||||
return "char";
|
||||
case ECPGt_unsigned_char:
|
||||
return "unsigned char";
|
||||
case ECPGt_short:
|
||||
return "short";
|
||||
case ECPGt_unsigned_short:
|
||||
return "unsigned short";
|
||||
case ECPGt_int:
|
||||
return "int";
|
||||
case ECPGt_unsigned_int:
|
||||
return "unsigned int";
|
||||
case ECPGt_long:
|
||||
return "long";
|
||||
case ECPGt_unsigned_long:
|
||||
return "unsigned long";
|
||||
case ECPGt_long_long:
|
||||
return "long long";
|
||||
case ECPGt_unsigned_long_long:
|
||||
return "unsigned long long";
|
||||
case ECPGt_float:
|
||||
return "float";
|
||||
case ECPGt_double:
|
||||
return "double";
|
||||
case ECPGt_bool:
|
||||
return "bool";
|
||||
case ECPGt_varchar:
|
||||
return "varchar";
|
||||
case ECPGt_char_variable:
|
||||
return "char";
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
ECPGDynamicType(Oid type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case BOOLOID:
|
||||
return SQL3_BOOLEAN; /* bool */
|
||||
case INT2OID:
|
||||
return SQL3_SMALLINT; /* int2 */
|
||||
case INT4OID:
|
||||
return SQL3_INTEGER; /* int4 */
|
||||
case TEXTOID:
|
||||
return SQL3_CHARACTER; /* text */
|
||||
case FLOAT4OID:
|
||||
return SQL3_REAL; /* float4 */
|
||||
case FLOAT8OID:
|
||||
return SQL3_DOUBLE_PRECISION; /* float8 */
|
||||
case BPCHAROID:
|
||||
return SQL3_CHARACTER; /* bpchar */
|
||||
case VARCHAROID:
|
||||
return SQL3_CHARACTER_VARYING; /* varchar */
|
||||
case DATEOID:
|
||||
return SQL3_DATE_TIME_TIMESTAMP; /* date */
|
||||
case TIMEOID:
|
||||
return SQL3_DATE_TIME_TIMESTAMP; /* time */
|
||||
case TIMESTAMPOID:
|
||||
return SQL3_DATE_TIME_TIMESTAMP; /* datetime */
|
||||
case NUMERICOID:
|
||||
return SQL3_NUMERIC; /* numeric */
|
||||
default:
|
||||
return -type;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user