kdb mount config.json user/tests/yajl yajl type
kdb set user/tests/yajl true
kdb setmeta user/tests/yajl type boolean
kdb set user/tests/yajl 1
kdb rm user/tests/yajl
kdb umount user/tests/yajl
仍然true
在配置文件中,因为true
和1
应该相同。
cat `kdb file user/tests/yajl`
#> true
Sorry, 1 warning was issued ;(
Warning (#78):
Description: Unknown or unsupported type found during streaming, assume key as string, type lost
Ingroup: plugin
Module: yajl
At: /home/jenkins/workspace/libelektra_master-Q2SIBK3KE2NBEMJ4WVGJXAXCSCB77DUBUULVLZDKHQEV3WNDXBMA/libelektra/src/plugins/yajl/yajl_gen.c:166
Reason: got boolean which is neither true nor false
Mountpoint: user/tests/yajl
Configfile: /home/markus/.config/config.json.26097:1554202289.309349.tmp
Set string to "1"
cat `kdb file user/tests/yajl`
#> "1"
yajl插件需要:
@kodebach仍然可以将类型插件重新配置为标准化为“ true”而不是“ 1”。
不,类型插件不支持此功能,我不知道有此用例。
海事组织这也没有道理。 表示布尔值的Elektra方式是0
和1
。 如果存储格式支持类型,则应由存储插件完成从Elektra表示到存储格式表示的转换。 最后,格式X的存储插件应该是Elektra和格式X之间的桥梁。
恢复价值还不是更大的问题吗? 恢复是在presetstorage
,您明确要求,设置值时,值始终会恢复为用户选择的表示形式。 这意味着,如果在示例中使用kdb set user/tests/yajl on
,则yajl
插件将获得值on
。
无论用户如何设置值,我们实际上需要的是一种将值恢复到的表示形式的设置方法。 这可以很容易地添加。 但是我不确定当前是否有一种方法可以从另一个插件中指定一个插件的配置。 这意味着用户在使用yajl
时仍必须正确配置type
yajl
。
值始终恢复为用户选择的表示形式
这不会有问题,因为在JSON中唯一可用的表示形式为true / false,因此用户无法选择。
这意味着,使用yajl时,用户仍然必须正确配置类型。
这也不是没有问题,因为yajl可以添加配置/需求来重新配置类型插件。
表示布尔值的Elektra方式为0和1。如果存储格式支持类型,则应由存储插件完成从Elektra表示到存储格式表示的转换。
是的,我完全同意。 您的方法的优势在于,它还将允许中间插件(类型和存储之间)看到布尔值的正确表示。
我更新了上面的“实施提示”以反映这一点。
@kodebach另一个问题:JSON仅支持double / boolean / string。 是否可以对类型插件说仅允许这3种类型?
这也将修复#1092中提到的JSON类型。
这不会有问题,因为在JSON中唯一可用的表示形式为true / false,因此用户无法选择。
他们无法选择JSON,但可以在使用kdb set
时进行选择
在类型和存储之间
顺序应该是这样的: getstorage
, type
,[other], type
, setstorage
,这意味着在类型之间不应该有任何插件和存储。
我更新了上面的“实施提示”以反映这一点。
仍然存在一个问题,例如kdb set user/tests/yajl on
在不更改type
情况下将不起作用,因为在这种情况下type
会将值on
传递给setstorage插入。
JSON仅支持double / boolean / string。 是否可以对类型插件说仅允许这3种类型?
通过配置来限制允许的类型应该不难。
他们无法选择JSON,但可以在使用kdb set时选择
如果文件格式不支持kdb set
选择的内容,则无论如何都无法记住。
仍然存在一个问题,例如,如果不更改类型,则kdb将user / tests / yajl设置为on无效,因为在这种情况下,type会将值传递给setstorage插件。
为什么在这种情况下不转换为“ 1”?
通过配置来限制允许的类型应该不难。
也许甚至没有关系。 如果存储插件或类型插件说不允许使用类型,这会有所不同吗? 如果存储教程还说一些有关类型的内容( @sanssecours ?),那将是很好的。
如果存储插件或类型插件说不允许使用类型,这会有所不同吗?
从来没听说过。 可能会在存储插件中引发错误,甚至更好,因为然后用户会看到问题是使用yajl
而不是type
。
为什么在这种情况下不转换为“ 1”?
规范化/还原过程可以通过以下几种情况来描述:
kdbGet
并且在kdbGet
和kdbSet
之间不变kdbGet
进行了规范化,而在kdbSet
恢复了原始值,因此基础存储文件保持不变(写了相关的键)kdbGet
不存在密钥kdbGet
,但其值在kdbGet
和kdbSet
keySetString
删除了origvalue
元数据,因此对于type
插件,此类密钥在kdbGet
不存在。 。有一种特殊情况。 我已经添加了可以在此处使用的功能(我忘记将其添加到信息/元数据中):
如果yajl
为所有布尔键注入元数据check/boolean/true = true
和check/boolean/false = false
,则所有规范化和还原都应按预期进行。 然后, type
插件将接受值true
, 1
, false
和0
作为布尔键(在get和set中),但它将始终将true
或false
传递给setstorage插件。 yajl
插件仍应在获取中返回0
/ 1
,并且应接受true
/ false
以及0
/ 1
设置,因此无论有没有type
插件都可以使用。
但是,如果我们选择这种方式,我们必须对其进行很好的记录,因为安装类型插件将不再允许对kdb set
布尔键使用不同的值,因为yajl
秘密地覆盖用户提供的任何配置。
从来没听说过。 在存储插件中引发错误可能会更好,因为这样用户就会发现问题出在使用yajl而不是使用type。
确切地。
可以通过以下情况描述归一化/恢复过程
[...](我忘记将其添加到信息/元数据中)
感谢您的详细解释。 您可以将此添加到我们的文档中吗?
将不再允许对kdb中的布尔键使用不同的值
yajl使用“ config / needs”可以确保使用“ check / boolean / true = true和check / boolean / false = false”来装入类型。
那么我应该更改实施提示吗?
yajl使用“ config / needs”可以确保使用“ check / boolean / true = true和check / boolean / false = false”来装入类型。
您误解了,现在必须将check/boolean/true
和check/boolean/false
设置为单个键上的元数据,而不是在type
的配置中。 配置中的常规支持必须添加(足够容易)。
好的。 不,然后保留原样。 在yajl插件中实现所有内容更有意义。
我添加了实现提示:
yajl插件需要:
@sanssecours您可以将此信息添加到存储插件教程吗?
yajl
还必须将元数据check/boolean/true = true
和check/boolean/false = false
到具有type = boolean
每个键中。 否则,将出现上述kdb set /some/key on
问题。
yajl还必须添加元数据
如果yajl总是只给您布尔值“ 0”和“ 1”,是否也需要这样做?
是的,因为发生此问题,所以当用户在kdbGet
之后更改键值时。 yajl
对此没有影响。
但请记住,无论如何,我们都需要对type
插件进行更改,因为如果用户添加了新密钥,则元数据将不存在并且解决方案将无法正常工作。
因此,我们需要类型插件在kdbSet
路径中两次可用,以便规范化能够正常工作? 您可以提出一个问题吗?
否。对于#2582, yajl
(或用户)只需要确保type
中包含
booleans
数组和boolean/restore = #1
booleans
数组,其中在#X
和boolean/restore = #X
位置包含"true"
和"false"
boolean/restore = #X
我将尝试解决此问题,但有一个问题。
在elektraYajlGet
解析为布尔值的键上设置type=boolean
和type/boolean/restoreas=none
不够吗? 然后在elektraYajlSet
我应该收到值为1或0的密钥,对吗?
但是我仍然收到用户提供的价值
# kdb mount conf.json user/tests/yajl yajl type
# kdb set user/tests/yajl 1
Set string to "1"
# kdb setmeta user/tests/yajl type boolean
# kdb set user/tests/yajl false
Sorry, 1 warning was issued ;(
Sorry, module yajl issued the warning C03200:
Validation Semantic: Got boolean which is neither true nor false
Set string to "false"
Case 2: The Key didn't exist in `kdbGet` Here we normalize the value to verify the type and then restore it immediately.
@科德巴赫
在这种情况下,即使type/boolean/restoreas=none
也总是可以恢复值吗?
/boolean/restoreas
不是单个键的元键。 它是用于整个安装点的type
插件实例的配置的一部分。
我认为将config/needs = type/boolean/restoreas=none
添加到src/pluigns/yajl/README.md
。 (至少用于通过kdb mount
进行安装)
添加- infos/config/needs = type/boolean/restoreas=none
似乎是编译器错误。
/elektra/build/src/plugins/yajl/readme_yajl.c:11:55: error: expected ‘)’ before ‘keyNew’
"- infos/config/needs = type/boolean/restoreas=none\n"
^
)
我也可以通过编程方式设置密钥吗? 我找不到有关如何配置另一个插件的文档。
我认为应该只是config/need
而不是infos/config/needs
。 我现在无法验证。
README的标题变成keyNew
,然后将其包含在插件get
方法中。 您可以在此处手动添加内容,首选使用README,因为它会自动提供文档。
我也可以通过编程方式设置密钥吗?
是的,只需将其添加到合同密钥集中即可。 例如,以下行显示了YAML CPP如何配置type
插件:
谢谢你们俩!
对于#3012,yajl插件具有以下行为。
kdb mount conf.json user/tests/yajl yajl type
kdb set user/tests/yajl 1
kdb get user/tests/yajl
#> 1
kdb setmeta user/tests/yajl type boolean
kdb set user/tests/yajl on
kdb get user/tests/yajl
#> 1
kdb set user/tests/yajl/subkey disable
kdb setmeta user/tests/yajl/subkey type boolean
kdb get user/tests/yajl/subkey
#> 0
cat `kdb file user/tests/yajl`
{
"___dirdata": true,
"subkey": true
}
yajl
插件仍应在获取中返回0
/1
,并且应接受true
/false
以及0
/1
设置,因此无论有没有type
插件都可以使用。
kdb mount conf.json user/tests/yajl yajl
kdb set user/tests/yajl 1
kdb getmeta user/tests/yajl type
#> boolean
kdb set user/tests/yajl false
kdb getmeta user/tests/yajl type
#> boolean
kdb get user/tests/yajl
#> 0
# Without the type plugin, 'on' is mapped to a string and a warning is emitted.
kdb set user/tests/yajl on
#> RET: 2
* fail with type errors if non-supported types are found
是指安装类型插件时还是不安装类型插件时?
在这最后一种情况下,到目前为止的行为是发出警告。
Sorry, 1 warning was issued ;(
Sorry, module yajl issued the warning C03200:
Validation Semantic: Got boolean which is neither 1 or true nor 0 or false
我认为这还是可以的,因为没有类型插件,就不应该进行类型检查。
实际上,它应该警告(甚至失败)除“ 1”或“ 0”以外的任何内容。 同样,“ true”,“ false”也不是Elektra的布尔值。
恕我直言,yajl插件应该对类型插件具有“ require”依赖性。 (但首先,我们还需要修复“数字”,因为它不是Elektra的类型之一)。
实际上,它应该警告(甚至失败)除“ 1”或“ 0”以外的任何内容。 同样,“ true”,“ false”也不是Elektra的布尔值。
@kodebach写道
yajl插件在get中仍应返回0/1,并且应在设置中接受true / false以及set中的0/1,以便无论是否使用类型插件都可以使用。
这就是我也允许“ true”和“ false”的内容。
恕我直言,yajl插件应该对类型插件具有“ require”依赖性。 (但首先,我们还需要修复“数字”,因为它不是Elektra的类型之一)。
是的,我完全同意这种依赖性。 然后,我们可以删除对“ true”和“ false”的支持。
关于数字问题:Yajl将Number类型映射为double,我认为这很好。 通过快速检查,类型插件的double类型还支持json的E表示法(即3.4e2
)。
您认为是什么问题?
您认为是什么问题?
啊,我现在看到src / plugins / yajl / testmod_yajl.c 240-251已被注释掉。 这应该被删除。 (仍然出现数字。)
最有用的评论
是的,只需将其添加到合同密钥集中即可。 例如,以下行显示了YAML CPP如何配置
type
插件:https://github.com/ElektraInitiative/libelektra/blob/5519cb8066a096215a3701ca3d8c02fcebe54914/src/plugins/yamlcpp/yamlcpp.cpp#L44
。