ftp.nice.ch/pub/next/database/postgres-4.2/postgresLibs.NIHS.b.tar.gz#/postgresLibs.pkg/postgresLibs.tar.gz#/contrib/xposthelp/PostgresRoutines.c

This is PostgresRoutines.c in view mode; [Download] [Up]

/*
 * /usr/local/devel/postgres-v4r2/src/contrib/xposthelp/RCS/PostgresRoutines.c,v 1.1 1993/07/24 03:03:50 aoki Exp
 */

#include "tmp/libpq.h"
#include "utils/geo-decls.h"

#include "xposthelp.h"

/**********************************************************
* Getting POSTGRES Table Info.                            *
**********************************************************/

int GetDBases(user_name)
     char *user_name;
{
  PortalBuffer *portalbuf;
  char         *res, str[200];
  int          ntups, tupno, ret_status;

  /* Get user name */
  ret_status = FindUser(user_name, &user_num);

  if (ret_status != NO_ERROR)
    return(ret_status);

  /* Open up database */
  PQsetdb("postgres");
  
  /* Start up processing */
  PQexec("begin");
  
  /* Define query for this table */
  sprintf(str, 
	  "retrieve iportal junk (p.datname) from p in pg_database where p.datdba = \"%d\" sort by datname", 
	  user_num);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  /* Get number of tuples in relation */
  ntups = PQntuplesGroup(portalbuf, 0);
  
  dbs_num = ntups;

  if (dbs_num > MAX_DBS)
    return(NO_DBS);
  
  for (tupno = 0; tupno < ntups; tupno++) 
    strcpy(dbs[tupno], PQgetvalue(portalbuf,tupno,0));
  
  PQexec("end");
  
  PQfinish();
  
  return(NO_ERROR);

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);
}




/*************************************************
 *                                               *
 *  Given the user name it returns the user oid. *
 *                                               *
*************************************************/

int FindUser(name, oid)
     char *name;
     int  *oid;
{
  PortalBuffer *portalbuf;
  char         *res, str[200];
  int          ntups, ret_status;
  
  /* Open up database */
  PQsetdb("postgres");
  
  /* Start up processing */
  PQexec("begin");
  
  /* Define query for this table */
  sprintf(str,"retrieve portal junk (p.usesysid) from p in pg_user where p.usename = \"%s\"", name);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  /* Get number of tuples in relation */
  ntups = PQntuplesGroup(portalbuf, 0);
      
  if (ntups)
    {
      *oid = atoi(PQgetvalue(portalbuf,0,0));
      ret_status = NO_ERROR;
    }
  else
    {
      /* User does not exist */
      ret_status = NO_USER;
    }

  PQexec("end");
  PQfinish();
  return(ret_status);

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);

}



/*******************************
 *                             *
 *  Vacuum the given database. *
 *                             *
*******************************/

VacuumDBase(dbase)
     char *dbase;
{
  PortalBuffer *portalbuf;
  
  /* Open up database */
  PQsetdb(dbase);
  
  /* Start up processing */
  PQexec("begin");

  /* Vacuum the database */
  PQexec("vacuum");
  
  PQexec("end");
  PQfinish();

}




/********************************************
 *                                          *
 *   Get all tables for the given database. *
 *                                          *
********************************************/

GetTables(dbase)
     char *dbase;
{
  PortalBuffer *portalbuf;
  char         *res, str[200], attr_name[80];
  int          tupno, ntups, i;
  
  /* Open up database */
  PQsetdb(dbase);
  
  /* Start up processing */
  PQexec("begin");
  
  /* Define query for this table */
  sprintf(str, 
	  "retrieve portal junk (p.relname,p.relkind,p.relhasindex, p.oid, p.reltuples) from p in pg_class where p.relowner = \"%d\" sort by relname", user_num);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  /* Get number of tuples in relation */
  ntups = PQntuplesGroup(portalbuf, 0);
  
  tbs_num = ntups;
  
  for (tupno = 0; tupno < ntups; tupno++) 
    {
      char *c;
      int  *tmp;
      
      strcpy(tbs[tupno].name, PQgetvalue(portalbuf,tupno,0));
      
      c = PQgetvalue(portalbuf,tupno,1);
      
      tbs[tupno].kind = (c[0] == 'r') ? 1 : 0;
      
      c = (char *)PQgetvalue(portalbuf,tupno,2);
      
      tbs[tupno].ind = (c[0] == 't') ? 1 : 0;
      
      strcpy(tbs[tupno].oid, PQgetvalue(portalbuf,tupno,3));
      
      c = (char *) PQgetvalue(portalbuf,tupno,4);
      
      
      tbs[tupno].numrec = atoi(c);
      
    }
  
  PQexec("end");
  PQfinish();
  return;

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);

}





/*********************************************
 *                                           *
 *   Get all attributes for the given table. *
 *                                           *
*********************************************/

GetAttributes(tableoid)
     char *tableoid;
{

  PortalBuffer *portalbuf;
  char         *res, str[200], attr_name[80], type_str[80];
  int          ngroups,tupno, grpno, ntups, nflds, i, fldno, attr_type, tuple_index;
  
  /* Start up processing */
  PQexec("begin");
  
  /* Define query for this table */
  sprintf(str, "retrieve iportal junk (p.attname, p.atttypid, p.attnum) from p in pg_attribute where p.attrelid = \"%s\" and p.attnum > 0 sort by attnum", tableoid);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  /* Get number of tuples in relation */
  ntups = PQntuplesGroup(portalbuf, 0);

  att_num = ntups;

  /* Get the attribute name for this group and field number */
  for (i = 0; i < ntups; i++)
    {
      int *tmp;

      strcpy(att[i].name, PQgetvalue(portalbuf,i,0));
      tmp = (int *) PQgetvalue(portalbuf,i,1);
      att[i].type = *tmp;

      switch(*tmp)
	{
	case 16:
	  strcpy(att[i].str_type, "boolean");
	  break;
	  
	case 18:
	  strcpy(att[i].str_type, "char");
	  break;
	  
	case 19:
	  strcpy(att[i].str_type, "char16");
	  break;
	  
	case 22:
	  strcpy(att[i].str_type, "array");
	  break;
	  
	case 23:
	  strcpy(att[i].str_type, "int4");
	  break;
	  
	case 25:
	  strcpy(att[i].str_type, "text");
	  break;
	  
	case 26:
	  strcpy(att[i].str_type, "oid");
	  break;
	  
	case 600:
	  strcpy(att[i].str_type, "point");
	  break;
	  
	case 601:
	  strcpy(att[i].str_type, "lseg");
	  break;
	  
	case 602:
	  strcpy(att[i].str_type, "path");
	  break;
	  
	case 603:
	  strcpy(att[i].str_type, "box");
	  break;
	  
	case 604:
	  strcpy(att[i].str_type, "polygon");
	  break;
	  
	case 700:
	  strcpy(att[i].str_type, "float4");
	  break;
	  
	case 701:
	  strcpy(att[i].str_type, "point");
	  break;
	  
	default:
	  strcpy(att[i].str_type, "other");
	  break;
	  
	}/* end switch */
      
    }/* end for loop on fldno */

  PQexec("end");
  PQfinish();
  return;

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);


}



/*********************************************
 *                                           *
 *   Get all index keys for the given index. *
 *                                           *
*********************************************/

GetIndexInfo(indexoid, index_on, ind_keys)
     char *indexoid,
          *index_on,
          *ind_keys;
{
  PortalBuffer *portalbuf;
  char         *res, str[200], relname[80];
  int          ntups, i, relid, numkeys;
  struct {
    int key;
    char attname[20];
  } keys[10];

  /* Start up processing */
  PQexec("begin");
  
  /****************************************
  * First let's find out the relation oid *
  * that was indexed by indexoid and the  *
  * correpondent index keys               *
  ****************************************/

  /* Define query for this table */
  sprintf(str,"retrieve portal junk (p.indrelid, p.indkey[1],p.indkey[2],p.indkey[3],p.indkey[4],p.indkey[5],p.indkey[6],p.indkey[7],p.indkey[8]) from p in pg_index where p.indexrelid = \"%s\"", indexoid);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  /* Get number of tuples in relation */
  ntups = PQntuplesGroup(portalbuf, 0);

  if (ntups)
    {
      char *tmp;

      tmp = (char *) PQgetvalue(portalbuf,0,0);

      /* relation oid on which the index is defined */
      relid = atoi(tmp);

      for (i = 1; i < 9; i++)
	{
	  /* Get each key attribute number */
	  tmp = (char *) PQgetvalue(portalbuf,0,i);

	  if (atoi(tmp) == 0)
	    break;

	  keys[i-1].key = atoi(tmp);

	}

      numkeys = i-1;

      /******************************************************
      *  Now for each key number and for the relation oid   *
      *  get the relation name and the attribute name       *
      ******************************************************/
      for (i = 0; i < numkeys; i++)
	{
	  PQexec("end");
	  PQfinish();
	  
	  /* Start up processing */
	  PQexec("begin");
  
	  /* Define query for this table */
	  sprintf(str,"retrieve portal junk (p.relname, pg_attribute.attname) from p in pg_class where p.oid = \"%d\" and pg_attribute.attnum = \"%d\" and pg_attribute.attrelid = \"%d\"", relid, keys[i].key, relid);

	  res = (char *)PQexec(str);
	  if (*res == 'E') 
	    {
	      printf("%s\nfailed",++res);
	      goto exit_error;
	    }
	  
	  res = (char *)PQexec("fetch all in junk");
	  if (*res != 'P') 
	    {
	      printf("\nno portal");
	      goto exit_error;
	    }
	  
	  /* Get portal buffer given portal name. */
	  portalbuf = PQparray(++res);
	  
	  /* Get number of tuples in relation */
	  ntups = PQntuplesGroup(portalbuf, 0);
	  
	  if (ntups)
	    {
	      strcpy(keys[i].attname, PQgetvalue(portalbuf,0,1));
	      strcpy(relname, PQgetvalue(portalbuf,0,0));
	    }
	}
      
      /* Put out info on relation name and key attribute names */
      strcpy(index_on, relname);

      strcpy(ind_keys, "");
      for (i=0; i< numkeys; i++)
	{
	  strcat(ind_keys, keys[i].attname);
	  strcat(ind_keys, "  ");
	}

    }

  PQexec("end");
  PQfinish();
  return;

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);



}



/************************************************
 *                                              *
 *   Get the index relation on the given table. *
 *                                              *
************************************************/

char *GetIndex(tableoid)
     char *tableoid;
{

  PortalBuffer *portalbuf;
  char         *res, str[200], index_name[80];
  
  /* Start up processing */
  PQexec("begin");
  
  /* Define query for this table */
  sprintf(str, "retrieve iportal junk (p.relname) from p in pg_class, q in pg_index where q.indrelid = \"%s\" and q.indexrelid = p.oid", tableoid);

  res = (char *)PQexec(str);
  if (*res == 'E') 
    {
      printf("%s\nfailed",++res);
      goto exit_error;
    }
  
  res = (char *)PQexec("fetch all in junk");
  if (*res != 'P') 
    {
      printf("\nno portal");
      goto exit_error;
    }
  
  /* Get portal buffer given portal name. */
  portalbuf = PQparray(++res);
  
  strcpy(index_name, PQgetvalue(portalbuf,0,0));


  PQexec("end");
  PQfinish();

  return(index_name);

 exit_error:
  PQexec("end");
  PQfinish();
  exit(1);


}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.