testM2.ec
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:3k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * $Id$
  3.  *
  4.  * This file is a part of GNU SQL Server
  5.  *
  6.  * Copyright (c) 1996, Free Software Foundation, Inc
  7.  * Developed at Institute of System Programming of Russian Academy of Science
  8.  * This file is written by Michael Kimelman
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify it under
  11.  * the terms of the GNU General Public License as published by the Free
  12.  * Software Foundation; either version 2 of the License, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful, but WITHOUT
  16.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  18.  * more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License along with
  21.  * this program; if not, write to the Free Software Foundation, Inc.,
  22.  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  * Contacts: gss@ispras.ru
  25.  */
  26. #include <signal.h>
  27. #include <sys/wait.h>
  28. $ whenever sqlerror goto errexit;
  29. int
  30. show_1(void)
  31. {
  32.   char t1[40];
  33.   int k1;
  34.   
  35.   $ declare show1 cursor for
  36.     ( select k1,t1 
  37.       from tbl1 )
  38.     ;
  39.    $ open show1;
  40.   fputs("---------------------c1---------------------------n",stdout);
  41.   while(1) 
  42.     {
  43.       $ fetch show1 into :k1, :t1;
  44.       if(SQLCODE==100) break;
  45.       printf("n|%7d|%40s| ",k1,t1);
  46.     }
  47.   fputs("n---------------------c1---------------------------n",stdout);
  48.   $ close show1;
  49.   return 0;
  50. errexit:
  51.   return SQLCODE;
  52. }
  53. static volatile int lock = 0;
  54. void
  55. catch(int sig)
  56. {
  57.   
  58.   if (sig==SIGUSR1)
  59.     lock = 0;
  60.   return;
  61. }
  62. #define wait_usr()   { lock = 0; signal(SIGUSR1,catch); while(lock) sleep(1); }
  63. #define EXIT         { if (cld) { kill(cld,SIGKILL); cld = 0; } return 1;     }
  64. int
  65. main(int argc,char **argv)
  66. {
  67.   int   pass = 0;
  68.   int   i,j,k;
  69.   pid_t cld = 0;
  70.   
  71.   printf("pass %d...n",pass++);
  72.   
  73.   printf("let's see the junkn");
  74.   if (show_1())
  75.     EXIT;       
  76.   printf("delete it now ...n");
  77.   $ delete from tbl1 ;
  78.   printf("and see again...n");
  79.   if (show_1())
  80.     EXIT;       
  81.   $ commit work;
  82.   cld = fork();
  83.   if (cld)
  84.     {
  85.       printf("Hi: I'm the son and going to insert data ...n");
  86.       for(i = 0; i < 10 ; i++ )
  87.         {
  88.           int v;
  89.           char s[50];
  90.           v=i+1;
  91.           sprintf(s,"k=%10d",v);
  92.       
  93.           $ insert into tbl1 (k1,t1)
  94.             values (:v,:s );
  95.           if (i == 5)
  96.             {
  97.               printf("Son: let's see can the parent read something ...n");
  98.               kill(getppid(),SIGUSR1);
  99.               wait_usr();
  100.             }
  101.         }
  102.       $ commit work;
  103.       printf("Son: and how about seeing now - after my death!!n");
  104.       return 0;           /* rollback on exit */
  105.     }
  106.   
  107.   wait_usr();
  108.   if (show_1())
  109.     EXIT;
  110.   kill(cld,SIGUSR1); 
  111.   wait(NULL);
  112.   cld = 0;
  113.   
  114.   if (show_1())
  115.     EXIT;         /* should be automatically disconnect with       */
  116.   $ commit work;
  117.   
  118.   return 0;
  119. errexit:
  120.   EXIT;
  121. }