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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  dyn_client.c  -  top level routine of GNU dynamic SQL
  3.  *                   client runtime library
  4.  *
  5.  * This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by Konstantin Dyshlevoi.
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts: gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: dyn_client.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #define __CLIENT__
  30. #include "setup_os.h"
  31. #include "gsqltrn.h"
  32. #include "global.h"
  33. #include "sql.h"
  34. #include "dyn_funcs.h"
  35. #include "cl_lib.h"
  36. #define DYN_MODE
  37. #include "options.c"
  38. #undef  DYN_MODE
  39. #include "cs_link.c"            /* "cs" means client/server */
  40. static char *server_host_name=NULL;
  41. extern i4_t    static_int_fl;
  42. extern struct module interp_mdl;
  43. #define SERVER_PREP_CALL(res,routine,parmptr,message)  
  44.   {
  45.     i4_t err; 
  46.     res = routine (parmptr, interp_mdl.svc);
  47.     err = dyncall_epilogue(res,message);
  48.     if(err)
  49.       {
  50.         SQLCODE=err;
  51.         return SQLCODE;
  52.       }
  53.   }
  54. #define SERVER_CALL(res,routine,parmptr,message)
  55.     {
  56.       res = routine (parmptr, interp_mdl.svc);  
  57.       if (!res)
  58. {
  59.   clnt_perror (interp_mdl.svc, message);
  60.           SQLCODE=-ER_SERV;                     
  61.           return SQLCODE;
  62. }
  63.     }
  64. static i4_t Argc = 0;
  65. static char **Argv = NULL;
  66. int
  67. server_start (void)
  68. {
  69.   init_params_t ip;
  70.   result_t      *r;
  71.   
  72.   sql_prg = progname = "dynlog";
  73.   static_int_fl = 0;
  74.   interp_mdl.svc = create_service(server_host_name,DYNAMIC_SVC,-1,-1,-1);
  75.   
  76.   if (!interp_mdl.svc)
  77.     yyfatal(clnt_error_msg());
  78.   open_out_files();
  79.   ip.init_params_t_len=Argc;
  80.   ip.init_params_t_val=Argv;
  81.   SERVER_CALL (r,init_comp_1,&ip,"Server initialization");
  82.   return SQLCODE;
  83. } /* server_start */
  84. static int
  85. dyncall_epilogue(result_t *res,char *message)
  86. {
  87.   if (!res)
  88.     {
  89.       if (svc_ready(interp_mdl.svc,0,0,0) > 0)
  90.         res = retry_1 ((void*)1, interp_mdl.svc);
  91.       else
  92.         {
  93.           yyerror (clnt_error_msg());
  94.           return -ER_SERV;
  95.         }
  96.     }
  97.   if (!res)
  98.     {
  99.       clnt_perror (interp_mdl.svc, message);
  100.       return -ER_SERV;
  101.     }
  102.   if (res->info.rett == RET_COMP)
  103.     put_files_bufs (res->info.return_data_u.comp_ret.bufs);
  104.   SQLCODE = res->sqlcode;
  105.   return 0;
  106. }
  107. int
  108. SQL__prepare_stmt (char *stmt_text, char *stmt_name, compiled_t **prep_res)
  109. {
  110.   stmt_info_t st;
  111.   result_t    *r;
  112.   i4_t err;
  113.   
  114.   st.next      = NULL;
  115.   st.stmt      = stmt_text;
  116.   st.stmt_name = stmt_name;
  117.   st.bline     = 0 /*bline*/;
  118.   if (!interp_mdl.svc && (err = server_start ()) < 0)
  119.     return err;
  120.     
  121.   SERVER_PREP_CALL (r, compile_1, &st,"Prepare statement request");
  122.   *prep_res = &(r->info.return_data_u.comp_ret);
  123.   return SQLCODE;
  124. }
  125. int
  126. server_seg_del (i4_t seg_cnt, i4_t *seg_vadr, i4_t mem_ptr)
  127. {
  128.   seg_del_t seg_del;
  129.   result_t *int_res;
  130.   
  131.   seg_del.segment = mem_ptr;
  132.   seg_del.seg_vadr.seg_vadr_len = seg_cnt;
  133.   seg_del.seg_vadr.seg_vadr_val = seg_vadr;
  134.   
  135.   SERVER_CALL (int_res, del_segment_1, &seg_del,
  136.                "Deallocating segments' memory");
  137.   return int_res->sqlcode;
  138. } /* server_seg_del */
  139. void
  140. server_finish (void)
  141. {
  142.   close_out_files ();
  143.   if (interp_mdl.svc)
  144.     {
  145.       down_svc (interp_mdl.svc);
  146.       interp_mdl.svc = NULL;
  147.     }
  148. }
  149. int
  150. SQL__get_cursor_segm (char *cursor_name, struct s_stmt *stmt)
  151. /* sends request to server to make segment for cursor           *
  152.  * & returns (>0) virtual address of made segment or error (<0) */
  153. {
  154.   result_t *int_res;
  155.   link_cursor_t mk_segm;
  156.   if (!stmt || !(stmt->mem_ptr))
  157.     return -DS_STMT;
  158.   mk_segm.cursor_name = cursor_name;
  159.   mk_segm.stmt_name   = stmt->name;
  160.   mk_segm.segment     = stmt->mem_ptr;
  161.   SERVER_CALL (int_res, link_cursor_1, &mk_segm, "Getting segment for cursor");
  162.   return int_res->info.return_data_u.segid;
  163. } /* get_cursor_segm */