in src/write.jl [346:401]
function Base.close(writer::Writer)
writer.isclosed && return
close(writer.msgs)
!istaskfailed(writer.task) && wait(writer.task)
if (!isassigned(writer.schema) || !isassigned(writer.firstcols))
writer.closeio && close(writer.io)
writer.isclosed = true
return
end
if !writer.writetofile
msg = Message(UInt8[], nothing, 0, true, false, Meta.Schema)
Base.write(writer.io, msg, writer.blocks, writer.schema, writer.alignment)
writer.closeio && close(writer.io)
writer.isclosed = true
return
end
b = FlatBuffers.Builder(1024)
schfoot = makeschema(b, writer.schema[], writer.firstcols[])
recordbatches = if !isempty(writer.blocks[1])
N = length(writer.blocks[1])
Meta.footerStartRecordBatchesVector(b, N)
for blk in Iterators.reverse(writer.blocks[1])
Meta.createBlock(b, blk.offset, blk.metaDataLength, blk.bodyLength)
end
FlatBuffers.endvector!(b, N)
else
FlatBuffers.UOffsetT(0)
end
dicts = if !isempty(writer.blocks[2])
N = length(writer.blocks[2])
Meta.footerStartDictionariesVector(b, N)
for blk in Iterators.reverse(writer.blocks[2])
Meta.createBlock(b, blk.offset, blk.metaDataLength, blk.bodyLength)
end
FlatBuffers.endvector!(b, N)
else
FlatBuffers.UOffsetT(0)
end
Meta.footerStart(b)
Meta.footerAddVersion(b, Meta.MetadataVersion.V5)
Meta.footerAddSchema(b, schfoot)
Meta.footerAddDictionaries(b, dicts)
Meta.footerAddRecordBatches(b, recordbatches)
foot = Meta.footerEnd(b)
FlatBuffers.finish!(b, foot)
footer = FlatBuffers.finishedbytes(b)
Base.write(writer.io, footer)
Base.write(writer.io, Int32(length(footer)))
Base.write(writer.io, "ARROW1")
writer.closeio && close(writer.io)
writer.isclosed = true
nothing
end