1
2
3
4
5
6
7
8
9
10 """Handle reading data off an SQLit2 2.x data file"""
11
12
13 import struct
14
15
16
17 BO='<'
18 signature='** This file contains an SQLite 2.1 database **\x00'
19 signature_len=len(signature)
20 LE_string='\x28\x75\xe3\xda'
21 BE_string='\xda\xe3\x75\x28'
22 Page_Length=1024
23 Max_Cell_Data_Len=238
24
25
31
34 Exception.__init__(self, 'Invalid Byte Order String: %s'%bad_data)
35 self.bad_data=bad_data
36
41
75
77 - def __init__(self, data):
78 global BO, Page_Length
79 self.prev_key=struct.unpack('%cI'%BO, data[:4])[0]
80 self.cell0=struct.unpack('%cH'%BO, data[4:6])[0]
81 self.freeblock=struct.unpack('%cH'%BO, data[6:8])[0]
82 self.data=data[:Page_Length]
83
84 - def get_cell_data(self, offset, db_file):
85 return Cell(self.data[offset:]).get_data(self, db_file)
86
87 - def get_data(self, db_file, _=None):
88
89 _res=[]
90 if self.prev_key:
91 _res=db_file.get_data(self.prev_key)
92 _res+=self.get_cell_data(self.cell0, db_file)
93 return _res
94
96 - def __init__(self, data):
97 global signature, BO, signature_len, LE_string, BE_string
98 _sig=data[:signature_len]
99 if _sig!=signature:
100 raise InvalidFile(_sig)
101 _idx=signature_len
102 _bo_string=data[_idx:_idx+4]
103 if _bo_string==LE_string:
104 BO='<'
105 elif _bo_string==BE_string:
106 BO='>'
107 else:
108 raise InvalidByteOrder(_bo_string)
109 _idx+=4
110 self.first_free_page=struct.unpack('%cI'%BO, data[_idx:_idx+4])[0]
111 _idx+=4
112 self.freelist_pages=struct.unpack('%cI'%BO, data[_idx:_idx+4])[0]
113
114 -class OverflowPage(object):
115 Max_Len=1020
116 - def __init__(self, data):
117 global BO, Page_Length
118 self.next=struct.unpack('%cI'%BO, data[:4])[0]
119 self.data=data[4:Page_Length]
120
121 - def get_data(self, db_file, data_size=None):
122 if data_size:
123 if data_size>self.Max_Len:
124 _res=self.data
125 if self.next:
126 _res+=db_file.get_data(self.next, data_size-self.Max_Len)
127 else:
128 _res=self.data[:data_size]
129 else:
130 _res=self.data
131 return _res
132
138
139 - def get_data(self, page_num, data_size=None):
150
152
153 _data_len=len(data)
154 if _data_len<256:
155 _ofs_size=1
156 elif _data_len<65536:
157 _ofs_size=2
158 else:
159 _ofs_size=3
160 _idx=(numofcols+1)*_ofs_size
161 return data[_idx:].split('\x00')[:numofcols]
162
164
165 _res={}
166
167 for _entry in self.get_data(2):
168 _row=self.extract_data(_entry, 5)
169 if _row[0]=='table':
170 _res[_row[1]]={ 'name': _row[1],
171 'page': int(_row[3]),
172 'numofcols': _row[4].count(',')+1 }
173 return _res
174
185