Libelektra: YAJL: لا يحفظ البرنامج المساعد القيمة مباشرة أسفل نقطة التحميل

تم إنشاؤها على ٢٧ يوليو ٢٠١٨  ·  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 .

نتيجة فعلية

يطبع الأمر الأخير سطرًا فارغًا.

معلومات النظام

  • نسخة إليكترا: سيد
  • نظام التشغيل: 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 درسًا تعليميًا ممتازًا يصف كيف يجب أن تتصرف مكونات التخزين الإضافية (انظر المستند / البرامج التعليمية / storage-plugins.md). لذلك يمكنك أن تأخذ المشكلة التالية رقم 2132 (ربما يكون # 2477 نتيجة لذلك) ومشكلات أخرى متعلقة بـ yajl. قد يكون عملك الرئيسي هو التحقق من صحة المصفوفات في البرنامج المساعد yajl أو - حتى أفضل - كمكوِّن إضافي خارجي (انظر # 1862).

إذا قمت بتركيب مستند json فارغ (بمعنى أنه يحتوي فقط على {} ) ، فسيحدث ما يلي عندما اتصل بـ kdb set system/lvas/cm/yajl "test" .
يتم استدعاء elektraYajlSet باستخدام مجموعة مفاتيح تحتوي على قيم jus (system/lvas/cm/yajl,test) .

في استدعاء elektraGenEmpty يتم تنفيذ الفقرة الثانية ، حيث أن حجم مجموعات المفاتيح هو 1.
ينجح strcmp أيضًا لأن المفتاح الرئيسي له نفس قيمة المفتاح الأخير في Keyset.

يتم إنشاء خريطة فارغة وتنتهي elektraYajlSet. لذا فإن الوظيفة تتلقى القيمة ، لكنها لا تفعل أي شيء بها.

لذلك في تلك المرحلة التي يتم فيها إنشاء الخريطة الفارغة ، يمكنني إضافة رمز يخرج قيمة المفاتيح في مستند json كما هو موضح في sanssecours هنا .
سيعمل هذا ، نظرًا لأن kdb get يقرأ هذه القيمة بشكل صحيح وأن مكالمة مثل kdb set system/lvas/cm/yajl/second "hi" ينتج عنها مستند json مثل {"__dirdata": "test", "second": "hi"} ، والذي يحدد المفاتيح كما هو متوقع.

أعتقد أن هذا الحل سيعمل ، لكنني سأجده أكثر وضوحًا إذا كان بإمكاني تعيين مستند json مباشرةً على {"__dirdata": "test"} ، والذي سيكون هو نفسه من الناحية المعنوية.

لكنني لست متأكدًا من كيفية القيام بذلك. أفترض أن الطريقة الصحيحة هي أن البرنامج المساعد directoryvalue سيعدل مجموعة المفاتيح التي يستقبلها elektraYajlSet. أو أعتقد أنه يمكنني تعديل KeySet بنفسي في elektraYajlSet.

هل لديك اقتراح @ markus2330؟

نعم ، تقوم قيمة الدليل بتعديل KeySet التي تستقبلها elektraYajlSet. هذا لا يحدث ، مع ذلك ، إذا كان المفتاح الرئيسي موجودًا فقط (لأنه لا يعتبر "دليلًا" إذن). لذلك إذا قمت بتعيين المفتاح الأصلي فقط ، كما اكتشفت بالفعل ، فسيتم تنفيذ elektraGenEmpty وسيُنفذ strcmp ينجح.

لكن لدى elektraGenEmpty بعض الافتراضات التي لم تعد صحيحة الآن (تمت كتابتها قبل وجود directoryvalue). لذلك توجد أخطاء أخرى ، على سبيل المثال # 2132

أعتقد أن هذا الحل سينجح ، لكنني سأجده أكثر وضوحًا إذا كان بإمكاني تعيين مستند json مباشرةً على {"__dirdata": "test"} ، والذي سيكون هو نفسه من الناحية المعنوية.

ألن يكون {"": "test"} هو الحد الأدنى من المستندات التي تصف قيمة واحدة؟ يبدو أيضًا أن هذا هو سلوك المكون الإضافي "camel".

sanssecours هل يمكنك تمديد البرنامج التعليمي للتخزين ليصف أيضًا مفاتيح الوالدين و "المفاتيح الفارغة" (٪) (أو على الأقل مثل TODO في الوقت الحالي)؟

هل يمكنك تمديد برنامج التخزين التعليمي ليشمل أيضًا مفاتيح الوالدين ...

أعتقد أن البرنامج التعليمي يصف

  • قيمة المفاتيح الأصل (filepath) ، و
  • يتم استخدام المفاتيح الأصلية لإرسال معلومات خطأ وتحذير

. لا أعرف أي شيء آخر خاص بمفاتيح الوالدين.

و "مفاتيح فارغة" (٪) (أو على الأقل مثل TODO حاليًا)؟

نظرًا لأن هذه هي المرة الأولى التي أسمع فيها عن المفاتيح الفارغة ، فلا أعتقد أنني الشخص المناسب للقيام بذلك.

يمكنني إضافة رمز يخرج قيمة المفاتيح في مستند json كما هو موضح بواسطة sanssecours هنا .

لست متأكدًا من أن هذه هي الطريقة الصحيحة لـ YAJL للتعامل مع المشكلة بعد الآن ، نظرًا لأن مستند JSON الصالح يبدو أنه يتطلب دائمًا مصفوفة أو كائنًا في المستوى الأعلى.

لا أعرف أي شيء آخر خاص بمفاتيح الوالدين.

لا يوجد أيضًا أي شيء آخر خاص به باستثناء أن بعض تنسيقات ملفات التكوين ليس لديها طريقة لوصف قيمة بدون مفتاح.

"مفاتيح فارغة" (٪)

تتيح لك المفاتيح الفارغة تعيين مستندات مثل {"root": {"": "something"}} . كيف يمكنك تعيين هذا حاليًا إلى KeySet؟

لست متأكدًا من أن هذه هي الطريقة الصحيحة لـ YAJL للتعامل مع المشكلة بعد الآن ، نظرًا لأن مستند JSON الصالح يبدو أنه يتطلب دائمًا مصفوفة أو كائنًا في المستوى الأعلى.

يبدو أن هذا قد تغير: https://stackoverflow.com/questions/13318420/is-a-single-string-value-consoded-valid-json

في https://www.ietf.org/rfc/rfc7159.txt توجد أمثلة توضح أن "القيم فقط" مسموح بها. لكن يبدو أن yajl لا يدعم هذا ... (yajl 2.1.0-2 + ​​b3 ينتج الخطأ Expected “{” but found “"” )

باستخدام الميزة من RFC 7159 ، يمكننا تعيين:

"some value" -> الأصل = "بعض القيمة"
{"", "some value"} -> الأصل /٪ = "بعض القيمة"

لكننا سنحتاج إلى حل مشكلة yajl بعد ذلك ... (لا يشير سجل التغيير أيضًا إلى إضافة هذه الميزة لاحقًا).

تتيح لك المفاتيح الفارغة تعيين مستندات مثل {"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؟ ماذا تفعل الملحقات الخاصة بك إذا تم تعيين المفتاح الرئيسي فقط؟

هل نريد الآن دعم RFC 7159؟

في رأيي ، فإن دعم كل نوع بيانات في المستوى الأعلى أمر منطقي.

ماذا تفعل الملحقات الخاصة بك إذا تم تعيين المفتاح الرئيسي فقط؟

يقومون فقط بتخزين النص (بدون المفتاح):

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

.

أضفت معالجة خاصة للمستوى الأعلى في هذا الالتزام .
هذا يكسر اختبارًا في وحدة yajl ، ولكن قبل أن أذهب وأقضي الوقت في إصلاح ما كنت أرغب في تسجيل الوصول إليه أولاً ، هل سيكون هذا حلاً مقبولاً @ markus2330؟

فقط للتوضيح قليلاً: إذا كان حجم KeySet هو 1 ، فيمكنني التأكد من وجود مفتاح المستوى الأعلى فقط فيه. ثم أقوم بتوليد قيمة هذا المفتاح. ولكن في هذه الحالة ، يجب أن أمنع استدعاء elektraGenOpenValue ، لأنه بخلاف ذلك سينشئ المفتاح كسلسلة.

يبدو أن برنامج YAML CPP يتعامل مع هذه البيانات بشكل صحيح:
...

هذا المثال يناسبني مع yajl. هل فاتني شيء؟

هذا يكسر الاختبار في وحدة yajl

أي اختبار؟ (انظر أيضا أدناه)

كنت أرغب في تسجيل الوصول أولاً ، إذا كان ذلك سيكون حلاً مقبولاً

من الأسهل معرفة ما إذا كان هناك حل مقبول إذا:

  • قمت بإنشاء علاقات عامة (والتي ستقوم بعد ذلك بتشغيل جميع حالات الاختبار)
  • صف في اختبار ومع أمثلة السلوك الذي تريد تنفيذه الآن

هذا المثال يناسبني مع yajl. هل فاتني شيء؟

لا ، هذا المثال يوضح فقط أن {"", "some value"} ليس طريقة مثالية لتمثيل قيمة المفتاح الرئيسي.

هل نريد الآن دعم RFC 7159؟
في رأيي ، فإن دعم كل نوع بيانات في المستوى الأعلى أمر منطقي.

انا اوافق تماما.

يقومون فقط بتخزين النص (بدون المفتاح):

لذلك دعونا نطبق الشيء نفسه مع yajl.

إنه يعمل بشكل مثالي بالنسبة لي الآن!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

markus2330 picture markus2330  ·  4تعليقات

markus2330 picture markus2330  ·  3تعليقات

e1528532 picture e1528532  ·  4تعليقات

mpranj picture mpranj  ·  3تعليقات

mpranj picture mpranj  ·  3تعليقات