chiark / gitweb /
Fix mis-merged trackdb_open().
[disorder] / lib / trackdb-playlists.c
index 77f7c132dcbd14a1a951d28f0fae195ae4eaeadd..bef7107bf9c784976c78fcfaa80b876926616c94 100644 (file)
@@ -32,6 +32,7 @@
 #include "log.h"
 #include "configuration.h"
 #include "vector.h"
+#include "eventlog.h"
 
 static int trackdb_playlist_get_tid(const char *name,
                                     const char *who,
@@ -81,7 +82,7 @@ int playlist_parse_name(const char *name,
     if(!valid_username(name))
       return -1;
     owner = 0;
-    share = "public";
+    share = "shared";
   }
   if(ownerp)
     *ownerp = owner;
@@ -100,7 +101,7 @@ static int playlist_may_read(const char *name,
                              const char *share) {
   char *owner;
   
-  if(!playlist_parse_name(name, &owner, 0))
+  if(playlist_parse_name(name, &owner, 0))
     return 0;
   /* Anyone can read shared playlists */
   if(!owner)
@@ -125,7 +126,7 @@ static int playlist_may_write(const char *name,
                               const char attribute((unused)) *share) {
   char *owner;
   
-  if(!playlist_parse_name(name, &owner, 0))
+  if(playlist_parse_name(name, &owner, 0))
     return 0;
   /* Anyone can modify shared playlists */
   if(!owner)
@@ -158,7 +159,7 @@ int trackdb_playlist_get(const char *name,
                          char **sharep) {
   int e;
 
-  if(!playlist_parse_name(name, 0, 0)) {
+  if(playlist_parse_name(name, 0, 0)) {
     error(0, "invalid playlist name '%s'", name);
     return EINVAL;
   }
@@ -257,7 +258,7 @@ int trackdb_playlist_set(const char *name,
   int e;
   char *owner;
   
-  if(!playlist_parse_name(name, &owner, 0)) {
+  if(playlist_parse_name(name, &owner, 0)) {
     error(0, "invalid playlist name '%s'", name);
     return EINVAL;
   }
@@ -293,6 +294,7 @@ static int trackdb_playlist_set_tid(const char *name,
   struct kvp *k;
   int e;
   const char *s;
+  const char *event = "playlist_modified";
 
   if((e = trackdb_getdata(trackdb_playlistsdb, name, &k, tid))
      && e != DB_NOTFOUND)
@@ -311,6 +313,7 @@ static int trackdb_playlist_set_tid(const char *name,
     k = 0;
     kvp_set(&k, "count", 0);
     kvp_set(&k, "sharing", defshare);
+    event = "playlist_created";
   }
   /* Check that the modification is allowed */
   if(!(s = kvp_get(k, "sharing"))) {
@@ -324,7 +327,7 @@ static int trackdb_playlist_set_tid(const char *name,
     return 0;
   /* Set the new values */
   if(share)
-    kvp_set(&k, "share", share);
+    kvp_set(&k, "sharing", share);
   if(tracks) {
     char b[16];
     int oldcount, n;
@@ -354,7 +357,11 @@ static int trackdb_playlist_set_tid(const char *name,
     kvp_set(&k, "count", b);
   }
   /* Store the resulting record */
-  return trackdb_putdata(trackdb_playlistsdb, name, k, tid, 0);
+  e = trackdb_putdata(trackdb_playlistsdb, name, k, tid, 0);
+  /* Log the event */
+  if(!e)
+    eventlog(event, name, kvp_get(k, "sharing"), (char *)0);
+  return e;
 }
 
 /** @brief Get a list of playlists
@@ -386,13 +393,17 @@ static int trackdb_playlist_list_tid(const char *who,
   while(!(e = c->c_get(c, k, prepare_data(d), DB_NEXT))) {
     char *name = xstrndup(k->data, k->size), *owner;
     const char *share = kvp_get(kvp_urldecode(d->data, d->size),
-                                "share");
+                                "sharing");
 
     /* Extract owner; malformed names are skipped */
     if(playlist_parse_name(name, &owner, 0)) {
       error(0, "invalid playlist name '%s' found in database", name);
       continue;
     }
+    if(!share) {
+      error(0, "playlist '%s' has no 'sharing' key", name);
+      continue;
+    }
     /* Always list public and shared playlists
      * Only list private ones to their owner
      * Don't list anything else
@@ -403,6 +414,7 @@ static int trackdb_playlist_list_tid(const char *who,
            && owner && !strcmp(owner, who)))
       vector_append(v, name);
   }
+  trackdb_closecursor(c);
   switch(e) {
   case DB_NOTFOUND:
     break;
@@ -435,7 +447,7 @@ int trackdb_playlist_delete(const char *name,
   int e;
   char *owner;
   
-  if(!playlist_parse_name(name, &owner, 0)) {
+  if(playlist_parse_name(name, &owner, 0)) {
     error(0, "invalid playlist name '%s'", name);
     return EINVAL;
   }
@@ -463,7 +475,10 @@ static int trackdb_playlist_delete_tid(const char *name,
   if(!playlist_may_write(name, who, s))
     return EACCES;
   /* Delete the playlist */
-  return trackdb_delkey(trackdb_playlistsdb, name, tid);
+  e = trackdb_delkey(trackdb_playlistsdb, name, tid);
+  if(!e)
+    eventlog("playlist_deleted", name, 0);
+  return e;
 }
 
 /*