pack.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <my_global.h>
  14. #include <mysql_com.h>
  15. #include <mysql.h>
  16. /* Get the length of next field. Change parameter to point at fieldstart */
  17. ulong STDCALL net_field_length(uchar **packet)
  18. {
  19.   reg1 uchar *pos= (uchar *)*packet;
  20.   if (*pos < 251)
  21.   {
  22.     (*packet)++;
  23.     return (ulong) *pos;
  24.   }
  25.   if (*pos == 251)
  26.   {
  27.     (*packet)++;
  28.     return NULL_LENGTH;
  29.   }
  30.   if (*pos == 252)
  31.   {
  32.     (*packet)+=3;
  33.     return (ulong) uint2korr(pos+1);
  34.   }
  35.   if (*pos == 253)
  36.   {
  37.     (*packet)+=4;
  38.     return (ulong) uint3korr(pos+1);
  39.   }
  40.   (*packet)+=9; /* Must be 254 when here */
  41.   return (ulong) uint4korr(pos+1);
  42. }
  43. /* The same as above but returns longlong */
  44. my_ulonglong net_field_length_ll(uchar **packet)
  45. {
  46.   reg1 uchar *pos= *packet;
  47.   if (*pos < 251)
  48.   {
  49.     (*packet)++;
  50.     return (my_ulonglong) *pos;
  51.   }
  52.   if (*pos == 251)
  53.   {
  54.     (*packet)++;
  55.     return (my_ulonglong) NULL_LENGTH;
  56.   }
  57.   if (*pos == 252)
  58.   {
  59.     (*packet)+=3;
  60.     return (my_ulonglong) uint2korr(pos+1);
  61.   }
  62.   if (*pos == 253)
  63.   {
  64.     (*packet)+=4;
  65.     return (my_ulonglong) uint3korr(pos+1);
  66.   }
  67.   (*packet)+=9; /* Must be 254 when here */
  68. #ifdef NO_CLIENT_LONGLONG
  69.   return (my_ulonglong) uint4korr(pos+1);
  70. #else
  71.   return (my_ulonglong) uint8korr(pos+1);
  72. #endif
  73. }
  74. /*
  75.   Store an integer with simple packing into a output package
  76.   SYNOPSIS
  77.     net_store_length()
  78.     pkg Store the packed integer here
  79.     length integers to store
  80.   NOTES
  81.     This is mostly used to store lengths of strings.
  82.     We have to cast the result for the LL() becasue of a bug in Forte CC
  83.     compiler.
  84.   RETURN
  85.    Position in 'pkg' after the packed length
  86. */
  87. char *
  88. net_store_length(char *pkg, ulonglong length)
  89. {
  90.   uchar *packet=(uchar*) pkg;
  91.   if (length < (ulonglong) LL(251))
  92.   {
  93.     *packet=(uchar) length;
  94.     return (char*) packet+1;
  95.   }
  96.   /* 251 is reserved for NULL */
  97.   if (length < (ulonglong) LL(65536))
  98.   {
  99.     *packet++=252;
  100.     int2store(packet,(uint) length);
  101.     return (char*) packet+2;
  102.   }
  103.   if (length < (ulonglong) LL(16777216))
  104.   {
  105.     *packet++=253;
  106.     int3store(packet,(ulong) length);
  107.     return (char*) packet+3;
  108.   }
  109.   *packet++=254;
  110.   int8store(packet,length);
  111.   return (char*) packet+8;
  112. }