myCgi.cgi


Last Modified: Fri Jul 01 23:18:20 CEST 2005
Size: 7490 bytes


#!/home/a/amuneric/public_html/cgi-bin/tclkit



lappend auto_path /home/a/amuneric/public_html/lib
package require Mylib
load tclsqlite-3.0.8.so sqlite3

proc getSortedArtistList {{aIdList ""}} {
	# get the artists' names and id

	set aList [list]
	if {$aIdList == ""} {
		set aIdList [db eval "select artists.artistId from artists"]
	}
	foreach id $aIdList {
		set aIdArr($id) $id
	}
	set aIdList [array names aIdArr]
	foreach id $aIdList {
		set name [join [db eval "select artists.lastname,artists.firstName from artists where artists.artistId = \"$id\""] ", "]
		lappend aList [list $name $id]
	}

	# sort by last name

	return [lsort -index 0 $aList]
}

proc findRuns {nl} {
	set seqStart [lindex $nl 0]
	set prev [lindex $nl 0]
	set str [lindex $nl 0]

	foreach number [lrange $nl 1 end] {

		# we are in a range

		if {$number == ($prev + 1)} {
			set prev $number

			# does the string reflect that we are in a range?

			if {[string index $str end] != "-"} {
				append str " -"
			}
		} else {
			# we are begninning a new range

			# do we need to finish previous range

			if {[string index $str end] == "-"} {
				append str " $prev, $number"
			} else {
				append str ", $number"
			}
			set seqStart $number
			set prev $number
		}
	}

	# do we need to finish off a range

	if {[string index $str end] == "-"} {
		append str " $number"
	}

	return $str
}

proc createReport {} {
	array set qarr [::ncgi::nvlist]

	if {[lindex [array get qarr artistId] 1] != "" && [lindex [array get qarr bootlegId] 1] != ""} {

		puts stdout <hr>[::html::h2 [string trim [db eval "select bootlegs.name from bootlegs where bootlegs.bootlegId=\"[lindex [array get qarr bootlegId] 1]\""] "{}"]]<br>

		# create the artist/track table

		set tableList [list]
		foreach artist [getSortedArtistList [db eval "select trackArtists.artistId from trackArtists where trackArtists.bootlegId = \"[lindex [array get qarr bootlegId] 1]\""]] {
			lappend tableList [lindex $artist 0]
			set str ""
			foreach mId [db eval "select distinct trackArtists.mediaId from trackArtists where trackArtists.bootlegId = \"[lindex [array get qarr bootlegId] 1]\" and trackArtists.artistId = \"[lindex $artist 1]\""] {
				append str "media #[set mId] - tracks "

				append str [findRuns [db eval "select trackArtists.trackNum from trackArtists where trackArtists.bootlegId = \"[lindex [array get qarr bootlegId] 1]\" and trackArtists.artistId = \"[lindex $artist 1]\" and trackArtists.mediaId = \"$mId\""]]
				append str <br>
			}
			lappend tableList $str
		}
		puts stdout "<table border=1>[::html::hdrRow Artist Tracks]"
		foreach {artist tracks} $tableList {
			puts stdout [::html::row <i>$artist</i> <i>$tracks</i>]
		}
		puts stdout "</table><br>"

		# create the venue/date/track table

		set tableList [list]
		foreach {date venueId} [db eval "select distinct tracks.recordingDate,tracks.venueId from tracks where tracks.bootlegId = \"[lindex [array get qarr bootlegId] 1]\" order by tracks.recordingDate"] {
			set str "[set date]<br>"
			foreach {venue location} [db eval "select venues.venue,venues.location from venues where venueId = \"$venueId\""] {}
			append str "[set venue]<br>[set location]"
			lappend tableList $str
			set str ""
			foreach mId [db eval "select distinct tracks.mediaId from tracks where tracks.recordingDate = \"$date\" and tracks.venueId = \"$venueId\" and tracks.bootlegId = \"[lindex [array get qarr bootlegId] 1]\""] {
				append str "media #[set mId] - "

				append str "tracks "
				append str [findRuns [db eval "select tracks.trackNum from tracks where tracks.recordingDate = \"$date\" and tracks.venueId = \"$venueId\" and tracks.mediaId = \"$mId\" and tracks.bootlegId = \"[lindex [array get qarr bootlegId] 1]\" order by tracks.trackNum"]]
				append str <br>
			}
			lappend tableList $str
		}
		puts stdout "<table style=\"width: 100%\;\" border=\"1\">[::html::hdrRow Date/Venue Tracks]"
		foreach {dateVenue tracks} $tableList {
			puts stdout [::html::row <i>$dateVenue</i> <i>$tracks</i>]
		}
		puts stdout "</table><br>"

		# print the setlist

		set mNumOld 1
		foreach {bid mNum tNum sId rDate vId} [db eval "select * from tracks where tracks.bootlegId=\"[lindex [array get qarr bootlegId] 1]\""] {
			if {$mNum != $mNumOld} {
				puts stdout <br>
				set mNumOld $mNum
			}
			puts stdout [format %2i $mNum].[format %2i $tNum]\ -\ [string trim [db eval "select songs.title from songs where songs.songId=\"$sId\""] "{}"]<br>
		}
	}
}

proc createRecordingDateSelection {bootlegIds} {
	array set qarr [::ncgi::nvlist]

	if {[lindex [array get qarr artistId] 1] != ""} {
		puts stdout "or a show date<br>"
		# also make a list of dates

		set recordingDate [list]
		foreach bId $bootlegIds {
			if 0 {
			array unset tempArr
			foreach date [db eval "select tracks.recordingDate from tracks where tracks.bootlegId=\"$bId\""] {
				set tempArr($date) $bId
			}
			foreach name [array names tempArr] {
				lappend recordingDate [list [string trim $name "{}"]  $bId]
			}
			}
			foreach {date id} [db eval "select distinct tracks.recordingDate,tracks.bootlegId from tracks where tracks.bootlegId=\"$bId\""] {
				lappend recordingDate [list $date $id]
			}
		}
		set recordingDate [lsort -index 0 $recordingDate]

		puts stdout {<form action="myCgi.cgi" method="POST">}
		puts stdout [::html::select bootlegId recordingDate [eval concat $recordingDate] [lindex [array get qarr bootlegId] 1]]
		puts stdout [::html::submit recordingDate]
		puts stdout [::html::getFormInfo artistId]
		puts stdout {</form>}

	}
}

proc createBootlegSelection {} {
	array set qarr [::ncgi::nvlist]

	set bIds [list]
	if {[lindex [array get qarr artistId] 1] != ""} {

		puts stdout "Select a bootleg<br>"
		# get all the names of those bootlegs

		set bootlegNames [list]
		set bIds [db eval "select distinct trackArtists.bootlegId from trackArtists where trackArtists.artistId=\"[lindex [array get qarr artistId] 1]\""]
		foreach bId $bIds {
			lappend bootlegNames [list [string trim [db eval "select bootlegs.name from bootlegs where bootlegs.bootlegId=\"$bId\""] "{}"]  $bId]
		}
		set bootlegNames [lsort -index 0 $bootlegNames]

		puts stdout {<form action="myCgi.cgi" method="POST">}
		puts stdout [::html::select bootlegId bootlegName [eval concat $bootlegNames] [lindex [array get qarr bootlegId] 1]]
		puts stdout [::html::submit bootleg]
		puts stdout [::html::getFormInfo artistId]
		puts stdout {</form>}
	}
	return $bIds
}


proc createArtistSelection {} {
	array set qarr [::ncgi::nvlist]

	set aList [getSortedArtistList]

	# flatten the list and put into a selection

	puts stdout {<form action="myCgi.cgi" method="POST">}
	puts stdout [::html::select artistId artistLastname [eval concat $aList] [lindex [array get qarr artistId] 1]]
	puts stdout [::html::submit artist]
	puts stdout {</form>}
}

proc main {} {

	::ncgi::header
	::html::init
	#puts stdout {<a href="myCgi.cgi?showSource=1">Click to show the code that generates this page</a><br>}

	myHeader
	array set qarr [::ncgi::nvlist]
	if {[array get qarr showSource] != ""} {
		exec /home/a/amuneric/public_html/cgi-bin/tclkit /home/a/amuneric/public_html/cgi-bin/tcl2html.tcl -stdout /home/a/amuneric/public_html/cgi-bin/myCgi.cgi
	} else {
		sqlite3 db bldb.sqlite
		puts stdout "Select an artist or band<br>"
		createArtistSelection
		set bootlegIds [createBootlegSelection]
		createRecordingDateSelection $bootlegIds
		createReport
		db close
	}
	myFooter
}

main
logAccess $env(REMOTE_ADDR) $env(REMOTE_HOST)