summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--db.go27
-rw-r--r--main.go43
-rw-r--r--updates.go8
3 files changed, 52 insertions, 26 deletions
diff --git a/db.go b/db.go
index 8ded5ec..9434273 100644
--- a/db.go
+++ b/db.go
@@ -6,20 +6,25 @@ import (
"log"
)
-var db *mysql.Client
+var dbPool chan *mysql.Client
func initDb() {
log.SetFlags(log.Ltime | log.Lshortfile)
- var err os.Error
- db, err = mysql.DialTCP("173.228.31.111", "audio", "audio", "audio")
- if err != nil {
- log.Panicln(err)
+ const dbPoolSize = 4
+ dbPool = make(chan *mysql.Client, 4)
+
+ for i := 0; i < dbPoolSize; i++ {
+ db, err := mysql.DialTCP("173.228.31.111", "audio", "audio", "audio")
+ if err != nil {
+ log.Panicln(err)
+ }
+ db.Reconnect = true
+ dbPool <- db
}
- db.Reconnect = true
}
-func prepare(sql string, params ...interface{}) (*mysql.Statement, os.Error) {
+func prepare(db *mysql.Client, sql string, params ...interface{}) (*mysql.Statement, os.Error) {
query, err := db.Prepare(sql)
if err != nil {
log.Println(err)
@@ -38,8 +43,8 @@ func prepare(sql string, params ...interface{}) (*mysql.Statement, os.Error) {
return query, err
}
-func queryInt(sql string, params ...interface{}) (int, os.Error) {
- query, err := prepare(sql, params...)
+func queryInt(db *mysql.Client, sql string, params ...interface{}) (int, os.Error) {
+ query, err := prepare(db, sql, params...)
if err != nil {
return 0, err
}
@@ -61,8 +66,8 @@ func queryInt(sql string, params ...interface{}) (int, os.Error) {
}
// given an id ('abcd1234'), return the pid (1)
-func getpid(id string) int {
- pid, err := queryInt("SELECT `pid` FROM `playlist` WHERE `id` = ?", id)
+func getpid(db *mysql.Client, id string) int {
+ pid, err := queryInt(db, "SELECT `pid` FROM `playlist` WHERE `id` = ?", id)
if err != nil {
return -1
}
diff --git a/main.go b/main.go
index 3bec1b9..21af0a8 100644
--- a/main.go
+++ b/main.go
@@ -56,7 +56,10 @@ func playlist(w http.ResponseWriter, r *http.Request) {
func add(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
- pid := getpid(q.Get("pid"))
+ db := <-dbPool
+ defer func () {dbPool <- db}()
+
+ pid := getpid(db, q.Get("pid"))
if pid == -1 {
http.Error(w, "invalid pid", http.StatusBadRequest)
return
@@ -67,14 +70,15 @@ func add(w http.ResponseWriter, r *http.Request) {
http.Error(w, err.String(), http.StatusInternalServerError)
return
}
- maxOrder, err := queryInt("SELECT MAX(`order`) FROM `song` WHERE pid = ?", pid)
+ maxOrder, err := queryInt(db, "SELECT MAX(`order`) FROM `song` WHERE pid = ?", pid)
if err != nil {
db.Rollback()
http.Error(w, err.String(), http.StatusInternalServerError)
return
}
- _, err = prepare("INSERT INTO `song` (`pid`,`yid`,`title`,`user`,`order`) VALUES(?, ?, ?, ?, ?)",
- pid, q.Get("yid"), q.Get("title"), q.Get("user"), maxOrder + 1)
+ _, err = prepare(db,
+ "INSERT INTO `song` (`pid`,`yid`,`title`,`user`,`order`) VALUES(?, ?, ?, ?, ?)",
+ pid, q.Get("yid"), q.Get("title"), q.Get("user"), maxOrder + 1)
if err != nil {
db.Rollback()
http.Error(w, err.String(), http.StatusInternalServerError)
@@ -93,7 +97,11 @@ func add(w http.ResponseWriter, r *http.Request) {
func remove(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
- pid := getpid(q.Get("pid"))
+
+ db := <-dbPool
+ defer func () {dbPool <- db}()
+
+ pid := getpid(db, q.Get("pid"))
if pid == -1 {
http.Error(w, "invalid pid", http.StatusBadRequest)
return
@@ -105,7 +113,7 @@ func remove(w http.ResponseWriter, r *http.Request) {
return
}
- order, err := queryInt("SELECT `order` FROM `song` WHERE `yid` = ? AND `pid` = ?",
+ order, err := queryInt(db, "SELECT `order` FROM `song` WHERE `yid` = ? AND `pid` = ?",
q.Get("yid"), pid)
if err != nil {
db.Rollback()
@@ -113,7 +121,7 @@ func remove(w http.ResponseWriter, r *http.Request) {
return
}
- _, err = prepare("DELETE FROM `song` WHERE `pid` = ? AND yid = ?",
+ _, err = prepare(db, "DELETE FROM `song` WHERE `pid` = ? AND yid = ?",
pid, q.Get("yid"))
if err != nil {
db.Rollback()
@@ -121,7 +129,7 @@ func remove(w http.ResponseWriter, r *http.Request) {
return
}
- _, err = prepare("UPDATE `song` SET `order` = `order`-1 WHERE `order` > ? AND `pid` = ?",
+ _, err = prepare(db, "UPDATE `song` SET `order` = `order`-1 WHERE `order` > ? AND `pid` = ?",
order, pid)
if err != nil {
db.Rollback()
@@ -141,7 +149,11 @@ func remove(w http.ResponseWriter, r *http.Request) {
func move(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
- pid := getpid(q.Get("pid"))
+
+ db := <-dbPool
+ defer func () {dbPool <- db}()
+
+ pid := getpid(db, q.Get("pid"))
if pid == -1 {
http.Error(w, "invalid pid", http.StatusBadRequest)
return
@@ -159,7 +171,7 @@ func move(w http.ResponseWriter, r *http.Request) {
return
}
- order, err := queryInt("SELECT `order` FROM `song` WHERE `yid` = ? AND `pid` = ?",
+ order, err := queryInt(db, "SELECT `order` FROM `song` WHERE `yid` = ? AND `pid` = ?",
q.Get("yid"), pid)
if err != nil {
db.Rollback()
@@ -177,7 +189,7 @@ func move(w http.ResponseWriter, r *http.Request) {
return
}
- query, err := prepare("UPDATE `song` SET `order` = ? WHERE `order` = ? AND `pid` = ?",
+ query, err := prepare(db, "UPDATE `song` SET `order` = ? WHERE `order` = ? AND `pid` = ?",
order, newOrder, pid)
if err != nil {
db.Rollback()
@@ -189,7 +201,7 @@ func move(w http.ResponseWriter, r *http.Request) {
return
}
// there are now two songs with that order, so also check yid
- _, err = prepare("UPDATE `song` SET `order` = ? WHERE `order` = ? AND `pid` = ? AND `yid` = ?",
+ _, err = prepare(db, "UPDATE `song` SET `order` = ? WHERE `order` = ? AND `pid` = ? AND `yid` = ?",
newOrder, order, pid, q.Get("yid"))
if err != nil {
db.Rollback()
@@ -211,7 +223,10 @@ func poll(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
timestamp := q.Get("timestamp")
if timestamp == "0" {
- query, err := prepare(
+ db := <-dbPool
+ defer func () {dbPool <- db}()
+
+ query, err := prepare(db,
"SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` WHERE `id` = ? ORDER BY `order` ASC",
q.Get("pid"))
@@ -249,7 +264,7 @@ func poll(w http.ResponseWriter, r *http.Request) {
}
var update *Update
for i := 0; i < 30; i++ {
- update = getUpdates(getpid(q.Get("pid")), timestamp)
+ update = getUpdates(q.Get("pid"), timestamp)
if update != nil {
w.Write([]byte("["))
for update != nil {
diff --git a/updates.go b/updates.go
index 33f12a9..28480c4 100644
--- a/updates.go
+++ b/updates.go
@@ -38,7 +38,13 @@ func addUpdate(pid int, action uint, song *Song) {
tailUpdates[pid] = update
}
-func getUpdates(pid int, timestamp int64) *Update {
+func getUpdates(id string, timestamp int64) *Update {
+ db := <-dbPool
+ pid := getpid(db, id)
+ dbPool <- db
+ if pid == -1 {
+ return nil
+ }
pup, ok := headUpdates[pid]
if !ok {
return nil