From ef6f07e5a063348065df412daf7b0dfa11705c68 Mon Sep 17 00:00:00 2001 From: Zoviet Date: Sat, 6 Dec 2025 01:42:49 +0400 Subject: [PATCH] init --- Makefile | 3 + README.md | 26 ++++++++- install.sh | 17 ++++++ mdbx | Bin 0 -> 17088 bytes mdbx.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 Makefile create mode 100755 install.sh create mode 100755 mdbx create mode 100644 mdbx.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a58340a --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +all: mdbx +mdbx: mdbx.c + gcc mdbx.c -I /usr/include/libmdbx -L /usr/include/libmdbx -Wl,-R/usr/include/libmdbx -lmdbx -lm -o mdbx diff --git a/README.md b/README.md index 7e852e8..981826c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,25 @@ -# libmdbx +# Простой консольный клиент для libmdbx -Консольный клиент для libmbdx \ No newline at end of file +Libmdbx (https://libmdbx.dqdkfa.ru/) - встраиваемая БД типа ключ-значение российской разработки, продолжающая традиции Tokyo Cabinet и подобных. + + +Base and simple libmbdx cli frontent: + +- Support put, del and get +- Commit changes +- Not support interactive mode +- Not support DUPKEYS + +# Usage + +``` +mdbx [db_path...] [--help] [--del] [--put] [--get] [--info] [--del] + +``` + +Options: + +--put key value +--del key +--get key +--info - database info diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..3bfc373 --- /dev/null +++ b/install.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +MDBX_VERSION="0.11.13" + +set -ex + +DIRNAME="/usr/include/libmdbx" + +if [ -e $DIRNAME ]; then + rm -rf $DIRNAME +fi + +mkdir -p $DIRNAME +wget -P $DIRNAME https://libmdbx.dqdkfa.ru/release/libmdbx-amalgamated-${MDBX_VERSION}.tar.gz +cd /usr/include/libmdbx +tar xvzf libmdbx-amalgamated-${MDBX_VERSION}.tar.gz +make lib diff --git a/mdbx b/mdbx new file mode 100755 index 0000000000000000000000000000000000000000..b066f01677039751f5d7bb4f4459b22e6050b055 GIT binary patch literal 17088 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. + * Copyright 2017 Ilya Shipitsin . + * Copyright 2012-2015 Howard Chu, Symas Corp. + * Copyright 2024 Zoviet, asustem.ru. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#include "mdbx.h" +#include +#include +#include +#include +#include + +void help(void) { + printf("Usage: mdbx [db_path...] [--help] [--del] [--put] [--get] [--info] [--del]\n Options:\n--put key value :put key-value pair\n--del key :delete key\n--get key :get key\n--info :db info\n"); +} + +int main(int argc, char **argv) { + + int rc; + MDBX_env *env = NULL; + MDBX_dbi dbi = 0; + MDBX_val key, data; + MDBX_txn *txn = NULL; + MDBX_cursor *cursor = NULL; + char sval[32]; + +#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul + const double scale_factor = 1099511627776.0; + const char *const scale_unit = "TiB"; +#else + const double scale_factor = 1073741824.0; + const char *const scale_unit = "GiB"; +#endif + const size_t pagesize_min = mdbx_limits_pgsize_min(); + const size_t pagesize_max = mdbx_limits_pgsize_max(); + const size_t pagesize_default = mdbx_default_pagesize(); + + if(argc <= 1 || !strcmp(argv[1], "--help")) { + help(); + return 0; + } + + rc = mdbx_env_create(&env); + if (rc != MDBX_SUCCESS) { + fprintf(stderr, "mdbx_env_create: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + + rc = mdbx_env_open(env, argv[1], MDBX_NOSUBDIR | MDBX_COALESCE | MDBX_LIFORECLAIM, 0664); + if (rc != MDBX_SUCCESS) { + fprintf(stderr, "mdbx_env_open: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + + rc = mdbx_txn_begin(env, NULL, 0, &txn); + if (rc != MDBX_SUCCESS) { + fprintf(stderr, "mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + + rc = mdbx_dbi_open(txn, NULL, 0, &dbi); + if (rc != MDBX_SUCCESS) { + fprintf(stderr, "mdbx_dbi_open: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + + if(!strcmp(argv[2], "--put")) { + if(argc <= 4) { + printf("'--put' operation requires two parameters: key and value.\n"); + return 0; + } + key.iov_len = sizeof(argv[3]); + key.iov_base = argv[3]; + data.iov_len = sizeof(char) * (strlen(argv[4]) + 1); + data.iov_base = argv[4]; + rc = mdbx_put(txn, dbi, &key, &data, 0); + if (rc != MDBX_SUCCESS) { + fprintf(stderr, "mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + rc = mdbx_txn_commit(txn); + if (rc) { + fprintf(stderr, "mdbx_txn_commit: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + goto bailout; + } else if (!strcmp(argv[2], "--get")) { + if(argc <= 3) { + printf("'--get' operation requires key.\n"); + return 0; + } + key.iov_len = sizeof(argv[3]); + key.iov_base = argv[3]; + MDBX_val v = {0}; + rc = mdbx_get(txn, dbi, &key, &v); + if (rc != MDBX_SUCCESS) { + if (rc == MDBX_NOTFOUND) { + printf("Key '%s' not found", argv[3]); + goto bailout; + } + fprintf(stderr, "mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + printf("%s", (char *) v.iov_base); + goto bailout; + } else if (!strcmp(argv[2], "--del")) { + if(argc <= 3) { + printf("'--del' operation requires key.\n"); + return 0; + } + key.iov_len = sizeof(argv[3]); + key.iov_base = argv[3]; + rc = mdbx_del(txn, dbi, &key, NULL); + if (rc != MDBX_SUCCESS) { + if (rc == MDBX_EINVAL) { + printf("Key '%s' not found", argv[3]); + goto bailout; + } + fprintf(stderr, "mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + rc = mdbx_txn_commit(txn); + if (rc) { + fprintf(stderr, "mdbx_txn_commit: (%d) %s\n", rc, mdbx_strerror(rc)); + goto bailout; + } + goto bailout; + } else if (!strcmp(argv[2], "--info")) { + printf("\tWrite transaction size: up to %zu (0x%zX) pages (%f %s for default " + "%zuK pagesize, %f %s for %zuK pagesize).\n", + mdbx_limits_txnsize_max(pagesize_min) / pagesize_min, + mdbx_limits_txnsize_max(pagesize_min) / pagesize_min, + mdbx_limits_txnsize_max(-1) / scale_factor, scale_unit, + pagesize_default / 1024, + mdbx_limits_txnsize_max(pagesize_max) / scale_factor, scale_unit, + pagesize_max / 1024); + printf("\tDatabase size: up to %zu pages (%f %s for default %zuK " + "pagesize, %f %s for %zuK pagesize).\n", + mdbx_limits_dbsize_max(pagesize_min) / pagesize_min, + mdbx_limits_dbsize_max(-1) / scale_factor, scale_unit, + pagesize_default / 1024, + mdbx_limits_dbsize_max(pagesize_max) / scale_factor, scale_unit, + pagesize_max / 1024); + } else { + printf("Unknown parameter: '%s'. Type %s --help for help.\n", argv[2], argv[0]); + } + bailout: + if (cursor) + mdbx_cursor_close(cursor); + if (txn) + mdbx_txn_abort(txn); + if (dbi) + mdbx_dbi_close(env, dbi); + if (env) + mdbx_env_close(env); + return (rc != MDBX_SUCCESS) ? EXIT_FAILURE : EXIT_SUCCESS; + }