Hello Roger,
On Sep 16, 2011, at 16:28 , Roger KeIrad wrote:
> hello,
> any help please?
> thanks in advance.
There are a number of GetValueXXX variants. GetValue() is only for single
values.
For arrays, you need to use GetValueByID(), which has a arrIndex parameter. To
get the ID for a name, use GetValueID(). You can get the size of the array by
appending VALSUFF_ARRSZ to the array field name, and call GetValue() with that
- you'll get the number of elements back.
See sysync_SDK/Sources/enginemodulebase.h for more detailed description of all
the Get/SetValue functions, and engine_defs.h for the VALNAME_xxx and
VALSUFF_xxx explanations.
Pseudo code to get all elements of an array would look like:
// get size of array
uInt16 arraySize;
memsize n;
GetValue("arrayFieldName" VALSUFF_ARRSZ, VALTYPE_INT16,
&arraySize,sizeof(arraySize),n);
// get elements of array
long arrayFieldID = GetValueID("arrayFieldName");
for (int i=0; i<arraySize; i++) {
GetValueByID(arrayFieldID, i, VALTYPE_XXX, &buffer, maxSize, n);
// do something with the value
}
Below is a more elaborate routine, which prints out all values for a given
aItemKey, including array fields:
/* Show all fields/variables of item represented by aItemKey */
static void ShowFields(DB_Callback cb, appPointer aItemKey)
{
const stringSize maxstr = 128;
appChar fnam[maxstr];
appChar fval[maxstr];
appChar ftz[maxstr];
uInt16 fvaltype;
uInt16 farrsize;
uInt16 arridx;
bool fisarray;
uInt32 valsize;
TSyError err;
uInt32 valueID,nameFlag,typeFlag,arrszFlag,tznamFlag;
// set desired time mode
cb->ui.SetTimeMode(cb, aItemKey, TMODE_LINEARTIME+TMODE_FLAG_FLOATING);
// get flags that can be combined with valueID to get attributes of a value
nameFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALNAME");
typeFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALTYPE");
arrszFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.ARRAYSIZE");
tznamFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.TZNAME");
// iterate over all fields
// - start iteration
valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_FIRST);
while (valueID != KEYVAL_ID_UNKNOWN && valueID != KEYVAL_NO_ID) {
// get field name
err = cb->ui.GetValueByID(cb,
aItemKey,
valueID + nameFlag,
0,
VALTYPE_TEXT,
fnam,
maxstr,
&valsize
);
// get field type
err = cb->ui.GetValueByID(cb,
aItemKey,
valueID + typeFlag,
0,
VALTYPE_INT16,
&fvaltype,
sizeof(fvaltype),
&valsize
);
// check if array, and if array, get number of elements
err = cb->ui.GetValueByID(cb,
aItemKey,
valueID + arrszFlag,
0,
VALTYPE_INT16,
&farrsize,
sizeof(farrsize),
&valsize
);
fisarray = err==LOCERR_OK;
if (!fisarray) {
// single value
err = cb->ui.GetValueByID(cb, aItemKey, valueID, 0, VALTYPE_TEXT, fval,
maxstr, &valsize);
if (err==LOCERR_OK) {
if (fvaltype==VALTYPE_TIME64) {
// for timestamps, get time zone name as well
cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, 0, VALTYPE_TEXT,
ftz, maxstr, &valsize);
DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = %s
timezone=%s",fnam,fvaltype,fval,ftz);
}
else
DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = '%s'",fnam,fvaltype,fval);
}
else
DEBUG_(cb, "- %-20s (VALTYPE=%2hd) : No value,
error=%hd",fnam,fvaltype,err);
}
else {
// array
DEBUG_(cb, "- %-20s (VALTYPE=%2d) = Array with %d
elements",fnam,fvaltype,farrsize);
// show elements
for (arridx=0; arridx<farrsize; arridx++) {
err = cb->ui.GetValueByID(cb, aItemKey, valueID, arridx, VALTYPE_TEXT,
fval, maxstr, &valsize);
if (err==LOCERR_OK) {
if (fvaltype==VALTYPE_TIME64) {
// for timestamps, get time zone name as well
cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, arridx,
VALTYPE_TEXT, ftz, maxstr, &valsize);
DEBUG_(cb, " %20s[%3hd] = %s
timezone=%s",fnam,arridx,fval,ftz);
}
else
DEBUG_(cb, " %20s[%3hd] = '%s'",fnam,arridx,fval);
}
else
DEBUG_(cb, " %20s[%3hd] : No value,
error=%hd",fnam,arridx,err);
}
}
// next value
valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_NEXT);
} // while more values
} /* ShowFields */
_______________________________________________
os-libsynthesis mailing list
[email protected]
http://lists.synthesis.ch/mailman/listinfo/os-libsynthesis