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); } }