Browse Source

Allow JackMetadata::GetProperty(ies) to return single char values

Problem:

#set two properties for UUID 4294967296

$ jack_property -s 4294967296 "a" 1
$ jack_property -s 4294967296 b "2"

#-l lists them

$ jack_property -l
4294967296
key: b value: 2
key: a value: 1

#-l for UUID doesn't list them  <<<<<<

$ jack_property -l 4294967296
$ jack_property -l 4294967296 a
Value not found for a of 4294967296
$ jack_property -l 4294967296 b
Value not found for b of 4294967296

#it seems that 3 chars is the minimum length for value when querying for UUID

$ jack_property -s 4294967296 a 123
$ jack_property -l 4294967296
key: a value: 123
$ jack_property -l 4294967296 a
123

In example-clients/property.c:

/* list all properties for a given UUID */

                        if ((cnt = jack_get_properties (uuid, &description)) < 0) {
                                fprintf (stderr, "could not retrieve properties for %s\n", subject);
                                exit (1);
                        }

cnt is always 0 for values < 3 chars. Why?

In common/JackMetadata.cpp:

int JackMetadata::GetProperty(jack_uuid_t subject, const char* key, char** value, char** type)
int JackMetadata::GetProperties(jack_uuid_t subject, jack_description_t* desc)

This loop gets results:
while ((ret = cursor->get (cursor, &key, &data, DB_NEXT)) == 0) {

but are dropped because of this check:

/* result must have at least 2 chars plus 2 nulls to be valid
if (data.size < 4) {

This rule isn't understood. Explanations are welcome!
Reducing the check to 2 (1 char + null) will consider single char values.
This makes listing properties for a given UUID the same keys as when listing all UUIDs and keys.
No side-effects of lowering the value has been detected (yet).

Note: there is no problem getting "short" values in this method:
int JackMetadata::GetAllProperties(jack_description_t** descriptions)
(as used by jack_property -l without UUID)

jack_property output after change to (data.size < 2):

$ jack_property -s 4294967296 "a" 1
$ jack_property -s 4294967296 b "2"
$ jack_property -l
4294967296
key: b value: 2
key: a value: 1
$ jack_property -l 4294967296
key: b value: 2
key: a value: 1
$ jack_property -l 4294967296 a
1
$ jack_property -l 4294967296 b
2

Note: This change should be considered also for JACK1 (libjack/metadata.c)
to keep implementations in sync.
tags/v1.9.13
Thomas Brand 6 years ago
parent
commit
a7f93c7eeb
1 changed files with 11 additions and 5 deletions
  1. +11
    -5
      common/JackMetadata.cpp

+ 11
- 5
common/JackMetadata.cpp View File

@@ -247,10 +247,13 @@ int JackMetadata::GetProperty(jack_uuid_t subject, const char* key, char** value
return -1;
}

/* result must have at least 2 chars plus 2 nulls to be valid
/* result must have at least 1 char plus 1 null to be valid
(old rule was:
result must have at least 2 chars plus 2 nulls to be valid
)
*/

if (data.size < 4) {
if (data.size < 2) {
if (d_key.size > 0) {
free (d_key.data);
}
@@ -345,10 +348,13 @@ int JackMetadata::GetProperties(jack_uuid_t subject, jack_description_t* desc)
continue;
}

/* result must have at least 2 chars plus 2 nulls to be valid
*/
/* result must have at least 1 char plus 1 null to be valid
(old rule was:
result must have at least 2 chars plus 2 nulls to be valid
)
*/

if (data.size < 4) {
if (data.size < 2) {
/* if (key.size > 0) free(key.data); */
if (data.size > 0) {
free (data.data);


Loading…
Cancel
Save