2.3.13 NdbBlob 类

本节提供有关 NdbBlob类的信息,该类模拟 blob 列的句柄并提供对 blob 列值的读写访问。这个对象有许多不同的状态,并提供了几种访问 blob 数据的模式;这些也在本节中描述。

NdbBlob 类概述

家长班

没有任何

儿童班

没有任何

描述

此类没有公共构造函数。的实例 是 在操作准备阶段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() 获取指向创建时NdbOperationNdbBlob对象所属的操作(对象)的指针。
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如下所示:

表 2.34 NdbBlob 类型和描述

姓名 描述
ActiveHook() 回调NdbBlob::setActiveHook()
State() 表示 可能采用的状态 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 数据段表不是自动创建的。

NdbBlob::ActiveHook

ActiveHook 是定义为用作 setActiveHook()方法回调的数据类型。(参见 NdbBlob::setActiveHook()。)

定义。  ActiveHook是定义如下所示的自定义数据类型:

typedef int ActiveHook
    (
      NdbBlob* me,
      void*    arg
    )

描述

这是 , 的回调 NdbBlob::setActiveHook(),并在准备好的操作执行(但未提交)后立即调用。getValue()首先执行对或 的任何调用 setValue()。blob 句柄处于活动状态,因此 readData()writeData()用于操作 blob 值。用户定义的参数与 NdbBlob. setActiveHook() 在发生错误时返回一个非零值。

NdbBlob::blobsFirstBlob()

描述

此方法初始化属于当前操作的 blob 列表,并返回列表中的第一个 blob。

签名
NdbBlob* blobsFirstBlob
    (
      void
    )
参数

没有

返回值

指向所需 blob 的指针。

NdbBlob::blobsNextBlob()

描述

使用该方法获取使用初始化的 blob 列表中的下一个blobsFirstBlob()。请参阅NdbBlob::blobsFirstBlob()

签名
NdbBlob* blobsNextBlob
    (
      void
    )
参数

没有

返回值

指向所需 blob 的指针。

NdbBlob::关闭()

描述

在提交或中止事务之前关闭 blob 句柄,同时释放内部资源。换句话说,这表明应用程序已完成从给定 blob 的读取。只有当 blob StateActive.

签名
int close
    (
      bool execPendingBlobOps = true
    )
参数

此方法有一个布尔参数 execPendingBlobOps。如果此参数的值true(默认值),则在关闭 blob 句柄之前刷新所有挂起的 blob 操作。如果execPendingBlobOpsfalse,则假定 blob 句柄没有要刷新的待处理读取或写入操作。

返回值

0 成功。

读取操作和锁定。  当使用 LM_ReadLM_Exclusive作为 对LockMode读取操作创建 Blob 句柄时,只有关闭在此操作上创建的所有 Blob 句柄后才能解锁读取操作。

当使用锁定模式读取包含 blob 的行时 LM_CommittedRead,该模式会自动升级到LM_Read以确保一致性。在这种情况下,当该行的所有 blob 句柄都已关闭时,该行的解锁操作将通过调用该close()方法自动执行,这会向该 blob 添加一个挂起的写操作。调用 后释放升级的锁 execute()

NdbBlob::getBlobEventName()

描述

此方法获取 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关于失败。

NdbBlob::getBlobTableName()

描述

该方法获取blob数据段表名。

此方法通常仅用于测试和调试目的。

签名
static int getBlobTableName
    (
      char*       name,
      Ndb*        ndb,
      const char* table,
      const char* column
    )
参数

此方法采用此处列出的四个参数:

  • name: blob 数据段表的名称。

  • ndb: 相关 Ndb对象。

  • table:主表的名称。

  • column: blob 列。

返回值

0成功 返回,-1失败返回。

NdbBlob::getColumn()

描述

使用此方法获取 NdbBlob所属的 blob 列。

签名
const Column* getColumn
    (
      void
    )
参数

没有

返回值

一个Column对象。

NdbBlob::getLength()

描述

此方法获取 blob 的当前长度(以字节为单位)。

签名
int getLength
    (
      Uint64& length
    )
参数

参考长度。

返回值

blob 的字节长度。对于 NULLblob,此方法返回 0. 要区分长度为0blob 和 长度为 的 blob NULL,请使用 getNull()方法。

NdbBlob::getNull()

描述

此方法检查 blob 的值是否为 NULL.

签名
int getNull
    (
      int& isNull
    )
参数

对整数的引用isNull。调用后,此参数具有以下值之一,解释如下:

  • -1: blob 未定义。如果这是非事件 blob,则此结果会导致状态错误。

  • 0: blob 具有非空值。

  • 1: blob 的值为 NULL

返回值

没有

NdbBlob::getNdbError()

描述

使用此方法获取错误对象。该错误可能是特定于 blob 的,也可能是从失败的隐式操作中复制的。错误代码被复制回操作,除非操作已经有一个非零错误代码。

签名
const NdbError& getNdbError
    (
      void
    ) const
参数

没有任何。

返回值

一个NdbError对象。

NdbBlob::getNdbOperation()

描述

此方法可用于查找与此句柄NdbBlob相关联的操作。

签名
const NdbOperation* getNdbOperation
    (
      void
    ) const
参数

没有

返回值

指向操作的指针。

此方法返回的指针所引用的操作可以用 NdbOperationNdbScanOperation对象表示。

有关更多信息,请参阅第 2.3.20 节,“NdbOperation 类”第 2.3.24 节,“NdbScanOperation 类”

NdbBlob::getPos()

描述

此方法获取 blob 中的当前读/写位置。

签名
int getPos
    (
      Uint64& pos
    )
参数

一个参数,对位置的引用。

返回值

返回0成功或 -1失败。(在成功调用之后,pos将保留 blob 中的当前读/写位置,作为从头开始的字节数。)

NdbBlob::getState()

描述

NdbBlob此方法获取调用它 的对象的当前状态 。NdbBlob::State中描述了可能的状态 。

签名
State getState
    (
      void
    )
参数

没有任何。

返回值

类型的值 State

NdbBlob::getValue()

描述

使用此方法准备读取一个 blob 值;该值在调用后可用。用于 getNull()检查 NULL值;用于 getLength()获取 blob 的实际长度,并检查截断。 getValue()将当前读/写位置设置为读取数据末尾之后的点。

签名
int getValue
    (
      void*  data,
      Uint32 bytes
    )
参数

这个方法有两个参数。其中第一个是指向data要读取的指针;第二个是bytes 要阅读的数量。

返回值

0关于成功,-1关于失败。

NdbBlob::getVersion()

描述

此方法用于区分 blob 操作是基于语句还是基于事件。

签名
void getVersion
    (
      int& version
    )
参数

此方法采用单个参数,即对 blob 版本(操作类型)的整数引用。

返回值

以下三个值之一:

  • -1:这是一个普通 (基于语句的)blob。

  • 0:这是一个基于事件操作的 blob,在其数据发生变化后。

  • 1:这是一个基于事件操作的 blob,在其数据发生任何更改之前。

getVersion()总是成功的,假设它被调用为 的有效实例的方法NdbBlob

NdbBlob::readData()

描述

此方法用于从 blob 中读取数据。

签名
int readData
    (
      void*     data,
      Uint32&  bytes
    )
参数

readData()接受一个指向 data要读取的指针,以及一个对bytes读取次数的引用。

返回值

0成功 返回,-1失败返回。调用成功后,data指向读取的数据,并bytes 保存读取的字节数。

NdbBlob::setActiveHook()

描述

此方法定义 blob 句柄激活的回调。到目前为止,准备好的操作队列将以无提交模式执行;然后,调用回调。有关其他信息,请参阅 NdbBlob::ActiveHook

签名
int setActiveHook
    (
      ActiveHook*  activeHook,
      void*        arg
    )
参数

此方法需要此处列出的两个参数:

  • 指向 ActiveHook.

  • 指向 的指针void,用于传递给回调的任何数据。

返回值

0关于成功,-1关于失败。

NdbBlob::setNull()

描述

此方法将 blob 的值设置为 NULL

签名
int setNull
    (
      void
    )
参数

没有

返回值

0成功时;-1失败时。

NdbBlob::setPos()

描述

此方法设置 blob 中读取或写入数据的位置。

签名
int setPos
    (
      Uint64 pos
    )
参数

setPos() 方法采用单个参数 pos(无符号 64 位整数),即读取或写入数据的位置。的值pos必须介于 0和 blob 的当前长度之间。

重要的

NDB API 不支持稀疏” blob;换句话说,blob 中不能有未使用的数据位置。

返回值

0关于成功,-1关于失败。

NdbBlob::setValue()

描述

此方法用于准备插入或更新 blob 值。任何比新数据长的现有 blob 数据都将被截断。在操作执行之前,数据缓冲区必须保持有效。 setValue()将当前读/写位置设置为数据末尾之后的点。您可以设置data为空指针 ( 0) 以创建 NULL值。

签名
int setValue
    (
      const void*  data,
      Uint32       bytes
    )
参数

此方法采用此处列出的两个参数:

  • data要插入或用于覆盖 blob 值的 。

  • 的数量( bytes即长度)data

返回值

0关于成功,-1关于失败。

NdbBlob::状态

这是一种枚举数据类型,表示NdbBlob实例的可能状态。

描述

一个NdbBlob可以假设这些状态中的任何一个

枚举值

下表显示了可能的值以及说明:

表 2.35 NdbBlob::State 类型值和描述

姓名 描述
Idle NdbBlob尚未准备好用于任何操作。
Prepared 这是NdbBlob操作执行之前的状态。
Active 这是 blob 句柄在执行或获取下一个结果之后但在提交事务之前的状态。
Closed 此状态发生在事务已提交之后。
Invalid 这是在回滚或事务关闭之后进行的。

NdbBlob::截断()

描述

此方法用于将 blob 截断为给定长度。

签名
int truncate
    (
      Uint64 length = 0
    )
参数

truncate()采用单个参数,该参数指定length要将 blob 截断到的新值。length如果大于 blob 的当前长度(您可以使用 进行检查 ),则此方法无效 getLength()

返回值

0关于成功,-1关于失败。

NdbBlob::writeData()

描述

此方法用于将数据写入 NdbBlob. 成功调用后,读/写位置将位于写入 blob 的数据之后的第一个字节。

超过 blob 数据当前末尾的写入会自动扩展 blob。

签名
int writeData
    (
      const void*  data,
      Uint32       bytes
    )
参数

该方法有两个参数,一个指向 data要写入的指针和要写入的编号bytes

返回值

0关于成功,-1关于失败。