File: binary.go

package info (click to toggle)
golang-mongodb-mongo-driver 1.17.1%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 25,988 kB
  • sloc: perl: 533; ansic: 491; python: 432; sh: 327; makefile: 174
file content (63 lines) | stat: -rw-r--r-- 1,595 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright (C) MongoDB, Inc. 2017-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

//go:build cse
// +build cse

package mongocrypt

/*
#include <stdlib.h>
#include <mongocrypt.h>
*/
import "C"
import (
	"unsafe"
)

// binary is a wrapper type around a mongocrypt_binary_t*
type binary struct {
	p       *C.uint8_t
	wrapped *C.mongocrypt_binary_t
}

// newBinary creates an empty binary instance.
func newBinary() *binary {
	return &binary{
		wrapped: C.mongocrypt_binary_new(),
	}
}

// newBinaryFromBytes creates a binary instance from a byte buffer.
func newBinaryFromBytes(data []byte) *binary {
	if len(data) == 0 {
		return newBinary()
	}

	// TODO: Consider using runtime.Pinner to replace the C.CBytes after using go1.21.0.
	addr := (*C.uint8_t)(C.CBytes(data)) // uint8_t*
	dataLen := C.uint32_t(len(data))     // uint32_t
	return &binary{
		p:       addr,
		wrapped: C.mongocrypt_binary_new_from_data(addr, dataLen),
	}
}

// toBytes converts the given binary instance to []byte.
func (b *binary) toBytes() []byte {
	dataPtr := C.mongocrypt_binary_data(b.wrapped) // C.uint8_t*
	dataLen := C.mongocrypt_binary_len(b.wrapped)  // C.uint32_t

	return C.GoBytes(unsafe.Pointer(dataPtr), C.int(dataLen))
}

// close cleans up any resources associated with the given binary instance.
func (b *binary) close() {
	if b.p != nil {
		C.free(unsafe.Pointer(b.p))
	}
	C.mongocrypt_binary_destroy(b.wrapped)
}