For how many years have you been working
with physical servers that are starving your database of the memory
necessary to deploy important new performance features such as the Result
Cache, Memoptimize Pool, In-Memory Aggregation, In-Memory Column Store, and
Full Database Caching? Too long? Contact me to learn how to improve all
queries ... not just some queries.

Purpose

Private types and constants tore providers must conform to. The SPI is not a client-side API and serves as a private contract between the implementation of the DBFS API and various stores that wish to be pluggable into it.

The DBFS API defines client-visible behavior (normal and exceptional) of various store operations, while allowing different stores to implement as rich a set of features as they choose.
The API allows stores to self-describe their capabilities and allows intelligent client applications to tune their behavior based on these capabilities (rather than hard-code logic specific to stores identified by name or by implementation).

The SPI has 2 space usage methods: "spaceUsage()" and "spaceUsageFull()". The difference between the two is that the latter function should implement a "bulk" API
---i.e. the ability to query and aggregate space usage information for all stores specified as the "propvalue" fields of the "store_names" property list (the other fields of the property list can be ignored).
If the SPI does not support the "bulk" aggregation API, the DBFS API will itself do the necessary iteration and aggregation, however, at the risk of inaccurate data due to potential double-counting.

dbms_dbfs_content_spi.createDirectory(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
prop_flags IN INTEGER,
recurse IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

dbms_dbfs_content_spi.createFile(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
content IN OUT NOCOPY BLOB,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

Providers that are willing/able to create a fastpath lookup view (whose structure conforms to the schema of "dbms_fuse.dir_entry_t")
should define "createGetattrView()" and "dropGetattrView()" methods, and create/drop the underlying view as needed.

dbms_dbfs_content_spi.createLink(
store_name IN VARCHAR2,
srcPath IN VARCHAR2,
dstPath IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

dbms_dbfs_content_spi.createReference(
store_name IN VARCHAR2,
srcPath IN VARCHAR2,
dstPath IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

dbms_dbfs_content_spi.getPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
content OUT NOCOPY BLOB,
item_type OUT INTEGER,
prop_flags IN INTEGER,
forUpdate IN INTEGER,
deref IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

TBD

Overload 2

dbms_dbfs_content_spi.getPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
amount IN OUT NUMBER,
offset IN NUMBER,
buffer OUT NOCOPY RAW,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

TBD

Overload 3

dbms_dbfs_content_spi.getPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
amount IN OUT NUMBER,
offset IN NUMBER,
buffers OUT NOCOPY dbms_dbfs_content_RAW_t,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

dbms_dbfs_content_spi.getPathNoWait(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
content OUT NOCOPY BLOB,
item_type OUT INTEGER,
prop_flags IN INTEGER,
deref IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

dbms_dbfs_content_spi.putPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
content IN OUT NOCOPY BLOB,
item_type OUT INTEGER,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

TBD

Overload 2

dbms_dbfs_content_spi.putPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
amount IN NUMBER,
offset IN NUMBER,
buffer IN RAW,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

TBD

Overload 3

dbms_dbfs_content_spi.putPath(
store_name IN VARCHAR2,
path IN VARCHAR2,
properties IN OUT NOCOPY dbms_dbfs_content_properties_t,
written OUT NUMBER,
offset IN NUMBER,
buffers IN dbms_dbfs_content_RAW_t,
prop_flags IN INTEGER,
ctx IN dbms_dbfs_content_context_t);

Clients can query filesystem space usage statistics via the"spaceUsage()" method. Store providers, IN turn, are expected to support at least the "spaceUsage()" method for their stores
(and to make a best effort determination of space usagem esp. if the store consists of multiple segments scattered across multiple tablespaces/datafiles/disk-groups, etc.).

Overload 1

dbms_dbfs_content_spi.spaceUsage(
store_name IN VARCHAR2,
blksize OUT INTEGER,
tbytes OUT INTEGER,
fbytes OUT INTEGER,
nfile OUT INTEGER,
ndir OUT INTEGER,
nlink OUT INTEGER,
nref OUT INTEGER);

TBD

Overload 2

dbms_dbfs_content_spi.spaceUsage(
store_name IN VARCHAR2,
blksize OUT INTEGER,
tbytes OUT INTEGER,
fbytes OUT INTEGER,
nfile OUT INTEGER,
ndir OUT INTEGER,
nlink OUT INTEGER,
nref OUT INTEGER,
useEstimate IN INTEGER);

Similar to SpaceUsage this proc should implement a "bulk" API, i.e. the ability to query and aggregate space usage information for all stores specified as the "propvalue"
fields of the "store_names" property list (the other fields of the property list can be ignored).

Overload 1

dbms_dbfs_content_spi.spaceUsageFull(
store_names IN dbms_dbfs_content_properties_t,
blksize OUT INTEGER,
tbytes OUT INTEGER,
fbytes OUT INTEGER,
nfile OUT INTEGER,
ndir OUT INTEGER,
nlink OUT INTEGER,
nref OUT INTEGER);

TBD

Overload 2

dbms_dbfs_content_spi.spaceUsageFull(
store_names IN dbms_dbfs_content_properties_t,
blksize OUT INTEGER,
tbytes OUT INTEGER,
fbytes OUT INTEGER,
nfile OUT INTEGER,
ndir OUT INTEGER,
nlink OUT INTEGER,
nref OUT INTEGER,
useEstimate IN INTEGER);