DatabaseRoot.coffee | |
---|---|
CompressedUnsignedLongByteIterable =
(require '../log/iterate/CompressedUnsignedLongByteIterable.coffee').
CompressedUnsignedLongByteIterable
DataIterator = (require '../log/DataIterator.coffee').DataIterator
LightReadIterator = (require '../log/DataIterator.coffee').LightReadIterator
LoggableToWrite = (require '../log/LoggableToWrite.coffee').LoggableToWrite
RandomAccessLoggable =
(require '../log/RandomAccessLoggable.coffee').RandomAccessLoggable
LightOutputStream =
(require '../database/impl/iterate/LightOutputStream.coffee').
LightOutputStream
Addr64 = (require '../log/Addr64.coffee').Addr64 | |
This class is necessary for commmiting log. It is written in log before each commit and contains kind of check sum. If it is valid, everything was written correctly. | class DatabaseRoot extends RandomAccessLoggable
@DATABASE_ROOT_TYPE: 1
@MAGIC_DIFF: 199 |
@private | rootAddress: undefined |
@private | lastStructureId: undefined |
@private | isValid: undefined |
Constructor takes rootAddress and lastStructureId. | @create$Addr64$int: (rootAddress, lastStructureId, o) ->
if !o? then o = new DatabaseRoot()
o.rootAddress = rootAddress
o.lastStructureId = lastStructureId
o.isValid = undefined
return o
getRootAddress: () ->
return @rootAddress
getLastStructureId: () ->
return @lastStructureId
isValid: () ->
return @isValid |
Get WriteLogable that can be written to log. | toLoggable: () ->
dataLength =
CompressedUnsignedLongByteIterable.
getCompressedSize$int(@rootAddress.toFloat()) +
CompressedUnsignedLongByteIterable.
getCompressedSize$int(@lastStructureId) +
CompressedUnsignedLongByteIterable.
getCompressedSize$int(@rootAddress.toFloat() + @lastStructureId +
DatabaseRoot.MAGIC_DIFF)
los = LightOutputStream.create$int dataLength
CompressedUnsignedLongByteIterable.
fillBytes$int$LightOutputStream @rootAddress.toFloat(), los
CompressedUnsignedLongByteIterable.
fillBytes$int$LightOutputStream @lastStructureId, los
CompressedUnsignedLongByteIterable.
fillBytes$int$LightOutputStream @rootAddress.toFloat() +
@lastStructureId + DatabaseRoot.MAGIC_DIFF, los
return LoggableToWrite.
create$int$ByteIterable$int DatabaseRoot.DATABASE_ROOT_TYPE,
los.asArrayByteIterable() |
Temporary function, until I undestand Loggable factories and usage of static temp emitters. Very DANGEROUS and should be rewritten anyway!!! | readFromLoggable: (loggable) ->
it = loggable.getData().iterator()
nums = new Object()
emit = false
onGetAllNumbers = () =>
@rootAddressInt = nums[1]
@rootAddress = Addr64.create$int$int(0, 0).plus$int(@rootAddressInt)
@lastStructureId = nums[2]
@isValid = @rootAddressInt == nums[3] -
@lastStructureId - DatabaseRoot.MAGIC_DIFF
if emit
@emit 'readFromLoggable', @isValid
k = 0
CompressedUnsignedLongByteIterable.EMITTER.once 'getInt', (value) =>
nums[k] = value
if k != 3
for i in [k + 1..3]
nums[i] = CompressedUnsignedLongByteIterable.
getInt$ByteIterator$emit it
onGetAllNumbers()
while k != 3
k += 1
nums[k] = CompressedUnsignedLongByteIterable.
getInt$ByteIterator$emit it
if !nums[k]?
emit = true
return undefined
CompressedUnsignedLongByteIterable.EMITTER.removeAllListeners 'getInt'
onGetAllNumbers()
return @isValid
exports.DatabaseRoot = DatabaseRoot
|