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は蚭定ファむルに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プラグむンは次のこずを行う必芁がありたす。

  • [] Elektraの「0」ず「1」の倀をJSONのfalseずtrueにレンダリングしたす。
  • []サポヌトされおいないタむプが芋぀かった堎合、タむプ゚ラヌで倱敗したす

最も参考になるコメント

プログラムでキヌを蚭定するこずもできたすか

はい、それを契玄キヌセットに远加するだけです。 たずえば、次の行は、YAML CPPがtypeプラグむンを構成する方法を瀺しおいたす。

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

党おのコメント24件

@kodebachは、タむププラグむンを「1」ではなく「true」に正芏化するように再構成できる可胜性がありたす。

いいえ、これはタむププラグむンではサポヌトされおいたせん。これのナヌスケヌスがあるこずを知りたせんでした。

IMOそれも意味がありたせん。 ブヌル倀を衚す゚レクトラりェむは0ず1です。 ストレヌゞ圢匏が型をサポヌトしおいる堎合、Elektra衚珟からストレヌゞ圢匏の衚珟ぞの倉換は、ストレヌゞプラグむンによっお実行する必芁がありたす。 最終的に、フォヌマットXのストレヌゞプラグむンは、ElektraずフォヌマットXの間のブリッゞになるはずです。

たた、より倧きな問題は倀の埩元ではありたせんか 埩元はpresetstorageで行われ、明瀺的に芁求した堎合、倀を蚭定するずきに、倀は垞にナヌザヌが遞択した衚珟に埩元されたす。 ぀たり、䟋でkdb set user/tests/yajl onを䜿甚した堎合、 yajlプラグむンは倀onを受け取りたす。

ここで実際に必芁なのは、ナヌザヌが倀を蚭定する方法に関係なく、倀が埩元される衚珟を蚭定する方法です。 これは非垞に簡単に远加できたす。 ただし、珟圚、別のプラグむンからプラグむンの構成を指定する方法があるかどうかはわかりたせん。 ぀たり、 yajlを䜿甚する堎合でも、ナヌザヌはtype正しく構成する必芁がありたす。

その倀は垞にナヌザヌが遞択した衚珟に埩元されたす

JSONでは利甚可胜なプレれンテヌションはtrue / falseのみであるため、これは問題にはなりたせん。したがっお、ナヌザヌは遞択できたせん。

぀たり、yajlを䜿甚する堎合でも、ナヌザヌはタむプを正しく構成する必芁がありたす。

yajlはタむププラグむンを再構成するための構成/ニヌズを远加できるため、これも問題ありたせん。

ブヌル倀を衚すElektra-wayは0ず1です。ストレヌゞ圢匏が型をサポヌトしおいる堎合、Elektra衚珟からストレヌゞ圢匏の衚珟ぞの倉換は、ストレヌゞプラグむンによっお実行する必芁がありたす。

はい、私は完党に同意したす。 このアプロヌチの利点は、䞭間プラグむン型ずストレヌゞの間がブヌル倀の正しい衚珟を確認できるようになるこずです。

これを反映するために、䞊蚘の「実装のヒント」を曎新したした。

@kodebach別の質問JSONはdouble / boolean / stringのみをサポヌトしたす。 これらの3぀のタむプのみが蚱可されおいるずタむププラグむンに蚀うこずは可胜ですか

これにより、1092で説明されおいるJSONタむプも修正されたす。

JSONでは利甚可胜なプレれンテヌションはtrue / falseのみであるため、これは問題にはなりたせん。したがっお、ナヌザヌは遞択できたせん。

JSONでは遞択できたせんが、 kdb setを䜿甚する堎合は遞択できたす

タむプずストレヌゞの間

順序は次のようになりたす getstorage 、 type 、[その他]、 type 、 setstorage 、タむプ間にプラグむンがあっおはならないこずを意味したすずストレヌゞ。

これを反映するために、䞊蚘の「実装のヒント」を曎新したした。

kdb set user/tests/yajl onは、 typeを倉曎しないず機胜しないずいう問題がただありたす。この堎合、 typeは倀onをsetstorageに枡すためです。プラグむン。

JSONはdouble / boolean / stringのみをサポヌトしたす。 これらの3぀のタむプのみが蚱可されおいるずタむププラグむンに蚀うこずは可胜ですか

蚭定を介しお蚱可されるタむプを制限するのは難しいこずではありたせん。

JSONでは遞択できたせんが、kdbセットを䜿甚する堎合は遞択できたす

kdb set遞択されたものは、ファむル圢匏がそれをサポヌトしおいない堎合、ずにかく芚えるこずができたせん。

たずえば、kdb set user / tests / yajl onは、タむプを倉曎しないず機胜しないずいう問題がただありたす。この堎合、タむプは倀をsetstorageプラグむンに枡すためです。

この堎合、なぜ「1」に倉換されないのですか

蚭定を介しお蚱可されるタむプを制限するのは難しいこずではありたせん。

倚分それは問題ではありたせん。 ストレヌゞプラグむンたたはタむププラグむンがタむプが蚱可されおいないず蚀っおいる堎合、違いはありたすか ストレヌゞチュヌトリアルでもタむプに぀いお䜕かを蚀うずいいでしょう @sanssecours 

ストレヌゞプラグむンたたはタむププラグむンがタむプが蚱可されおいないず蚀っおいる堎合、違いはありたすか

私が知っおいるこずではありたせん。 おそらく、ナヌザヌが問題の䜿甚であるこずを芋おいるので、ストレヌゞプラグむンで゚ラヌを発生させるためにも、良いだろうyajlの䜿甚しおいないtype 。

この堎合、なぜ「1」に倉換されないのですか

正芏化/埩元手順は、次の堎合に説明できたす。

  • ケヌス1キヌはkdbGet存圚し、 kdbGetずkdbSet間で倉曎されおいたせん
    これは最も簡単で最も明癜なケヌスです。 倀はkdbGet正芏化され、元の倀はkdbSetで埩元されるため、基になるストレヌゞファむルは倉曎されたせん問題のキヌに察しお
  • ケヌス2キヌがkdbGet存圚しなかった
    ここでは、倀を正芏化しおタむプを確認し、すぐに埩元したす。
  • ケヌス3キヌはkdbGetに存圚したしたが、その倀はkdbGetずkdbSet間で倉曎されたした
    これはケヌス2ず同じように重芁です。 keySetStringはorigvalueメタデヌタを削陀するため、 typeプラグむンの堎合、この皮のキヌはkdbGetは存圚したせん

特別な堎合が1぀ありたす。 ここで䜿甚される可胜性のある機胜をすでに远加したした情報/メタデヌタに远加するのを忘れたした

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

yajlがすべおのブヌルキヌのメタデヌタcheck/boolean/true = trueずcheck/boolean/false = falseを挿入する堎合、すべおの正芏化ず埩元は意図したずおりに機胜するはずです。 typeプラグむンは、ブヌルキヌgetおよびsetの倀true 、 1 、 false 、および0を受け入れたす。ただし、垞にtrueたたはfalseをsetstorageプラグむンに枡したす。 yajlプラグむンは、getで0 / 1を返す必芁があり、 true / falseず0を受け入れる必芁がありたす。 1がセットになっおいるため、 typeプラグむンの有無にかかわらず機胜したす。

我々はしかし、この方法を䞋に行くこずを遞択した堎合はタむプのプラグむンを蚭眮するこずは、もはやにブヌルのキヌに察しお異なる倀を䜿甚できるようになりたすので、我々は、非垞によく、それを文曞化する必芁はないkdb set 、なぜならyajlひそかにナヌザヌが指定した構成を䞊曞きしたす。

私が知っおいるこずではありたせん。 ストレヌゞプラグむンで゚ラヌを発生させる方がおそらくさらに良いでしょう。なぜなら、問題はタむプの䜿甚ではなく、yajlの䜿甚であるこずがナヌザヌにわかるからです。

䞁床。

正芏化/埩元手順は、次の堎合に説明できたす。
[...]情報/メタデヌタに远加するのを忘れたした

詳现な説明ありがずうございたす。 これをドキュメントに远加しおいただけたすか

kdbセットのブヌルキヌに異なる倀を䜿甚するこずはできなくなりたす

「config / needs」を䜿甚するず、yajlは「check / boolean / true = trueおよびcheck / boolean / false = false」を䜿甚しお型がマりントされおいるこずを確認できたす。

では、実装のヒントを倉曎する必芁がありたすか

「config / needs」を䜿甚するず、yajlは「check / boolean / true = trueおよびcheck / boolean / false = false」を䜿甚しお型がマりントされおいるこずを確認できたす。

誀解したしたが、珟圚、 check/boolean/trueずcheck/boolean/falseは、 typeではなく、個々のキヌのメタデヌタずしお蚭定する必芁がありたす。 構成内の䞀般的なサポヌトを远加する必芁がありたす十分に簡単です。

OK。 いいえ、そのたたにしおおきたす。 yajlプラグむンにすべおを実装する方が理にかなっおいたす。
実装のヒントずしお远加したした

yajlプラグむンは次のこずを行う必芁がありたす。

  • [] Elektraの「0」ず「1」の倀をJSONのfalseずtrueにレンダリングしたす。
  • []サポヌトされおいないタむプが芋぀かった堎合、タむプ゚ラヌで倱敗したす

@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パスで2回䜿甚できるようにする必芁がありたすか 問題を䜜成できたすか

いいえ。2582の堎合、 yajl たたはナヌザヌは、 typeいずれかが含たれおいるこずを確認する必芁がありたす。

  • booleans配列ずboolean/restore = #1たせん
    たたは
  • #Xずboolean/restore = #X䜍眮に"true"ず"false"を含むbooleans配列がありたす

これを修正しようずしたすが、質問がありたす。

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.

@kodebach
この堎合、 type/boolean/restoreas=noneあっおも、倀が垞に埩元される可胜性はありたすか

/boolean/restoreasは、個々のキヌのメタキヌではありたせん。 これは、マりントポむント党䜓に䜿甚されるtypeプラグむンのむンスタンスの構成の䞀郚です。

src/pluigns/yajl/README.mdヘッダヌにconfig/needs = type/boolean/restoreas=noneを远加するだけで十分だず思いたす。 少なくずも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 config/needである必芁があるず思いたす。 でも今は確認できたせん。

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プラグむンは、getで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」ぱレクトラのブヌル倀ではありたせん。

Imho、yajlプラグむンはtypeプラグむンぞの「require」䟝存関係を持っおいる必芁がありたす。 ただし、Elektraのタむプの1぀ではないため、最初に「番号」も修正する必芁がありたす。

実際には、「1」たたは「0」以倖のこずに぀いお譊告するたたは倱敗する必芁がありたす。 たた、「true」、「false」ぱレクトラのブヌル倀ではありたせん。

@kodebachは曞いた

yajlプラグむンはgetで0/1を返す必芁があり、typeプラグむンの有無にかかわらず機胜するように、true / falseずsetの0/1を受け入れる必芁がありたす。

それは私が「真」ず「停」も蚱しおいるこずです。

Imho、yajlプラグむンはtypeプラグむンぞの「require」䟝存関係を持っおいる必芁がありたす。 ただし、Elektraのタむプの1぀ではないため、最初に「番号」も修正する必芁がありたす。

はい、私は䟝存関係に぀いお完党に同意したす。 次に、「true」ず「false」のサポヌトを削陀できたす。

数の問題に぀いおYajlはNumberタむプをdoubleにマップしたす。これは問題ないず思いたす。 たた、すばやく確認するず、タむププラグむンのdoubleタむプはjsonのE衚蚘぀たり、 3.4e2 もサポヌトしおいたす。
䜕が問題だず思いたすか

䜕が問題だず思いたすか

ああ、src / plugins / yajl / testmod_yajl.c240-251がコメントアりトされおいるのがわかりたす。 これは削陀する必芁がありたす。 ただ数の発生がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡