~drizzle-trunk/drizzle/development

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 *
 *  Copyright (C) 2008 Sun Microsystems
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef DRIZZLED_PROTOCOL_H
#define DRIZZLED_PROTOCOL_H

#include <drizzled/sql_list.h>
#include <drizzled/item.h>

class Field;
class String;
class i_string;
class Session;
class my_decimal;
typedef struct st_drizzle_field DRIZZLE_FIELD;
typedef struct st_drizzle_rows DRIZZLE_ROWS;
typedef struct st_drizzle_time DRIZZLE_TIME;

class Protocol
{
protected:
  Session	 *session;
  String *packet;
  String *convert;
  uint32_t field_pos;
  uint32_t field_count;
  bool net_store_data(const unsigned char *from, size_t length);
  bool net_store_data(const unsigned char *from, size_t length,
                      const CHARSET_INFO * const fromcs, const CHARSET_INFO * const tocs);
  bool store_string_aux(const char *from, size_t length,
                        const CHARSET_INFO * const fromcs, const CHARSET_INFO * const tocs);
public:
  Protocol() {}
  Protocol(Session *session_arg) { init(session_arg); }
  virtual ~Protocol() {}
  void init(Session* session_arg);

  enum { SEND_NUM_ROWS= 1, SEND_DEFAULTS= 2, SEND_EOF= 4 };
  virtual bool send_fields(List<Item> *list, uint32_t flags);

  virtual bool store(I_List<i_string> *str_list);
  virtual bool store(const char *from, const CHARSET_INFO * const cs);
  String *storage_packet() { return packet; }
  void free();
  virtual bool write();
  virtual bool store(int from)
  { return store_long((int64_t) from); }
  virtual  bool store(uint32_t from)
  { return store_long((int64_t) from); }
  virtual bool store(int64_t from)
  { return store_int64_t((int64_t) from, 0); }
  virtual bool store(uint64_t from)
  { return store_int64_t((int64_t) from, 1); }
  virtual bool store(String *str);

  virtual bool prepare_for_send(List<Item> *item_list)
  {
    field_count=item_list->elements;
    return 0;
  }
  virtual bool flush();
  virtual void prepare_for_resend()=0;

  virtual bool store_null()=0;
  virtual bool store_tiny(int64_t from)=0;
  virtual bool store_short(int64_t from)=0;
  virtual bool store_long(int64_t from)=0;
  virtual bool store_int64_t(int64_t from, bool unsigned_flag)=0;
  virtual bool store_decimal(const my_decimal * dec_value)=0;
  virtual bool store(const char *from, size_t length, const CHARSET_INFO * const cs)=0;
  virtual bool store(const char *from, size_t length,
                     const CHARSET_INFO * const fromcs, const CHARSET_INFO * const tocs)=0;
  virtual bool store(float from, uint32_t decimals, String *buffer)=0;
  virtual bool store(double from, uint32_t decimals, String *buffer)=0;
  virtual bool store(DRIZZLE_TIME *time)=0;
  virtual bool store_date(DRIZZLE_TIME *time)=0;
  virtual bool store_time(DRIZZLE_TIME *time)=0;
  virtual bool store(Field *field)=0;
  void remove_last_row() {}
  enum enum_protocol_type
  {
    PROTOCOL_TEXT= 0, PROTOCOL_BINARY= 1
    /*
      before adding here or change the values, consider that it is cast to a
      bit in sql_cache.cc.
    */
  };
  virtual enum enum_protocol_type type()= 0;
};


/** Class used for the old (MySQL 4.0 protocol). */

class Protocol_text :public Protocol
{
public:
  Protocol_text() {}
  Protocol_text(Session *session_arg) :Protocol(session_arg) {}
  virtual void prepare_for_resend();
  virtual bool store(I_List<i_string> *str_list)
  {
    return Protocol::store(str_list);
  }
  virtual bool store(const char *from, const CHARSET_INFO * const cs)
  {
    return Protocol::store(from, cs);
  }
  virtual bool store_null();
  virtual bool store_tiny(int64_t from);
  virtual bool store_short(int64_t from);
  virtual bool store_long(int64_t from);
  virtual bool store_int64_t(int64_t from, bool unsigned_flag);
  virtual bool store_decimal(const my_decimal *);
  virtual bool store(int from)
  { return store_long((int64_t) from); }
  virtual  bool store(uint32_t from)
  { return store_long((int64_t) from); }
  virtual bool store(int64_t from)
  { return store_int64_t((int64_t) from, 0); }
  virtual bool store(uint64_t from)
  { return store_int64_t((int64_t) from, 1); }
  virtual bool store(String *str)
  {
    return Protocol::store(str);
  }
  virtual bool store(const char *from, size_t length, const CHARSET_INFO * const cs);
  virtual bool store(const char *from, size_t length,
                     const CHARSET_INFO * const fromcs,  const CHARSET_INFO * const tocs);
  virtual bool store(DRIZZLE_TIME *time);
  virtual bool store_date(DRIZZLE_TIME *time);
  virtual bool store_time(DRIZZLE_TIME *time);
  virtual bool store(float nr, uint32_t decimals, String *buffer);
  virtual bool store(double from, uint32_t decimals, String *buffer);
  virtual bool store(Field *field);
  virtual enum enum_protocol_type type() { return PROTOCOL_TEXT; };
};

void send_warning(Session *session, uint32_t sql_errno, const char *err=0);
void net_send_error(Session *session, uint32_t sql_errno=0, const char *err=0);
void drizzleclient_net_end_statement(Session *session);
unsigned char *net_store_data(unsigned char *to,const unsigned char *from, size_t length);
unsigned char *net_store_data(unsigned char *to,int32_t from);
unsigned char *net_store_data(unsigned char *to,int64_t from);

#endif /* DRIZZLED_PROTOCOL_H */