/* This file is part of Libresonic. Libresonic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Libresonic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Libresonic. If not, see <http://www.gnu.org/licenses/>. Copyright 2016 (C) Libresonic Authors Based upon Subsonic, Copyright 2009 (C) Sindre Mehus */ package org.libresonic.player.dao; import org.libresonic.player.domain.Bookmark; import org.springframework.jdbc.core.RowMapper; import org.springframework.transaction.annotation.Transactional; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; /** * Provides database services for media file bookmarks. * * @author Sindre Mehus */ public class BookmarkDao extends AbstractDao { private static final String INSERT_COLUMNS = "media_file_id, position_millis, username, comment, created, changed"; private static final String QUERY_COLUMNS = "id, " + INSERT_COLUMNS; private BookmarkRowMapper bookmarkRowMapper = new BookmarkRowMapper(); /** * Returns all bookmarks. * * @return Possibly empty list of all bookmarks. */ public List<Bookmark> getBookmarks() { String sql = "select " + QUERY_COLUMNS + " from bookmark"; return query(sql, bookmarkRowMapper); } /** * Returns all bookmarks for a given user. * * @return Possibly empty list of all bookmarks for the user. */ public List<Bookmark> getBookmarks(String username) { String sql = "select " + QUERY_COLUMNS + " from bookmark where username=?"; return query(sql, bookmarkRowMapper, username); } /** * Creates or updates a bookmark. If created, the ID of the bookmark will be set by this method. */ @Transactional public void createOrUpdateBookmark(Bookmark bookmark) { int n = update("update bookmark set position_millis=?, comment=?, changed=? where media_file_id=? and username=?", bookmark.getPositionMillis(), bookmark.getComment(), bookmark.getChanged(), bookmark.getMediaFileId(), bookmark.getUsername()); if (n == 0) { update("insert into bookmark (" + INSERT_COLUMNS + ") values (" + questionMarks(INSERT_COLUMNS) + ")", bookmark.getMediaFileId(), bookmark.getPositionMillis(), bookmark.getUsername(), bookmark.getComment(), bookmark.getCreated(), bookmark.getChanged()); int id = queryForInt("select id from bookmark where media_file_id=? and username=?", 0, bookmark.getMediaFileId(), bookmark.getUsername()); bookmark.setId(id); } } /** * Deletes the bookmark for the given username and media file. */ @Transactional public void deleteBookmark(String username, int mediaFileId) { update("delete from bookmark where username=? and media_file_id=?", username, mediaFileId); } private static class BookmarkRowMapper implements RowMapper<Bookmark> { public Bookmark mapRow(ResultSet rs, int rowNum) throws SQLException { return new Bookmark(rs.getInt(1), rs.getInt(2), rs.getLong(3), rs.getString(4), rs.getString(5), rs.getTimestamp(6), rs.getTimestamp(7)); } } }