blob: 2438ec89011a3671d6801017589a4fd5525000b5 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package opendal
import (
"context"
"unsafe"
"github.com/jupiterrider/ffi"
)
// Info returns metadata about the Operator.
//
// This method provides access to essential information about the Operator,
// including its storage scheme, root path, name, and capabilities.
//
// Returns:
// - *OperatorInfo: A pointer to an OperatorInfo struct containing the Operator's metadata.
func (op *Operator) Info() *OperatorInfo {
inner := ffiOperatorInfoNew.symbol(op.ctx)(op.inner)
defer ffiOperatorInfoFree.symbol(op.ctx)(inner)
return &OperatorInfo{
scheme: ffiOperatorInfoGetScheme.symbol(op.ctx)(inner),
root: ffiOperatorInfoGetRoot.symbol(op.ctx)(inner),
name: ffiOperatorInfoGetName.symbol(op.ctx)(inner),
fullCap: &Capability{inner: ffiOperatorInfoGetFullCapability.symbol(op.ctx)(inner)},
nativeCap: &Capability{inner: ffiOperatorInfoGetNativeCapability.symbol(op.ctx)(inner)},
}
}
// OperatorInfo provides metadata about an Operator instance.
//
// This struct contains essential information about the storage backend
// and its capabilities, allowing users to query details about the
// Operator they are working with.
type OperatorInfo struct {
scheme string
root string
name string
fullCap *Capability
nativeCap *Capability
}
func (i *OperatorInfo) GetFullCapability() *Capability {
return i.fullCap
}
func (i *OperatorInfo) GetNativeCapability() *Capability {
return i.nativeCap
}
func (i *OperatorInfo) GetScheme() string {
return i.scheme
}
func (i *OperatorInfo) GetRoot() string {
return i.root
}
func (i *OperatorInfo) GetName() string {
return i.name
}
// Capability represents the set of operations and features supported by an Operator.
//
// Each field indicates the support level for a specific capability:
// - bool fields: false indicates no support, true indicates support.
// - uint fields: Represent size limits or thresholds for certain operations.
//
// This struct covers a wide range of capabilities including:
// - Basic operations: stat, read, write, delete, copy, rename, list
// - Advanced features: multipart uploads, presigned URLs, batch operations
// - Operation modifiers: cache control, content type, if-match conditions
//
// The capability information helps in understanding the functionalities
// available for a specific storage backend or Operator configuration.
type Capability struct {
inner *opendalCapability
}
func (c *Capability) Stat() bool {
return c.inner.stat == 1
}
func (c *Capability) StatWithIfmatch() bool {
return c.inner.statWithIfmatch == 1
}
func (c *Capability) StatWithIfNoneMatch() bool {
return c.inner.statWithIfNoneMatch == 1
}
func (c *Capability) Read() bool {
return c.inner.read == 1
}
func (c *Capability) ReadWithIfmatch() bool {
return c.inner.readWithIfmatch == 1
}
func (c *Capability) ReadWithIfMatchNone() bool {
return c.inner.readWithIfMatchNone == 1
}
func (c *Capability) ReadWithOverrideCacheControl() bool {
return c.inner.readWithOverrideCacheControl == 1
}
func (c *Capability) ReadWithOverrideContentDisposition() bool {
return c.inner.readWithOverrideContentDisposition == 1
}
func (c *Capability) ReadWithOverrideContentType() bool {
return c.inner.readWithOverrideContentType == 1
}
func (c *Capability) Write() bool {
return c.inner.write == 1
}
func (c *Capability) WriteCanMulti() bool {
return c.inner.writeCanMulti == 1
}
func (c *Capability) WriteCanEmpty() bool {
return c.inner.writeCanEmpty == 1
}
func (c *Capability) WriteCanAppend() bool {
return c.inner.writeCanAppend == 1
}
func (c *Capability) WriteWithContentType() bool {
return c.inner.writeWithContentType == 1
}
func (c *Capability) WriteWithContentDisposition() bool {
return c.inner.writeWithContentDisposition == 1
}
func (c *Capability) WriteWithCacheControl() bool {
return c.inner.writeWithCacheControl == 1
}
func (c *Capability) WriteMultiMaxSize() uint {
return c.inner.writeMultiMaxSize
}
func (c *Capability) WriteMultiMinSize() uint {
return c.inner.writeMultiMinSize
}
func (c *Capability) WriteTotalMaxSize() uint {
return c.inner.writeTotalMaxSize
}
func (c *Capability) CreateDir() bool {
return c.inner.createDir == 1
}
func (c *Capability) Delete() bool {
return c.inner.delete == 1
}
func (c *Capability) Copy() bool {
return c.inner.copy == 1
}
func (c *Capability) Rename() bool {
return c.inner.rename == 1
}
func (c *Capability) List() bool {
return c.inner.list == 1
}
func (c *Capability) ListWithLimit() bool {
return c.inner.listWithLimit == 1
}
func (c *Capability) ListWithStartAfter() bool {
return c.inner.listWithStartAfter == 1
}
func (c *Capability) ListWithRecursive() bool {
return c.inner.listWithRecursive == 1
}
func (c *Capability) Presign() bool {
return c.inner.presign == 1
}
func (c *Capability) PresignRead() bool {
return c.inner.presignRead == 1
}
func (c *Capability) PresignStat() bool {
return c.inner.presignStat == 1
}
func (c *Capability) PresignWrite() bool {
return c.inner.presignWrite == 1
}
func (c *Capability) PresignDelete() bool {
return c.inner.presignDelete == 1
}
func (c *Capability) Shared() bool {
return c.inner.shared == 1
}
func (c *Capability) Blocking() bool {
return c.inner.blocking == 1
}
var ffiOperatorInfoNew = newFFI(ffiOpts{
sym: "opendal_operator_info_new",
rType: &ffi.TypePointer,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(op *opendalOperator) *opendalOperatorInfo {
return func(op *opendalOperator) *opendalOperatorInfo {
var result *opendalOperatorInfo
ffiCall(
unsafe.Pointer(&result),
unsafe.Pointer(&op),
)
return result
}
})
var ffiOperatorInfoFree = newFFI(ffiOpts{
sym: "opendal_operator_info_free",
rType: &ffi.TypeVoid,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(_ context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) {
return func(info *opendalOperatorInfo) {
ffiCall(
nil,
unsafe.Pointer(&info),
)
}
})
var ffiOperatorInfoGetFullCapability = newFFI(ffiOpts{
sym: "opendal_operator_info_get_full_capability",
rType: &typeCapability,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) *opendalCapability {
return func(info *opendalOperatorInfo) *opendalCapability {
var cap opendalCapability
ffiCall(
unsafe.Pointer(&cap),
unsafe.Pointer(&info),
)
return &cap
}
})
var ffiOperatorInfoGetNativeCapability = newFFI(ffiOpts{
sym: "opendal_operator_info_get_native_capability",
rType: &typeCapability,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) *opendalCapability {
return func(info *opendalOperatorInfo) *opendalCapability {
var cap opendalCapability
ffiCall(
unsafe.Pointer(&cap),
unsafe.Pointer(&info),
)
return &cap
}
})
var ffiOperatorInfoGetScheme = newFFI(ffiOpts{
sym: "opendal_operator_info_get_scheme",
rType: &ffi.TypePointer,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) string {
return func(info *opendalOperatorInfo) string {
var bytePtr *byte
ffiCall(
unsafe.Pointer(&bytePtr),
unsafe.Pointer(&info),
)
return BytePtrToString(bytePtr)
}
})
var ffiOperatorInfoGetRoot = newFFI(ffiOpts{
sym: "opendal_operator_info_get_root",
rType: &ffi.TypePointer,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) string {
return func(info *opendalOperatorInfo) string {
var bytePtr *byte
ffiCall(
unsafe.Pointer(&bytePtr),
unsafe.Pointer(&info),
)
return BytePtrToString(bytePtr)
}
})
var ffiOperatorInfoGetName = newFFI(ffiOpts{
sym: "opendal_operator_info_get_name",
rType: &ffi.TypePointer,
aTypes: []*ffi.Type{&ffi.TypePointer},
}, func(ctx context.Context, ffiCall ffiCall) func(info *opendalOperatorInfo) string {
return func(info *opendalOperatorInfo) string {
var bytePtr *byte
ffiCall(
unsafe.Pointer(&bytePtr),
unsafe.Pointer(&info),
)
return BytePtrToString(bytePtr)
}
})