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
Itu masih true
ada di file konfigurasi sebagai true
dan 1
harus sama.
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"
Plugin yajl perlu:
@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:
kdbGet
dan tidak berubah antara kdbGet
dan kdbSet
kdbGet
dan nilai asli dipulihkan dalam kdbSet
, sehingga file penyimpanan yang mendasarinya tetap tidak berubah (tulis kunci yang dimaksud)kdbGet
kdbGet
, tetapi nilainya diubah antara kdbGet
dan kdbSet
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):
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:
@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
booleans
dan boolean/restore = #1
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
:
Terima kasih semuanya!
Dengan # 3012, plugin yajl memiliki perilaku berikut.
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
}
Plugin
yajl
masih harus mengembalikan0
/1
dan harus menerimatrue
/false
serta0
/1
dalam set, sehingga dapat bekerja dengan atau tanpa plugintype
.
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.)
Komentar yang paling membantu
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
.