@@ -68,16 +68,22 @@ func mapInterfaceToStr(m map[string]interface{}) map[string]string {
6868 return retVal
6969}
7070
71- func findSectionSeparator (mmdbFile * os.File , sep string ) (int64 , error ) {
72- fileInfo , err := mmdbFile .Stat ()
71+ func findSectionSeparator (mmdbFile string , sep string ) (int64 , error ) {
72+ file , err := os .Open (mmdbFile )
73+ if err != nil {
74+ return 0 , fmt .Errorf ("couldn't open mmdb file: %w" , err )
75+ }
76+ defer file .Close ()
77+
78+ fileInfo , err := file .Stat ()
7379 if err != nil {
7480 return 0 , err
7581 }
7682
7783 fileSize := fileInfo .Size ()
7884
7985 // Map the mmdb file into memory.
80- mmap , err := syscall .Mmap (int (mmdbFile .Fd ()), 0 , int (fileSize ), syscall .PROT_READ , syscall .MAP_SHARED )
86+ mmap , err := syscall .Mmap (int (file .Fd ()), 0 , int (fileSize ), syscall .PROT_READ , syscall .MAP_SHARED )
8187 if err != nil {
8288 return 0 , err
8389 }
@@ -120,19 +126,25 @@ type TypeSizes struct {
120126 Utf8StringSize int64 `json:"utf8_string_size"`
121127 DoubleSize int64 `json:"double_size"`
122128 BytesSize int64 `json:"bytes_size"`
123- Unsigned16bitIntSize int64 `json:"unsigned_16-bit_int_size "`
124- Unsigned32bitIntSize int64 `json:"unsigned_32-bit_int_size "`
125- Signed32bitIntSize int64 `json:"signed_32-bit_int_size "`
126- Unsigned64bitIntSize int64 `json:"unsigned_64-bit_int_size "`
127- Unsigned128bitIntSize int64 `json:"unsigned_128-bit_int_size "`
129+ Unsigned16bitIntSize int64 `json:"unsigned_16bit_int_size "`
130+ Unsigned32bitIntSize int64 `json:"unsigned_32bit_int_size "`
131+ Signed32bitIntSize int64 `json:"signed_32bit_int_size "`
132+ Unsigned64bitIntSize int64 `json:"unsigned_64bit_int_size "`
133+ Unsigned128bitIntSize int64 `json:"unsigned_128bit_int_size "`
128134 MapKeyValueCount int64 `json:"map_key_value_pair_count"`
129135 ArrayLength int64 `json:"array_length"`
130136 FloatSize int64 `json:"float_size"`
131137}
132138
133- func traverseDataSection (mmdbFile * os.File , startOffset int64 , endOffset int64 ) (TypeSizes , error ) {
139+ func traverseDataSection (mmdbFile string , startOffset int64 , endOffset int64 ) (TypeSizes , error ) {
140+ file , err := os .Open (mmdbFile )
141+ if err != nil {
142+ return TypeSizes {}, fmt .Errorf ("couldn't open mmdb file: %w" , err )
143+ }
144+ defer file .Close ()
145+
134146 // Go to the start offset of the data section.
135- _ , err := mmdbFile .Seek (startOffset , 0 )
147+ _ , err = file .Seek (startOffset , 0 )
136148 if err != nil {
137149 return TypeSizes {}, err
138150 }
@@ -142,7 +154,7 @@ func traverseDataSection(mmdbFile *os.File, startOffset int64, endOffset int64)
142154 // Read and process bytes until the end offset is reached.
143155 for offset := startOffset ; offset < endOffset ; {
144156 var controlByte [1 ]byte
145- _ , err := mmdbFile .Read (controlByte [:])
157+ _ , err := file .Read (controlByte [:])
146158 if err != nil {
147159 return TypeSizes {}, err
148160 }
@@ -156,33 +168,33 @@ func traverseDataSection(mmdbFile *os.File, startOffset int64, endOffset int64)
156168 if dataType == 0 {
157169 // Read actual type number from the next byte
158170 var extendedTypeByte [1 ]byte
159- _ , err := mmdbFile .Read (extendedTypeByte [:])
171+ _ , err := file .Read (extendedTypeByte [:])
160172 if err != nil {
161173 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
162174 }
163175 offset ++
164176
165177 switch extendedTypeByte [0 ] {
166178 case 1 : // unsigned 32-bit int.
167- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
179+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
168180 if err != nil {
169181 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
170182 }
171183 typeSizes .Signed32bitIntSize += int64 (payloadSize )
172184 case 2 : // unsigned 64-bit int.
173- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
185+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
174186 if err != nil {
175187 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
176188 }
177189 typeSizes .Unsigned64bitIntSize += int64 (payloadSize )
178190 case 3 : // unsigned 128-bit int.
179- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
191+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
180192 if err != nil {
181193 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
182194 }
183195 typeSizes .Unsigned128bitIntSize += int64 (payloadSize )
184196 case 4 : // array.
185- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
197+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
186198 if err != nil {
187199 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
188200 }
@@ -204,40 +216,39 @@ func traverseDataSection(mmdbFile *os.File, startOffset int64, endOffset int64)
204216 typeSizes .PointerSize += 3
205217 }
206218 case 2 : // UTF-8 string.
207- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
219+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
208220 if err != nil {
209221 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
210222 }
211223 typeSizes .Utf8StringSize += int64 (payloadSize )
212224 case 3 : // Double.
213225 typeSizes .DoubleSize += 8
214226 case 4 : // Byte.
215- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
227+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
216228 if err != nil {
217229 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
218230 }
219231 typeSizes .BytesSize += int64 (payloadSize )
220232 case 5 : // unsigned 16-bit int.
221- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
233+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
222234 if err != nil {
223235 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
224236 }
225237 typeSizes .Unsigned16bitIntSize += int64 (payloadSize )
226238 case 6 : // unsigned 32-bit int.
227- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
239+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
228240 if err != nil {
229241 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
230242 }
231243 typeSizes .Unsigned32bitIntSize += int64 (payloadSize )
232244 case 7 : // map.
233- payloadSize , offset , err = payloadCalculation (mmdbFile , payloadSize , offset )
245+ payloadSize , offset , err = payloadCalculation (file , payloadSize , offset )
234246 if err != nil {
235247 return TypeSizes {}, fmt .Errorf ("couldn't read the file: %v" , err )
236248 }
237249 typeSizes .MapKeyValueCount += int64 (payloadSize )
238250 }
239251 }
240-
241252 }
242253
243254 return typeSizes , nil
0 commit comments