]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mysql_selector.c
improved version of split_args()
[paraslash.git] / mysql_selector.c
index 85d16ee200dc9c7bf032aac790894dabee5a710f..98db17dc758762b1b16feb2a2cae3da4f38b8571 100644 (file)
@@ -38,7 +38,6 @@ extern struct misc_meta_data *mmd;
 
 static void *mysql_ptr = NULL;
 
 
 static void *mysql_ptr = NULL;
 
-
 static int com_cam(int, int, char **);
 static int com_cdb(int, int, char **);
 static int com_cs(int, int, char **);
 static int com_cam(int, int, char **);
 static int com_cdb(int, int, char **);
 static int com_cs(int, int, char **);
@@ -93,7 +92,7 @@ static struct server_command cmds[] = {
 
 "\tCreate database name containing the initial columns for basic\n"
 "\tinteroperation with server. This command has to be used only once\n"
 
 "\tCreate database name containing the initial columns for basic\n"
 "\tinteroperation with server. This command has to be used only once\n"
-"\twhen you use the mysql database tool for the very first time.\n"
+"\twhen you use the mysql audio file selector for the very first time.\n"
 "\n"
 "\tThe optional name defaults to 'paraslash' if not given.\n"
 
 "\n"
 "\tThe optional name defaults to 'paraslash' if not given.\n"
 
@@ -212,7 +211,7 @@ static struct server_command cmds[] = {
 .help =
 
 "\tIf pattern was not given, print list of all audio files known\n"
 .help =
 
 "\tIf pattern was not given, print list of all audio files known\n"
-"\tto the mysql database tool. See the documentation of mysql\n"
+"\tto the mysql selector. See the documentation of mysql\n"
 "\tfor the definition of LIKE patterns.\n"
 
 },
 "\tfor the definition of LIKE patterns.\n"
 
 },
@@ -600,7 +599,7 @@ static struct para_macro macro_list[] = {
        }
 };
 
        }
 };
 
-static int real_query(char *query)
+static int real_query(const char *query)
 {
        if (!mysql_ptr)
                return -E_NOTCONN;
 {
        if (!mysql_ptr)
                return -E_NOTCONN;
@@ -617,7 +616,7 @@ static int real_query(char *query)
  * Use open connection given by mysql_ptr to query server. Returns a
  * result pointer on succes and NULL on errors
  */
  * Use open connection given by mysql_ptr to query server. Returns a
  * result pointer on succes and NULL on errors
  */
-static struct MYSQL_RES *get_result(char *query)
+static struct MYSQL_RES *get_result(const char *query)
 {
        void *result;
 
 {
        void *result;
 
@@ -699,7 +698,7 @@ static int com_na(__unused int fd, int argc, char *argv[])
        char *q;
        int ret;
 
        char *q;
        int ret;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
        q = make_message("alter table data add %s char(1) "
                "not null default 0", argv[1]);
                return -E_MYSQL_SYNTAX;
        q = make_message("alter table data add %s char(1) "
                "not null default 0", argv[1]);
@@ -716,7 +715,7 @@ static int com_da(__unused int fd, int argc, char *argv[])
        char *q;
        int ret;
 
        char *q;
        int ret;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
        q = make_message("alter table data drop %s", argv[1]);
        ret = real_query(q);
                return -E_MYSQL_SYNTAX;
        q = make_message("alter table data drop %s", argv[1]);
        ret = real_query(q);
@@ -732,7 +731,7 @@ static int com_stradd_picadd(int fd, int argc, char *argv[])
        int ret, stradd = strcmp(argv[0], "picadd");
        size_t size;
 
        int ret, stradd = strcmp(argv[0], "picadd");
        size_t size;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
        if (strlen(argv[1]) >= MAXLINE - 1)
                return -E_NAMETOOLONG;
                return -E_MYSQL_SYNTAX;
        if (strlen(argv[1]) >= MAXLINE - 1)
                return -E_NAMETOOLONG;
@@ -808,9 +807,9 @@ static int com_verb(int fd, int argc, char *argv[])
        int ret;
        unsigned int num_rows, num_fields;
 
        int ret;
        unsigned int num_rows, num_fields;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
-        result = get_result(argv[1]);
+       result = get_result(argv[1]);
        if (!result)
                /* return success, because it's ok to have no results */
                return 1;
        if (!result)
                /* return success, because it's ok to have no results */
                return 1;
@@ -837,7 +836,7 @@ static void *get_all_attributes(void)
                mysql_free_result(result);
                return NULL;
        }
                mysql_free_result(result);
                return NULL;
        }
-        mysql_data_seek(result, 4); /* skip Lastplayed, Numplayed... */
+       mysql_data_seek(result, 4); /* skip Lastplayed, Numplayed... */
        return result;
 }
 
        return result;
 }
 
@@ -849,7 +848,7 @@ static int com_laa(int fd, int argc, __unused char *argv[])
        void *result;
        int ret;
 
        void *result;
        int ret;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        result = get_all_attributes();
        if (!result)
                return -E_MYSQL_SYNTAX;
        result = get_all_attributes();
        if (!result)
@@ -870,10 +869,10 @@ static int com_hist(int fd, int argc, char *argv[]) {
 
        q = make_message("select name, to_days(now()) - to_days(lastplayed) from "
                "data%s%s%s order by lastplayed",
 
        q = make_message("select name, to_days(now()) - to_days(lastplayed) from "
                "data%s%s%s order by lastplayed",
-               (argc < 1)? "" : " where ",
-               (argc < 1)? "" : argv[1], 
-               (argc < 1)? "" : " = '1'");
-        result = get_result(q);
+               (argc < 2)? "" : " where ",
+               (argc < 2)? "" : argv[1],
+               (argc < 2)? "" : " = '1'");
+       result = get_result(q);
        free(q);
        if (!result)
                return -E_NORESULT;
        free(q);
        if (!result)
                return -E_NORESULT;
@@ -894,7 +893,7 @@ static int com_last(int fd, int argc, char *argv[])
        char *q;
        int num, ret;
 
        char *q;
        int num, ret;
 
-       if (argc < 1)
+       if (argc < 2)
                num = 10;
        else
                num = atoi(argv[1]);
                num = 10;
        else
                num = atoi(argv[1]);
@@ -943,7 +942,7 @@ static int com_mbox(int fd, int argc, char *argv[])
                "\n\n\n"
                "') from data"
        );
                "\n\n\n"
                "') from data"
        );
-       if (argc >= 1) {
+       if (argc >= 2) {
                char *tmp = make_message("%s where name LIKE '%s'", query,
                        argv[1]);
                free(query);
                char *tmp = make_message("%s where name LIKE '%s'", query,
                        argv[1]);
                free(query);
@@ -951,7 +950,7 @@ static int com_mbox(int fd, int argc, char *argv[])
        }
        mysql_free_result(result);
        ret = -E_NORESULT;
        }
        mysql_free_result(result);
        ret = -E_NORESULT;
-        result = get_result(query);
+       result = get_result(query);
        if (!result)
                goto out;
        ret = -E_EMPTY_RESULT;
        if (!result)
                goto out;
        ret = -E_EMPTY_RESULT;
@@ -998,7 +997,7 @@ static char *get_atts(char *name, int verbose)
        num_fields = mysql_num_fields(result);
        if (num_fields < 5)
                goto out;
        num_fields = mysql_num_fields(result);
        if (num_fields < 5)
                goto out;
-        mysql_data_seek(result2, 4); /* skip Lastplayed, Numplayed... */
+       mysql_data_seek(result2, 4); /* skip Lastplayed, Numplayed... */
        row = mysql_fetch_row(result);
        ret = -E_NOROW;
        if (!row)
        row = mysql_fetch_row(result);
        ret = -E_NOROW;
        if (!row)
@@ -1010,11 +1009,11 @@ static char *get_atts(char *name, int verbose)
                        goto out;
                if (atts && (verbose || is_set))
                        atts = para_strcat(atts, verbose? "," : " ");
                        goto out;
                if (atts && (verbose || is_set))
                        atts = para_strcat(atts, verbose? "," : " ");
-                if (is_set || verbose)
+               if (is_set || verbose)
                        atts = para_strcat(atts, row2[0]);
                if (verbose)
                        atts = para_strcat(atts, is_set? "=\"1\"" : "=\"0\"");
                        atts = para_strcat(atts, row2[0]);
                if (verbose)
                        atts = para_strcat(atts, is_set? "=\"1\"" : "=\"0\"");
-        }
+       }
        ret = 1;
 out:
        if (result2)
        ret = 1;
 out:
        if (result2)
@@ -1048,7 +1047,7 @@ static char *get_meta(char *name, int verbose)
                goto out;
        q = make_message(verbose? verbose_fmt : fmt, ebn);
        free(ebn);
                goto out;
        q = make_message(verbose? verbose_fmt : fmt, ebn);
        free(ebn);
-        result = get_result(q);
+       result = get_result(q);
        free(q);
        if (!result)
                goto out;
        free(q);
        if (!result)
                goto out;
@@ -1187,7 +1186,7 @@ static char *get_query(char *streamname, char *filename, int with_path)
                        free(tmp2);
                        continue;
                }
                        free(tmp2);
                        continue;
                }
-               if (!strcmp(command, "score:"))
+               if (!score && !strcmp(command, "score:"))
                        score = s_a_r_list(macro_list, arg);
        }
        if (!score) {
                        score = s_a_r_list(macro_list, arg);
        }
        if (!score) {
@@ -1207,10 +1206,10 @@ static char *get_query(char *streamname, char *filename, int with_path)
                goto write_query;
        }
        select_clause = para_strdup(with_path?
                goto write_query;
        }
        select_clause = para_strdup(with_path?
-                "select concat(dir.dir, '/', dir.name) from data, dir "
-                "where dir.name = data.name "
-                :
-                "select name from data where name is not NULL");
+               "select concat(dir.dir, '/', dir.name) from data, dir "
+               "where dir.name = data.name "
+               :
+               "select name from data where name is not NULL");
        order = make_message("order by -(%s)", score);
        free(score);
        if (accept_opts && deny_opts) {
        order = make_message("order by -(%s)", score);
        free(score);
        if (accept_opts && deny_opts) {
@@ -1248,7 +1247,7 @@ out:
  * This is called from server and from some commands. Name must not be NULL
  * Never returns NULL.
  */
  * This is called from server and from some commands. Name must not be NULL
  * Never returns NULL.
  */
-static char *get_dbinfo(char *name)
+static char *get_selector_info(char *name)
 {
        char *meta = NULL, *atts = NULL, *info, *dir = NULL, *query, *stream = NULL;
        void *result = NULL;
 {
        char *meta = NULL, *atts = NULL, *info, *dir = NULL, *query, *stream = NULL;
        void *result = NULL;
@@ -1307,7 +1306,7 @@ static int com_info(int fd, int argc, char *argv[])
        char *name = NULL, *meta = NULL, *atts = NULL, *dir = NULL;
        int ret, com_la = strcmp(argv[0], "info");
 
        char *name = NULL, *meta = NULL, *atts = NULL, *dir = NULL;
        int ret, com_la = strcmp(argv[0], "info");
 
-       if (argc < 1) {
+       if (argc < 2) {
                ret = -E_GET_AUDIO_FILE;
                if (!(name = get_current_audio_file()))
                        goto out;
                ret = -E_GET_AUDIO_FILE;
                if (!(name = get_current_audio_file()))
                        goto out;
@@ -1338,7 +1337,7 @@ out:
                free(name);
        return ret;
 }
                free(name);
        return ret;
 }
-static int change_stream(char *stream)
+static int change_stream(const char *stream)
 {
        char *query;
        int ret;
 {
        char *query;
        int ret;
@@ -1442,9 +1441,9 @@ static int com_rm_ne(__unused int fd, int argc, char *argv[])
 {
        int ne = !strcmp(argv[0], "ne");
        int i, ret;
 {
        int ne = !strcmp(argv[0], "ne");
        int i, ret;
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
-       for (i = 1; i <= argc; i++) {
+       for (i = 1; i < argc; i++) {
                ret = remove_entry(argv[i]);
                if (ret < 0)
                        return ret;
                ret = remove_entry(argv[i]);
                if (ret < 0)
                        return ret;
@@ -1465,7 +1464,7 @@ static int com_mv(__unused int fd, int argc, char *argv[])
        char *q, *dn, *ebn1 = NULL, *ebn2 = NULL, *edn = NULL;
        int ret;
 
        char *q, *dn, *ebn1 = NULL, *ebn2 = NULL, *edn = NULL;
        int ret;
 
-       if (argc != 2)
+       if (argc != 3)
                return -E_MYSQL_SYNTAX;
        ebn1 = escaped_basename(argv[1]);
        ebn2 = escaped_basename(argv[2]);
                return -E_MYSQL_SYNTAX;
        ebn1 = escaped_basename(argv[1]);
        ebn2 = escaped_basename(argv[2]);
@@ -1517,12 +1516,12 @@ static int com_set(__unused int fd, int argc, char *argv[])
        char *q, *ebn;
        long unsigned id;
        int i, ret;
        char *q, *ebn;
        long unsigned id;
        int i, ret;
-       char *field = strcmp(argv[0], "picass")? "numplayed" : "pic_id";
+       const char *field = strcmp(argv[0], "picass")? "numplayed" : "pic_id";
 
 
-       if (argc < 2)
+       if (argc < 3)
                return -E_MYSQL_SYNTAX;
        id = atol(argv[1]);
                return -E_MYSQL_SYNTAX;
        id = atol(argv[1]);
-       for (i = 2; i <= argc; i++) {
+       for (i = 2; i < argc; i++) {
                ebn = escaped_basename(argv[i]);
                if (!ebn)
                        return -E_ESCAPE;
                ebn = escaped_basename(argv[i]);
                if (!ebn)
                        return -E_ESCAPE;
@@ -1546,7 +1545,7 @@ static int com_picch(__unused int fd, int argc, char *argv[])
        long unsigned id;
        char *q;
 
        long unsigned id;
        char *q;
 
-       if (argc != 2)
+       if (argc != 3)
                return -E_MYSQL_SYNTAX;
        id = atol(argv[1]);
        if (strlen(argv[2]) > MAXLINE)
                return -E_MYSQL_SYNTAX;
        id = atol(argv[1]);
        if (strlen(argv[2]) > MAXLINE)
@@ -1567,7 +1566,7 @@ static int com_piclist(__unused int fd, int argc, __unused char *argv[])
        unsigned long *length;
        int ret;
 
        unsigned long *length;
        int ret;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        result = get_result("select id,name,pic from pics order by id");
        if (!result)
                return -E_MYSQL_SYNTAX;
        result = get_result("select id,name,pic from pics order by id");
        if (!result)
@@ -1596,9 +1595,9 @@ static int com_picdel(int fd, int argc, char *argv[])
        my_ulonglong aff;
        int i, ret;
 
        my_ulonglong aff;
        int i, ret;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
-       for (i = 1; i <= argc; i++) {
+       for (i = 1; i < argc; i++) {
                id = atol(argv[i]);
                q = make_message("delete from pics where id = %lu", id);
                ret = real_query(q);
                id = atol(argv[i]);
                q = make_message("delete from pics where id = %lu", id);
                ret = real_query(q);
@@ -1629,7 +1628,7 @@ static int com_pic(int fd, int argc, char *argv[])
        int ret;
        char *q, *name = NULL;
 
        int ret;
        char *q, *name = NULL;
 
-       if (argc < 1) {
+       if (argc < 2) {
                ret = -E_GET_AUDIO_FILE;
                name = get_current_audio_file();
        } else {
                ret = -E_GET_AUDIO_FILE;
                name = get_current_audio_file();
        } else {
@@ -1667,7 +1666,7 @@ static int com_strdel(__unused int fd, int argc, char *argv[])
        char *tmp;
        int ret = -1;
 
        char *tmp;
        int ret = -1;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
        tmp = make_message("delete from streams where name='%s'", argv[1]);
        ret = real_query(tmp);
                return -E_MYSQL_SYNTAX;
        tmp = make_message("delete from streams where name='%s'", argv[1]);
        ret = real_query(tmp);
@@ -1691,12 +1690,12 @@ static int com_ls(int fd, int argc, char *argv[])
        int ret;
        unsigned int num_rows;
 
        int ret;
        unsigned int num_rows;
 
-       if (argc > 0)
+       if (argc > 1)
                q = make_message("select name from data where name LIKE '%s'",
                        argv[1]);
        else
                q = para_strdup("select name from data");
                q = make_message("select name from data where name LIKE '%s'",
                        argv[1]);
        else
                q = para_strdup("select name from data");
-        result = get_result(q);
+       result = get_result(q);
        free(q);
        if (!result)
                return -E_NORESULT;
        free(q);
        if (!result)
                return -E_NORESULT;
@@ -1719,7 +1718,7 @@ static int com_summary(__unused int fd, int argc, __unused char *argv[])
        const char *fmt = "select count(name) from data where %s='1'";
        int ret = -E_NORESULT;
 
        const char *fmt = "select count(name) from data where %s='1'";
        int ret = -E_NORESULT;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        result = get_all_attributes();
        if (!result)
                return -E_MYSQL_SYNTAX;
        result = get_all_attributes();
        if (!result)
@@ -1761,7 +1760,7 @@ static int get_numplayed(char *name)
        char *buf = make_message(fmt, name);
        int ret = -E_NORESULT;
 
        char *buf = make_message(fmt, name);
        int ret = -E_NORESULT;
 
-        result = get_result(buf);
+       result = get_result(buf);
        free(buf);
        if (!result)
                goto out;
        free(buf);
        if (!result)
                goto out;
@@ -1807,14 +1806,14 @@ out:
 static void update_mmd(char *info)
 {
        PARA_DEBUG_LOG("%s", "updating shared memory area\n");
 static void update_mmd(char *info)
 {
        PARA_DEBUG_LOG("%s", "updating shared memory area\n");
-       strncpy(mmd->dbinfo, info, MMD_INFO_SIZE - 1);
-       mmd->dbinfo[MMD_INFO_SIZE - 1] = '\0';
+       strncpy(mmd->selector_info, info, MMD_INFO_SIZE - 1);
+       mmd->selector_info[MMD_INFO_SIZE - 1] = '\0';
 }
 
 static void update_audio_file_server_handler(char *name)
 {
        char *info;
 }
 
 static void update_audio_file_server_handler(char *name)
 {
        char *info;
-       info = get_dbinfo(name);
+       info = get_selector_info(name);
        update_mmd(info);
        free(info);
        update_audio_file(name);
        update_mmd(info);
        free(info);
        update_audio_file(name);
@@ -1822,19 +1821,19 @@ static void update_audio_file_server_handler(char *name)
 
 static int com_us(__unused int fd, int argc, char *argv[])
 {
 
 static int com_us(__unused int fd, int argc, char *argv[])
 {
-       if (argc != 1)
+       if (argc != 2)
                return -E_MYSQL_SYNTAX;
        return update_audio_file(argv[1]);
 }
 
                return -E_MYSQL_SYNTAX;
        return update_audio_file(argv[1]);
 }
 
-static void refresh_mmd_dbinfo(void)
+static void refresh_selector_info(void)
 {
        char *name = get_current_audio_file();
        char *info;
 
        if (!name)
                return;
 {
        char *name = get_current_audio_file();
        char *info;
 
        if (!name)
                return;
-       info = get_dbinfo(name);
+       info = get_selector_info(name);
        free(name);
        mmd_lock();
        update_mmd(info);
        free(name);
        mmd_lock();
        update_mmd(info);
@@ -1851,7 +1850,7 @@ static int com_ps(__unused int fd, int argc, char *argv[])
        int match = -1, ret, i;
        unsigned int num_rows;
 
        int match = -1, ret, i;
        unsigned int num_rows;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        ret = -E_NORESULT;
        if (!result)
                return -E_MYSQL_SYNTAX;
        ret = -E_NORESULT;
        if (!result)
@@ -1880,7 +1879,7 @@ static int com_ps(__unused int fd, int argc, char *argv[])
        else
                i = match < num_rows - 1? match + 1 : 0;
        ret = -E_NOROW;
        else
                i = match < num_rows - 1? match + 1 : 0;
        ret = -E_NOROW;
-        mysql_data_seek(result, i);
+       mysql_data_seek(result, i);
        row = mysql_fetch_row(result);
        if (!row || !row[0])
                goto out;
        row = mysql_fetch_row(result);
        if (!row || !row[0])
                goto out;
@@ -1901,7 +1900,7 @@ static int com_ps(__unused int fd, int argc, char *argv[])
                "'current_stream'", row[0]);
        ret = real_query(query);
        free(query);
                "'current_stream'", row[0]);
        ret = real_query(query);
        free(query);
-       refresh_mmd_dbinfo();
+       refresh_selector_info();
 out:
        free(stream);
        if (result)
 out:
        free(stream);
        if (result)
@@ -1917,9 +1916,9 @@ static int com_streams(int fd, int argc, __unused char *argv[])
        void *result;
        MYSQL_ROW row;
 
        void *result;
        MYSQL_ROW row;
 
-       if (argc && strcmp(argv[1], "current_stream"))
+       if (argc > 1 && strcmp(argv[1], "current_stream"))
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
-       if (argc) {
+       if (argc > 1) {
                char *cs = get_current_stream();
                ret = send_va_buffer(fd, "%s\n", cs);
                free(cs);
                char *cs = get_current_stream();
                ret = send_va_buffer(fd, "%s\n", cs);
                free(cs);
@@ -1955,7 +1954,7 @@ static int com_strq(int fd, int argc, char *argv[])
        void *result;
        int ret;
 
        void *result;
        int ret;
 
-       if (argc < 1) {
+       if (argc < 2) {
                ret = -E_GET_STREAM;
                name = get_current_stream();
        } else {
                ret = -E_GET_STREAM;
                name = get_current_stream();
        } else {
@@ -1991,7 +1990,7 @@ static int com_cs(int fd, int argc, char *argv[])
        char *old_stream = get_current_stream();
        int csp = !strcmp(argv[0], "csp");
 
        char *old_stream = get_current_stream();
        int csp = !strcmp(argv[0], "csp");
 
-       if (!argc) {
+       if (argc == 1) {
                ret = -E_MYSQL_SYNTAX;
                if (csp)
                        goto out;
                ret = -E_MYSQL_SYNTAX;
                if (csp)
                        goto out;
@@ -2009,7 +2008,7 @@ static int com_cs(int fd, int argc, char *argv[])
                ret = change_stream(argv[1]);
                if (ret < 0)
                        goto out;
                ret = change_stream(argv[1]);
                if (ret < 0)
                        goto out;
-               refresh_mmd_dbinfo();
+               refresh_selector_info();
        }
        if (csp) {
                mmd_lock();
        }
        if (csp) {
                mmd_lock();
@@ -2035,12 +2034,12 @@ static int com_sl(int fd, int argc, char *argv[])
        char *query, *stream, *tmp;
        unsigned int num_rows, num;
 
        char *query, *stream, *tmp;
        unsigned int num_rows, num;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
        num = atoi(argv[1]);
        if (!num)
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
        num = atoi(argv[1]);
        if (!num)
                return -E_MYSQL_SYNTAX;
-       stream = (argc == 1)?  get_current_stream() : para_strdup(argv[2]);
+       stream = (argc == 2)?  get_current_stream() : para_strdup(argv[2]);
        tmp = get_query(stream, NULL, 0);
        query = make_message("%s limit %d", tmp, num);
        free(tmp);
        tmp = get_query(stream, NULL, 0);
        query = make_message("%s limit %d", tmp, num);
        free(tmp);
@@ -2109,9 +2108,9 @@ static int com_sa(int fd, int argc, char *argv[])
        int i, ret;
        char *atts = NULL, *name;
 
        int i, ret;
        char *atts = NULL, *name;
 
-       if (argc < 1)
+       if (argc < 2)
                return -E_MYSQL_SYNTAX;
                return -E_MYSQL_SYNTAX;
-       for (i = 1; i <= argc; i++) {
+       for (i = 1; i < argc; i++) {
                int unset = 0;
                char *tmp, *p =argv[i];
                int len = strlen(p);
                int unset = 0;
                char *tmp, *p =argv[i];
                int len = strlen(p);
@@ -2137,7 +2136,7 @@ static int com_sa(int fd, int argc, char *argv[])
 no_more_atts:
        if (!atts)
                return -E_NOATTS;
 no_more_atts:
        if (!atts)
                return -E_NOATTS;
-       if (i > argc) { /* no name given, use current af */
+       if (i >= argc) { /* no name given, use current af */
                ret = -E_GET_AUDIO_FILE;
                if (!(name = get_current_audio_file()))
                        goto out;
                ret = -E_GET_AUDIO_FILE;
                if (!(name = get_current_audio_file()))
                        goto out;
@@ -2148,7 +2147,7 @@ no_more_atts:
                for (; argv[i] && ret >= 0; i++)
                        ret = update_atts(fd, argv[i], atts);
        }
                for (; argv[i] && ret >= 0; i++)
                        ret = update_atts(fd, argv[i], atts);
        }
-       refresh_mmd_dbinfo();
+       refresh_selector_info();
 out:
        return ret;
 }
 out:
        return ret;
 }
@@ -2161,7 +2160,7 @@ static int com_cam(int fd, int argc, char *argv[])
        char *name = NULL, *meta = NULL, *atts = NULL;
        int i, ret;
 
        char *name = NULL, *meta = NULL, *atts = NULL;
        int i, ret;
 
-       if (argc < 2)
+       if (argc < 3)
                return -E_MYSQL_SYNTAX;
        if (!(name = escaped_basename(argv[1])))
                return -E_ESCAPE;
                return -E_MYSQL_SYNTAX;
        if (!(name = escaped_basename(argv[1])))
                return -E_ESCAPE;
@@ -2171,7 +2170,7 @@ static int com_cam(int fd, int argc, char *argv[])
        ret = -E_META;
        if (!(meta = get_meta(name, 0)))
                goto out;
        ret = -E_META;
        if (!(meta = get_meta(name, 0)))
                goto out;
-       for (i = 2; i <= argc; i++) {
+       for (i = 2; i < argc; i++) {
                char *ebn, *q;
                ret = -E_ESCAPE;
                if (!(ebn = escaped_basename(argv[i])))
                char *ebn, *q;
                ret = -E_ESCAPE;
                if (!(ebn = escaped_basename(argv[i])))
@@ -2213,7 +2212,7 @@ static int com_vrfy(int fd, int argc, __unused char *argv[])
        MYSQL_ROW row;
        char *escaped_name;
 
        MYSQL_ROW row;
        char *escaped_name;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        ret = -E_NORESULT;
        result = get_result("select data.name from data left join dir on "
                return -E_MYSQL_SYNTAX;
        ret = -E_NORESULT;
        result = get_result("select data.name from data left join dir on "
@@ -2278,7 +2277,7 @@ static int com_upd(int fd, int argc, __unused char *argv[])
        unsigned int num_rows;
        MYSQL_ROW row;
 
        unsigned int num_rows;
        MYSQL_ROW row;
 
-       if (argc)
+       if (argc != 1)
                return -E_MYSQL_SYNTAX;
        out_file = NULL;
        tempname = para_strdup("/tmp/mysql.tmp.XXXXXX");
                return -E_MYSQL_SYNTAX;
        out_file = NULL;
        tempname = para_strdup("/tmp/mysql.tmp.XXXXXX");
@@ -2427,7 +2426,7 @@ static int init_mysql_server(void)
 /* mmd lock must be held */
 static void write_msg2mmd(int success)
 {
 /* mmd lock must be held */
 static void write_msg2mmd(int success)
 {
-       sprintf(mmd->dbinfo, "dbinfo1:%s\ndbinfo2:mysql-%s\ndbinfo3:\n",
+       sprintf(mmd->selector_info, "dbinfo1:%s\ndbinfo2:mysql-%s\ndbinfo3:\n",
                success < 0? PARA_STRERROR(-success) :
                        "successfully connected to mysql server",
                success < 0? "" : mysql_get_server_info(mysql_ptr));
                success < 0? PARA_STRERROR(-success) :
                        "successfully connected to mysql server",
                success < 0? "" : mysql_get_server_info(mysql_ptr));
@@ -2436,17 +2435,9 @@ static void write_msg2mmd(int success)
 /* create database */
 static int com_cdb(int fd, int argc, char *argv[])
 {
 /* create database */
 static int com_cdb(int fd, int argc, char *argv[])
 {
-       char *query, *name;
+       char *query;
        int ret;
 
        int ret;
 
-       if (argc < 1)
-               name = "paraslash";
-       else {
-               ret = -E_NAMETOOLONG;
-               name = argv[1];
-               if (strlen(name) > MAXLINE)
-                       goto out;
-       }
        if (mysql_ptr) {
                PARA_INFO_LOG("%s", "closing database\n");
                mysql_close(mysql_ptr);
        if (mysql_ptr) {
                PARA_INFO_LOG("%s", "closing database\n");
                mysql_close(mysql_ptr);
@@ -2456,14 +2447,15 @@ static int com_cdb(int fd, int argc, char *argv[])
        ret = -E_MYSQL_INIT;
        if (init_mysql_server() < 0 || !mysql_ptr)
                goto out;
        ret = -E_MYSQL_INIT;
        if (init_mysql_server() < 0 || !mysql_ptr)
                goto out;
-       query = make_message("create database %s", name);
+       conf.mysql_database_arg = para_strdup((argc < 2)?
+               "paraslash" : argv[1]);
+       query = make_message("create database %s", conf.mysql_database_arg);
        ret = real_query(query);
        free(query);
        if (ret < 0)
                goto out;
        /* reconnect with database just created */
        mysql_close(mysql_ptr);
        ret = real_query(query);
        free(query);
        if (ret < 0)
                goto out;
        /* reconnect with database just created */
        mysql_close(mysql_ptr);
-       conf.mysql_database_arg = para_strdup(name);
        ret = -E_MYSQL_INIT;
        if (init_mysql_server() < 0 || !mysql_ptr)
                goto out;
        ret = -E_MYSQL_INIT;
        if (init_mysql_server() < 0 || !mysql_ptr)
                goto out;
@@ -2494,7 +2486,8 @@ static int com_cdb(int fd, int argc, char *argv[])
        if (real_query("insert into streams (name, def) values "
                        "('current_stream', '(none)')") < 0)
                goto out;
        if (real_query("insert into streams (name, def) values "
                        "('current_stream', '(none)')") < 0)
                goto out;
-       ret = send_va_buffer(fd, "successfully created database %s\n", name);
+       ret = send_va_buffer(fd, "successfully created database %s\n",
+               conf.mysql_database_arg);
 out:
        return ret;
 }
 out:
        return ret;
 }
@@ -2509,12 +2502,13 @@ static void shutdown_connection(void)
 }
 
 /**
 }
 
 /**
- * the init function of the mysql-based database tool
+ * the init function of the mysql-based audio file selector
  *
  * Check the command line options and initialize all function pointers of \a db.
  *
  * Check the command line options and initialize all function pointers of \a db.
- * Connect to the mysql server and initialize the dbinfo string.
+ * Connect to the mysql server and initialize the info string.
  *
  *
- * \sa struct audio_file_selector, misc_meta_data::dbinfo, random_selector.c
+ * \sa struct audio_file_selector, misc_meta_data::selector_info,
+ * random_selector.c
  */
 int mysql_selector_init(struct audio_file_selector *db)
 {
  */
 int mysql_selector_init(struct audio_file_selector *db)
 {