Libelektra: yajl: Boolean Elektra tidak didukung

Dibuat pada 2 Apr 2019  ·  24Komentar  ·  Sumber: ElektraInitiative/libelektra

Langkah-langkah untuk Mereproduksi Masalah

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

Hasil yang diharapkan

Itu masih true ada di file konfigurasi sebagai true dan 1 harus sama.

cat `kdb file user/tests/yajl`
#> true

Hasil Aktual

 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"

Sistem Informasi

  • Versi Elektra: master

Petunjuk Implementasi

Plugin yajl perlu:

  • [] merender nilai "0" dan "1" Elektra menjadi salah dan benar JSON.
  • [] gagal dengan kesalahan jenis jika jenis yang tidak didukung ditemukan
bug lanc

Komentar yang paling membantu

Dapatkah saya menyetel kunci secara terprogram juga?

Ya, tambahkan saja ke kumpulan kunci kontrak. Misalnya, baris berikut menunjukkan bagaimana YAML CPP mengkonfigurasi plugin type :

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

Semua 24 komentar

@kodebach apakah ini masih memungkinkan bahwa plugin jenis dapat dikonfigurasi ulang untuk dinormalisasi ke "true" daripada "1".

Tidak, ini tidak didukung oleh plugin type, saya tidak tahu ada kasus penggunaan untuk ini.

IMO itu juga tidak masuk akal. Cara Elektra untuk merepresentasikan boolean adalah 0 dan 1 . Jika format penyimpanan mendukung tipe, konversi dari representasi Elektra ke representasi format penyimpanan, harus dilakukan oleh plugin penyimpanan. Pada akhirnya plugin penyimpanan untuk format X harus menjadi jembatan antara Elektra dan format X.

Juga bukankah masalah yang lebih besar adalah memulihkan nilai? Pemulihan dilakukan di presetstorage , dan Anda secara eksplisit meminta, bahwa nilai selalu dikembalikan ke representasi yang dipilih oleh pengguna, saat menyetel nilainya. Ini berarti, jika Anda menggunakan kdb set user/tests/yajl on dalam contoh Anda, plugin yajl akan menerima nilai on .

Apa yang sebenarnya kita butuhkan di sini, adalah cara untuk mengatur representasi ke nilai mana yang dipulihkan, terlepas dari bagaimana pengguna mengatur nilainya. Ini bisa ditambahkan dengan sangat mudah. Namun saya tidak yakin saat ini ada cara untuk menentukan konfigurasi untuk sebuah plugin, dari plugin lain. Artinya pengguna masih harus mengkonfigurasi type dengan benar saat menggunakan yajl .

nilai-nilai itu selalu dikembalikan ke representasi yang dipilih oleh pengguna

Ini tidak akan menjadi masalah karena di JSON satu-satunya presentasi yang tersedia adalah benar / salah, sehingga pengguna tidak dapat memilih.

Artinya pengguna masih harus mengkonfigurasi jenis dengan benar saat menggunakan yajl.

Ini juga tidak menjadi masalah karena yajl dapat menambahkan konfigurasi / kebutuhan untuk mengkonfigurasi ulang jenis plugin.

Cara Elektra untuk merepresentasikan boolean adalah 0 dan 1. Jika format penyimpanan mendukung tipe, konversi dari representasi-Elektra ke representasi format penyimpanan, harus dilakukan oleh plugin penyimpanan.

Ya, saya setuju sepenuhnya. Keuntungan dari pendekatan Anda adalah bahwa itu juga akan memungkinkan plugin perantara (antara tipe dan penyimpanan) untuk melihat representasi boolean yang benar.

Saya memperbarui "Petunjuk Penerapan" di atas untuk mencerminkan hal ini.

@kodebach pertanyaan lain: JSON hanya mendukung double / boolean / string. Apakah mungkin untuk mengatakan kepada jenis plugin bahwa hanya 3 jenis ini yang diperbolehkan?

Ini juga akan memperbaiki jenis JSON yang disebutkan di # 1092.

Ini tidak akan menjadi masalah karena di JSON satu-satunya presentasi yang tersedia adalah benar / salah, sehingga pengguna tidak dapat memilih.

Mereka tidak dapat memilih di JSON, tetapi mereka dapat memilih saat menggunakan kdb set

antara tipe dan penyimpanan

Urutannya harus seperti ini: getstorage , type , [other], type , setstorage , Berarti tidak boleh ada plugin apa pun di antara jenis dan penyimpanan.

Saya memperbarui "Petunjuk Penerapan" di atas untuk mencerminkan hal ini.

Masih ada masalah bahwa misalnya kdb set user/tests/yajl on tidak akan berfungsi, tanpa perubahan ke type , karena dalam kasus ini type akan meneruskan nilai on ke setstorage plugin.

JSON hanya mendukung double / boolean / string. Apakah mungkin untuk mengatakan kepada jenis plugin bahwa hanya 3 jenis ini yang diperbolehkan?

Seharusnya tidak sulit untuk membatasi jenis yang diizinkan melalui konfigurasi.

Mereka tidak dapat memilih di JSON, tetapi mereka dapat memilih saat menggunakan set kdb

Apa yang dipilih di kdb set tidak dapat diingat jika format file tidak mendukungnya.

Masih ada masalah yaitu kdb set user / tests / yajl on tidak akan berfungsi, tanpa perubahan jenis, karena dalam hal ini type akan meneruskan nilai ke plugin setstorage.

Mengapa tidak berubah menjadi "1" dalam kasus ini?

Seharusnya tidak sulit untuk membatasi jenis yang diizinkan melalui konfigurasi.

Mungkin itu tidak masalah. Apakah ada bedanya jika plugin penyimpanan atau plugin tipe mengatakan bahwa sebuah tipe tidak diperbolehkan? Akan lebih baik jika tutorial penyimpanan juga mengatakan sesuatu tentang tipe ( @sanssecours ?)

Apakah ada bedanya jika plugin penyimpanan atau plugin tipe mengatakan bahwa sebuah tipe tidak diperbolehkan?

Tidak yang saya tahu. Mungkin akan lebih baik untuk meningkatkan kesalahan dalam plugin penyimpanan, karena kemudian pengguna melihat bahwa masalahnya adalah penggunaan yajl bukan penggunaan type .

Mengapa tidak berubah menjadi "1" dalam kasus ini?

Prosedur normalisasi / pemulihan dapat dijelaskan oleh kasus-kasus berikut:

  • Kasus 1: Kunci ada di kdbGet dan tidak berubah antara kdbGet dan kdbSet
    Ini adalah kasus termudah dan paling jelas. Nilai dinormalisasi dalam kdbGet dan nilai asli dipulihkan dalam kdbSet , sehingga file penyimpanan yang mendasarinya tetap tidak berubah (tulis kunci yang dimaksud)
  • Kasus 2: Kunci tidak ada di kdbGet
    Di sini kami menormalkan nilai untuk memverifikasi jenis dan kemudian segera mengembalikannya.
  • Kasus 3: Kunci ada di kdbGet , tetapi nilainya diubah antara kdbGet dan kdbSet
    Ini penting sama seperti Kasus 2. keySetString menghapus origvalue metadata, jadi untuk plugin type kunci semacam ini tidak ada di kdbGet .

Ada satu kasus khusus. Saya sudah menambahkan fungsionalitas yang mungkin digunakan di sini (saya lupa menambahkannya ke infos / metadata):

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

Jika yajl menyuntikkan metadata check/boolean/true = true dan check/boolean/false = false untuk semua kunci boolean, semua normalisasi dan pemulihan harus bekerja sebagaimana mestinya. Plugin type kemudian akan menerima nilai true , 1 , false dan 0 untuk kunci boolean (dalam get dan set), tetapi itu akan selalu meneruskan true atau false ke plugin setstorage. Plugin yajl masih harus mengembalikan 0 / 1 dan harus menerima true / false serta 0 / 1 dalam set, sehingga dapat bekerja dengan atau tanpa plugin type .

Namun, jika kita memilih untuk turun dengan cara ini, kita harus mendokumentasikannya dengan sangat baik, karena memasang plugin tipe tidak akan lagi memungkinkan untuk menggunakan nilai yang berbeda untuk kunci boolean di kdb set , karena yajl diam-diam menimpa konfigurasi apa pun yang diberikan oleh pengguna.

Tidak yang saya tahu. Mungkin akan lebih baik untuk meningkatkan kesalahan di plugin penyimpanan, karena pengguna melihat bahwa masalahnya adalah penggunaan yajl bukan penggunaan tipe.

Persis.

Prosedur normalisasi / pemulihan dapat dijelaskan dalam kasus berikut
[...] (Saya lupa menambahkannya ke info / metadata)

Terima kasih atas penjelasan detailnya. Bisakah Anda menambahkan ini ke dokumentasi kami?

tidak lagi mengizinkan penggunaan nilai yang berbeda untuk kunci boolean dalam set kdb

Dengan "config / needs" yajl dapat memastikan bahwa tipe dipasang menggunakan "check / boolean / true = true dan check / boolean / false = false".

Jadi, haruskah saya mengubah petunjuk penerapan?

Dengan "config / needs" yajl dapat memastikan bahwa tipe dipasang menggunakan "check / boolean / true = true dan check / boolean / false = false".

Anda salah paham, sekarang check/boolean/true dan check/boolean/false harus disetel sebagai metadata pada kunci individu, bukan di konfigurasi type . Dukungan umum dalam konfigurasi harus ditambahkan (cukup mudah).

Baik. Tidak, biarkan apa adanya. Lebih masuk akal untuk menerapkan semua yang ada di plugin yajl.
Saya menambahkan sebagai petunjuk implementasi:

Plugin yajl perlu:

  • [] merender nilai "0" dan "1" Elektra menjadi salah dan benar JSON.
  • [] gagal dengan kesalahan jenis jika jenis yang tidak didukung ditemukan

@sanssecours dapatkah Anda menambahkan info ini ke tutorial plugin penyimpanan?

yajl juga harus menambahkan metadata check/boolean/true = true dan check/boolean/false = false ke setiap kunci dengan type = boolean . Jika tidak masalah untuk kdb set /some/key on disebutkan di atas akan terjadi.

yajl juga harus menambahkan metadata

Apakah ini juga diperlukan jika yajl selalu memberi Anda "0" dan "1" untuk boolean?

Ya, karena masalah terjadi, ketika pengguna mengubah nilai kunci setelah kdbGet . yajl tidak berpengaruh pada hal itu.

Tapi bagaimanapun juga, kita perlu mengubah plugin type , karena jika pengguna menambahkan kunci baru, metadata tidak akan ada dan solusinya tidak akan berfungsi.

Jadi kita membutuhkan plugin tipe untuk tersedia dua kali di jalur kdbSet sehingga normalisasi akan bekerja dengan baik? Bisakah Anda membuat masalah?

Tidak. Dengan # 2582 yajl (atau pengguna) hanya perlu memastikan bahwa konfigurasi untuk type berisi

  • tidak ada array booleans dan boolean/restore = #1
    atau
  • memiliki array booleans yang berisi "true" dan "false" pada posisi #X dan boolean/restore = #X

Saya akan mencoba memperbaikinya, tetapi punya pertanyaan.

Bukankah seharusnya cukup untuk menetapkan type=boolean dan type/boolean/restoreas=none pada kunci yang saya parse sebagai boolean di elektraYajlGet ? Lalu di elektraYajlSet saya akan menerima kunci ini dengan nilai 1 atau 0, bukan?

Tapi saya masih menerima nilai yang diberikan pengguna

# 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.

@tokopedia
Mungkinkah dalam kasus ini nilai selalu dipulihkan meskipun type/boolean/restoreas=none ?

/boolean/restoreas bukan metakey untuk kunci individu. Ini adalah bagian dari konfigurasi untuk plugin type digunakan untuk keseluruhan mountpoint.

Saya pikir itu sudah cukup untuk menambahkan config/needs = type/boolean/restoreas=none ke header src/pluigns/yajl/README.md . (Setidaknya untuk pemasangan melalui kdb mount )

Menambahkan - infos/config/needs = type/boolean/restoreas=none sepertinya merupakan kesalahan kompilator.

/elektra/build/src/plugins/yajl/readme_yajl.c:11:55: error: expected ‘)’ before ‘keyNew’
 "- infos/config/needs = type/boolean/restoreas=none\n"
                                                       ^
                                                       )

Dapatkah saya menyetel kunci secara terprogram juga? Saya tidak dapat menemukan dokumentasi tentang cara mengkonfigurasi plugin lain.

Saya pikir seharusnya config/need bukan infos/config/needs . Saya tidak dapat memverifikasinya sekarang.

Header README diubah menjadi baris keyNew , yang kemudian Anda masukkan ke dalam metode plugin get . Anda dapat menambahkan barang secara manual di sana, menggunakan README lebih disukai, karena secara otomatis menyediakan dokumentasi.

Dapatkah saya menyetel kunci secara terprogram juga?

Ya, tambahkan saja ke kumpulan kunci kontrak. Misalnya, baris berikut menunjukkan bagaimana YAML CPP mengkonfigurasi plugin type :

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

Terima kasih semuanya!

Dengan # 3012, plugin yajl memiliki perilaku berikut.

Dengan plugin tipe

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
}

Tanpa plugin tipe

Plugin yajl masih harus mengembalikan 0 / 1 dan harus menerima true / false serta 0 / 1 dalam set, sehingga dapat bekerja dengan atau tanpa plugin 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

Apakah itu mengacu pada kapan plugin tipe dipasang atau tanpa?

Dalam kasus terakhir ini, perilaku hingga saat ini adalah peringatan yang dikeluarkan.

 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

Saya rasa ini masih baik-baik saja, karena tanpa plugin tipe, seharusnya tidak ada pemeriksaan tipe.

Sebenarnya, itu harus memperingatkan (atau bahkan gagal) tentang apa pun kecuali "1" atau "0". Juga "benar", "salah" bukanlah boolean Elektra.

Imho, plugin yajl harus memiliki ketergantungan "memerlukan" untuk jenis plugin. (tapi pertama-tama kita juga perlu memperbaiki "nomor", karena ini bukan salah satu tipe Elektra).

Sebenarnya, itu harus memperingatkan (atau bahkan gagal) tentang apa pun kecuali "1" atau "0". Juga "benar", "salah" bukanlah boolean Elektra.

@kodebach menulis

Plugin yajl masih harus mengembalikan 0/1 dalam get dan harus menerima true / false serta 0/1 dalam set, sehingga bekerja dengan atau tanpa plugin tipe.

Itulah yang saya izinkan juga "benar" dan "salah".

Imho, plugin yajl harus memiliki ketergantungan "memerlukan" untuk jenis plugin. (tapi pertama-tama kita juga perlu memperbaiki "nomor", karena ini bukan salah satu tipe Elektra).

Ya, saya sangat setuju tentang ketergantungan tersebut. Kemudian kami dapat menghapus dukungan untuk "true" dan "false".

Mengenai masalah nomor: Yajl memetakan jenis Nomor menjadi dua kali lipat, yang menurut saya tidak masalah. Dan dari pemeriksaan cepat, tipe ganda plugin juga mendukung notasi-E json (yaitu 3.4e2 ).
Menurut Anda, apa masalahnya?

Menurut Anda, apa masalahnya?

Ahh, sekarang saya melihat bahwa src / plugins / yajl / testmod_yajl.c 240-251 dikomentari. Ini harus dihapus. (Masih ada angka.)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

sanssecours picture sanssecours  ·  36Komentar

ghost picture ghost  ·  29Komentar

ingwinlu picture ingwinlu  ·  35Komentar

haraldg picture haraldg  ·  65Komentar

PhilippGackstatter picture PhilippGackstatter  ·  45Komentar