public TrackData ReadTrackByISRC(string isrc)
        {
            // get track collection
            var col = db.GetCollection <TrackDataDTO>("tracks");

            // return by isrc
            var result = col.FindOne(x => x.ISRC == isrc);

            return(TrackDataDTO.CopyToTrackData(result));
        }
        public TrackData ReadTrackByReference(IModelReference id)
        {
            // get track collection
            var col = db.GetCollection <TrackDataDTO>("tracks");

            // return by id
            var result = col.FindById(new BsonValue(id.Id));

            return(TrackDataDTO.CopyToTrackData(result));
        }
 public static TrackData CopyToTrackData(TrackDataDTO dto)
 {
     return(new TrackData(
                dto.ISRC,
                dto.Artist,
                dto.Title,
                dto.Album,
                dto.ReleaseYear,
                dto.TrackLengthSec,
                new ModelReference <string>(dto.Id)));
 }
        public IModelReference InsertTrack(TrackData track)
        {
            var dto = TrackDataDTO.CopyToTrackDataDTO(track);

            // get track collection
            var col = db.GetCollection <TrackDataDTO>("tracks");

            // insert new track object
            var bson = col.Insert(dto);

            var trackReference = new ModelReference <string>(bson);

            return(track.TrackReference = trackReference);
        }
        public void PutTrack(TrackDataDTO trackDataDTO)
        {
            if (string.IsNullOrWhiteSpace(trackDataDTO.Id))
            {
                throw new ArgumentException("Id have to be unique and not empty", nameof(trackDataDTO.Id));
            }
            // check for isrc in database
            var idKey = Encoding.UTF8.GetBytes(trackDataDTO.Id).AsMemory();

            using (idKey.Pin())
            {
                var keyBuffer = new DirectBuffer(idKey.Span);
                if (indexesHolder.IdIndex.TryGet(tx, ref keyBuffer, out _))
                {
                    throw new ArgumentException("Track with given Id already exists", nameof(trackDataDTO.Id));
                }
            }

            var trackKey   = BitConverter.GetBytes(trackDataDTO.TrackReference).AsMemory();
            var trackValue = MessagePackSerializer.Serialize(trackDataDTO, options: serializerOptions).AsMemory();

            using (trackKey.Pin())
            {
                var trackKeyBuffer = new DirectBuffer(trackKey.Span);
                using (trackValue.Pin())
                {
                    var valueBuffer = new DirectBuffer(trackValue.Span);
                    databasesHolder.TracksDatabase.Put(tx, ref trackKeyBuffer, ref valueBuffer);
                }

                // create indexes
                using (idKey.Pin())
                {
                    var keyBuffer = new DirectBuffer(idKey.Span);
                    indexesHolder.IdIndex.Put(tx, ref keyBuffer, ref trackKeyBuffer);
                }

                var titleKey = Encoding.UTF8.GetBytes(trackDataDTO.Title).AsMemory();
                if (!titleKey.IsEmpty)
                {
                    using (titleKey.Pin())
                    {
                        var keyBuffer = new DirectBuffer(titleKey.Span);
                        indexesHolder.TitleIndex.Put(tx, ref keyBuffer, ref trackKeyBuffer);
                    }
                }
            }
        }
        public void InsertTrack(TrackData track)
        {
            using var tx = databaseContext.OpenReadWriteTransaction();
            try
            {
                var newTrack = new TrackDataDTO(track);

                tx.PutTrack(newTrack);

                tx.Commit();
            }
            catch (Exception)
            {
                tx.Abort();
                throw;
            }
        }
        public TrackData InsertTrack(TrackInfo track, double durationInSeconds)
        {
            using var tx = databaseContext.OpenReadWriteTransaction();
            try
            {
                var newTrackId = tx.GetLastTrackId();
                newTrackId++;
                var trackReference = new ModelReference <ulong>(newTrackId);
                var newTrack       = new TrackDataDTO(track, durationInSeconds, trackReference);

                tx.PutTrack(newTrack);

                tx.Commit();
                return(newTrack.ToTrackData());
            }
            catch (Exception)
            {
                tx.Abort();
                throw;
            }
        }
        public void RemoveTrack(TrackDataDTO trackDataDTO)
        {
            var trackKey = BitConverter.GetBytes(trackDataDTO.TrackReference).AsMemory();

            using (trackKey.Pin())
            {
                var trackKeyBuffer = new DirectBuffer(trackKey.Span);
                // get track from database
                var track = GetTrackById(ref trackKeyBuffer, tx);

                // remove indexes
                var idKey = Encoding.UTF8.GetBytes(track.Id).AsMemory();
                using (idKey.Pin())
                {
                    var keyBuffer = new DirectBuffer(idKey.Span);
                    indexesHolder.IdIndex.Delete(tx, ref keyBuffer);
                }

                var titleKey = Encoding.UTF8.GetBytes(track.Title).AsMemory();
                if (!titleKey.IsEmpty)
                {
                    using (titleKey.Pin())
                        using (var cursor = indexesHolder.TitleIndex.OpenCursor(tx))
                        {
                            var keyBuffer = new DirectBuffer(titleKey.Span);
                            if (cursor.TryGet(ref keyBuffer, ref trackKeyBuffer, CursorGetOption.GetBoth))
                            {
                                cursor.Delete(false);
                            }
                        }
                }

                // remove track
                databasesHolder.TracksDatabase.Delete(tx, ref trackKeyBuffer);
            }
        }