本节提供有关
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 值是否为 NULLgetPos()获取当前读/写位置 getState()获取 NdbBlob对象的状态getValue()准备读取 blob 值 getVersion()检查 blob 是基于语句还是基于事件 readData()从 blob 中读取数据 setActiveHook()定义 blob 句柄激活的回调 setNull()将 blob 设置为 NULLsetPos()设置开始读/写的位置 setValue()准备插入或更新 blob 值 truncate()将 blob 截断为给定长度 writeData()写入 blob 数据 getBlobTableName()并且getBlobEventName()是静态方法。大多数
NdbBlob方法(几乎所有返回类型为 的方法int) 都会0在成功和-1失败时返回。 - 类型
-
定义的公共类型
NdbBlob如下所示:
Blob 数据存储。 Blob 数据存储在 2 个位置:
标头和内联字节存储在 blob 列中。
blob 的数据段存储在名为 的单独表中 ,其中是表 ID, 是 blob 列 ID。
NDB$BLOB_tid_cidtidcid
可以在创建表时使用适当的
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 的字节长度。对于
NULLblob,此方法返回0. 要区分长度为0blob 和 长度为 的 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关于失败。