Source code for gavo.votable.dec_binary2
"""
BINARY2 VOTable decoding
BINARY2 is like BINARY, except every record is preceded by a mask which
columns are NULL.
Sorry for gratuituously peeking into the guts of dec_binary here. But well,
it's family.
"""
#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL. See the
#c COPYING file in the source distribution.
from gavo.votable import coding #noflake: used by generated code
from gavo.votable import common
from gavo.votable import dec_binary
from gavo.votable.model import VOTable
[docs]def getRowDecoderSource(tableDefinition):
"""returns the source for a function deserializing a BINARY stream.
tableDefinition is a VOTable.TABLE instance. The function returned
expects a file-like object.
"""
source = [
"def codec(inF):",
" row = []",
" try:",
" nullMap = nullFlags.getFromFile(inF)",
" except IOError:", # EOF while reading null map: correct end of stream.
" return None",
]
for index, field in enumerate(
tableDefinition.iterChildrenOfType(VOTable.FIELD)):
source.extend([
" try:",]+
common.indentList(getLinesFor(field), " ")+[
" except common.VOTableError:",
" raise",
" except:",
# " raise",
" raise common.BadVOTableLiteral('%s', repr(inF.lastRes), name=%r)"%(
field.datatype, field.name),
])
source.extend([
" for index, isNull in enumerate(nullMap):",
" if isNull:",
" row[index] = None",
" return row"])
return "\n".join(source)
[docs]def getGlobals(tableDefinition):
vars = dict((n, getattr(dec_binary, n)) for n in dir(dec_binary))
vars["nullFlags"] = common.NULLFlags(len(tableDefinition.getFields()))
return vars
getLinesFor = dec_binary.getLinesFor