nolo-cli 0.143.0-alpha.1 → 0.145.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/{_executeModel-QK43QR2R.js → _executeModel-M3FASQ2Z.js} +18 -17
- package/{agentDeleteCommand-SE4WUIRR.js → agentDeleteCommand-K7GCEEVS.js} +10 -9
- package/{agentEmailCommands-LW5JMYH2.js → agentEmailCommands-MNXRO36L.js} +24 -23
- package/{agentListCommands-LGZG2OQR.js → agentListCommands-KMZR6VVM.js} +12 -11
- package/{agentMachineCommands-BNOXYSPZ.js → agentMachineCommands-75TIBYDY.js} +10 -9
- package/{agentProviderCommands-AOG3OZJA.js → agentProviderCommands-TWB6E5WD.js} +1 -1
- package/{agentRecordCommands-W5ZXPHZV.js → agentRecordCommands-RDO5L3N4.js} +23 -22
- package/{agentRunCommand-VRLCL57M.js → agentRunCommand-FVJJPL27.js} +23 -22
- package/{agentRuntimeLocal-VOQ3UYZB.js → agentRuntimeLocal-DAK7RCER.js} +8 -7
- package/{agentSlice-4AK24F5F.js → agentSlice-6MRJR2BJ.js} +1 -1
- package/{appDeleteCommands-XWAIUHTN.js → appDeleteCommands-JMMXK3XT.js} +11 -10
- package/{appDeployCommands-CBJJCUMG.js → appDeployCommands-JFU6GALI.js} +11 -10
- package/{appDeployStatusCommands-LTTZTJQS.js → appDeployStatusCommands-AXTZ4GAN.js} +11 -10
- package/{appGetCommands-QHUB7MFF.js → appGetCommands-CR2W3DCM.js} +11 -10
- package/{appListCommands-HINIDJE7.js → appListCommands-2TV6P3EU.js} +11 -10
- package/{authCommand-LARLQ3GC.js → authCommand-UBJ4EWYZ.js} +6 -6
- package/{authCommands-GBIFZWD3.js → authCommands-H6WKKCRW.js} +1 -1
- package/{builtinSkillRegistry-AFPSTTAU.js → builtinSkillRegistry-ZMF6YGNO.js} +4 -3
- package/{chatQueueReduxAdapter-KIQ3FQ62.js → chatQueueReduxAdapter-CDOHVTSE.js} +2 -2
- package/{chromeCommands-NKU3OWKH.js → chromeCommands-2N6MEWRU.js} +94 -23
- package/{chromeOpsCommands-OQDJGD4Y.js → chromeOpsCommands-IXRLN57H.js} +4 -3
- package/{chunk-7MUSNQ6E.js → chunk-27ONFIEY.js} +20 -2
- package/{chunk-OZ6V53WV.js → chunk-2EE5UD3N.js} +1 -1
- package/{chunk-44QZPYLI.js → chunk-2SYTUTLI.js} +92 -20
- package/{chunk-DID5AVGT.js → chunk-2TKVOEQF.js} +11 -10
- package/chunk-5J3PYNUP.js +255 -0
- package/{chunk-OUOJE2P2.js → chunk-5XYFIDFU.js} +5 -5
- package/{chunk-WTUVMKSQ.js → chunk-62XHRZG4.js} +2 -2
- package/{chunk-WC6A2Q7S.js → chunk-6TPOEJMQ.js} +5 -2
- package/{chunk-RRMAZ2BI.js → chunk-7NANRWL4.js} +1 -1
- package/{chunk-44F6KKUE.js → chunk-7YAK46ML.js} +3 -3
- package/{chunk-NOGH7HCP.js → chunk-A6FNUMCF.js} +47 -6
- package/{chunk-OFYHCA6W.js → chunk-AATZZAZE.js} +1 -1
- package/{chunk-KUPDS66Q.js → chunk-ANX7Z7Z2.js} +8 -8
- package/{chunk-J5H6SUOW.js → chunk-B2XUQXQX.js} +2 -2
- package/{chunk-A5MB5RIT.js → chunk-CCOXTK3I.js} +1 -1
- package/chunk-GNMAFAIS.js +29 -0
- package/{chunk-GZQNKKDG.js → chunk-HKBFZONG.js} +1 -1
- package/{chunk-7LLWEG6F.js → chunk-I44MDY73.js} +3 -3
- package/{chunk-QDT5T7MK.js → chunk-I4OPU5TK.js} +1 -1
- package/{chunk-VPFEPRME.js → chunk-IVZJWTDI.js} +3 -0
- package/{chunk-CTGZO35O.js → chunk-JLQKV2ZJ.js} +2 -2
- package/{chunk-PQVOC2CZ.js → chunk-M2YBIBBS.js} +1 -1
- package/{chunk-ZOI6KA4N.js → chunk-M76SRQ3H.js} +34 -22
- package/{chunk-K25DK52L.js → chunk-OKSJZ4UU.js} +21 -223
- package/{chunk-U5QTKTZE.js → chunk-P6GMCCAT.js} +1 -1
- package/{chunk-L6RB42ZR.js → chunk-QFZM5BFI.js} +3 -3
- package/{chunk-GH4MH73K.js → chunk-RHDOQWXZ.js} +175 -17
- package/{chunk-M6NK74VP.js → chunk-S5XGT6GB.js} +1 -1
- package/{chunk-KUWT3C2P.js → chunk-T76D3OYX.js} +1 -1
- package/{chunk-MXRUAINC.js → chunk-UMB7CHAY.js} +3 -3
- package/{chunk-VVUSRF5D.js → chunk-VJ4FUWPC.js} +3 -3
- package/{chunk-T36EFAW7.js → chunk-VZVTPDPL.js} +3 -3
- package/{chunk-AAROOKLX.js → chunk-X2QRZXZH.js} +1 -1
- package/{chunk-WYYO2YOL.js → chunk-XNXNHAAP.js} +1 -1
- package/{chunk-O6OSWFZQ.js → chunk-XUWRURDF.js} +6 -0
- package/{chunk-DOBBRISY.js → chunk-Y6XHJ4JJ.js} +22 -10
- package/{chunk-W247GBSQ.js → chunk-YU2THNST.js} +1 -1
- package/{chunk-OY5IJI2N.js → chunk-YUNJN43V.js} +23 -3
- package/{commandRegistry-DETYXF5I.js → commandRegistry-ZF6YXQWV.js} +76 -65
- package/{contentThunks-6QBTPLWT.js → contentThunks-6Y6ATG3A.js} +3 -3
- package/{createAgentAutomationAction-TZVIJTZ7.js → createAgentAutomationAction-OQTLA2FC.js} +3 -3
- package/{createDialogAction-KTDAEA42.js → createDialogAction-IF5EZMBD.js} +6 -5
- package/{createPageAction-4RASVDAU.js → createPageAction-GU766R3L.js} +3 -3
- package/{dialogCommands-GY7LRERG.js → dialogCommands-QV7XAX2V.js} +11 -10
- package/{dialogSlice-J24APUGG.js → dialogSlice-CVHMDSVV.js} +2 -2
- package/{docCreateCommands-T7KII3WP.js → docCreateCommands-FSBANQTO.js} +10 -9
- package/{docDeleteCommands-SQ26EFE6.js → docDeleteCommands-4IR4YSGU.js} +11 -10
- package/{docReadCommands-I6NA2ZKV.js → docReadCommands-4EYPGUE3.js} +10 -9
- package/{docStore-SPOGE7K3.js → docStore-RQOWPNON.js} +1 -1
- package/{docUpdateCommands-IG43SZ6U.js → docUpdateCommands-RW2BYLSE.js} +10 -9
- package/{handleSendMessageAction-I2IN64DS.js → handleSendMessageAction-UDTPG5WK.js} +4 -3
- package/index.js +4 -4
- package/{machineCommands-U7VABJPW.js → machineCommands-WBQ4TCPD.js} +22 -21
- package/{machineWsRunDispatch-ZNU6LRNG.js → machineWsRunDispatch-7DNDXUOS.js} +22 -21
- package/node_modules/abstract-level/CHANGELOG.md +150 -0
- package/node_modules/abstract-level/LICENSE +21 -0
- package/node_modules/abstract-level/README.md +1957 -0
- package/node_modules/abstract-level/UPGRADING.md +669 -0
- package/node_modules/abstract-level/abstract-chained-batch.js +397 -0
- package/node_modules/abstract-level/abstract-iterator.js +404 -0
- package/node_modules/abstract-level/abstract-level.js +1127 -0
- package/node_modules/abstract-level/abstract-snapshot.js +84 -0
- package/node_modules/abstract-level/index.d.ts +52 -0
- package/node_modules/abstract-level/index.js +9 -0
- package/node_modules/abstract-level/lib/abstract-sublevel-iterator.js +141 -0
- package/node_modules/abstract-level/lib/abstract-sublevel.js +290 -0
- package/node_modules/abstract-level/lib/common.js +33 -0
- package/node_modules/abstract-level/lib/default-chained-batch.js +29 -0
- package/node_modules/abstract-level/lib/default-kv-iterator.js +74 -0
- package/node_modules/abstract-level/lib/deferred-iterator.js +110 -0
- package/node_modules/abstract-level/lib/deferred-queue.js +84 -0
- package/node_modules/abstract-level/lib/errors.js +21 -0
- package/node_modules/abstract-level/lib/event-monitor.js +30 -0
- package/node_modules/abstract-level/lib/hooks.js +78 -0
- package/node_modules/abstract-level/lib/prefixes.js +21 -0
- package/node_modules/abstract-level/lib/prewrite-batch.js +96 -0
- package/node_modules/abstract-level/lib/range-options.js +26 -0
- package/node_modules/abstract-level/package.json +66 -0
- package/node_modules/abstract-level/test/async-iterator-test.js +132 -0
- package/node_modules/abstract-level/test/batch-test.js +214 -0
- package/node_modules/abstract-level/test/chained-batch-test.js +315 -0
- package/node_modules/abstract-level/test/clear-range-test.js +262 -0
- package/node_modules/abstract-level/test/clear-test.js +110 -0
- package/node_modules/abstract-level/test/common.js +90 -0
- package/node_modules/abstract-level/test/deferred-open-test.js +209 -0
- package/node_modules/abstract-level/test/del-test.js +65 -0
- package/node_modules/abstract-level/test/encoding-buffer-test.js +336 -0
- package/node_modules/abstract-level/test/encoding-custom-test.js +92 -0
- package/node_modules/abstract-level/test/encoding-decode-error-test.js +85 -0
- package/node_modules/abstract-level/test/encoding-json-test.js +75 -0
- package/node_modules/abstract-level/test/encoding-test.js +130 -0
- package/node_modules/abstract-level/test/events/write.js +132 -0
- package/node_modules/abstract-level/test/factory-test.js +36 -0
- package/node_modules/abstract-level/test/get-many-test.js +157 -0
- package/node_modules/abstract-level/test/get-sync-test.js +61 -0
- package/node_modules/abstract-level/test/get-test.js +83 -0
- package/node_modules/abstract-level/test/has-many-test.js +144 -0
- package/node_modules/abstract-level/test/has-test.js +81 -0
- package/node_modules/abstract-level/test/hooks/newsub.js +57 -0
- package/node_modules/abstract-level/test/hooks/postopen.js +229 -0
- package/node_modules/abstract-level/test/hooks/prewrite.js +816 -0
- package/node_modules/abstract-level/test/hooks/shared.js +38 -0
- package/node_modules/abstract-level/test/index.js +86 -0
- package/node_modules/abstract-level/test/iterator-explicit-snapshot-test.js +393 -0
- package/node_modules/abstract-level/test/iterator-no-snapshot-test.js +49 -0
- package/node_modules/abstract-level/test/iterator-range-test.js +277 -0
- package/node_modules/abstract-level/test/iterator-seek-test.js +335 -0
- package/node_modules/abstract-level/test/iterator-snapshot-test.js +56 -0
- package/node_modules/abstract-level/test/iterator-test.js +621 -0
- package/node_modules/abstract-level/test/manifest-test.js +21 -0
- package/node_modules/abstract-level/test/open-create-if-missing-test.js +39 -0
- package/node_modules/abstract-level/test/open-error-if-exists-test.js +25 -0
- package/node_modules/abstract-level/test/open-test.js +263 -0
- package/node_modules/abstract-level/test/put-get-del-test.js +97 -0
- package/node_modules/abstract-level/test/put-test.js +70 -0
- package/node_modules/abstract-level/test/self/abstract-iterator-test.js +182 -0
- package/node_modules/abstract-level/test/self/async-iterator-test.js +242 -0
- package/node_modules/abstract-level/test/self/attach-resource-test.js +74 -0
- package/node_modules/abstract-level/test/self/defer-test.js +140 -0
- package/node_modules/abstract-level/test/self/deferred-iterator-test.js +314 -0
- package/node_modules/abstract-level/test/self/deferred-operations-test.js +86 -0
- package/node_modules/abstract-level/test/self/deferred-queue-test.js +93 -0
- package/node_modules/abstract-level/test/self/encoding-test.js +391 -0
- package/node_modules/abstract-level/test/self/errors-test.js +11 -0
- package/node_modules/abstract-level/test/self/iterator-test.js +1050 -0
- package/node_modules/abstract-level/test/self/sublevel-test.js +1039 -0
- package/node_modules/abstract-level/test/self.js +905 -0
- package/node_modules/abstract-level/test/sublevel-test.js +209 -0
- package/node_modules/abstract-level/test/traits/closed.js +42 -0
- package/node_modules/abstract-level/test/traits/index.js +4 -0
- package/node_modules/abstract-level/test/traits/open.js +62 -0
- package/node_modules/abstract-level/test/util.js +275 -0
- package/node_modules/abstract-level/types/abstract-chained-batch.d.ts +124 -0
- package/node_modules/abstract-level/types/abstract-iterator.d.ts +241 -0
- package/node_modules/abstract-level/types/abstract-level.d.ts +636 -0
- package/node_modules/abstract-level/types/abstract-snapshot.d.ts +30 -0
- package/node_modules/abstract-level/types/abstract-sublevel.d.ts +76 -0
- package/node_modules/abstract-level/types/interfaces.d.ts +43 -0
- package/node_modules/base64-js/LICENSE +21 -0
- package/node_modules/base64-js/README.md +34 -0
- package/node_modules/base64-js/base64js.min.js +1 -0
- package/node_modules/base64-js/index.d.ts +3 -0
- package/node_modules/base64-js/index.js +150 -0
- package/node_modules/base64-js/package.json +47 -0
- package/node_modules/browser-level/CHANGELOG.md +44 -0
- package/node_modules/browser-level/LICENSE +21 -0
- package/node_modules/browser-level/README.md +124 -0
- package/node_modules/browser-level/UPGRADING.md +143 -0
- package/node_modules/browser-level/index.d.ts +108 -0
- package/node_modules/browser-level/index.js +323 -0
- package/node_modules/browser-level/iterator.js +239 -0
- package/node_modules/browser-level/package.json +48 -0
- package/node_modules/browser-level/util/clear.js +38 -0
- package/node_modules/browser-level/util/deserialize.js +17 -0
- package/node_modules/browser-level/util/key-range.js +20 -0
- package/node_modules/buffer/AUTHORS.md +73 -0
- package/node_modules/buffer/LICENSE +21 -0
- package/node_modules/buffer/README.md +410 -0
- package/node_modules/buffer/index.d.ts +194 -0
- package/node_modules/buffer/index.js +2106 -0
- package/node_modules/buffer/package.json +93 -0
- package/node_modules/classic-level/CHANGELOG.md +115 -0
- package/node_modules/classic-level/LICENSE +21 -0
- package/node_modules/classic-level/README.md +274 -0
- package/node_modules/classic-level/UPGRADING.md +131 -0
- package/node_modules/classic-level/binding.cc +2652 -0
- package/node_modules/classic-level/binding.gyp +71 -0
- package/node_modules/classic-level/binding.js +1 -0
- package/node_modules/classic-level/chained-batch.js +35 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/LICENSE +27 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/Makefile +424 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/build_detect_platform +256 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/autocompact_test.cc +118 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/builder.cc +88 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/builder.h +34 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/c.cc +595 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/c_test.c +390 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/corruption_test.cc +374 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_bench.cc +1020 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_impl.cc +1568 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_impl.h +212 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_iter.cc +317 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_iter.h +28 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/db_test.cc +2158 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/dbformat.cc +140 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/dbformat.h +230 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/dbformat_test.cc +112 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/dumpfile.cc +225 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/fault_injection_test.cc +554 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/filename.cc +144 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/filename.h +85 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/filename_test.cc +123 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/leveldbutil.cc +64 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_format.h +35 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_reader.cc +284 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_reader.h +113 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_test.cc +591 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_writer.cc +112 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/log_writer.h +54 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/memtable.cc +145 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/memtable.h +89 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/recovery_test.cc +324 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/repair.cc +461 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/skiplist.h +384 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/skiplist_test.cc +378 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/snapshot.h +67 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/table_cache.cc +127 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/table_cache.h +61 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_edit.cc +266 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_edit.h +107 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_edit_test.cc +46 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_set.cc +1535 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_set.h +399 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/version_set_test.cc +179 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/write_batch.cc +147 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/write_batch_internal.h +50 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/db/write_batch_test.cc +120 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.cc +398 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.h +20 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/helpers/memenv/memenv_test.cc +241 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/c.h +290 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/cache.h +110 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/comparator.h +63 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/db.h +164 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/dumpfile.h +25 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/env.h +351 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/filter_policy.h +70 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/iterator.h +100 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/options.h +213 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/slice.h +109 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/status.h +112 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/table.h +85 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/table_builder.h +92 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/value_sink.h +26 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/include/leveldb/write_batch.h +64 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/issues/issue178_test.cc +92 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/issues/issue200_test.cc +59 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/atomic_pointer.h +242 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/port.h +21 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/port_example.h +141 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/port_posix.cc +53 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/port_posix.h +156 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/port_posix_sse.cc +129 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/thread_annotations.h +60 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/port/win/stdint.h +24 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/block.cc +268 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/block.h +44 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/block_builder.cc +109 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/block_builder.h +57 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/filter_block.cc +111 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/filter_block.h +68 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/filter_block_test.cc +128 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/format.cc +144 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/format.h +108 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/iterator.cc +67 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/iterator_wrapper.h +66 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/merger.cc +197 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/merger.h +26 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/table.cc +285 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/table_builder.cc +270 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/table_test.cc +876 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/two_level_iterator.cc +182 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/table/two_level_iterator.h +34 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/arena.cc +68 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/arena.h +68 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/arena_test.cc +68 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/bloom.cc +95 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/bloom_test.cc +162 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/cache.cc +405 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/cache_test.cc +226 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/coding.cc +194 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/coding.h +104 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/coding_test.cc +196 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/comparator.cc +81 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/crc32c.cc +350 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/crc32c.h +45 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/crc32c_test.cc +72 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/env.cc +100 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/env_posix.cc +695 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/env_posix_test.cc +66 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/env_posix_test_helper.h +28 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/env_test.cc +106 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/filter_policy.cc +11 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/hash.cc +52 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/hash.h +19 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/hash_test.cc +54 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/histogram.cc +139 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/histogram.h +42 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/logging.cc +72 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/logging.h +43 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/mutexlock.h +41 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/options.cc +30 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/posix_logger.h +98 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/random.h +64 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/status.cc +75 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/testharness.cc +77 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/testharness.h +138 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/testutil.cc +51 -0
- package/node_modules/classic-level/deps/leveldb/leveldb-1.20/util/testutil.h +63 -0
- package/node_modules/classic-level/deps/leveldb/leveldb.gyp +282 -0
- package/node_modules/classic-level/deps/leveldb/patches/001-value-sink.patch +164 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/atomic_pointer_win.h +48 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/env_win.cc +692 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/port_uv.cc +36 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/port_uv.h +157 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/port_uv.h.bak +153 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/stdint-msvc2008.h +247 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/uv_condvar.h +45 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/uv_condvar_posix.cc +139 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/win_logger.cc +79 -0
- package/node_modules/classic-level/deps/leveldb/port-libuv/win_logger.h +28 -0
- package/node_modules/classic-level/deps/snappy/freebsd/config.h +135 -0
- package/node_modules/classic-level/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/deps/snappy/linux/config.h +135 -0
- package/node_modules/classic-level/deps/snappy/linux/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/deps/snappy/mac/config.h +137 -0
- package/node_modules/classic-level/deps/snappy/mac/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/deps/snappy/openbsd/config.h +135 -0
- package/node_modules/classic-level/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/deps/snappy/snappy/COPYING +54 -0
- package/node_modules/classic-level/deps/snappy/snappy/cmake/SnappyConfig.cmake +1 -0
- package/node_modules/classic-level/deps/snappy/snappy/cmake/config.h.in +62 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-c.cc +90 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-c.h +138 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-internal.h +224 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-sinksource.cc +104 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-sinksource.h +182 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-stubs-internal.cc +42 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-stubs-internal.h +561 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-stubs-public.h.in +94 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-test.cc +612 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy-test.h +573 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy.cc +1515 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy.h +203 -0
- package/node_modules/classic-level/deps/snappy/snappy/snappy_unittest.cc +1410 -0
- package/node_modules/classic-level/deps/snappy/snappy.gyp +119 -0
- package/node_modules/classic-level/deps/snappy/solaris/config.h +135 -0
- package/node_modules/classic-level/deps/snappy/solaris/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/deps/snappy/win32/config.h +29 -0
- package/node_modules/classic-level/deps/snappy/win32/snappy-stubs-public.h +100 -0
- package/node_modules/classic-level/index.d.ts +343 -0
- package/node_modules/classic-level/index.js +311 -0
- package/node_modules/classic-level/iterator.js +122 -0
- package/node_modules/classic-level/package.json +70 -0
- package/node_modules/classic-level/prebuilds/android-arm/classic-level.armv7.node +0 -0
- package/node_modules/classic-level/prebuilds/android-arm64/classic-level.armv8.node +0 -0
- package/node_modules/classic-level/prebuilds/darwin-x64+arm64/classic-level.node +0 -0
- package/node_modules/classic-level/prebuilds/linux-arm/classic-level.armv6.node +0 -0
- package/node_modules/classic-level/prebuilds/linux-arm/classic-level.armv7.node +0 -0
- package/node_modules/classic-level/prebuilds/linux-arm64/classic-level.armv8.node +0 -0
- package/node_modules/classic-level/prebuilds/linux-x64/classic-level.musl.node +0 -0
- package/node_modules/classic-level/prebuilds/linux-x64/classic-level.node +0 -0
- package/node_modules/classic-level/prebuilds/win32-ia32/classic-level.node +0 -0
- package/node_modules/classic-level/prebuilds/win32-x64/classic-level.node +0 -0
- package/node_modules/ieee754/LICENSE +11 -0
- package/node_modules/ieee754/README.md +51 -0
- package/node_modules/ieee754/index.d.ts +10 -0
- package/node_modules/ieee754/index.js +85 -0
- package/node_modules/ieee754/package.json +52 -0
- package/node_modules/is-buffer/LICENSE +21 -0
- package/node_modules/is-buffer/README.md +54 -0
- package/node_modules/is-buffer/index.d.ts +2 -0
- package/node_modules/is-buffer/index.js +11 -0
- package/node_modules/is-buffer/package.json +65 -0
- package/node_modules/level/CHANGELOG.md +532 -0
- package/node_modules/level/LICENSE +21 -0
- package/node_modules/level/README.md +107 -0
- package/node_modules/level/UPGRADING.md +413 -0
- package/node_modules/level/browser.js +1 -0
- package/node_modules/level/index.d.ts +75 -0
- package/node_modules/level/index.js +1 -0
- package/node_modules/level/package.json +62 -0
- package/node_modules/level-supports/CHANGELOG.md +140 -0
- package/node_modules/level-supports/LICENSE +21 -0
- package/node_modules/level-supports/README.md +276 -0
- package/node_modules/level-supports/index.d.ts +137 -0
- package/node_modules/level-supports/index.js +26 -0
- package/node_modules/level-supports/package.json +46 -0
- package/node_modules/level-supports/test/cloneable.js +26 -0
- package/node_modules/level-supports/test/index.js +24 -0
- package/node_modules/level-supports/test/self.js +86 -0
- package/node_modules/level-supports/test/shape.js +23 -0
- package/node_modules/level-transcoder/CHANGELOG.md +15 -0
- package/node_modules/level-transcoder/LICENSE +21 -0
- package/node_modules/level-transcoder/README.md +214 -0
- package/node_modules/level-transcoder/UPGRADING.md +13 -0
- package/node_modules/level-transcoder/index.d.ts +27 -0
- package/node_modules/level-transcoder/index.js +158 -0
- package/node_modules/level-transcoder/lib/encoding.d.ts +158 -0
- package/node_modules/level-transcoder/lib/encoding.js +105 -0
- package/node_modules/level-transcoder/lib/encodings.d.ts +9 -0
- package/node_modules/level-transcoder/lib/encodings.js +135 -0
- package/node_modules/level-transcoder/lib/formats.d.ts +13 -0
- package/node_modules/level-transcoder/lib/formats.js +111 -0
- package/node_modules/level-transcoder/lib/text-endec.d.ts +6 -0
- package/node_modules/level-transcoder/lib/text-endec.js +19 -0
- package/node_modules/level-transcoder/package.json +46 -0
- package/node_modules/maybe-combine-errors/LICENSE.md +21 -0
- package/node_modules/maybe-combine-errors/README.md +94 -0
- package/node_modules/maybe-combine-errors/index.js +60 -0
- package/node_modules/maybe-combine-errors/package.json +33 -0
- package/node_modules/module-error/CHANGELOG.md +23 -0
- package/node_modules/module-error/LICENSE +21 -0
- package/node_modules/module-error/README.md +89 -0
- package/node_modules/module-error/index.d.ts +18 -0
- package/node_modules/module-error/index.js +22 -0
- package/node_modules/module-error/package.json +36 -0
- package/node_modules/napi-macros/LICENSE +21 -0
- package/node_modules/napi-macros/README.md +277 -0
- package/node_modules/napi-macros/index.js +1 -0
- package/node_modules/napi-macros/napi-macros.h +255 -0
- package/node_modules/napi-macros/package.json +22 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/package.json +6 -3
- package/{providerPresetApply-7XEHTODR.js → providerPresetApply-XTEXOH7X.js} +3 -3
- package/{providerRegistry-GNV4FFSA.js → providerRegistry-ADYDSLKR.js} +3 -3
- package/{readlineWorkspace-46KDFUHN.js → readlineWorkspace-LO6ZLFTO.js} +1381 -1317
- package/{runAgentClientLoop-CQWLWU4W.js → runAgentClientLoop-KAYGKVTK.js} +16 -15
- package/{runtimeDoctorCommands-3USD722U.js → runtimeDoctorCommands-ID23PNNZ.js} +28 -0
- package/{spaceCommands-TSBC5UWP.js → spaceCommands-FA6RCZ2Y.js} +10 -9
- package/{streamAgentChatTurn-XD5JEJXA.js → streamAgentChatTurn-DFNDU2UY.js} +17 -16
- package/{tools-5NAJJTFN.js → tools-6HKH75NT.js} +13 -12
- package/{tuiSummaryLlmCaller-7KLLDP22.js → tuiSummaryLlmCaller-CFFVXQWX.js} +2 -2
- package/{updateCommands-XYMGOKF4.js → updateCommands-4EHDLF5J.js} +1 -1
- package/{updateDialogTitleAction-IKZPJCRA.js → updateDialogTitleAction-FFSYTLBC.js} +3 -3
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// Copyright 2014 The LevelDB Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
4
|
+
|
|
5
|
+
// This test uses a custom Env to keep track of the state of a filesystem as of
|
|
6
|
+
// the last "sync". It then checks for data loss errors by purposely dropping
|
|
7
|
+
// file data (or entire files) not protected by a "sync".
|
|
8
|
+
|
|
9
|
+
#include "leveldb/db.h"
|
|
10
|
+
|
|
11
|
+
#include <map>
|
|
12
|
+
#include <set>
|
|
13
|
+
#include "db/db_impl.h"
|
|
14
|
+
#include "db/filename.h"
|
|
15
|
+
#include "db/log_format.h"
|
|
16
|
+
#include "db/version_set.h"
|
|
17
|
+
#include "leveldb/cache.h"
|
|
18
|
+
#include "leveldb/env.h"
|
|
19
|
+
#include "leveldb/table.h"
|
|
20
|
+
#include "leveldb/write_batch.h"
|
|
21
|
+
#include "util/logging.h"
|
|
22
|
+
#include "util/mutexlock.h"
|
|
23
|
+
#include "util/testharness.h"
|
|
24
|
+
#include "util/testutil.h"
|
|
25
|
+
|
|
26
|
+
namespace leveldb {
|
|
27
|
+
|
|
28
|
+
static const int kValueSize = 1000;
|
|
29
|
+
static const int kMaxNumValues = 2000;
|
|
30
|
+
static const size_t kNumIterations = 3;
|
|
31
|
+
|
|
32
|
+
class FaultInjectionTestEnv;
|
|
33
|
+
|
|
34
|
+
namespace {
|
|
35
|
+
|
|
36
|
+
// Assume a filename, and not a directory name like "/foo/bar/"
|
|
37
|
+
static std::string GetDirName(const std::string filename) {
|
|
38
|
+
size_t found = filename.find_last_of("/\\");
|
|
39
|
+
if (found == std::string::npos) {
|
|
40
|
+
return "";
|
|
41
|
+
} else {
|
|
42
|
+
return filename.substr(0, found);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Status SyncDir(const std::string& dir) {
|
|
47
|
+
// As this is a test it isn't required to *actually* sync this directory.
|
|
48
|
+
return Status::OK();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// A basic file truncation function suitable for this test.
|
|
52
|
+
Status Truncate(const std::string& filename, uint64_t length) {
|
|
53
|
+
leveldb::Env* env = leveldb::Env::Default();
|
|
54
|
+
|
|
55
|
+
SequentialFile* orig_file;
|
|
56
|
+
Status s = env->NewSequentialFile(filename, &orig_file);
|
|
57
|
+
if (!s.ok())
|
|
58
|
+
return s;
|
|
59
|
+
|
|
60
|
+
char* scratch = new char[length];
|
|
61
|
+
leveldb::Slice result;
|
|
62
|
+
s = orig_file->Read(length, &result, scratch);
|
|
63
|
+
delete orig_file;
|
|
64
|
+
if (s.ok()) {
|
|
65
|
+
std::string tmp_name = GetDirName(filename) + "/truncate.tmp";
|
|
66
|
+
WritableFile* tmp_file;
|
|
67
|
+
s = env->NewWritableFile(tmp_name, &tmp_file);
|
|
68
|
+
if (s.ok()) {
|
|
69
|
+
s = tmp_file->Append(result);
|
|
70
|
+
delete tmp_file;
|
|
71
|
+
if (s.ok()) {
|
|
72
|
+
s = env->RenameFile(tmp_name, filename);
|
|
73
|
+
} else {
|
|
74
|
+
env->DeleteFile(tmp_name);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
delete[] scratch;
|
|
80
|
+
|
|
81
|
+
return s;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
struct FileState {
|
|
85
|
+
std::string filename_;
|
|
86
|
+
ssize_t pos_;
|
|
87
|
+
ssize_t pos_at_last_sync_;
|
|
88
|
+
ssize_t pos_at_last_flush_;
|
|
89
|
+
|
|
90
|
+
FileState(const std::string& filename)
|
|
91
|
+
: filename_(filename),
|
|
92
|
+
pos_(-1),
|
|
93
|
+
pos_at_last_sync_(-1),
|
|
94
|
+
pos_at_last_flush_(-1) { }
|
|
95
|
+
|
|
96
|
+
FileState() : pos_(-1), pos_at_last_sync_(-1), pos_at_last_flush_(-1) {}
|
|
97
|
+
|
|
98
|
+
bool IsFullySynced() const { return pos_ <= 0 || pos_ == pos_at_last_sync_; }
|
|
99
|
+
|
|
100
|
+
Status DropUnsyncedData() const;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
} // anonymous namespace
|
|
104
|
+
|
|
105
|
+
// A wrapper around WritableFile which informs another Env whenever this file
|
|
106
|
+
// is written to or sync'ed.
|
|
107
|
+
class TestWritableFile : public WritableFile {
|
|
108
|
+
public:
|
|
109
|
+
TestWritableFile(const FileState& state,
|
|
110
|
+
WritableFile* f,
|
|
111
|
+
FaultInjectionTestEnv* env);
|
|
112
|
+
virtual ~TestWritableFile();
|
|
113
|
+
virtual Status Append(const Slice& data);
|
|
114
|
+
virtual Status Close();
|
|
115
|
+
virtual Status Flush();
|
|
116
|
+
virtual Status Sync();
|
|
117
|
+
|
|
118
|
+
private:
|
|
119
|
+
FileState state_;
|
|
120
|
+
WritableFile* target_;
|
|
121
|
+
bool writable_file_opened_;
|
|
122
|
+
FaultInjectionTestEnv* env_;
|
|
123
|
+
|
|
124
|
+
Status SyncParent();
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
class FaultInjectionTestEnv : public EnvWrapper {
|
|
128
|
+
public:
|
|
129
|
+
FaultInjectionTestEnv() : EnvWrapper(Env::Default()), filesystem_active_(true) {}
|
|
130
|
+
virtual ~FaultInjectionTestEnv() { }
|
|
131
|
+
virtual Status NewWritableFile(const std::string& fname,
|
|
132
|
+
WritableFile** result);
|
|
133
|
+
virtual Status NewAppendableFile(const std::string& fname,
|
|
134
|
+
WritableFile** result);
|
|
135
|
+
virtual Status DeleteFile(const std::string& f);
|
|
136
|
+
virtual Status RenameFile(const std::string& s, const std::string& t);
|
|
137
|
+
|
|
138
|
+
void WritableFileClosed(const FileState& state);
|
|
139
|
+
Status DropUnsyncedFileData();
|
|
140
|
+
Status DeleteFilesCreatedAfterLastDirSync();
|
|
141
|
+
void DirWasSynced();
|
|
142
|
+
bool IsFileCreatedSinceLastDirSync(const std::string& filename);
|
|
143
|
+
void ResetState();
|
|
144
|
+
void UntrackFile(const std::string& f);
|
|
145
|
+
// Setting the filesystem to inactive is the test equivalent to simulating a
|
|
146
|
+
// system reset. Setting to inactive will freeze our saved filesystem state so
|
|
147
|
+
// that it will stop being recorded. It can then be reset back to the state at
|
|
148
|
+
// the time of the reset.
|
|
149
|
+
bool IsFilesystemActive() const { return filesystem_active_; }
|
|
150
|
+
void SetFilesystemActive(bool active) { filesystem_active_ = active; }
|
|
151
|
+
|
|
152
|
+
private:
|
|
153
|
+
port::Mutex mutex_;
|
|
154
|
+
std::map<std::string, FileState> db_file_state_;
|
|
155
|
+
std::set<std::string> new_files_since_last_dir_sync_;
|
|
156
|
+
bool filesystem_active_; // Record flushes, syncs, writes
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
TestWritableFile::TestWritableFile(const FileState& state,
|
|
160
|
+
WritableFile* f,
|
|
161
|
+
FaultInjectionTestEnv* env)
|
|
162
|
+
: state_(state),
|
|
163
|
+
target_(f),
|
|
164
|
+
writable_file_opened_(true),
|
|
165
|
+
env_(env) {
|
|
166
|
+
assert(f != NULL);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
TestWritableFile::~TestWritableFile() {
|
|
170
|
+
if (writable_file_opened_) {
|
|
171
|
+
Close();
|
|
172
|
+
}
|
|
173
|
+
delete target_;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
Status TestWritableFile::Append(const Slice& data) {
|
|
177
|
+
Status s = target_->Append(data);
|
|
178
|
+
if (s.ok() && env_->IsFilesystemActive()) {
|
|
179
|
+
state_.pos_ += data.size();
|
|
180
|
+
}
|
|
181
|
+
return s;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
Status TestWritableFile::Close() {
|
|
185
|
+
writable_file_opened_ = false;
|
|
186
|
+
Status s = target_->Close();
|
|
187
|
+
if (s.ok()) {
|
|
188
|
+
env_->WritableFileClosed(state_);
|
|
189
|
+
}
|
|
190
|
+
return s;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
Status TestWritableFile::Flush() {
|
|
194
|
+
Status s = target_->Flush();
|
|
195
|
+
if (s.ok() && env_->IsFilesystemActive()) {
|
|
196
|
+
state_.pos_at_last_flush_ = state_.pos_;
|
|
197
|
+
}
|
|
198
|
+
return s;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
Status TestWritableFile::SyncParent() {
|
|
202
|
+
Status s = SyncDir(GetDirName(state_.filename_));
|
|
203
|
+
if (s.ok()) {
|
|
204
|
+
env_->DirWasSynced();
|
|
205
|
+
}
|
|
206
|
+
return s;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
Status TestWritableFile::Sync() {
|
|
210
|
+
if (!env_->IsFilesystemActive()) {
|
|
211
|
+
return Status::OK();
|
|
212
|
+
}
|
|
213
|
+
// Ensure new files referred to by the manifest are in the filesystem.
|
|
214
|
+
Status s = target_->Sync();
|
|
215
|
+
if (s.ok()) {
|
|
216
|
+
state_.pos_at_last_sync_ = state_.pos_;
|
|
217
|
+
}
|
|
218
|
+
if (env_->IsFileCreatedSinceLastDirSync(state_.filename_)) {
|
|
219
|
+
Status ps = SyncParent();
|
|
220
|
+
if (s.ok() && !ps.ok()) {
|
|
221
|
+
s = ps;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return s;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
Status FaultInjectionTestEnv::NewWritableFile(const std::string& fname,
|
|
228
|
+
WritableFile** result) {
|
|
229
|
+
WritableFile* actual_writable_file;
|
|
230
|
+
Status s = target()->NewWritableFile(fname, &actual_writable_file);
|
|
231
|
+
if (s.ok()) {
|
|
232
|
+
FileState state(fname);
|
|
233
|
+
state.pos_ = 0;
|
|
234
|
+
*result = new TestWritableFile(state, actual_writable_file, this);
|
|
235
|
+
// NewWritableFile doesn't append to files, so if the same file is
|
|
236
|
+
// opened again then it will be truncated - so forget our saved
|
|
237
|
+
// state.
|
|
238
|
+
UntrackFile(fname);
|
|
239
|
+
MutexLock l(&mutex_);
|
|
240
|
+
new_files_since_last_dir_sync_.insert(fname);
|
|
241
|
+
}
|
|
242
|
+
return s;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
Status FaultInjectionTestEnv::NewAppendableFile(const std::string& fname,
|
|
246
|
+
WritableFile** result) {
|
|
247
|
+
WritableFile* actual_writable_file;
|
|
248
|
+
Status s = target()->NewAppendableFile(fname, &actual_writable_file);
|
|
249
|
+
if (s.ok()) {
|
|
250
|
+
FileState state(fname);
|
|
251
|
+
state.pos_ = 0;
|
|
252
|
+
{
|
|
253
|
+
MutexLock l(&mutex_);
|
|
254
|
+
if (db_file_state_.count(fname) == 0) {
|
|
255
|
+
new_files_since_last_dir_sync_.insert(fname);
|
|
256
|
+
} else {
|
|
257
|
+
state = db_file_state_[fname];
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
*result = new TestWritableFile(state, actual_writable_file, this);
|
|
261
|
+
}
|
|
262
|
+
return s;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
Status FaultInjectionTestEnv::DropUnsyncedFileData() {
|
|
266
|
+
Status s;
|
|
267
|
+
MutexLock l(&mutex_);
|
|
268
|
+
for (std::map<std::string, FileState>::const_iterator it =
|
|
269
|
+
db_file_state_.begin();
|
|
270
|
+
s.ok() && it != db_file_state_.end(); ++it) {
|
|
271
|
+
const FileState& state = it->second;
|
|
272
|
+
if (!state.IsFullySynced()) {
|
|
273
|
+
s = state.DropUnsyncedData();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return s;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
void FaultInjectionTestEnv::DirWasSynced() {
|
|
280
|
+
MutexLock l(&mutex_);
|
|
281
|
+
new_files_since_last_dir_sync_.clear();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
bool FaultInjectionTestEnv::IsFileCreatedSinceLastDirSync(
|
|
285
|
+
const std::string& filename) {
|
|
286
|
+
MutexLock l(&mutex_);
|
|
287
|
+
return new_files_since_last_dir_sync_.find(filename) !=
|
|
288
|
+
new_files_since_last_dir_sync_.end();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
void FaultInjectionTestEnv::UntrackFile(const std::string& f) {
|
|
292
|
+
MutexLock l(&mutex_);
|
|
293
|
+
db_file_state_.erase(f);
|
|
294
|
+
new_files_since_last_dir_sync_.erase(f);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
Status FaultInjectionTestEnv::DeleteFile(const std::string& f) {
|
|
298
|
+
Status s = EnvWrapper::DeleteFile(f);
|
|
299
|
+
ASSERT_OK(s);
|
|
300
|
+
if (s.ok()) {
|
|
301
|
+
UntrackFile(f);
|
|
302
|
+
}
|
|
303
|
+
return s;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
Status FaultInjectionTestEnv::RenameFile(const std::string& s,
|
|
307
|
+
const std::string& t) {
|
|
308
|
+
Status ret = EnvWrapper::RenameFile(s, t);
|
|
309
|
+
|
|
310
|
+
if (ret.ok()) {
|
|
311
|
+
MutexLock l(&mutex_);
|
|
312
|
+
if (db_file_state_.find(s) != db_file_state_.end()) {
|
|
313
|
+
db_file_state_[t] = db_file_state_[s];
|
|
314
|
+
db_file_state_.erase(s);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (new_files_since_last_dir_sync_.erase(s) != 0) {
|
|
318
|
+
assert(new_files_since_last_dir_sync_.find(t) ==
|
|
319
|
+
new_files_since_last_dir_sync_.end());
|
|
320
|
+
new_files_since_last_dir_sync_.insert(t);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return ret;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
void FaultInjectionTestEnv::ResetState() {
|
|
328
|
+
// Since we are not destroying the database, the existing files
|
|
329
|
+
// should keep their recorded synced/flushed state. Therefore
|
|
330
|
+
// we do not reset db_file_state_ and new_files_since_last_dir_sync_.
|
|
331
|
+
MutexLock l(&mutex_);
|
|
332
|
+
SetFilesystemActive(true);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
Status FaultInjectionTestEnv::DeleteFilesCreatedAfterLastDirSync() {
|
|
336
|
+
// Because DeleteFile access this container make a copy to avoid deadlock
|
|
337
|
+
mutex_.Lock();
|
|
338
|
+
std::set<std::string> new_files(new_files_since_last_dir_sync_.begin(),
|
|
339
|
+
new_files_since_last_dir_sync_.end());
|
|
340
|
+
mutex_.Unlock();
|
|
341
|
+
Status s;
|
|
342
|
+
std::set<std::string>::const_iterator it;
|
|
343
|
+
for (it = new_files.begin(); s.ok() && it != new_files.end(); ++it) {
|
|
344
|
+
s = DeleteFile(*it);
|
|
345
|
+
}
|
|
346
|
+
return s;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
void FaultInjectionTestEnv::WritableFileClosed(const FileState& state) {
|
|
350
|
+
MutexLock l(&mutex_);
|
|
351
|
+
db_file_state_[state.filename_] = state;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
Status FileState::DropUnsyncedData() const {
|
|
355
|
+
ssize_t sync_pos = pos_at_last_sync_ == -1 ? 0 : pos_at_last_sync_;
|
|
356
|
+
return Truncate(filename_, sync_pos);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
class FaultInjectionTest {
|
|
360
|
+
public:
|
|
361
|
+
enum ExpectedVerifResult { VAL_EXPECT_NO_ERROR, VAL_EXPECT_ERROR };
|
|
362
|
+
enum ResetMethod { RESET_DROP_UNSYNCED_DATA, RESET_DELETE_UNSYNCED_FILES };
|
|
363
|
+
|
|
364
|
+
FaultInjectionTestEnv* env_;
|
|
365
|
+
std::string dbname_;
|
|
366
|
+
Cache* tiny_cache_;
|
|
367
|
+
Options options_;
|
|
368
|
+
DB* db_;
|
|
369
|
+
|
|
370
|
+
FaultInjectionTest()
|
|
371
|
+
: env_(new FaultInjectionTestEnv),
|
|
372
|
+
tiny_cache_(NewLRUCache(100)),
|
|
373
|
+
db_(NULL) {
|
|
374
|
+
dbname_ = test::TmpDir() + "/fault_test";
|
|
375
|
+
DestroyDB(dbname_, Options()); // Destroy any db from earlier run
|
|
376
|
+
options_.reuse_logs = true;
|
|
377
|
+
options_.env = env_;
|
|
378
|
+
options_.paranoid_checks = true;
|
|
379
|
+
options_.block_cache = tiny_cache_;
|
|
380
|
+
options_.create_if_missing = true;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
~FaultInjectionTest() {
|
|
384
|
+
CloseDB();
|
|
385
|
+
DestroyDB(dbname_, Options());
|
|
386
|
+
delete tiny_cache_;
|
|
387
|
+
delete env_;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
void ReuseLogs(bool reuse) {
|
|
391
|
+
options_.reuse_logs = reuse;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
void Build(int start_idx, int num_vals) {
|
|
395
|
+
std::string key_space, value_space;
|
|
396
|
+
WriteBatch batch;
|
|
397
|
+
for (int i = start_idx; i < start_idx + num_vals; i++) {
|
|
398
|
+
Slice key = Key(i, &key_space);
|
|
399
|
+
batch.Clear();
|
|
400
|
+
batch.Put(key, Value(i, &value_space));
|
|
401
|
+
WriteOptions options;
|
|
402
|
+
ASSERT_OK(db_->Write(options, &batch));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
Status ReadValue(int i, std::string* val) const {
|
|
407
|
+
std::string key_space, value_space;
|
|
408
|
+
Slice key = Key(i, &key_space);
|
|
409
|
+
Value(i, &value_space);
|
|
410
|
+
ReadOptions options;
|
|
411
|
+
return db_->Get(options, key, val);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
Status Verify(int start_idx, int num_vals,
|
|
415
|
+
ExpectedVerifResult expected) const {
|
|
416
|
+
std::string val;
|
|
417
|
+
std::string value_space;
|
|
418
|
+
Status s;
|
|
419
|
+
for (int i = start_idx; i < start_idx + num_vals && s.ok(); i++) {
|
|
420
|
+
Value(i, &value_space);
|
|
421
|
+
s = ReadValue(i, &val);
|
|
422
|
+
if (expected == VAL_EXPECT_NO_ERROR) {
|
|
423
|
+
if (s.ok()) {
|
|
424
|
+
ASSERT_EQ(value_space, val);
|
|
425
|
+
}
|
|
426
|
+
} else if (s.ok()) {
|
|
427
|
+
fprintf(stderr, "Expected an error at %d, but was OK\n", i);
|
|
428
|
+
s = Status::IOError(dbname_, "Expected value error:");
|
|
429
|
+
} else {
|
|
430
|
+
s = Status::OK(); // An expected error
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return s;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Return the ith key
|
|
437
|
+
Slice Key(int i, std::string* storage) const {
|
|
438
|
+
char buf[100];
|
|
439
|
+
snprintf(buf, sizeof(buf), "%016d", i);
|
|
440
|
+
storage->assign(buf, strlen(buf));
|
|
441
|
+
return Slice(*storage);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Return the value to associate with the specified key
|
|
445
|
+
Slice Value(int k, std::string* storage) const {
|
|
446
|
+
Random r(k);
|
|
447
|
+
return test::RandomString(&r, kValueSize, storage);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
Status OpenDB() {
|
|
451
|
+
delete db_;
|
|
452
|
+
db_ = NULL;
|
|
453
|
+
env_->ResetState();
|
|
454
|
+
return DB::Open(options_, dbname_, &db_);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
void CloseDB() {
|
|
458
|
+
delete db_;
|
|
459
|
+
db_ = NULL;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
void DeleteAllData() {
|
|
463
|
+
Iterator* iter = db_->NewIterator(ReadOptions());
|
|
464
|
+
WriteOptions options;
|
|
465
|
+
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
|
466
|
+
ASSERT_OK(db_->Delete(WriteOptions(), iter->key()));
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
delete iter;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
void ResetDBState(ResetMethod reset_method) {
|
|
473
|
+
switch (reset_method) {
|
|
474
|
+
case RESET_DROP_UNSYNCED_DATA:
|
|
475
|
+
ASSERT_OK(env_->DropUnsyncedFileData());
|
|
476
|
+
break;
|
|
477
|
+
case RESET_DELETE_UNSYNCED_FILES:
|
|
478
|
+
ASSERT_OK(env_->DeleteFilesCreatedAfterLastDirSync());
|
|
479
|
+
break;
|
|
480
|
+
default:
|
|
481
|
+
assert(false);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
void PartialCompactTestPreFault(int num_pre_sync, int num_post_sync) {
|
|
486
|
+
DeleteAllData();
|
|
487
|
+
Build(0, num_pre_sync);
|
|
488
|
+
db_->CompactRange(NULL, NULL);
|
|
489
|
+
Build(num_pre_sync, num_post_sync);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
void PartialCompactTestReopenWithFault(ResetMethod reset_method,
|
|
493
|
+
int num_pre_sync,
|
|
494
|
+
int num_post_sync) {
|
|
495
|
+
env_->SetFilesystemActive(false);
|
|
496
|
+
CloseDB();
|
|
497
|
+
ResetDBState(reset_method);
|
|
498
|
+
ASSERT_OK(OpenDB());
|
|
499
|
+
ASSERT_OK(Verify(0, num_pre_sync, FaultInjectionTest::VAL_EXPECT_NO_ERROR));
|
|
500
|
+
ASSERT_OK(Verify(num_pre_sync, num_post_sync, FaultInjectionTest::VAL_EXPECT_ERROR));
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
void NoWriteTestPreFault() {
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
void NoWriteTestReopenWithFault(ResetMethod reset_method) {
|
|
507
|
+
CloseDB();
|
|
508
|
+
ResetDBState(reset_method);
|
|
509
|
+
ASSERT_OK(OpenDB());
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
void DoTest() {
|
|
513
|
+
Random rnd(0);
|
|
514
|
+
ASSERT_OK(OpenDB());
|
|
515
|
+
for (size_t idx = 0; idx < kNumIterations; idx++) {
|
|
516
|
+
int num_pre_sync = rnd.Uniform(kMaxNumValues);
|
|
517
|
+
int num_post_sync = rnd.Uniform(kMaxNumValues);
|
|
518
|
+
|
|
519
|
+
PartialCompactTestPreFault(num_pre_sync, num_post_sync);
|
|
520
|
+
PartialCompactTestReopenWithFault(RESET_DROP_UNSYNCED_DATA,
|
|
521
|
+
num_pre_sync,
|
|
522
|
+
num_post_sync);
|
|
523
|
+
|
|
524
|
+
NoWriteTestPreFault();
|
|
525
|
+
NoWriteTestReopenWithFault(RESET_DROP_UNSYNCED_DATA);
|
|
526
|
+
|
|
527
|
+
PartialCompactTestPreFault(num_pre_sync, num_post_sync);
|
|
528
|
+
// No new files created so we expect all values since no files will be
|
|
529
|
+
// dropped.
|
|
530
|
+
PartialCompactTestReopenWithFault(RESET_DELETE_UNSYNCED_FILES,
|
|
531
|
+
num_pre_sync + num_post_sync,
|
|
532
|
+
0);
|
|
533
|
+
|
|
534
|
+
NoWriteTestPreFault();
|
|
535
|
+
NoWriteTestReopenWithFault(RESET_DELETE_UNSYNCED_FILES);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
TEST(FaultInjectionTest, FaultTestNoLogReuse) {
|
|
541
|
+
ReuseLogs(false);
|
|
542
|
+
DoTest();
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
TEST(FaultInjectionTest, FaultTestWithLogReuse) {
|
|
546
|
+
ReuseLogs(true);
|
|
547
|
+
DoTest();
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
} // namespace leveldb
|
|
551
|
+
|
|
552
|
+
int main(int argc, char** argv) {
|
|
553
|
+
return leveldb::test::RunAllTests();
|
|
554
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
4
|
+
|
|
5
|
+
#include <ctype.h>
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include "db/filename.h"
|
|
8
|
+
#include "db/dbformat.h"
|
|
9
|
+
#include "leveldb/env.h"
|
|
10
|
+
#include "util/logging.h"
|
|
11
|
+
|
|
12
|
+
namespace leveldb {
|
|
13
|
+
|
|
14
|
+
// A utility routine: write "data" to the named file and Sync() it.
|
|
15
|
+
extern Status WriteStringToFileSync(Env* env, const Slice& data,
|
|
16
|
+
const std::string& fname);
|
|
17
|
+
|
|
18
|
+
static std::string MakeFileName(const std::string& name, uint64_t number,
|
|
19
|
+
const char* suffix) {
|
|
20
|
+
char buf[100];
|
|
21
|
+
snprintf(buf, sizeof(buf), "/%06llu.%s",
|
|
22
|
+
static_cast<unsigned long long>(number),
|
|
23
|
+
suffix);
|
|
24
|
+
return name + buf;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
std::string LogFileName(const std::string& name, uint64_t number) {
|
|
28
|
+
assert(number > 0);
|
|
29
|
+
return MakeFileName(name, number, "log");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
std::string TableFileName(const std::string& name, uint64_t number) {
|
|
33
|
+
assert(number > 0);
|
|
34
|
+
return MakeFileName(name, number, "ldb");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
std::string SSTTableFileName(const std::string& name, uint64_t number) {
|
|
38
|
+
assert(number > 0);
|
|
39
|
+
return MakeFileName(name, number, "sst");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
|
|
43
|
+
assert(number > 0);
|
|
44
|
+
char buf[100];
|
|
45
|
+
snprintf(buf, sizeof(buf), "/MANIFEST-%06llu",
|
|
46
|
+
static_cast<unsigned long long>(number));
|
|
47
|
+
return dbname + buf;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
std::string CurrentFileName(const std::string& dbname) {
|
|
51
|
+
return dbname + "/CURRENT";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
std::string LockFileName(const std::string& dbname) {
|
|
55
|
+
return dbname + "/LOCK";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
std::string TempFileName(const std::string& dbname, uint64_t number) {
|
|
59
|
+
assert(number > 0);
|
|
60
|
+
return MakeFileName(dbname, number, "dbtmp");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
std::string InfoLogFileName(const std::string& dbname) {
|
|
64
|
+
return dbname + "/LOG";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Return the name of the old info log file for "dbname".
|
|
68
|
+
std::string OldInfoLogFileName(const std::string& dbname) {
|
|
69
|
+
return dbname + "/LOG.old";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
// Owned filenames have the form:
|
|
74
|
+
// dbname/CURRENT
|
|
75
|
+
// dbname/LOCK
|
|
76
|
+
// dbname/LOG
|
|
77
|
+
// dbname/LOG.old
|
|
78
|
+
// dbname/MANIFEST-[0-9]+
|
|
79
|
+
// dbname/[0-9]+.(log|sst|ldb)
|
|
80
|
+
bool ParseFileName(const std::string& fname,
|
|
81
|
+
uint64_t* number,
|
|
82
|
+
FileType* type) {
|
|
83
|
+
Slice rest(fname);
|
|
84
|
+
if (rest == "CURRENT") {
|
|
85
|
+
*number = 0;
|
|
86
|
+
*type = kCurrentFile;
|
|
87
|
+
} else if (rest == "LOCK") {
|
|
88
|
+
*number = 0;
|
|
89
|
+
*type = kDBLockFile;
|
|
90
|
+
} else if (rest == "LOG" || rest == "LOG.old") {
|
|
91
|
+
*number = 0;
|
|
92
|
+
*type = kInfoLogFile;
|
|
93
|
+
} else if (rest.starts_with("MANIFEST-")) {
|
|
94
|
+
rest.remove_prefix(strlen("MANIFEST-"));
|
|
95
|
+
uint64_t num;
|
|
96
|
+
if (!ConsumeDecimalNumber(&rest, &num)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (!rest.empty()) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
*type = kDescriptorFile;
|
|
103
|
+
*number = num;
|
|
104
|
+
} else {
|
|
105
|
+
// Avoid strtoull() to keep filename format independent of the
|
|
106
|
+
// current locale
|
|
107
|
+
uint64_t num;
|
|
108
|
+
if (!ConsumeDecimalNumber(&rest, &num)) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
Slice suffix = rest;
|
|
112
|
+
if (suffix == Slice(".log")) {
|
|
113
|
+
*type = kLogFile;
|
|
114
|
+
} else if (suffix == Slice(".sst") || suffix == Slice(".ldb")) {
|
|
115
|
+
*type = kTableFile;
|
|
116
|
+
} else if (suffix == Slice(".dbtmp")) {
|
|
117
|
+
*type = kTempFile;
|
|
118
|
+
} else {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
*number = num;
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
Status SetCurrentFile(Env* env, const std::string& dbname,
|
|
127
|
+
uint64_t descriptor_number) {
|
|
128
|
+
// Remove leading "dbname/" and add newline to manifest file name
|
|
129
|
+
std::string manifest = DescriptorFileName(dbname, descriptor_number);
|
|
130
|
+
Slice contents = manifest;
|
|
131
|
+
assert(contents.starts_with(dbname + "/"));
|
|
132
|
+
contents.remove_prefix(dbname.size() + 1);
|
|
133
|
+
std::string tmp = TempFileName(dbname, descriptor_number);
|
|
134
|
+
Status s = WriteStringToFileSync(env, contents.ToString() + "\n", tmp);
|
|
135
|
+
if (s.ok()) {
|
|
136
|
+
s = env->RenameFile(tmp, CurrentFileName(dbname));
|
|
137
|
+
}
|
|
138
|
+
if (!s.ok()) {
|
|
139
|
+
env->DeleteFile(tmp);
|
|
140
|
+
}
|
|
141
|
+
return s;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
} // namespace leveldb
|