Libelektra: yajl:不支持Elektra的布尔值

创建于 2019-04-02  ·  24评论  ·  资料来源: ElektraInitiative/libelektra

重现问题的步骤

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在配置文件中,因为true1应该相同。

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"

系统信息

  • Elektra版本:大师

实施提示

yajl插件需要:

  • []将Elektra的“ 0”和“ 1”值呈现为JSON的false和true。
  • 如果找到不受支持的类型,则[]会因类型错误而失败
bug lanc

最有用的评论

我也可以通过编程方式设置密钥吗?

是的,只需将其添加到合同密钥集中即可。 例如,以下行显示了YAML CPP如何配置type插件:

https://github.com/ElektraInitiative/libelektra/blob/5519cb8066a096215a3701ca3d8c02fcebe54914/src/plugins/yamlcpp/yamlcpp.cpp#L44

所有24条评论

@kodebach仍然可以将类型插件重新配置为标准化为“ true”而不是“ 1”。

不,类型插件不支持此功能,我不知道有此用例。

海事组织这也没有道理。 表示布尔值的Elektra方式是01 。 如果存储格式支持类型,则应由存储插件完成从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时进行选择

在类型和存储之间

顺序应该是这样的: getstoragetype ,[other], typesetstorage ,这意味着在类型之间不应该有任何插件和存储。

我更新了上面的“实施提示”以反映这一点。

仍然存在一个问题,例如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”?

规范化/还原过程可以通过以下几种情况来描述:

  • 情况1:密钥存在于kdbGet并且在kdbGetkdbSet之间不变
    这是最简单,最明显的情况。 该值在kdbGet进行了规范化,而在kdbSet恢复了原始值,因此基础存储文件保持不变(写了相关的键)
  • 情况2: kdbGet不存在密钥
    在这里,我们将值标准化以验证类型,然后立即将其还原。
  • 情况3:密钥存在于kdbGet ,但其值在kdbGetkdbSet
    这与案例2相同。 keySetString删除了origvalue元数据,因此对于type插件,此类密钥在kdbGet不存在。 。

有一种特殊情况。 我已经添加了可以在此处使用的功能(我忘记将其添加到信息/元数据中):

https://github.com/ElektraInitiative/libelektra/blob/6e609f7e78039db188e32d32d2ea13908c0abe38/src/plugins/type/README.md#L84 -L88

如果yajl为所有布尔键注入元数据check/boolean/true = truecheck/boolean/false = false ,则所有规范化和还原都应按预期进行。 然后, type插件将接受值true1false0作为布尔键(在get和set中),但它将始终将truefalse传递给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/truecheck/boolean/false设置为单个键上的元数据,而不是在type的配置中。 配置中的常规支持必须添加(足够容易)。

好的。 不,然后保留原样。 在yajl插件中实现所有内容更有意义。
我添加了实现提示:

yajl插件需要:

  • []将Elektra的“ 0”和“ 1”值呈现为JSON的false和true。
  • 如果找到不受支持的类型,则[]会因类型错误而失败

@sanssecours您可以将此信息添加到存储插件教程吗?

yajl还必须将元数据check/boolean/true = truecheck/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数组,其中在#Xboolean/restore = #X位置包含"true""false" boolean/restore = #X

我将尝试解决此问题,但有一个问题。

elektraYajlGet解析为布尔值的键上设置type=booleantype/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插件:

https://github.com/ElektraInitiative/libelektra/blob/5519cb8066a096215a3701ca3d8c02fcebe54914/src/plugins/yamlcpp/yamlcpp.cpp#L44

谢谢你们俩!

对于#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已被注释掉。 这应该被删除。 (仍然出现数字。)

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

相关问题

e1528532 picture e1528532  ·  4评论

mpranj picture mpranj  ·  3评论

dominicjaeger picture dominicjaeger  ·  3评论

sanssecours picture sanssecours  ·  3评论

sanssecours picture sanssecours  ·  4评论