| | |
| | | |
| | | /** The DN attribute type. */ |
| | | private static final AttributeType dnType; |
| | | static final IndexOutputBuffer.IndexComparator indexComparator = |
| | | new IndexOutputBuffer.IndexComparator(); |
| | | |
| | | /** Phase one buffer count. */ |
| | | private final AtomicInteger bufferCount = new AtomicInteger(0); |
| | |
| | | final ByteStringBuilder key = new ByteStringBuilder(BYTE_BUFFER_CAPACITY); |
| | | ImportIDSet insertIDSet = null; |
| | | ImportIDSet deleteIDSet = null; |
| | | Integer indexID = null; |
| | | ImportRecord previousRecord = null; |
| | | try |
| | | { |
| | | beginWriteTask(); |
| | |
| | | while (!bufferSet.isEmpty()) |
| | | { |
| | | IndexInputBuffer b = bufferSet.pollFirst(); |
| | | if (!b.sameKeyAndIndexID(key, indexID)) |
| | | if (!b.currentRecord().equals(previousRecord)) |
| | | { |
| | | if (indexID != null) |
| | | if (previousRecord != null) |
| | | { |
| | | // save the previous record |
| | | addToDB(indexID, insertIDSet, deleteIDSet); |
| | | addToDB(previousRecord.getIndexID(), insertIDSet, deleteIDSet); |
| | | } |
| | | |
| | | // this is a new record, reinitialize all |
| | | indexID = b.getIndexID(); |
| | | int indexID = b.getIndexID(); |
| | | b.fetchKey(key); |
| | | previousRecord = ImportRecord.from(key, indexID); |
| | | |
| | | insertIDSet = newImportIDSet(key, indexID); |
| | | deleteIDSet = newImportIDSet(key, indexID); |
| | |
| | | } |
| | | } |
| | | |
| | | if (indexID != null) |
| | | if (previousRecord != null) |
| | | { |
| | | addToDB(indexID, insertIDSet, deleteIDSet); |
| | | addToDB(previousRecord.getIndexID(), insertIDSet, deleteIDSet); |
| | | } |
| | | } |
| | | return null; |
| | |
| | | else if (!indexBuffer.sameKeyAndIndexID(i)) |
| | | { |
| | | // this is a new record, save previous record ... |
| | | bufferLen += writeRecord(indexBuffer); |
| | | bufferLen += writeRecord(indexBuffer.currentRecord()); |
| | | // ... and reinitialize all |
| | | indexBuffer.setPosition(i); |
| | | resetStreams(); |
| | |
| | | if (numberKeys > 0) |
| | | { |
| | | // save the last record |
| | | bufferLen += writeRecord(indexBuffer); |
| | | bufferLen += writeRecord(indexBuffer.currentRecord()); |
| | | } |
| | | return bufferLen; |
| | | } |
| | |
| | | indexSortedSet.add(b); |
| | | } |
| | | } |
| | | byte[] saveKey = null; |
| | | int saveIndexID = 0; |
| | | ImportRecord previousRecord = null; |
| | | while (!indexSortedSet.isEmpty()) |
| | | { |
| | | final IndexOutputBuffer b = indexSortedSet.pollFirst(); |
| | | if (!b.sameKeyAndIndexID(saveKey, saveIndexID)) |
| | | if (!b.currentRecord().equals(previousRecord)) |
| | | { |
| | | if (saveKey != null) |
| | | if (previousRecord != null) |
| | | { |
| | | // save the previous record |
| | | bufferLen += writeRecord(saveKey, saveIndexID); |
| | | bufferLen += writeRecord(previousRecord); |
| | | resetStreams(); |
| | | } |
| | | // this is a new record, reinitialize all |
| | | saveKey = b.getKey(); |
| | | saveIndexID = b.getIndexID(); |
| | | previousRecord = b.currentRecord(); |
| | | } |
| | | |
| | | appendNextEntryIDToStream(b, b.getPosition()); |
| | |
| | | indexSortedSet.add(b); |
| | | } |
| | | } |
| | | if (saveKey != null) |
| | | if (previousRecord != null) |
| | | { |
| | | bufferLen += writeRecord(saveKey, saveIndexID); |
| | | bufferLen += writeRecord(previousRecord); |
| | | } |
| | | return bufferLen; |
| | | } |
| | |
| | | return 2 * INT_SIZE; |
| | | } |
| | | |
| | | private int writeRecord(IndexOutputBuffer b) throws IOException |
| | | private int writeRecord(ImportRecord record) throws IOException |
| | | { |
| | | int keySize = b.getKeySize(); |
| | | int headerSize = writeHeader(b.getIndexID(), keySize); |
| | | b.writeKey(bufferStream); |
| | | int bodySize = writeByteStreams(); |
| | | return headerSize + keySize + bodySize; |
| | | } |
| | | |
| | | private int writeRecord(byte[] k, int indexID) throws IOException |
| | | { |
| | | int keySize = k.length; |
| | | int headerSize = writeHeader(indexID, keySize); |
| | | bufferStream.write(k); |
| | | final ByteSequence key = record.getKey(); |
| | | int keySize = key.length(); |
| | | int headerSize = writeHeader(record.getIndexID(), keySize); |
| | | key.copyTo(bufferStream); |
| | | int bodySize = writeByteStreams(); |
| | | return headerSize + keySize + bodySize; |
| | | } |
| | |
| | | { |
| | | int pLen = INT_SIZE; |
| | | int len = reader.getInt(); |
| | | if (indexComparator.compare(existingDnsBytes, previousPos+pLen, len, dn.getBackingArray(), dn.length()) == 0) |
| | | ImportRecord r1 = ImportRecord.from(ByteString.wrap(existingDnsBytes, previousPos + pLen, len), 0); |
| | | ImportRecord r2 = ImportRecord.from(dn, 0); |
| | | if (r1.equals(r2)) |
| | | { |
| | | return true; |
| | | } |