home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / test / testmmgr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  3.1 KB  |  140 lines

  1. static    char    testfuncs_c[] = "$Header: /private/postgres/src/test/RCS/testmmgr.c,v 1.6 1990/06/07 18:20:56 cimarron Version_2 $";
  2.  
  3. #include <signal.h>
  4. #include <stdio.h>
  5. #include <setjmp.h>
  6. #include <strings.h>
  7. #include "log.h"
  8. #include "skey.h"
  9. #include "fmgr.h"
  10.  
  11. /*
  12.  *      testmmgr.c      - fmgr/mmgr.c test program
  13.  */
  14.  
  15. #define    BUFFER_SIZE    120
  16.  
  17. static  char    Buf[MAXPGPATH];
  18. jmp_buf Warn_restart;
  19.  
  20. handle_warn()
  21. {
  22.         extern  jmp_buf Warn_restart;
  23.  
  24.         longjmp(Warn_restart);
  25. }
  26.  
  27. main(argc, argv)
  28. int    argc;
  29. char    *argv[];
  30. {
  31.     char        *datname;
  32.     char        *s;
  33.     extern    jmp_buf    Warn_restart;
  34.     int        geteuid(), setuid();            /* uid_t */
  35.     int        chdir(), setjmp(), fprintf(), isatty();
  36.     char        *getenv();
  37.     extern        setbuf(), exitpg();
  38.     int        cinit();
  39.     extern        resetmmgr(), bflush(), elog();
  40.     char        *fmgr(), *endmmgr();
  41.     extern        startmmgr(), reportmmgr();
  42.     char        *get_object();
  43.  
  44.     if (argc > 2) {
  45.         fprintf(stderr, "Usage: %s [datname]\n", rindex(argv[0], '/') ?
  46.             rindex(argv[0], '/') + 1 : argv[0]);
  47.         exitpg(1);
  48.     }
  49.     if (argc == 2)
  50.         datname = argv[1];
  51.     else if ((datname = getenv("USER")) == (char *)NULL) {
  52.         fprintf(stderr, "failed getenv(\"USER\")");
  53.         exitpg(1);
  54.     }
  55.     if (!cinit(Buf, datname, (XID *)NULL)) {
  56.         fprintf("cinit failed");
  57.         exitpg(1);
  58.     }
  59.     if (chdir(Buf) < 0)
  60.         elog(FATAL, "chdir(\"%s\"): %m", Buf);
  61.     if (!isatty(fileno(stdout)) && !isatty(fileno(stderr))) {
  62.         setbuf(stdout, (char *)NULL);
  63.         setbuf(stderr, (char *)NULL);
  64.     }
  65.     reportmmgr();
  66.     setuid(geteuid());
  67.     signal(SIGHUP, handle_warn);
  68.     if (setjmp(Warn_restart) != NULL) {
  69.         bflush();
  70.         resetmmgr();
  71.         Xact.xa_topcxt.ct_status &= ~CT_BOOTSTRAP;    /* needed??? */
  72.     }
  73.  
  74.     for (;;) {
  75.         startmmgr(!Curmem->mh_flags);
  76.         printf("**Mode is %d**\n", Curmem->mh_flags);
  77.         if ((s = get_object("Enter a text string: ", F_TEXTIN,
  78.                 F_TEXTOUT)) == NULL)
  79.             break;
  80.         printf("External rep. is \"%s\"\n", s);
  81.         startmmgr(Curmem->mh_flags);
  82.         if ((s = get_object("Enter a bytea string: ", F_BYTEAIN,
  83.                 F_BYTEAOUT)) == NULL)
  84.             break;
  85.         printf("External rep. is \"%s\"\n", s);
  86.         printf("After endmmgr is \"%s\"\n", endmmgr(s));
  87.     }
  88.     reportmmgr();
  89.     cleanup();
  90.     reportmmgr();
  91. }
  92.  
  93. char    *
  94. get_object(request, inputf, outputf)
  95. char    request[];
  96. OID    inputf, outputf;
  97. {
  98.     char        *s;
  99.     struct    varlena    *vlena;
  100.     int        i;
  101.     static    char    buf[BUFFER_SIZE];
  102.     char        *fmgr();
  103.     extern        pfree();
  104.     int        fputs(), printf();
  105.  
  106.     fputs(request, stdout);
  107.     fgets(buf, BUFFER_SIZE, stdin);
  108.     if (feof(stdin))
  109.         return(NULL);
  110.     *rindex(buf, '\n') = '\0';
  111.     if ((vlena = (struct varlena *)fmgr(inputf, buf)) != NULL) {
  112.         printf("Internal rep. of \"%s\" has length %d.\n", buf,
  113.             vlena->vl_len - sizeof (vlena->vl_len));
  114.         printf("Bytes are as follows:  \"");
  115.         for (i = 0; i < vlena->vl_len - sizeof (vlena->vl_len); i++)
  116.             putchar(vlena->vl_dat[i]);
  117.         putchar('"');
  118.         putchar('\n');
  119.     } else
  120.         printf("Internal rep. of \"%s\" is NULL.\n", buf);
  121.     s = fmgr(outputf, (char *)vlena);
  122.     if (vlena != NULL)
  123.         pfree((char *)vlena);
  124.     return(s);
  125. }
  126.  
  127. cleanup()
  128. {
  129.     static    int    beenhere = 0;
  130.  
  131.     if (!beenhere)
  132.         beenhere = 1;
  133.     else {
  134.         puts("Memory manager fault: cleanup called twice.");
  135.         exitpg(1);
  136.     }
  137.     puts("** clean up and exit **");
  138.     resetmmgr();
  139. }
  140.