/* 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 . Copyright 2016 (C) Libresonic Authors Based upon Subsonic, Copyright 2009 (C) Sindre Mehus */ package org.libresonic.player.dao; import org.libresonic.player.Logger; import org.libresonic.player.domain.MediaFile; import org.libresonic.player.domain.Playlist; import org.springframework.jdbc.core.RowMapper; import org.springframework.transaction.annotation.Transactional; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; /** * Provides database services for playlists. * * @author Sindre Mehus */ public class PlaylistDao extends AbstractDao { private static final Logger LOG = Logger.getLogger(PlaylistDao.class); private static final String INSERT_COLUMNS = "username, is_public, name, comment, file_count, duration_seconds, " + "created, changed, imported_from"; private static final String QUERY_COLUMNS = "id, " + INSERT_COLUMNS; private final RowMapper rowMapper = new PlaylistMapper(); public List getReadablePlaylistsForUser(String username) { List result1 = getWritablePlaylistsForUser(username); List result2 = query("select " + QUERY_COLUMNS + " from playlist where is_public", rowMapper); List result3 = query("select " + prefix(QUERY_COLUMNS, "playlist") + " from playlist, playlist_user where " + "playlist.id = playlist_user.playlist_id and " + "playlist.username != ? and " + "playlist_user.username = ?", rowMapper, username, username); // Put in sorted map to avoid duplicates. SortedMap map = new TreeMap(); for (Playlist playlist : result1) { map.put(playlist.getId(), playlist); } for (Playlist playlist : result2) { map.put(playlist.getId(), playlist); } for (Playlist playlist : result3) { map.put(playlist.getId(), playlist); } return new ArrayList(map.values()); } public List getWritablePlaylistsForUser(String username) { return query("select " + QUERY_COLUMNS + " from playlist where username=?", rowMapper, username); } public Playlist getPlaylist(int id) { return queryOne("select " + QUERY_COLUMNS + " from playlist where id=?", rowMapper, id); } public List getAllPlaylists() { return query("select " + QUERY_COLUMNS + " from playlist", rowMapper); } @Transactional public void createPlaylist(Playlist playlist) { update("insert into playlist(" + INSERT_COLUMNS + ") values(" + questionMarks(INSERT_COLUMNS) + ")", playlist.getUsername(), playlist.isShared(), playlist.getName(), playlist.getComment(), 0, 0, playlist.getCreated(), playlist.getChanged(), playlist.getImportedFrom()); int id = queryForInt("select max(id) from playlist", 0); playlist.setId(id); } public void setFilesInPlaylist(int id, List files) { update("delete from playlist_file where playlist_id=?", id); int duration = 0; for (MediaFile file : files) { update("insert into playlist_file (playlist_id, media_file_id) values (?, ?)", id, file.getId()); if (file.getDurationSeconds() != null) { duration += file.getDurationSeconds(); } } update("update playlist set file_count=?, duration_seconds=?, changed=? where id=?", files.size(), duration, new Date(), id); } public List getPlaylistUsers(int playlistId) { return queryForStrings("select username from playlist_user where playlist_id=?", playlistId); } public void addPlaylistUser(int playlistId, String username) { if (!getPlaylistUsers(playlistId).contains(username)) { update("insert into playlist_user(playlist_id,username) values (?,?)", playlistId, username); } } public void deletePlaylistUser(int playlistId, String username) { update("delete from playlist_user where playlist_id=? and username=?", playlistId, username); } @Transactional public void deletePlaylist(int id) { update("delete from playlist where id=?", id); } public void updatePlaylist(Playlist playlist) { update("update playlist set username=?, is_public=?, name=?, comment=?, changed=?, imported_from=? where id=?", playlist.getUsername(), playlist.isShared(), playlist.getName(), playlist.getComment(), new Date(), playlist.getImportedFrom(), playlist.getId()); } private static class PlaylistMapper implements RowMapper { public Playlist mapRow(ResultSet rs, int rowNum) throws SQLException { return new Playlist( rs.getInt(1), rs.getString(2), rs.getBoolean(3), rs.getString(4), rs.getString(5), rs.getInt(6), rs.getInt(7), rs.getTimestamp(8), rs.getTimestamp(9), rs.getString(10)); } } }