本节提供有关
NdbBlob
类的信息,该类模拟 blob 列的句柄并提供对 blob 列值的读写访问。这个对象有许多不同的状态,并提供了几种访问 blob 数据的模式;这些也在本节中描述。
- 家长班
没有任何
- 儿童班
没有任何
- 描述
此类没有公共构造函数。的实例 是 在操作准备阶段
NdbBlob
使用该方法创建的 。NdbOperation::getBlobHandle()
(请参阅 第 2.3.20 节,“NdbOperation 类”。)此对象充当 blob 列的句柄。- 方法
-
下表列出了该类的公共方法以及每个方法的用途或用途:
表 2.33 NdbBlob 类方法和描述
姓名 描述 blobsFirstBlob()
获取列表中的第一个 blob。 blobsNextBlob()
获取列表中的下一个 blob close()
在提交或中止之前释放内部资源 getBlobEventName()
获取 blob 事件名称 getBlobTableName()
获取 blob 数据段的表名。 getColumn()
获取一个 blob 列。 getLength()
获取 blob 的长度,以字节为单位 getNdbError()
获取错误(一个 NdbError
对象)getNdbOperation()
获取指向创建时 NdbOperation
此NdbBlob
对象所属的操作(对象)的指针。getNull()
检查 blob 值是否为 NULL
getPos()
获取当前读/写位置 getState()
获取 NdbBlob
对象的状态getValue()
准备读取 blob 值 getVersion()
检查 blob 是基于语句还是基于事件 readData()
从 blob 中读取数据 setActiveHook()
定义 blob 句柄激活的回调 setNull()
将 blob 设置为 NULL
setPos()
设置开始读/写的位置 setValue()
准备插入或更新 blob 值 truncate()
将 blob 截断为给定长度 writeData()
写入 blob 数据 getBlobTableName()
并且getBlobEventName()
是静态方法。大多数
NdbBlob
方法(几乎所有返回类型为 的方法int
) 都会0
在成功和-1
失败时返回。 - 类型
-
定义的公共类型
NdbBlob
如下所示:
Blob 数据存储。 Blob 数据存储在 2 个位置:
标头和内联字节存储在 blob 列中。
blob 的数据段存储在名为 的单独表中 ,其中是表 ID, 是 blob 列 ID。
NDB$BLOB_
tid
_cid
tid
cid
可以在创建表时使用适当的
Column
方法设置内联和数据段大小。有关这些方法的更多信息,
请参见第 2.3.1 节“列类” 。
数据访问类型。
NdbBlob
支持 3 种数据访问类型:这些数据访问类型可以组合应用,前提是它们按上面给出的顺序使用。
在准备阶段,
NdbBlob
方法getValue()
和setValue()
用于准备读取或写入已知大小的 blob 值。同样在准备阶段,
setActiveHook()
用于定义一旦句柄激活就会调用的例程。在活动阶段,
readData()
用于writeData()
读取和写入具有任意大小的 blob 值。
斑点操作。
Blob 操作在执行下一个事务时生效。在某些情况下,NdbBlob
被迫执行隐式执行。为避免这种情况,您应该始终对完整的 blob 数据段进行操作。
用于
NdbTransaction::executePendingBlobOps()
刷新读取和写入,如果没有未决操作,这可以避免任何执行惩罚。在执行操作之后或在下一个扫描结果之后,这不是必需的。
NdbBlob
还支持从事件中读取 blob 后或 pre-blob 数据。在检索到主表上的下一个事件后,可以读取句柄。数据立即可用。(有关更多信息,请参阅第 2.3.16 节,“NdbEventOperation 类”。)
Blob 和 NdbOperations。
NdbOperation
作用于
NdbBlob
对象的方法具有以下特点:
NdbOperation::insertTuple()
NdbBlob::setValue()
如果 blob 属性 不可为空,则 必须使用。-
NdbOperation::readTuple()
与任何锁定模式一起使用可以读取但不能写入 blob 值。当
LM_CommittedRead
锁定模式与 一起使用时readTuple()
,锁定模式会自动升级为LM_Read
每当访问 blob 属性时。 NdbOperation::updateTuple()
可以使用 覆盖现有值NdbBlob::setValue()
,或在活动阶段更新它。NdbOperation::writeTuple()
始终覆盖 blob 值,并且必须NdbBlob::setValue()
在 blob 属性不可为空时使用。NdbOperation::deleteTuple()
创建隐式的、不可访问的 blob 句柄。-
具有任何锁定模式的扫描都可以使用其 blob 句柄来读取 blob 值但不能写入它们。
使用
LM_Exclusive
锁定模式的扫描可以使用更新行和 blob 值updateCurrentTuple()
;返回的操作必须显式创建自己的 blob 句柄。使用
LM_Exclusive
锁定模式的扫描可以删除行值(因此也删除 blob 值)deleteCurrentTuple()
;这会创建隐式不可访问的 blob 句柄。 返回的操作
lockCurrentTuple()
无法更新 blob 值。
已知的问题。 NdbBlob
以下是使用对象
时遇到的已知问题或限制:
过多的挂起 blob 操作可能会溢出 I/O 缓冲区。
该表及其 blob 数据段表不是自动创建的。
ActiveHook 是定义为用作
setActiveHook()
方法回调的数据类型。(参见
NdbBlob::setActiveHook()。)
定义。
ActiveHook
是定义如下所示的自定义数据类型:
typedef int ActiveHook
(
NdbBlob* me,
void* arg
)
- 描述
这是 , 的回调
NdbBlob::setActiveHook()
,并在准备好的操作执行(但未提交)后立即调用。getValue()
首先执行对或 的任何调用setValue()
。blob 句柄处于活动状态,因此readData()
可writeData()
用于操作 blob 值。用户定义的参数与NdbBlob
.setActiveHook()
在发生错误时返回一个非零值。
- 描述
此方法初始化属于当前操作的 blob 列表,并返回列表中的第一个 blob。
- 签名
NdbBlob* blobsFirstBlob ( void )
- 参数
没有。
- 返回值
指向所需 blob 的指针。
- 描述
使用该方法获取使用初始化的 blob 列表中的下一个
blobsFirstBlob()
。请参阅NdbBlob::blobsFirstBlob()。- 签名
NdbBlob* blobsNextBlob ( void )
- 参数
没有。
- 返回值
指向所需 blob 的指针。
- 描述
在提交或中止事务之前关闭 blob 句柄,同时释放内部资源。换句话说,这表明应用程序已完成从给定 blob 的读取。只有当 blob
State
为Active
.- 签名
int close ( bool execPendingBlobOps = true )
- 参数
此方法有一个布尔参数
execPendingBlobOps
。如果此参数的值true
(默认值),则在关闭 blob 句柄之前刷新所有挂起的 blob 操作。如果execPendingBlobOps
是false
,则假定 blob 句柄没有要刷新的待处理读取或写入操作。- 返回值
0 成功。
读取操作和锁定。
当使用
LM_Read
或LM_Exclusive
作为 对LockMode
读取操作创建 Blob 句柄时,只有关闭在此操作上创建的所有 Blob 句柄后才能解锁读取操作。
当使用锁定模式读取包含 blob 的行时
LM_CommittedRead
,该模式会自动升级到LM_Read
以确保一致性。在这种情况下,当该行的所有 blob 句柄都已关闭时,该行的解锁操作将通过调用该close()
方法自动执行,这会向该 blob 添加一个挂起的写操作。调用 后释放升级的锁
execute()
。
- 描述
此方法获取 blob 事件名称。如果主事件监视 blob 列,则会创建 blob 事件。该名称包括主要事件名称。
- 签名
static int getBlobEventName ( char* name, Ndb* ndb, const char* event, const char* column )
- 参数
-
此方法采用此处列出的四个参数:
name
:blob 事件的名称。ndb
: 相关Ndb
对象。event
:主要事件的名称。column
: blob 列。
- 返回值
0
关于成功,-1
关于失败。
- 描述
-
该方法获取blob数据段表名。
此方法通常仅用于测试和调试目的。
- 签名
static int getBlobTableName ( char* name, Ndb* ndb, const char* table, const char* column )
- 参数
-
此方法采用此处列出的四个参数:
name
: blob 数据段表的名称。ndb
: 相关Ndb
对象。table
:主表的名称。column
: blob 列。
- 返回值
0
成功 返回,-1
失败返回。
- 描述
此方法获取 blob 的当前长度(以字节为单位)。
- 签名
int getLength ( Uint64& length )
- 参数
参考长度。
- 返回值
blob 的字节长度。对于
NULL
blob,此方法返回0
. 要区分长度为0
blob 和 长度为 的 blobNULL
,请使用getNull()
方法。
- 描述
此方法检查 blob 的值是否为
NULL
.- 签名
int getNull ( int& isNull )
- 参数
-
对整数的引用
isNull
。调用后,此参数具有以下值之一,解释如下:-1
: blob 未定义。如果这是非事件 blob,则此结果会导致状态错误。0
: blob 具有非空值。1
: blob 的值为NULL
。
- 返回值
没有。
- 描述
使用此方法获取错误对象。该错误可能是特定于 blob 的,也可能是从失败的隐式操作中复制的。错误代码被复制回操作,除非操作已经有一个非零错误代码。
- 签名
const NdbError& getNdbError ( void ) const
- 参数
没有任何。
- 返回值
一个
NdbError
对象。
- 描述
此方法可用于查找与此句柄
NdbBlob
相关联的操作。- 签名
const NdbOperation* getNdbOperation ( void ) const
- 参数
没有。
- 返回值
-
指向操作的指针。
此方法返回的指针所引用的操作可以用
NdbOperation
或NdbScanOperation
对象表示。有关更多信息,请参阅第 2.3.20 节,“NdbOperation 类”和 第 2.3.24 节,“NdbScanOperation 类”。
- 描述
此方法获取 blob 中的当前读/写位置。
- 签名
int getPos ( Uint64& pos )
- 参数
一个参数,对位置的引用。
- 返回值
返回
0
成功或-1
失败。(在成功调用之后,pos
将保留 blob 中的当前读/写位置,作为从头开始的字节数。)
- 描述
NdbBlob
此方法获取调用它 的对象的当前状态 。NdbBlob::State中描述了可能的状态 。- 签名
State getState ( void )
- 参数
没有任何。
- 返回值
类型的值
State
。
- 描述
使用此方法准备读取一个 blob 值;该值在调用后可用。用于
getNull()
检查NULL
值;用于getLength()
获取 blob 的实际长度,并检查截断。getValue()
将当前读/写位置设置为读取数据末尾之后的点。- 签名
int getValue ( void* data, Uint32 bytes )
- 参数
这个方法有两个参数。其中第一个是指向
data
要读取的指针;第二个是bytes
要阅读的数量。- 返回值
0
关于成功,-1
关于失败。
- 描述
此方法用于区分 blob 操作是基于语句还是基于事件。
- 签名
void getVersion ( int& version )
- 参数
此方法采用单个参数,即对 blob 版本(操作类型)的整数引用。
- 返回值
-
以下三个值之一:
-1
:这是一个“普通” (基于语句的)blob。0
:这是一个基于事件操作的 blob,在其数据发生变化后。1
:这是一个基于事件操作的 blob,在其数据发生任何更改之前。
getVersion()
总是成功的,假设它被调用为 的有效实例的方法NdbBlob
。
- 描述
此方法用于从 blob 中读取数据。
- 签名
int readData ( void* data, Uint32& bytes )
- 参数
readData()
接受一个指向data
要读取的指针,以及一个对bytes
读取次数的引用。- 返回值
0
成功 返回,-1
失败返回。调用成功后,data
指向读取的数据,并bytes
保存读取的字节数。
- 描述
此方法定义 blob 句柄激活的回调。到目前为止,准备好的操作队列将以无提交模式执行;然后,调用回调。有关其他信息,请参阅 NdbBlob::ActiveHook。
- 签名
int setActiveHook ( ActiveHook* activeHook, void* arg )
- 参数
-
此方法需要此处列出的两个参数:
指向
ActiveHook
.指向 的指针
void
,用于传递给回调的任何数据。
- 返回值
0
关于成功,-1
关于失败。
- 描述
此方法设置 blob 中读取或写入数据的位置。
- 签名
int setPos ( Uint64 pos )
- 参数
setPos() 方法采用单个参数
pos
(无符号 64 位整数),即读取或写入数据的位置。的值pos
必须介于0
和 blob 的当前长度之间。
NDB API 不支持“稀疏” blob;换句话说,blob 中不能有未使用的数据位置。
- 返回值
0
关于成功,-1
关于失败。
- 描述
此方法用于准备插入或更新 blob 值。任何比新数据长的现有 blob 数据都将被截断。在操作执行之前,数据缓冲区必须保持有效。
setValue()
将当前读/写位置设置为数据末尾之后的点。您可以设置data
为空指针 (0
) 以创建NULL
值。- 签名
int setValue ( const void* data, Uint32 bytes )
- 参数
-
此方法采用此处列出的两个参数:
data
要插入或用于覆盖 blob 值的 。的数量(
bytes
即长度)data
。
- 返回值
0
关于成功,-1
关于失败。
- 描述
此方法用于将 blob 截断为给定长度。
- 签名
int truncate ( Uint64 length = 0 )
- 参数
truncate()
采用单个参数,该参数指定length
要将 blob 截断到的新值。length
如果大于 blob 的当前长度(您可以使用 进行检查 ),则此方法无效getLength()
。- 返回值
0
关于成功,-1
关于失败。
- 描述
-
此方法用于将数据写入
NdbBlob
. 成功调用后,读/写位置将位于写入 blob 的数据之后的第一个字节。超过 blob 数据当前末尾的写入会自动扩展 blob。
- 签名
int writeData ( const void* data, Uint32 bytes )
- 参数
该方法有两个参数,一个指向
data
要写入的指针和要写入的编号bytes
。- 返回值
0
关于成功,-1
关于失败。