ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/UnserializePHP.py
Revision: 1.2
Committed: Wed Jan 17 18:17:59 2007 UTC (18 years, 3 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_9_1, CRAB_2_9_1_pre2, CRAB_2_9_1_pre1, CRAB_2_9_0, CRAB_2_9_0_pre2, CRAB_2_9_0_pre1, CRAB_2_8_8, CRAB_2_8_8_pre1, CRAB_2_8_7_patch3, CRAB_2_8_7_patch2, CRAB_2_8_7_patch1, CRAB_2_8_7, CRAB_2_8_7_pre2, CRAB_2_8_7_pre1, CRAB_2_8_6, CRAB_2_8_6_pre1, CRAB_2_8_5_patch3, CRAB_2_8_5_patch2, CRAB_2_8_5_patch1, CRAB_2_8_5, CRAB_2_8_5_pre5, CRAB_2_8_5_pre4, CRAB_2_8_5_pre3, CRAB_2_8_4_patch3, CRAB_2_8_5_pre2, CRAB_2_8_4_patch2, CRAB_2_8_5_pre1, CRAB_2_8_4_patch1, CRAB_2_8_4, CRAB_2_8_4_pre5, CRAB_2_8_4_pre4, CRAB_2_8_4_pre3, CRAB_2_8_4_pre2, CRAB_2_8_4_pre1, CRAB_2_8_3, CRAB_2_8_3_pre4, CRAB_2_8_3_pre3, CRAB_2_8_3_pre2, CRAB_2_8_3_pre1, CRAB_2_8_2_patch1, CRAB_2_8_2, CRAB_2_8_2_pre5, CRAB_2_8_2_pre4, CRAB_2_8_2_pre3, CRAB_2_8_2_pre2, CRAB_2_8_2_pre1, CRAB_2_8_1, CRAB_2_8_0, CRAB_2_8_0_pre1, CRAB_2_7_10_pre3, CRAB_2_7_9_patch2_pre1, CRAB_2_7_10_pre2, CRAB_2_7_10_pre1, CRAB_2_7_9_patch1, CRAB_2_7_9, CRAB_2_7_9_pre5, CRAB_2_7_9_pre4, CRAB_2_7_9_pre3, CRAB_2_7_9_pre2, CRAB_2_7_8_patch2, CRAB_2_7_9_pre1, CRAB_2_7_8_patch2_pre1, CRAB_2_7_8_patch1, CRAB_2_7_8_patch1_pre1, CRAB_2_7_8, CRAB_2_7_8_pre3, CRAB_2_7_8_pre2, CRAB_2_7_8_dash3, CRAB_2_7_8_dash2, CRAB_2_7_8_dash, CRAB_2_7_7_patch1, CRAB_2_7_7_patch1_pre1, CRAB_2_7_8_pre1, CRAB_2_7_7, CRAB_2_7_7_pre2, CRAB_2_7_7_pre1, CRAB_2_7_6_patch1, CRAB_2_7_6, CRAB_2_7_6_pre1, CRAB_2_7_5_patch1, CRAB_2_7_5, CRAB_2_7_5_pre3, CRAB_2_7_5_pre2, CRAB_2_7_5_pre1, CRAB_2_7_4_patch1, CRAB_2_7_4, CRAB_2_7_4_pre6, CRAB_2_7_4_pre5, CRAB_2_7_4_pre4, CRAB_2_7_4_pre3, CRAB_2_7_4_pre2, CRAB_2_7_4_pre1, CRAB_2_7_3, CRAB_2_7_3_pre3, CRAB_2_7_3_pre3_beta, CRAB_2_7_3_pre2, CRAB_2_7_3_pre2_beta, CRAB_2_7_3_pre1, CRAB_2_7_3_beta3, CRAB_2_7_3_beta2, CRAB_2_7_3_beta1, CRAB_2_7_3_beta, CRAB_2_7_2_p1, CRAB_2_7_1_branch_firstMERGE, CRAB_2_7_2, CRAB_2_7_2_pre4, CRAB_2_7_2_pre3, CRAB_2_7_2_pre2, CRAB_2_7_2_pre1, CRAB_2_7_1, fede_170310, CRAB_2_7_1_pre12, CRAB_2_7_1_pre11, CRAB_2_7_1_pre10, CRAB_2_7_1_pre9, CRAB_LumiMask, CRAB_2_7_lumi, from_LimiMask, CRAB_2_7_1_pre8, CRAB_2_7_1_pre6, CRAB_2_7_1_pre5, CRAB_2_7_1_wmbs_pre4, CRAB_2_7_1_pre4, CRAB_2_7_1_pre3, CRAB_2_6_6_pre6, CRAB_2_7_1_pre2, CRAB_2_6_6_pre5, CRAB_2_7_1_pre1, CRAB_2_6_6_pre4, CRAB_2_6_6_pre3, CRAB_2_6_6_pre2, CRAB_2_6_6_check, CRAB_2_6_6, CRAB_2_6_6_pre1, CRAB_2_7_0, CRAB_2_6_5, CRAB_2_7_0_pre8, CRAB_2_6_5_pre1, CRAB_2_7_0_pre7, CRAB_2_6_4, CRAB_2_7_0_pre6, CRAB_2_6_4_pre1, CRAB_2_7_0_pre5, CRAB_2_6_3_patch_2, CRAB_2_6_3_patch_2_pre2, CRAB_2_6_3_patch_2_pre1, CRAB_2_6_3_patch_1, CRAB_2_7_0_pre4, CRAB_2_7_0_pre3, CRAB_2_6_3, CRAB_2_6_3_pre5, CRAB_2_6_3_pre4, CRAB_2_6_3_pre3, CRAB_2_6_3_pre2, CRAB_2_7_0_pre2, CRAB_2_6_3_pre1, test_1, CRAB_2_7_0_pre1, CRAB_2_6_2, CRAB_2_6_2_pre2, CRAB_2_6_2_pre1, CRAB_2_6_1_pre4, CRAB_2_6_1_pre3, CRAB_2_6_1_pre2, CRAB_2_6_1_pre1, CRAB_2_6_1, CRAB_2_6_0, CRAB_2_6_0_pre14, CRAB_2_6_0_pre13, CRAB_2_6_0_pre12, CRAB_2_6_0_pre11, CRAB_2_6_0_pre10, CRAB_2_6_0_pre9, CRAB_2_6_0_pre8, CRAB_2_6_0_pre7, CRAB_2_6_0_pre6, CRAB_2_6_0_pre5, CRAB_2_6_0_pre4, CRAB_2_6_0_pre3, CRAB_2_6_0_pre2, CRAB_2_6_0_pre1, CRAB_2_5_1, CRAB_2_5_1_pre4, CRAB_2_5_1_pre3, CRAB_2_5_1_pre2, CRAB_2_5_1_pre1, CRAB_2_5_0, CRAB_2_5_0_pre7, CRAB_2_5_0_pre6, CRAB_2_5_0_pre5, CRAB_2_5_0_pre4, CRAB_2_5_0_pre3, CRAB_2_5_0_pre2, CRAB_2_5_0_pre1, CRAB_2_4_4, CRAB_2_4_4_pre6, CRAB_2_4_4_pre5, CRAB_2_4_4_pre4, CRAB_2_4_4_pre3, CRAB_2_4_4_pre2, CRAB_2_4_4_pre1, CRAB_2_4_3, CRAB_2_4_3_pre8, CRAB_2_4_3_pre7, CRAB_2_4_3_pre6, CRAB_2_4_3_pre5, CRAB_2_4_3_pre3, CRAB_2_4_3_pre2, CRAB_2_4_3_pre1, CRAB_2_4_2, CRAB_2_4_2_pre3, CRAB_2_4_2_pre2, CRAB_2_4_2_pre1, CRAB_2_4_1, CRAB_2_4_1_pre4, CRAB_2_4_1_pre3, CRAB_2_4_1_pre2, CRAB_2_4_1_pre1, CRAB_2_4_0_Tutorial, CRAB_2_4_0_Tutorial_pre1, CRAB_2_4_0, CRAB_2_4_0_pre9, CRAB_2_4_0_pre8, CRAB_2_4_0_pre7, CRAB_2_4_0_pre6, CRAB_2_4_0_pre5, CRAB_2_4_0_pre4, CRAB_2_4_0_pre3, CRAB_2_4_0_pre2, CRAB_2_4_0_pre1, CRAB_DLS_PHED1, CRAB_DLS_PHED, CRAB_2_3_2_Fnal, CRAB_2_3_2, CRAB_2_3_2_pre7, CRAB_2_3_2_pre5, CRAB_2_3_2_pre4, CRAB_2_3_2_pre3, CRAB_2_3_2_pre2, CRAB_2_3_2_pre1, CRAB_2_4_0_test, CRAB_2_3_1, CRAB_2_3_1_pre6, CRAB_2_3_1_pre5, CRAB_2_3_1_pre4, CRAB_2_3_1_pre3, CRAB_2_3_1_pre2, CRAB_2_3_1_pre1, CRAB_2_3_0, CRAB_2_3_0_pre6, CRAB_2_3_0_pre1, CRAB_2_2_2_pre5, CRAB_2_2_2_pre4, CRAB_2_2_2_pre3, CRAB_2_2_2_pre2, CRAB_2_2_2_pre1, CRAB_2_2_1, CRAB_2_2_1_pre6, CRAB_2_2_1_pre5, CRAB_2_2_1_pre4, PRODCOMMON_0_10_7_testCS2, CRAB_2_2_1_pre3, CRAB_2_2_1_pre2, CRAB_2_2_1_pre1, CRAB_2_2_0, CRAB_2_2_0_pre21, CRAB_2_2_0_pre19, CRAB_2_2_0_pre18, CRAB_2_2_0_pre17, CRAB_2_2_0_pre16, CRAB_2_2_0_pre15, CRAB_2_2_0_pre13, CRAB_2_2_0_pre12, CRAB_2_2_0_pre11, CRAB_2_2_0_pre10, bp_osg_bdii, CRAB_2_2_0_pre9, CRAB_2_2_0_pre8, CRAB_2_2_0_pre7, CRAB_2_1_2, CRAB_2_2_0_pre5, CRAB_2_1_2_pre2, CRAB_2_1_2_pre1, CRAB_2_2_0_pre4, CRAB_2_2_0_pre2, CRAB_2_1_1, CRAB_2_1_1_pre3, CRAB_2_2_0_pre1, CRAB_2_1_1_pre1, CRAB_2_1_0, CRAB_2_1_0_pre6, CRAB_2_1_0_pre5, CRAB_2_1_0_pre4, CRAB_2_1_0_pre3, CRAB_2_1_0_pre2, CRAB_2_1_0_pre1, CRAB_2_0_4, CRAB_2_0_4_pre2, CRAB_2_0_4_pre1, CRAB_2_0_3, CRAB_2_0_3_pre1, CRAB_2_0_2, CRAB_2_0_2_pre6, CRAB_2_0_2_pre5, CRAB_2_0_2_pre4, CRAB_2_0_2_pre3, CRAB_1_5_4_SLC3, CRAB_1_5_4_SLC3_pre4, CRAB_2_0_2_pre2, CRAB_2_0_2_pre1, CRAB_1_5_4_SLC3_pre3, CRAB_2_0_1, CRAB_1_5_4_SLC3_pre2, CRAB_2_0_1_pre1, CRAB_1_5_4_SLC3_pre1, CRAB_2_0_0, CRAB_2_0_0_pre10, CRAB_2_0_0_pre9, CRAB_1_5_4, CRAB_1_5_4_pre2, CRAB_1_5_4_pre1, CRAB_2_0_0_pre7, CRAB_2_0_0_pre6, CRAB_1_5_3, CRAB_1_5_3_pre5, CRAB_1_5_3_pre4, CRAB_2_0_0_pre5, CRAB_1_5_3_pre3, configure, CRAB_2_0_0_pre4, CRAB_1_5_3_pre2, CRAB_1_5_3_pre1, CRAB_2_0_0_pre3, CRAB_1_5_2, CRAB_2_0_0_pre2, CRAB_2_0_0_pre1, CRAB_1_5_1, CRAB_1_5_1_pre4, CRAB_1_5_1_pre3, CRAB_1_5_1_pre2, CRAB_1_5_1_pre1, CRAB_1_5_0, CRAB_1_5_0_pre9, CRAB_1_5_0_pre8, CRAB_1_5_0_pre7, CRAB_1_5_0_pre6, CRAB_1_5_0_pre5, CRAB_1_5_0_pre4, HEAD
Branch point for: CRAB_multiout, CRAB_2_7_1_branch, Lumi2_8, CRAB_2_6_X_br, AnaDataSet, CRAB_2_3_0_br, osg_bdii, CRAB_2_1_2_br, CRAB_2_1_1_pre2, CRAB_1_5_4_SLC3_pre4_br, CRAB_1_5_4_SLC3_start
Changes since 1.1: +3 -4 lines
Log Message:
many minor fixes reported by pychecker, mostly unsude import and unused variables

File Contents

# Content
1 import string
2
3 """
4 Unserialize class for the PHP RefDB serialization format.
5
6 @version v1.0
7 @@author Giovanni Ciraolo
8
9 @ From A Project of
10 @Scott Hurring; scott at hurring dot com
11 @copyright Copyright (c) 2005 Scott Hurring
12 @license http://opensource.org/licenses/gpl-license.php GNU Public License
13 $Id: UnserializePHP.py,v 1.1 2005/07/25 14:31:24 slacapra Exp $
14
15 Most recent version can be found at:
16 http://hurring.com/code/python/phpserialize/
17
18 Usage:
19 # Create an instance of the unserialize engine
20 u = PHPUnserialize()
21 # unserialize some string into python data
22 data = u.unserialize(serialized_string)
23
24 Please see README.txt for more information.
25 """
26 class PHPUnserializeError:
27 def __init__(self,line):
28 print '\nERROR Unserializing: '+line+'\n'
29 pass
30
31 class PHPUnserialize(object):
32 """
33 Class to unserialize something from the PHP Serialize format.
34
35 Usage:
36 u = PHPUnserialize()
37 data = u.unserialize(serialized_string)
38 """
39
40 def __init__(self):
41 pass
42
43 def unserialize(self, data):
44 return self._unserialize(data, 0)[2]
45
46 def _unserialize(self, data, offset=0):
47 """
48 Find the next token and unserialize it.
49 Recurse on array.
50
51 offset = raw offset from start of data
52 """
53
54 dtype = string.lower(data[offset:offset+1])
55
56 #print "# dtype =", dtype
57
58 # 't:' = 2 chars
59 dataoffset = offset + 2
60 typeconvert = lambda x : x
61 chars = 0
62
63 # int => Integer
64 if dtype == 'i':
65 typeconvert = lambda x : int(x)
66 (chars, readdata) = self.read_until(data, dataoffset, ';')
67 # +1 for end semicolon
68 dataoffset += chars + 1
69 elif dtype == 'o':
70 (chars, keys) = self.read_until(data, dataoffset, ':')
71 dataoffset += chars + 1
72 (chars, keys) = self.read_until(data, dataoffset, ':')
73 dataoffset += chars + 1
74 (chars, keys) = self.read_until(data, dataoffset, ':')
75 #print chars,keys
76 dataoffset += chars + 2
77 readdata = {}
78 for i in range(0, int(keys)):
79 (ktype, kchars, key) = self._unserialize(data, dataoffset)
80 dataoffset += kchars
81 # print "Key(%i) = (%s, %i, %s) %i" % (i, ktype, kchars, key, dataoffset)
82
83 # Read value of the key
84 (vtype, vchars, value) = self._unserialize(data, dataoffset)
85 dataoffset += vchars
86 # print "Value(%i) = (%s, %i, %s) %i" % (i, vtype, vchars, value, dataoffset)
87
88 # Set the list element
89 readdata[key] = value
90
91
92 # +1 for end semicolon
93
94 dataoffset += chars - 1
95 # bool => Boolean
96 elif dtype == 'b':
97 typeconvert = lambda x : (int(x) == 1)
98 (chars, readdata) = self.read_until(data, dataoffset, ';')
99 # +1 for end semicolon
100 dataoffset += chars + 1
101
102 # double => Floating Point
103 elif dtype == 'd':
104 typeconvert = lambda x : float(x)
105 (chars, readdata) = self.read_until(data, dataoffset, ';')
106 # +1 for end semicolon
107 dataoffset += chars + 1
108
109 # n => None
110 elif dtype == 'n':
111 readdata = None
112
113 # s => String
114 elif dtype == 's':
115 (chars, stringlength) = self.read_until(data, dataoffset, ':')
116 # +2 for colons around length field
117 dataoffset += chars + 2
118
119 # +1 for start quote
120 (chars, readdata) = self.read_chars(data, dataoffset+1, int(stringlength))
121 # +2 for endquote semicolon
122 dataoffset += chars + 2
123
124 if chars != int(stringlength) != int(readdata):
125 raise Exception("String length mismatch")
126
127 # array => Dict
128 # If you originally serialized a Tuple or List, it will
129 # be unserialized as a Dict. PHP doesn't have tuples or lists,
130 # only arrays - so everything has to get converted into an array
131 # when serializing and the original type of the array is lost
132 elif dtype == 'a':
133 readdata = {}
134
135 # How many keys does this list have?
136 (chars, keys) = self.read_until(data, dataoffset, ':')
137 # +2 for colons around length field
138 dataoffset += chars + 2
139
140 # Loop through and fetch this number of key/value pairs
141 for i in range(0, int(keys)):
142 # Read the key
143 (ktype, kchars, key) = self._unserialize(data, dataoffset)
144 dataoffset += kchars
145 #print "Key(%i) = (%s, %i, %s) %i" % (i, ktype, kchars, key, dataoffset)
146
147 # Read value of the key
148 (vtype, vchars, value) = self._unserialize(data, dataoffset)
149 dataoffset += vchars
150 #print "Value(%i) = (%s, %i, %s) %i" % (i, vtype, vchars, value, dataoffset)
151
152 # Set the list element
153 readdata[key] = value
154
155 # +1 for end semicolon
156 dataoffset += 1
157 #chars = int(dataoffset) - start
158
159 # I don't know how to unserialize this
160
161
162 else:
163 raise Exception("Unknown / Unhandled data type (%s)!" % dtype)
164
165
166 return (dtype, dataoffset-offset, typeconvert(readdata))
167
168 def read_until(self, data, offset, stopchar):
169 """
170 Read from data[offset] until you encounter some char 'stopchar'.
171 """
172 buf = []
173 char = data[offset:offset+1]
174 i = 2
175 while char != stopchar:
176 # Consumed all the characters and havent found ';'
177 if i+offset > len(data):
178 raise Exception("Invalid")
179 buf.append(char)
180 char = data[offset+(i-1):offset+i]
181 i += 1
182
183 # (chars_read, data)
184 return (len(buf), "".join(buf))
185
186 def read_chars(self, data, offset, length):
187 """
188 Read 'length' number of chars from data[offset].
189 """
190 buf = []
191 # Account for the starting quote char
192 #offset += 1
193 for i in range(0, length):
194 char = data[offset+(i-1):offset+i]
195 buf.append(char)
196
197 # (chars_read, data)
198 return (len(buf), "".join(buf))
199
200