Libelektra: YAJL:插件不会直接在安装点下保存值

创建于 2018-07-27  ·  17评论  ·  资料来源: ElektraInitiative/libelektra

重现问题的步骤

kdb mount config.json user/tests/yajl yajl
kdb set user/tests/yajl 'This May Be the Year I Disappear'
kdb ls user/tests/yajl
#> user/tests/yajl
kdb get user/tests/yajl 

预期结果

最后一条命令应打印文本This May Be the Year I Disappear

实际结果

最后一条命令显示一个空行。

系统信息

  • Elektra版本:大师
  • 作业系统:macOS 10.13.6
bug good first issue usability

所有17条评论

感谢您报告问题!

这样的JSON文档会是什么样子? 我们还需要有关仅包含父键的配置文件特殊语义的文档。

这样的JSON文档会是什么样子?

在这种情况下,文档仅包含一个字符串:

"This May Be the Year I Disappear"

。 如果我将配置文件替换为上述内容,则插件已经读取了正确的值:

printf '"This May Be the Year I Disappear"' > (kdb file user/tests/yajl/)
kdb get user/tests/yajl
#> This May Be the Year I Disappear

所以只需要固定设置? 听起来很简单!

所以只需要固定设置?

据我所知,是的。

我想我可以将这作为我的第一个问题。 您能给我一些指向我应该开始看@ markus2330的提示吗? 谢谢。

源在src / plugins / yajl / yajl_gen.c和src / plugins / yajl / yajl_parse.c中

幸运的是, @ sanssecours写了一篇很棒的教程,描述了存储插件的行为(请参阅doc / tutorials / storage-plugins.md)。 因此,您可以将其作为下一个问题#2132(#2477可能是此问题的结果)和其他与yajl相关的问题。 您的主要工作可能是验证yajl插件中的数组,或者甚至更好地用作外部插件(请参阅#1862)。

如果我挂载一个空的json文档(意味着它仅包含{} ),那么当我调用kdb set system/lvas/cm/yajl "test"时会发生以下情况。
调用elektraYajlSet的键集以(system/lvas/cm/yajl,test)作为值。

在对elektraGenEmpty的调用中,第二个子句被执行,因为它们的KeySets大小为1。
strcmp也成功,因为parentKey与Keyset中的最后一个键具有相同的值。

生成一个空映射,并且elektraYajlSet终止。 因此该函数接收该值,但不对其执行任何操作。

因此,在生成空映射的那一点上,我可以添加代码,以将键值输出到json文档中,如@sanssecours here所述
这将起作用,因为kdb get可以正确读取该值,并且像kdb set system/lvas/cm/yajl/second "hi"这样的调用会生成一个像{"__dirdata": "test", "second": "hi"}这样的json文档,该文档将按预期映射键。

我认为该解决方案会起作用,但是如果我可以将json文档直接设置为{"__dirdata": "test"} ,那么我会觉得它更干净,这在语义上是相同的。

但是我不确定该怎么做。 我认为正确的方法是directoryvalue插件将修改elektraYajlSet接收的Keyset。 或者我想我可以在elektraYajlSet中自己修改KeySet。

您有@ markus2330的建议吗?

是的,directoryvalue修改了keySet elektraYajlSet接收到的值。 但是,如果仅存在parentKey(因为它不被视为“目录”),则不会发生这种情况。因此,如果仅设置了已经发现的父键,则将执行elektraGenEmpty并执行strcmp成功。

但是elektraGenEmpty有一些假设,这些假设现在不再成立(它是在directoryvalue存在之前编写的)。 因此还有其他错误,例如#2132

我认为该解决方案会行得通,但是如果我可以将json文档直接设置为{“ __dirdata”:“ test”},我会觉得它更干净,这在语义上是相同的。

{"": "test"}不会是描述单个值的最小文档吗? 这似乎也是“骆驼”插件的行为。

@sanssecours您是否可以扩展storage-tutorial以也描述parentKeys和“空键”(%)(或至少现在称为TODO)?

您能否扩展存储教程来描述parentKeys…

我认为插件教程已经介绍了

  • 父键(文件路径)的值,以及
  • 父键用于发出错误和警告信息

。 我对父键没有什么特别的了解。

和“空键”(%)(或至少现在称为TODO)?

因为这是我第一次听说空键,所以我认为我不是合适的人。

我可以添加将键值输出到json文档中的代码,如@sanssecours这里所述

我不确定这是否是YAJL进一步解决问题的正确方法,因为有效的JSON文档似乎总是需要顶层的数组或对象。

我对父键没有什么特别的了解。

除了某些配置文件格式没有简单描述没有键的值的方法外,它也没有其他特殊之处。

“空键”(%)

使用空键可以映射{"root": {"": "something"}}类的文档。 您如何将其当前映射到KeySet?

我不确定这是否是YAJL进一步解决问题的正确方法,因为有效的JSON文档似乎总是需要顶层的数组或对象。

这似乎已经改变了: https :

https://www.ietf.org/rfc/rfc7159.txt中甚至有示例显示允许“仅值”。 但是似乎yajl不支持此...(yajl 2.1.0-2 + b3产生错误Expected “{” but found “"”

借助RFC 7159中的功能,我们可以映射:

"some value" -> parent =“一些值”
{"", "some value"} ->父级/%=“某个值”

但是那时我们将需要解决yajl ...(ChangeLog也不表示此功能是在以后添加的)。

使用空键可以映射诸如{“ root”:{“”:“ something”}}之类的文档。 您如何将其当前映射到KeySet?

似乎YAML CPP可以正确处理此数据:

kdb mount config.yaml user/tests/yaml yamlcpp
printf '{"root": {"": "something"}}' > "$(kdb file user/tests/yaml)"
kdb ls user/tests/yaml
#> user/tests/yaml/root/%
kdb get user/tests/yaml/root/%
#> something

。 我没有为空键改编插件。 仅使用正确的字符串值( "" )在存储插件中调用setBaseName ,就足以支持此功能。

很高兴看到这无需额外处理即可开箱即用:+1:

@sanssecours我们现在要支持RFC 7159吗? 如果只设置了parentKey,您的插件会做什么?

我们现在是否要支持RFC 7159?

我认为在顶层支持每种数据类型都是有意义的。

如果只设置了parentKey,您的插件会做什么?

他们只是存储文本(没有密钥):

kdb mount config.yaml user/tests/yaml yamlcpp
kdb set user/tests/yaml value
kdb file user/tests/yaml | xargs cat
#> value

我在此commit中为顶层添加了特殊处理。
这破坏了yajl模块中的测试,但是在我花时间修复要首先检查的问题之前,如果那是@ markus2330可接受的解决方案?

只是详细说明一下:如果KeySet的大小为1,那么我可以确定其中只有顶级键。 然后,我生成该键的值。 但是在那种情况下,我必须防止elektraGenOpenValue被调用,因为否则它将以字符串形式生成键。

似乎YAML CPP可以正确处理此数据:
...

这个例子对我来说适用于yajl。 我想念什么吗?

打破了yajl模块中的测试

哪个考试? (另请参见下文)

我想先检查一下,是否可以接受

在以下情况下,更容易看出某事是否可以接受:

  • 您创建了一个PR(它将运行所有测试用例)
  • 在测试和示例中描述您现在想要实现的行为

这个例子对我来说适用于yajl。 我想念什么吗?

不,此示例仅说明{"", "some value"}不是表示parentKey值的理想方法。

我们现在是否要支持RFC 7159?
我认为在顶层支持每种数据类型都是有意义的。

我完全同意。

他们只是存储文本(没有密钥):

因此,让我们用yajl实现相同的功能。

现在对我来说非常适合!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dominicjaeger picture dominicjaeger  ·  3评论

mpranj picture mpranj  ·  3评论

mpranj picture mpranj  ·  4评论

sanssecours picture sanssecours  ·  3评论

markus2330 picture markus2330  ·  4评论