Drizzled Public API Documentation

column.py
1 #!/usr/bin/env python
2 #
3 # Drizzle Client & Protocol Library
4 #
5 # Copyright (C) 2008 Eric Day (eday@oddments.org)
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are
10 # met:
11 #
12 # * Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 #
15 # * Redistributions in binary form must reproduce the above
16 # copyright notice, this list of conditions and the following disclaimer
17 # in the documentation and/or other materials provided with the
18 # distribution.
19 #
20 # * The names of its contributors may not be used to endorse or
21 # promote products derived from this software without specific prior
22 # written permission.
23 #
24 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #
36 
37 '''
38 MySQL Protocol Column Objects
39 '''
40 
41 import struct
42 import unittest
43 import bitfield
44 import packet
45 
46 class ColumnType(object):
47  DECIMAL = 0
48  TINY = 1
49  SHORT = 2
50  LONG = 3
51  FLOAT = 4
52  DOUBLE = 5
53  NULL = 6
54  TIMESTAMP = 7
55  LONGLONG = 8
56  INT24 = 9
57  DATE = 10
58  TIME = 11
59  DATETIME = 12
60  YEAR = 13
61  NEWDATE = 14
62  VARCHAR = 15
63  BIT = 16
64  NEWDECIMAL = 246
65  ENUM = 247
66  SET = 248
67  TINY_BLOB = 249
68  MEDIUM_BLOB = 250
69  LONG_BLOB = 251
70  BLOB = 252
71  VAR_STRING = 253
72  STRING = 254
73  GEOMETRY = 255
74 
76  _fields = [
77  'NOT_NULL',
78  'PRI_KEY',
79  'UNIQUE_KEY',
80  'MULTIPLE_KEY',
81  'BLOB',
82  'UNSIGNED',
83  'ZEROFILL',
84  'BINARY',
85  'ENUM',
86  'AUTO_INCREMENT',
87  'TIMESTAMP',
88  'SET',
89  'NO_DEFAULT_VALUE',
90  'ON_UPDATE_NOW',
91  'PART_KEY',
92  'NUM',
93  'UNIQUE',
94  'BINCMP',
95  'GET_FIXED_FIELDS',
96  'IN_PART_FUNC',
97  'IN_ADD_INDEX',
98  'RENAMED'
99  ]
100 
101 
102 class Column(object):
103  '''This class represents a column packet sent from the client.'''
104 
105  def __init__(self, packed=None, catalog='', db='', table='', orig_table='',
106  name='', orig_name='', unused1=0, charset=0, size=0, type=0,
107  flags=0, decimal=0, unused2=tuple([0] * 2), default_value=''):
108  if packed is None:
109  self.catalog = catalog
110  self.db = db
111  self.table = table
112  self.orig_table = orig_table
113  self.name = name
114  self.orig_name = orig_name
115  self.unused1 = unused1
116  self.charset = charset
117  self.size = size
118  self.type = type
119  self.flags = ColumnFlags(flags)
120  self.decimal = decimal
121  self.unused2 = unused2
122  self.default_value = default_value
123  else:
124  self._packed = packed
125  self.catalog = self.parseString()
126  self.db = self.parseString()
127  self.table = self.parseString()
128  self.orig_table = self.parseString()
129  self.name = self.parseString()
130  self.orig_name = self.parseString()
131  data = struct.unpack('B2B4BB2BB', self._packed[:11])
132  self.unused1 = data[0]
133  self.charset = data[1] | (data[2] << 8)
134  self.size = data[3] | (data[4] << 8) | (data[5] << 16) | (data[6] << 24)
135  self.type = data[7]
136  self.flags = ColumnFlags(data[8] | (data[9] << 8))
137  self.decimal = data[10]
138  self.unused2 = tuple(data[11:13])
139  self.default_value = self._packed[13:]
140 
141  def parseString(self):
142  (size, packed_size) = packet.parse_encoded_size(self._packed)
143  string = self._packed[packed_size:size+packed_size]
144  self._packed = self._packed[size+packed_size:]
145  return string
146 
147  def pack(self):
148  return chr(self.command) + self.payload
149 
150  def __str__(self):
151  return '''Column
152  catalog = %s
153  db = %s
154  table = %s
155  orig_table = %s
156  name = %s
157  orig_name = %s
158  unused1 = %s
159  charset = %s
160  size = %s
161  type = %s
162  flags = %s
163  decimal = %s
164  unused2 = %s
165  default_value = %s
166 ''' % (self.catalog, self.db, self.table, self.orig_table, self.name,
167  self.orig_name, self.unused1, self.charset, self.size, self.type,
168  self.flags, self.decimal, self.unused2, self.default_value)
169 
170 if __name__ == '__main__':
171  unittest.main()