new
Title : new Usage : $db = Music::DB->new(@args) Function: create a new adaptor Returns : an Music::DB object Args : see below Status : Public
Argument Description
-------- -----------
-dsn the DBI data source, e.g. 'dbi:mysql:music_db' or "music_db"
Also accepts DB or database as synonyms.
-user username for authentication
-pass the password for authentication
_create_database
Title : _create_database Usage : _create_database(user,pass,host,db) Function: create the database Returns : a boolean indicating the success of the operation Args : username, password, host and database Status : protected
Called internally by new to create the database if it does not already exist.
do_initialize
Title : do_initialize
Usage : $success = $db->do_initialize($drop_all)
Function: initialize the database
Returns : a boolean indicating the success of the operation
Args : a boolean indicating whether to delete existing data
Status : protected
This method will load the schema into the database. If $drop_all is true, then any existing data in the tables known to the schema will be deleted.
Internally, this method calls schema() to get the schema data.
drop_all
Title : drop_all
Usage : $dbh->drop_all
Function: empty the database
Returns : void
Args : none
Status : protected
This method drops the tables known to this module. Internally it calls the abstract tables() method to get a list of all tables to drop.
tables
Title : tables
Usage : @tables = $db->tables
Function: return list of tables that belong to this module
Returns : list of tables
Args : none
Status : protected
This method returns a list of all the tables in the database.
schema
Title : schema
Usage : ($schema,$raw_schema) = $mp3->schema
Function: return the CREATE script for the schema and
the raw_schema as a hashref
for easily accessing columns in proper order.
Returns : a hash of CREATE statements; hash of tables and parameters
Args : none
Status : protected
This method returns a list containing the various CREATE statements needed to initialize the database tables. Each create statement is built programatically so I can maintain all fields in a central location . This raw schema is returned for building temporary tables for loading.
dbh
Title : dbh
Usage : $dbh->dbh
Function: get database handle
Returns : a DBI handle
Args : none
Status : Public
DESTROY
Title : DESTROY
Usage : $dbh->DESTROY
Function: disconnect database at destruct time
Returns : void
Args : none
Status : protected
This is the destructor for the class.
debug
Title : debug
Usage : $dbh = $dbh->debug
Function: prints out debugging information
Returns : debugging information
Args : none
Status : Private
NAME
Music::DB::Adaptor::dbi::mysql -- Database adaptor for a specific mysql schema
SYNOPSIS
See Music::DB
DESCRIPTION
This adaptor implements a specific mysql database schema that is compatible with Music::DB. It inherits from Music::DB. In addition to implementing the abstract SQL-generating methods of Music::DB::Adaptor::dbi, this module also implements the data loading functionality of Music::DB.
The schema uses several tables:
artists This the artists data table. Its columns are:
artist_id artist ID (integer); primary key artist artist name (string); may be null; indexed
albums This is the albums table. Its columns are:
album_id album ID (integer); primary key
album album name (string); may be null; indexed
album_type one of compilation or standard; may be null
total_tracks total songs on album (integer)
year self explanatory, no? (integer)
songs This is the primary songs table. Its columns are:
song_id song ID (integer); primary key
title song title (string)
artist_id artist ID (integer); indexed
album_id album ID (integer)
genre_id genre ID (integer) # may be superceded...see note
track track number (integer)
duration formatted song length (string)
seconds length in seconds (integer)
lyrics song lyrics (long text)
comment ID3 tag comment (text)
bitrate encoded bitrate (integer)
samplerate sample rate (real)
format format of the file (ie MPEG) (string)
channels channels (string)
tag_types type of ID3 tags present (ie ID3v2.3.0) (text)
filename file name (text)
filesize file size in bytes (real)
filepath absolute path (text)
year the year tag for single tracks
(since singles or songs on compilations
each may be different) (integer)
uber_playcount total times the song has been played
uber_rating overall song rating (see "users" below)
Currently, ID3 tags support but a single genre. The genre_id is now stored with the song table. Multiple genres may be assigned via the song_genres join table below. The 'year' is a database denormalization that allows the assignment of years to single tracks not belonging to an album.
genres This is the genres table. Its columns are:
genre_id genre ID (integer); primary key
genre genre (string)
album_artists This is the album_artists join table. Its columns are:
artist_id artist ID. May not be null.
album_id album ID. May not be null.
artist_genres This is the artists_genres join table. It enables multiple genres to be assigned to a single artist. Its columns are:
artist_id artist ID. May not be null
genre_id genre ID. May not be null
song_genres This is the song_genres join table. It enables multiple genres to be assigned to a single song. Its columns are:
song_id artist ID. May not be null
genre_id genre ID. May not be null
song_types This is the song_types join table. It enables multiple general descriptive types to be assigned to a single song. Its columns are:
song_id artist ID. May not be null
type one of: live cover bootleg single
Supplementary tables used by Web.pm
Music::DB::Web provides a web interface to databases
created with Music::DB. It requires a few extra
tables that are not directly related to the MP3
tag data.
users The users table provides support for multiple users of the database. Its columns are:
user_id user UD. May not be null; primary key
first users first name (text)
last last name (text_
email email address (text)
username username in the system (text)
password password (text)
privs privileges (text)
joined date user joined (date)
last_access date of last access (timestamp)
songs_played number of songs played (integer)
user_ratings The user_ratings table allows users to maintain individual ratings and playcounts for every song (as opposed to the uber playcounts and ratings above). I'll probably pitch the uber columns above, instead determining these values in middleware.
user_id may not be null
song_id may not be null
rating user rating from 1-100 (integer)
playcount user playcount (integer)
playlists Playlist names and descriptions. Columns are:
playlist_id may not be null; primary key
playlist the playlist name (text)
description brief description of the playlist (text)
user_id the owner of the playlist (integer)
is_shared yes/no. Controls the public-accessiblity of the playlist
created date playlist created. (date)
viewed number of times playlist viewed (integer)
playlist_songs A small join table that associates songs with playlists:
playlist_id may not be null
song_id may not be null
Available Methods
BUGS
This module implements a fairly complex internal data structure, which in itself rests upon lots of things going right, like reading ID3 tags, tag naming conventions, etc. On top of that, I wrote this in a Starbucks full of screaming children.
TODO
Lots of error checking needs to be added. Support for custom data schemas, including new data types like more extensive artist info, paths to images, lyrics, etc.
Robusticize new for different adaptor types.
AUTHOR
Copyright 2002, Todd W. Harris <harris@cshl.org>.
This module is distributed under the same terms as Perl itself. Feel free to use, modify and redistribute it as long as you retain the correct attribution.
ACKNOWLEDGEMENTS
Much of this module was derived from Bio::DB::GFF, written by Lincoln Stein <lstein@cshl.org>.