diff --git a/mdbx/mdbx.go b/mdbx/mdbx.go index b8c8a9b..6d7e27e 100644 --- a/mdbx/mdbx.go +++ b/mdbx/mdbx.go @@ -172,3 +172,20 @@ CGO_CFLAGS="${CGO_CFLAGS} -DMDBX_DEBUG=1 -DMDBX_FORCE_ASSERTIONS=1 -v" go run ./ func Version() string { return C.GoString(C.mdbx_version.git.describe) } + +func GetSysRamInfo() (pageSize, totalPages, availablePages int, err error) { + var cPageSize, cTotalPages, cAvailablePages C.intptr_t + + // Вызываем C-функцию, передавая туда указатели на тип C.intptr_t + ret := C.mdbx_get_sysraminfo(&cPageSize, &cTotalPages, &cAvailablePages) + if ret != success { + return 0, 0, 0, operrno("mdbx_cursor_count", ret) + } + + // Преобразуем результаты обратно в Go int + pageSize = int(cPageSize) + totalPages = int(cTotalPages) + availablePages = int(cAvailablePages) + + return +} diff --git a/mdbx/mdbx_test.go b/mdbx/mdbx_test.go index 2f0e6b9..8152bf9 100644 --- a/mdbx/mdbx_test.go +++ b/mdbx/mdbx_test.go @@ -219,3 +219,59 @@ func TestTest1(t *testing.T) { // t.Error("empty version string") // } //} + +func TestGetSysRamInfo(t *testing.T) { + env, err1 := NewEnv(Default) + if err1 != nil { + t.Fatalf("Cannot create environment: %s", err1) + } + err1 = env.SetGeometry(-1, -1, 1024*1024, -1, -1, 4096) + if err1 != nil { + t.Fatalf("Cannot set mapsize: %s", err1) + } + path := t.TempDir() + err1 = env.Open(path, 0, 0664) + defer env.Close() + if err1 != nil { + t.Fatalf("Cannot open environment: %s", err1) + } + + var db DBI + if err := env.Update(func(txn *Txn) (err error) { + db, err = txn.OpenRoot(0) + if err != nil { + panic(err) + } + + err = txn.Put(db, nil, []byte{}, NoOverwrite) + if err != nil { + panic(err) + } + err = txn.Put(db, []byte{}, []byte{}, NoOverwrite) + if err == nil { //expect err: MDBX_KEYEXIST + panic(err) + } + err = txn.Put(db, []byte{1}, []byte{}, NoOverwrite) + if err != nil { + panic(err) + } + err = txn.Put(db, []byte{2}, nil, NoOverwrite) + if err != nil { + panic(err) + } + err = txn.Put(db, []byte{3}, []byte{1}, NoOverwrite) + if err != nil { + panic(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + pageSize, totalPages, availablePages, err := GetSysRamInfo() + if err != nil { + t.Fatal(err) + } + + println(pageSize, totalPages, availablePages) //no asserts because it's (at least avP) pretty random TODO: think about how to avoid it +}