public void InsertSubFingerprints(IEnumerable <SubFingerprintData> subFingerprints)
 {
     using var tx = databaseContext.OpenReadWriteTransaction();
     foreach (var subFingerprint in subFingerprints)
     {
         var subFingerprintDto = new SubFingerprintDataDTO(subFingerprint);
         tx.PutSubFingerprint(subFingerprintDto);
     }
 }
        public void RemoveSubFingerprint(SubFingerprintDataDTO subFingerprintDataDTO)
        {
            var subFingerprintKey = BitConverter.GetBytes(subFingerprintDataDTO.SubFingerprintReference).AsMemory();

            using (subFingerprintKey.Pin())
            {
                var keyBuffer = new DirectBuffer(subFingerprintKey.Span);
                databasesHolder.SubFingerprintsDatabase.Delete(tx, ref keyBuffer);

                var trackKey = BitConverter.GetBytes(subFingerprintDataDTO.TrackReference).AsMemory();
                using (trackKey.Pin())
                {
                    var trackKeyBuffer = new DirectBuffer(trackKey.Span);
                    using var cursor = indexesHolder.TracksSubfingerprintsIndex.OpenCursor(tx);
                    if (cursor.TryGet(ref trackKeyBuffer, ref keyBuffer, CursorGetOption.GetBoth))
                    {
                        cursor.Delete(false);
                    }
                }
            }
        }
Exemple #3
0
        public IEnumerable <SubFingerprintData> InsertHashDataForTrack(IEnumerable <HashedFingerprint> hashedFingerprints, IModelReference trackReference)
        {
            using var tx = databaseContext.OpenReadWriteTransaction();
            var trackId   = trackReference.Get <ulong>();
            var trackData = tx.GetTrackById(trackId);

            if (trackData == null)
            {
                throw new TrackNotFoundException(trackId);
            }

            var newSubFingerprintId = tx.GetLastSubFingerprintId();
            var result = new List <SubFingerprintData>();

            foreach (var hashedFingerprint in hashedFingerprints)
            {
                newSubFingerprintId++;
                var subFingerprintReference = new ModelReference <ulong>(newSubFingerprintId);
                var subFingerprint          = new SubFingerprintDataDTO(hashedFingerprint.HashBins,
                                                                        hashedFingerprint.SequenceNumber,
                                                                        hashedFingerprint.StartsAt,
                                                                        subFingerprintReference,
                                                                        trackReference);
                tx.PutSubFingerprint(subFingerprint);

                // Insert hashes to hashTable
                var table = 0;
                foreach (var hash in hashedFingerprint.HashBins)
                {
                    tx.PutSubFingerprintsByHashTableAndHash(table, hash, newSubFingerprintId);
                    table++;
                }

                result.Add(subFingerprint.ToSubFingerprintData());
            }

            tx.Commit();
            return(result);
        }
        public void PutSubFingerprint(SubFingerprintDataDTO subFingerprintDataDTO)
        {
            var subFingerprintKey   = BitConverter.GetBytes(subFingerprintDataDTO.SubFingerprintReference).AsMemory();
            var subFingerprintValue = MessagePackSerializer.Serialize(subFingerprintDataDTO, options: serializerOptions).AsMemory();

            using (subFingerprintKey.Pin())
            {
                var subFingerprintKeyBuffer = new DirectBuffer(subFingerprintKey.Span);
                using (subFingerprintValue.Pin())
                {
                    var valueBuffer = new DirectBuffer(subFingerprintValue.Span);
                    databasesHolder.SubFingerprintsDatabase.Put(tx, ref subFingerprintKeyBuffer, ref valueBuffer);
                }

                var trackKey = BitConverter.GetBytes(subFingerprintDataDTO.TrackReference).AsMemory();
                using (trackKey.Pin())
                {
                    var trackKeyBuffer = new DirectBuffer(trackKey.Span);
                    indexesHolder.TracksSubfingerprintsIndex.Put(tx, ref trackKeyBuffer, ref subFingerprintKeyBuffer);
                }
            }
        }