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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  sql_type.c  - SQL types support library for SQL precompiler
  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 Prpgramming
  8.  *  This file is written by Michael Kimelman & Konstantin Dyshlevoi
  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: sql_type.c,v 1.246 1997/03/31 11:03:16 kml Exp $ */
  28. #include "setup_os.h"
  29. #include "sql.h"
  30. #include "global.h"
  31. #include "type_lib.h"
  32. #include <assert.h>
  33. /*******==================================================*******
  34. *******            Type conversion functions               *******
  35. *******==================================================*******/
  36. static struct
  37. {
  38.   char                *SQLtypename;
  39.   dyn_sql_type_code_t  dyn_id;
  40. } typesname[]= {
  41. #define DEF_SQLTYPE(Code,SQLstr,Cstr,Dyn_Id)    {SQLstr,Dyn_Id},
  42. #include "sql_type.def"
  43.   { NULL, 0 }
  44. };
  45. /*******==================================================*******
  46. *******            Type conversion functions               *******
  47. *******==================================================*******/
  48. void 
  49. conv_type (char *s, sql_type_t * l, i4_t direct)  /* direct=s->l?1:0 */
  50. {
  51.   sql_type_t tt;
  52.   byte ll = 0;
  53.   char c, c1;
  54.   i4_t len, prec;
  55.   char buffer[20];
  56.   assert (s != NULL);
  57.   assert (l != NULL);
  58.   if (direct)
  59.     {
  60.       sscanf (s, "%[^[]%*c%u%c%u%c", buffer, &len, &c, &prec, &c1);
  61.       tt.len = (i2_t) len;
  62.       tt.prec = (byte) (prec & 0xff);
  63.       if (c != ',' || c1 != ']')
  64. {
  65.   fprintf (stderr, "Internal error at %s:%d: "
  66.    "incorrect type format in string '%s'n",
  67.    __FILE__, __LINE__, s);
  68.   return;
  69. }
  70.       ll = (byte) SQLType_LAST;
  71.       while (ll--)
  72. if (0 == strcmp (buffer, typesname[ll].SQLtypename))
  73.   {
  74.     tt.code = ll;
  75.     break;
  76.   }
  77.       *l = tt;
  78.       conv_type (buffer, l, 0); /* restore string */
  79.       if (strncmp (buffer, s,strlen(buffer)))
  80. yyfatal ("Trl.conv_type: Internal error in algorithm");
  81.     }
  82.   else
  83.     {
  84.       tt = *l;
  85.       sprintf (s, "%s[%u,%u]", typesname[tt.code].SQLtypename,
  86.        (int) tt.len, (int) tt.prec);
  87.     }
  88. }
  89. dyn_sql_type_code_t
  90. get_dyn_sqltype_code(SQLType t)
  91. {
  92.   if (t<=SQLType_0 || t>=SQLType_LAST)
  93.     return 0;
  94.   return typesname[t].dyn_id;
  95. }
  96. SQLType
  97. get_sqltype_code(dyn_sql_type_code_t t)
  98. {
  99.   SQLType i;
  100.   for(i=0;i<SQLType_LAST;i++)
  101.     if(typesname[i].dyn_id ==t)
  102.       return i;
  103.   return SQLType_0;
  104. }
  105. sql_type_t 
  106. pack_type (SQLType tpname, i2_t lenght, i2_t prec)
  107. {
  108. #define LEN1(tl)   (i4_t)(tl*2.4+0.99)
  109. #define LEN(t)     LEN1((sizeof(t)))
  110. #define FATAL(str)   fprintf(STDERR,"%sn",str)
  111.   sql_type_t tt;
  112.   
  113.   assert (tpname < SQLType_LAST);
  114.   if (prec > 0xff)
  115.     {
  116.       char s[100];
  117.       sprintf(s,"trl.pack_type: precision (%d) more than 256",prec);
  118.       FATAL (s);
  119.       prec = 0xff;
  120.     }
  121.   assert ( (prec & 0xff) == prec );
  122.   
  123.   tt.prec = prec;
  124.   tt.code = tpname;
  125.   tt.len = lenght;
  126.   
  127.   if ( prec > lenght )
  128.     {
  129.       char s[100];
  130.       sprintf(s,"trl.pack_type: precision more than lenght in '%s'",
  131.       type2str(tt));
  132.       FATAL (s);
  133.       prec = lenght - 1;
  134.     }
  135.   switch (tt.code)
  136.     {
  137.     case SQLType_0:
  138.       tt.len  = 0;
  139.       tt.prec = 0;
  140.       break;
  141.     case SQLType_Char:
  142.     case SQLType_CharVar:
  143.       tt.prec = 0;
  144.       tt.code = SQLType_Char;
  145.       break;
  146.     case SQLType_Short:
  147.       tt.len = LEN (i2_t);
  148.       tt.prec = 0;
  149.       break;
  150.     case SQLType_Int:
  151.       tt.len = LEN (i4_t);
  152.       tt.prec = 0;
  153.       break;
  154.     case SQLType_Long:
  155.       tt.len = LEN (i4_t);
  156.       tt.prec = 0;
  157.       break;
  158.     case SQLType_Real:
  159.       tt.len = LEN1 (3);
  160.       tt.prec = 0;
  161.       break;
  162.     case SQLType_Double:
  163.       tt.len = LEN1 (6);
  164.       tt.prec = 0;
  165.       break;
  166.     case SQLType_Num:
  167.       if ( tt.prec == 0 )
  168. {
  169.   if (tt.len <= LEN (i2_t) )
  170.     {
  171.       tt.code = SQLType_Short;
  172.       tt.len  = LEN (i2_t);
  173.       break;
  174.     }
  175.   else if (tt.len <= LEN (i4_t) )
  176.     {
  177.       tt.code = SQLType_Long;
  178.       tt.len  = LEN (i4_t);
  179.       break;
  180.     }
  181. }
  182.     case SQLType_Float:
  183.       tt.prec = 0;
  184.       if (tt.len <= LEN1(3) )
  185. {
  186.   tt.code = SQLType_Real;
  187.   tt.len  = LEN1(3);
  188.   break;
  189. }
  190.       else if (tt.len <= LEN1(6) )
  191. {
  192.   tt.code = SQLType_Double;
  193.   tt.len  = LEN1(6);
  194.   break;
  195. }
  196.     default:
  197.       /* error should be detected here */
  198.       FATAL("sql_type.pack_type: unacceptable type given ");
  199.       fprintf(STDERR,"-%s ",type2str(tt));
  200.       tt.code = SQLType_Double;
  201.       tt.len  = LEN1(6);
  202.       fprintf(STDERR,"--> %s n",type2str(tt));
  203.     }
  204.   return tt;
  205. #undef FATAL
  206. #undef LEN
  207. #undef LEN1
  208. }
  209. sql_type_t 
  210. read_type (char *s)
  211. {
  212.   sql_type_t t;
  213.   conv_type (s, &t, 1);
  214.   return t;
  215. }
  216. char *
  217. type2str (sql_type_t t)
  218. {
  219.   static char b[40];
  220.   sql_type_t t2 = t;
  221.   conv_type (b, &t2, 0);
  222.   return b;
  223. }
  224. i4_t
  225. type2long (sql_type_t t)
  226. {
  227.   return *(i4_t*)&t;
  228. }
  229. i4_t
  230. user_to_rpc (gsql_parm *parm, parm_t *rpc_arg)
  231. {
  232.   char *str;
  233.   
  234.   rpc_arg->value.type = parm->type;
  235.   rpc_arg->indicator = (parm->indptr) ? *(parm->indptr) : 0;
  236.   switch (parm->type)
  237.     {
  238.     case T_STR /* SQLType_Char */ :
  239.       str = *(char **)(parm->valptr);
  240.       rpc_arg->value.data_u.Str.Str_len = strlen (str);
  241.       rpc_arg->value.data_u.Str.Str_val = str;
  242.       break;
  243.     case SQLType_Short:
  244.       rpc_arg->value.data_u.Shrt = *((i2_t *)(parm->valptr));
  245.       break;
  246.     case SQLType_Int :
  247.       rpc_arg->value.data_u.Int  = *((i4_t *)(parm->valptr));
  248.       break;
  249.     case SQLType_Long :
  250.       rpc_arg->value.data_u.Lng  = *((i4_t *)(parm->valptr));
  251.       break;
  252.     case SQLType_Real :
  253.       rpc_arg->value.data_u.Flt  = *((float *)(parm->valptr));
  254.       break;
  255.     case SQLType_Double :
  256.       rpc_arg->value.data_u.Dbl  = *((double *)(parm->valptr));
  257.       break;
  258.     default    :
  259.       return -ER_CLNT;
  260.     }
  261.   return 0;
  262. } /* user_to_rpc */
  263. i4_t
  264. rpc_to_user (parm_t *rpc_res, gsql_parm *parm)
  265. {
  266.   i4_t typ, error = 0, size, from_size, to_size;
  267.   
  268.   if (rpc_res->indicator != -1) /* current result is REGULAR_VALUE */
  269.     {
  270.       if (parm->indptr)
  271. *(parm->indptr) = rpc_res->indicator;
  272.       typ = parm->type;
  273.       if (typ == T_STR)
  274. {
  275.   from_size = rpc_res->value.data_u.Str.Str_len;
  276.   to_size = parm->length - 1;
  277.   size = (to_size > from_size) ? from_size : to_size;
  278.   bcopy (rpc_res->value.data_u.Str.Str_val,
  279.  (char *) (parm->valptr), size);
  280.   ((char *) (parm->valptr))[size] = '';
  281. }
  282.       else
  283. error = put_dat (&(rpc_res->value.data_u), 0, rpc_res->value.type,
  284.  REGULAR_VALUE, parm->valptr, 0, typ, NULL);
  285.       if (error > 0) /* res_dt-string was shortened */
  286. if (parm->indptr)
  287.   *(parm->indptr) = error;
  288.   
  289.       if (error < 0)
  290. return error;
  291.     }
  292.   else
  293.     /* current result is NULL_VALUE */
  294.     if (parm->indptr)
  295.       *(parm->indptr) = -1;
  296.     else
  297.       return -ND_INDIC;
  298.   
  299.   return 0;
  300. } /* rpc_to_user */
  301. i4_t 
  302. put_dat (void *from, i4_t from_size, byte from_mask, char from_nl_fl,
  303.  void *to,   i4_t to_size_,  byte to_mask_,  char *to_nl_fl)
  304. /* Copying of information accordingly "*_mask"          *
  305.  * (if to_mask_==0 => type isn't being changed).        *
  306.  * This function returns value:                         *
  307.  * 0 - if it's all right,                               *
  308.  * < 0 - if error,                                      *
  309.  * > 0 - if result is string and this value = lenght of *
  310.  *       this string. It is greater than res_size       *
  311.  *       (so string was shortened).                     */
  312. {
  313.   i2_t size;
  314.   byte to_mask = (to_mask_) ? to_mask_ : from_mask;
  315.   i4_t to_size = (to_size_) ? to_size_ : from_size;
  316.   
  317.   if (to_nl_fl)
  318.     *to_nl_fl = from_nl_fl;
  319.   
  320.   if (from_nl_fl != REGULAR_VALUE)
  321.     return 0;
  322.   
  323.   if (from_mask == T_STR)
  324.     {
  325.       size = (to_size > from_size) ? from_size : to_size;
  326.       if (to_mask != T_STR)
  327. return (-ER_1);
  328.       bcopy ((char *) from, (char *) to, size);
  329.       return from_size - size;
  330.     }
  331.   
  332.   /* trere are handled here numbers only */
  333.   if (from_mask == to_mask)
  334.     switch (from_mask)
  335.       {
  336.       case T_SRT:
  337. *(i2_t *) to = *(i2_t *) from;
  338. break;
  339.       case T_INT:
  340. *(i4_t *) to = *(i4_t *) from;
  341. break;
  342.       case T_LNG:
  343. *(i4_t *) to = *(i4_t *) from;
  344. break;
  345.       case T_FLT:
  346. *(float *) to = *(float *) from;
  347. break;
  348.       case T_DBL:
  349. *(double *) to = *(double *) from;
  350. break;
  351.       default:
  352. return (-ER_1); /* ERROR */
  353.       } /* switch */
  354.   else
  355.     switch (to_mask)
  356.       {
  357.       case T_SRT:
  358. switch (from_mask)
  359.   {
  360.   case T_INT:
  361.     *(i2_t *) to = (i2_t) (*(i4_t *) from);
  362.     break;
  363.   case T_LNG:
  364.     *(i2_t *) to = (i2_t) (*(i4_t *) from);
  365.     break;
  366.   case T_FLT:
  367.     *(i2_t *) to = (i2_t) (*(float *) from);
  368.     break;
  369.   case T_DBL:
  370.     *(i2_t *) to = (i2_t) (*(double *) from);
  371.     break;
  372.   default:
  373.     return (-ER_1); /* ERROR */
  374.   } /* switch */
  375. break;
  376.       case T_INT:
  377. switch (from_mask)
  378.   {
  379.   case T_SRT:
  380.     *(i4_t *) to = (i4_t) (*(i2_t *) from);
  381.     break;
  382.   case T_LNG:
  383.     *(i4_t *) to = (i4_t) (*(i4_t *) from);
  384.     break;
  385.   case T_FLT:
  386.     *(i4_t *) to = (i4_t) (*(float *) from);
  387.     break;
  388.   case T_DBL:
  389.     *(i4_t *) to = (i4_t) (*(double *) from);
  390.     break;
  391.   default:
  392.     return (-ER_1); /* ERROR */
  393.   } /* switch */
  394. break;
  395.       case T_LNG:
  396. switch (from_mask)
  397.   {
  398.   case T_SRT:
  399.     *(i4_t *) to = (i4_t) (*(i2_t *) from);
  400.     break;
  401.   case T_INT:
  402.     *(i4_t *) to = (i4_t) (*(i4_t *) from);
  403.     break;
  404.   case T_FLT:
  405.     *(i4_t *) to = (i4_t) (*(float *) from);
  406.     break;
  407.   case T_DBL:
  408.     *(i4_t *) to = (i4_t) (*(double *) from);
  409.     break;
  410.   default:
  411.     return (-ER_1); /* ERROR */
  412.   } /* switch */
  413. break;
  414.       case T_FLT:
  415. switch (from_mask)
  416.   {
  417.   case T_SRT:
  418.     *(float *) to = (float) (*(i2_t *) from);
  419.     break;
  420.   case T_INT:
  421.     *(float *) to = (float) (*(i4_t *) from);
  422.     break;
  423.   case T_LNG:
  424.     *(float *) to = (float) (*(i4_t *) from);
  425.     break;
  426.   case T_DBL:
  427.     *(float *) to = (float) (*(double *) from);
  428.     break;
  429.   default:
  430.     return (-ER_1); /* ERROR */
  431.   } /* switch */
  432. break;
  433.       case T_DBL:
  434. switch (from_mask)
  435.   {
  436.   case T_SRT:
  437.     *(double *) to = (double) (*(i2_t *) from);
  438.     break;
  439.   case T_INT:
  440.     *(double *) to = (double) (*(i4_t *) from);
  441.     break;
  442.   case T_LNG:
  443.     *(double *) to = (double) (*(i4_t *) from);
  444.     break;
  445.   case T_FLT:
  446.     *(double *) to = (double) (*(float *) from);
  447.     break;
  448.   default:
  449.     return (-ER_1); /* ERROR */
  450.   } /* switch */
  451. break;
  452.       default:
  453. return (-ER_1); /* ERROR */
  454.       } /* switch,if,if */
  455.   return (0);
  456. } /* "put" */
  457. int
  458. is_casted(sql_type_t pt1,sql_type_t pt2)
  459. {
  460.   sql_type_t t3, t1=pt1, t2=pt2;
  461.   
  462.   if ( *(i4_t*)&t1 == *(i4_t*)&t2 )
  463.     return 1;
  464.   
  465.   if ( t1.code != t2.code )
  466.     {
  467.       static struct cast { 
  468. SQLType from,to; 
  469.       } casting[] = { { SQLType_0      ,SQLType_Char   },
  470.       { SQLType_0      ,SQLType_Short  },
  471.       { SQLType_Char   ,SQLType_Cstring},
  472.       { SQLType_Short  ,SQLType_Int    },
  473.       { SQLType_Int    ,SQLType_Long   },
  474.       { SQLType_Long   ,SQLType_Real   },
  475.       { SQLType_Long   ,SQLType_Num    },
  476.       { SQLType_Num    ,SQLType_Float  },
  477.       { SQLType_Real   ,SQLType_Double },
  478.       { SQLType_Double ,SQLType_Float  },
  479.       { SQLType_Real   ,SQLType_Double }  };
  480.       
  481.       register int i;
  482.       t3 = t2;
  483.       i = sizeof(casting)/sizeof(struct cast);
  484.       while (i--)
  485. {
  486.   if (t2.code != casting[i].from)
  487.     continue;
  488.   t3.code = casting[i].to;
  489.   if ( is_casted(t1,t3) )
  490.     return 1;
  491. }
  492.       return 0;
  493.     }
  494.   else /* (t1.code == t2.code) */
  495.     {
  496.       switch(t1.code)
  497. {
  498. case SQLType_Char: 
  499.   if (t2.len > t1.len)
  500.     return 0;
  501.   break;
  502. case SQLType_Num:
  503.   if ( t2.len - t2.prec > t1.len - t1.prec || t2.prec > t1.prec )
  504.     return 0;
  505.   break;
  506. case SQLType_Float:
  507.   if ( t2.len > t1.len)
  508.     return 0;
  509.   break;
  510. default:
  511.           break;
  512. }
  513.     }
  514.   return 1;
  515. }