~ubuntu-branches/ubuntu/saucy/drizzle/saucy-proposed

« back to all changes in this revision

Viewing changes to plugin/drizzle_protocol/pack.cc

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2010-03-18 12:12:31 UTC
  • Revision ID: james.westby@ubuntu.com-20100318121231-k6g1xe6cshbwa0f8
Tags: upstream-2010.03.1347
ImportĀ upstreamĀ versionĀ 2010.03.1347

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
3
 *
 
4
 *  Copyright (C) 2008 Sun Microsystems, Inc.
 
5
 *
 
6
 *  This program is free software; you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation; version 2 of the License.
 
9
 *
 
10
 *  This program is distributed in the hope that it will be useful,
 
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 *  GNU General Public License for more details.
 
14
 *
 
15
 *  You should have received a copy of the GNU General Public License
 
16
 *  along with this program; if not, write to the Free Software
 
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
18
 */
 
19
 
 
20
#include "config.h"
 
21
#include <drizzled/korr.h>
 
22
 
 
23
#include <stdint.h>
 
24
 
 
25
#include "pack.h"
 
26
 
 
27
namespace drizzle_protocol
 
28
{
 
29
 
 
30
/* Get the length of next field. Change parameter to point at fieldstart */
 
31
uint32_t drizzleclient_net_field_length(unsigned char **packet)
 
32
{
 
33
  register unsigned char *pos= (unsigned char *)*packet;
 
34
  if (*pos < 251)
 
35
  {
 
36
    (*packet)++;
 
37
    return (uint32_t) *pos;
 
38
  }
 
39
  if (*pos == 251)
 
40
  {
 
41
    (*packet)++;
 
42
    return NULL_LENGTH;
 
43
  }
 
44
  if (*pos == 252)
 
45
  {
 
46
    (*packet)+=3;
 
47
    return (uint32_t) uint2korr(pos+1);
 
48
  }
 
49
  if (*pos == 253)
 
50
  {
 
51
    (*packet)+=4;
 
52
    return (uint32_t) uint3korr(pos+1);
 
53
  }
 
54
  (*packet)+=9;          /* Must be 254 when here */
 
55
  return (uint32_t) uint4korr(pos+1);
 
56
}
 
57
 
 
58
/* The same as above but returns int64_t */
 
59
uint64_t drizzleclient_drizzleclient_net_field_length_ll(unsigned char **packet)
 
60
{
 
61
  register unsigned char *pos= *packet;
 
62
  if (*pos < 251)
 
63
  {
 
64
    (*packet)++;
 
65
    return (uint64_t) *pos;
 
66
  }
 
67
  if (*pos == 251)
 
68
  {
 
69
    (*packet)++;
 
70
    return (uint64_t) NULL_LENGTH;
 
71
  }
 
72
  if (*pos == 252)
 
73
  {
 
74
    (*packet)+=3;
 
75
    return (uint64_t) uint2korr(pos+1);
 
76
  }
 
77
  if (*pos == 253)
 
78
  {
 
79
    (*packet)+=4;
 
80
    return (uint64_t) uint3korr(pos+1);
 
81
  }
 
82
  (*packet)+=9;          /* Must be 254 when here */
 
83
#ifdef NO_CLIENT_LONGLONG
 
84
  return (uint64_t) uint4korr(pos+1);
 
85
#else
 
86
  return (uint64_t) uint8korr(pos+1);
 
87
#endif
 
88
}
 
89
 
 
90
/*
 
91
  Store an integer with simple packing into a output package
 
92
 
 
93
  SYNOPSIS
 
94
    drizzleclient_net_store_length()
 
95
    pkg      Store the packed integer here
 
96
    length    integers to store
 
97
 
 
98
  NOTES
 
99
    This is mostly used to store lengths of strings.
 
100
    We have to cast the result for the LL() becasue of a bug in Forte CC
 
101
    compiler.
 
102
 
 
103
  RETURN
 
104
   Position in 'pkg' after the packed length
 
105
*/
 
106
 
 
107
unsigned char *drizzleclient_net_store_length(unsigned char *packet, uint64_t length)
 
108
{
 
109
  if (length < (uint64_t) 251LL)
 
110
  {
 
111
    *packet=(unsigned char) length;
 
112
    return packet+1;
 
113
  }
 
114
  /* 251 is reserved for NULL */
 
115
  if (length < (uint64_t) 65536LL)
 
116
  {
 
117
    *packet++=252;
 
118
    int2store(packet,(uint32_t) length);
 
119
    return packet+2;
 
120
  }
 
121
  if (length < (uint64_t) 16777216LL)
 
122
  {
 
123
    *packet++=253;
 
124
    int3store(packet,(uint32_t) length);
 
125
    return packet+3;
 
126
  }
 
127
  *packet++=254;
 
128
  int8store(packet,length);
 
129
  return packet+8;
 
130
}
 
131
 
 
132
} /* namespace drizzle_protocol */