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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  gsql_cli.c  -  top level routine of GNU SQL compiler client
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by Michael Kimelman.
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: gsql_cli.c,v 1.247 1997/04/24 14:20:25 kml Exp $ */
  28. /*
  29.  * Macro __CLIENT__ has to be defined here to mark this file as a main
  30.  * file on the client part of compiler.  
  31.  */
  32. #define __CLIENT__
  33. #include "setup_os.h"
  34. #include <stdio.h>
  35. #include "gsqltrn.h"
  36. #include "sql_decl.h"
  37. #include "xmem.h"
  38. #include "cl_lib.h"
  39. #include "sql.h"
  40. #include <assert.h>
  41. int scanner(void);
  42. static CLIENT *comp_srv = NULL;
  43. static char *server_host_name=NULL;
  44. #include "options.c"
  45. #include "cs_link.c"            /* "cs" means client/server */
  46. #define SERVER_CALL(res,routine,parmptr,message) 
  47.   {  
  48.     start_compiler_server();  
  49.     res = routine (parmptr, comp_srv);    
  50.     if (!call_epilogue(res,message))  
  51.       return 0;  
  52.   }
  53. /*------------------------------------------------------------------------*/
  54. static int          Argc       = 0;
  55. static char       **Argv       = NULL;
  56. static int          prep_done  = 0;
  57. static stmt_info_t *st         = NULL;
  58. static int          subst_to_c = 0;
  59. static void
  60. start_compiler_server (void)
  61. {
  62.   /* 
  63.    * this call make connection to service server and register
  64.    * reaction for unlinking it on exit 
  65.    */
  66.   if (!comp_srv)
  67.     comp_srv = create_service(server_host_name,COMPILE_SVC,300,-1,-1);
  68.   if (!comp_srv)
  69.     yyfatal(clnt_error_msg());
  70. }
  71. static void 
  72. disconnect_compiler_server (void)
  73. {
  74.   if (comp_srv)
  75.     {
  76.       down_svc (comp_srv);
  77.       comp_srv = NULL;
  78.     }
  79. }
  80. static void
  81. close_all(void)
  82. {
  83.   close_out_files ();
  84.   close_file(NULL,"c");
  85.   while (st)
  86.     {
  87.       stmt_info_t *lst = st;
  88.       st = st->next;
  89.       free(lst);
  90.     }
  91. }
  92. static int
  93. call_epilogue(result_t *res,char *message)
  94. {
  95.   if (!res)
  96.     {
  97.       if (svc_ready(comp_srv,0,0,0) > 0)
  98.         res = retry_1 ((void*)1, comp_srv);
  99.       else
  100.         {
  101.           yyerror (clnt_error_msg());
  102.           close_all();
  103.           return 0;
  104.         }
  105.     }
  106.   if (!res)
  107.     {
  108.       clnt_perror (comp_srv, message);
  109.       close_all();
  110.       return 0;
  111.     }
  112.   if (res->info.rett == RET_COMP)
  113.     {
  114.       put_files_bufs (res->info.return_data_u.comp_ret.bufs);
  115.       errors += res->info.return_data_u.comp_ret.errors;
  116.     }
  117.   if (res->sqlcode<0)
  118.     {
  119.       /* yyerror ("gsqlca.errmsg); */
  120.       close_all();
  121.       return 0;
  122.     }
  123.   return 1;
  124. }
  125. /*------------------------------------------------------------------------*/
  126. int
  127. prepare_statement (char *stmt, i4_t bline, char **repl)
  128. {
  129.   stmt_info_t *lst;
  130.   static char  replace[1024];
  131.   lst = (stmt_info_t*) xmalloc(sizeof(*st));
  132.   lst->stmt      = savestring ( stmt );
  133.   lst->stmt_name = "";
  134.   lst->bline     = bline;
  135.   lst->next      = NULL;
  136.   if (!st)
  137.     st           = lst;
  138.   else
  139.     {
  140.       stmt_info_t *st1 = st;
  141.       while(st1->next)
  142.         st1 = st1->next;
  143.       st1->next  = lst;
  144.     }
  145.   if (repl)
  146.     {
  147.       assert(!subst_to_c);
  148.       sprintf(replace,"SQL__subst_%d n",prep_done);
  149.       *repl = replace;
  150.     }
  151.   else if (prep_done==0)
  152.     subst_to_c = 1;
  153.   else
  154.     {
  155.       assert(subst_to_c);
  156.     }
  157.   prep_done++;
  158.   return 1;
  159. }/*-----------------------------------------------------------------------*/
  160. static int
  161. process_file (char *flname)
  162. {
  163.   progname = flname;
  164.   prep_done = subst_to_c = 0;
  165.   if (!progname)
  166.     sql_prg = "gsql";
  167.   else
  168.     {
  169.       char b[120];
  170.       register char *p;
  171.       strcpy (b, progname);
  172.       p = b + strlen (b) - 1;
  173.       while ( p > b && *p != '.' && *p != '/' )
  174.         p--;
  175.       if (*p=='.')
  176.         *p = 0;
  177.       while ( p > b && *p != '/' )
  178.         p--;
  179.       if (*p=='/')
  180.         p++;
  181.       sql_prg = savestring (p);
  182.     }
  183.   /*
  184.    * Connection to gsql administrator and creating CLIENT handle to
  185.    * started compiler server
  186.    */
  187.   open_out_files();
  188.   if (scanner ())
  189.     if (st)
  190.       {
  191.         init_params_t ip;
  192.         result_t      *r;
  193.         ip.init_params_t_len=Argc;
  194.         ip.init_params_t_val=Argv;
  195.         
  196.         SERVER_CALL(r,init_comp_1,&ip,"server compiler initialization");
  197.         SERVER_CALL(r,compile_1,st,"compile module request");
  198.         if (errors==0)
  199.           gen_substitution(subst_to_c,get_host(comp_srv),
  200.                            &(r->info.return_data_u.comp_ret));
  201.         while (st)
  202.           {
  203.             stmt_info_t *lst = st;
  204.             st = st -> next;
  205.             xfree (lst->stmt);
  206.             xfree (lst);
  207.           }
  208.         disconnect_compiler_server();
  209.       }
  210.   close_all();
  211.   return 1;
  212. }/*-----------------------------------------------------------------------*/
  213. i4_t 
  214. main (i4_t argc, char *argv[])
  215. {
  216.   i4_t i, done, errs;
  217.   read_options (argc, argv);
  218.   Argc = argc;
  219.   Argv = argv;
  220.   done = 0;
  221.   errs = 0;
  222.   for (i = 1; i < argc; i++)
  223.     if (argv[i][0] != '-')
  224.       {
  225.         i4_t rc;
  226. errors = 0;
  227.         rc = process_file (argv[i]);
  228. errs += errors;
  229.         if (!rc)
  230.           goto FATAL_EXIT;
  231.         done = 1;
  232.       }
  233.   if (done == 0)
  234.     {
  235.       fprintf(stderr,"Usage: gsql [options] prognames...n");
  236.     }
  237. FATAL_EXIT:
  238.   return errs || !done ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
  239. }/*-----------------------------------------------------------------------*/