文档首页
MySQL NDB Cluster API 开发者指南
相关文档 下载本手册
PDF (US Letter) - 3.6Mb
PDF (A4) - 3.6Mb


2.3.20 NdbOperation 类

本节提供有关 NdbOperation 类的信息。

从 NDB 8.0.30 开始,NdbOperation 支持一种类似于 NdbInterpretedCode 实现的解释代码 API。有关更多信息,请参阅 NdbOperation 解释代码 API

NdbOperation 类概述

父类

子类

NdbIndexOperationNdbScanOperation

描述

NdbOperation 表示“通用”数据操作。它的子类表示更具体类型的操作。有关操作类型及其对应 NdbOperation 子类的列表,请参阅 NdbOperation::Type

方法

下表列出了此类的公共方法以及每个方法的用途。

表 2.49 NdbOperation 类方法和描述

名称 描述
add_reg() 添加并存储两个寄存器的内容
branch_col_and_mask_eq_mask() 如果列值 AND 位掩码等于位掩码,则分支
branch_col_and_mask_ne_mask() 如果列值 AND 位掩码不等于位掩码,则分支
branch_col_and_mask_eq_zero() 如果列值 AND 位掩码等于零,则分支
branch_col_and_mask_ne_zero() 如果列值 AND 位掩码不等于零,则分支
branch_col_eq() 如果列等于指定值,则分支
branch_col_eq_null() 如果列为 NULL,则分支
branch_col_ge() 如果列大于或等于指定值,则分支
branch_col_gt() 如果列大于指定值,则分支
branch_col_le() 如果列小于或等于指定值,则分支
branch_col_like() 如果列值匹配通配符模式,则分支
branch_col_lt() 如果列小于指定值,则分支
branch_col_ne() 如果列不等于指定值,则分支
branch_col_ne_null() 如果列不为 NULL,则分支
branch_col_notlike() 如果列值不匹配通配符模式,则分支
branch_eq() 如果第一个寄存器值等于第二个寄存器值,则分支
branch_eq_null() 如果寄存器值为 null,则分支
branch_ge() 如果第一个寄存器值大于或等于第二个寄存器值,则分支
branch_gt() 如果第一个寄存器值大于第二个寄存器值,则分支
branch_label() 跳转到解释程序中的标签
branch_le() 如果第一个寄存器值小于第二个寄存器值,则分支
branch_lt() 如果第一个寄存器值小于或等于第二个寄存器值,则分支
branch_ne() 如果第一个寄存器值不等于第二个寄存器值,则分支
branch_ne_null() 如果寄存器值不为 null,则分支
call_sub() 调用解释程序子例程
def_label() 在解释程序操作中定义跳转标签
def_subroutine() 定义解释程序子例程
deleteTuple() 从表中删除元组
equal() 使用相等定义搜索条件
getBlobHandle() 用于访问 blob 属性
getLockHandle() 获取操作的锁句柄
getLockMode() 获取操作的锁模式
getNdbError() 获取最新的错误
getNdbErrorLine() 获取发生最新错误的方法的编号
getTableName() 获取用于此操作的表的名称
getTable() 获取用于此操作的表对象
getNdbTransaction() 获取此操作的 NdbTransaction 对象
getType() 获取操作类型
getValue() 分配一个属性值持有器以供以后访问
incValue() 向属性添加值
insertTuple() 向表中添加一个新元组
interpret_exit_last_row() 终止事务
interpret_exit_nok() 以状态 NOT OK 退出解释程序
interpret_exit_ok() 以状态 OK 退出解释程序
interpretedDeleteTuple() 使用解释程序删除元组
interpretedUpdateTuple() 使用解释程序更新元组
interpretedWriteTuple() 使用解释程序写入元组
load_const_u32() 将 32 位常量值加载到寄存器中
load_const_u64() 将 64 位常量值加载到寄存器中
load_const_null() NULL 加载到寄存器中
read_attr() 将给定属性读取到寄存器中
readTuple() 从表中读取元组
ret_sub() 从解释程序子例程返回
setValue() 定义要设置或更新的属性
sub_reg() 存储两个寄存器值的差
subValue() 从属性中减去值
updateTuple() 更新表中现有的元组
write_attr() 从寄存器写入给定属性
writeTuple() 插入或更新元组

此类没有公共构造函数。要创建 NdbOperation 的实例,必须使用 NdbTransaction::getNdbOperation()

类型

NdbOperation 类定义了三种公共类型,如下表所示

表 2.50 NdbOperation 类类型和描述

名称 描述
AbortOption 确定失败的操作是否会导致其所属事务失败
LockMode 执行读取操作时使用的锁类型
类型 操作访问类型

有关使用 NdbOperation 的更多信息,请参阅第 1.4.2.3.2 节“单行操作”

NdbOperation 解释代码 API

NDB 8.0.30 及更高版本中的 NdbOperation 支持与 NdbInterpretedCode 一起使用的解释代码 API。

首先,使用 updateTuple()writeTuple()deleteTuple() 之一来将操作定义为给定类型(更新、写入或删除)的操作。这是由解释程序执行的操作;解释程序本身是由各种寄存器、比较和分支指令组成的。

解释程序不是单独的 NdbInterpretedCode 对象,尽管它的行为非常相似。指令被分配给 NdbOperation 实例(例如,myNdbOp->branch_col_lt(col1id, val1, col2id, val2))。要运行解释程序,请调用 NdbTransaction::execute()

NdbOperation 解释代码 API 实现与 NdbInterpretedCode 支持的实现之间的另一个区别是,类似方法的参数顺序不一定相同。下面列出了一对这样的方法

**分支列方法比较。** 分支列方法(例如 branch_col_le())将提供的值与列的值进行比较。这些方法从右到左作用于前两个参数,因此,例如,branch_col_le(myColId, myValue, 8, true, myLabel) 的作用如下面的伪代码所示

if(myValue <= value(myColId))
  goto myLabel;

**按位逻辑比较。** 这些比较类型仅适用于位字段类型,可用于测试位字段列与位模式。传入的值是一个位掩码,它与列数据进行按位与运算。位字段作为 32 位字传入和传出 NDB API,位从最低有效位 (LSB) 设置到最高有效位 (MSB)。平台的字节序控制哪个字节包含 LSB:对于 x86,这是第一个(第 0 个)字节;对于 SPARC 和 PPC 平台,它是最后一个(第 3 个)字节。

您可以像这样从 Uint32* 掩码中将位掩码的位 n 设置为 1

mask[n >> 5] |= (1 << (n & 31))

这里列出的方法支持四种不同的按位比较分支

有关更多信息,请参阅各个方法的描述。

NdbOperation::AbortOption

本节提供有关 AbortOption 数据类型的信息。

描述

此类型用于确定失败的操作是否应强制中止事务。它用作 execute() 方法的参数,有关更多信息,请参阅 NdbTransaction::execute()

枚举值

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

表 2.51 NdbOperation::AbortOption 类型值和描述

名称 描述
AbortOnError 失败的操作会导致事务中止。
AO_IgnoreOnError 忽略失败的操作;事务继续执行。
DefaultAbortOption AbortOption 值根据操作类型设置
  • 读取操作:AO_IgnoreOnError

  • 扫描接管或 DML 操作:AbortOnError


有关更多信息,请参阅 NdbTransaction::execute()

NdbOperation::add_reg()

描述

将两个寄存器的内容相加;将结果存储在第三个寄存器中。

签名
int add_reg
    (
      Uint32 RegSource1, 
      Uint32 RegSource2, 
      Uint32 RegDest
    )
参数
RegSource1

包含要添加的第一个值的寄存器。

RegSource2

包含要添加的第二个值的寄存器。

RegDest

用于存储结果的寄存器。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_eq_null()

描述

如果指定的列为 NULL,则分支到解释程序中的标签。

签名
int branch_col_eq_null
    (
      Uint32 ColId, 
      Uint32 Label
    )
参数
ColId

要检查的列的 ID。

parLabelam

如果列为 NULL,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_ne_null()

描述

如果指定的列不为 NULL,则分支到解释程序中的标签。

签名
int branch_col_ne_null
    (
      Uint32 ColId, 
      Uint32 Label
    )
参数
ColId

要检查的列的 ID。

parLabelam

如果列不为 NULL,则跳转到的标签。

返回值

NdbOperation::branch_col_eq()

描述

如果给定值等于指定列的值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_eg() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_eq
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 val 等于列值,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_ne()

描述

如果给定值不等于指定列的值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_ne() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_ne
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果列值不等于 val,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_lt()

描述

如果给定值小于列值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_lt() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_lt
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 val 小于列值,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_le()

描述

如果给定值小于或等于列值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_le() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_le
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 val 小于或等于列值,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_gt()

描述

如果给定值大于列值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_gt() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_gt
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 val 大于列值,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_ge()

描述

如果给定值大于或等于列值,则分支到解释程序中的标签。

注意

与其他 NdbOperation::branch_col_*() 方法一样,branch_col_ge() 将其第二个参数与其第一个参数进行比较,按此顺序。

签名
int branch_col_ge
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较的列的 ID。

val

要比较的值。

len

val 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 val 大于或等于列值,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_like()

描述

如果列值匹配通配符模式,则分支。此方法和 branch_col_notlike() 都支持 MySQL LIKE 运算符使用的通配符:% 表示任何 0 个或多个字符的字符串,_ 表示任何单个字符。

列的类型必须是 CHARVARCHARBINARYVARBINARY 之一。

签名
int branch_col_like
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较其值的列的 ID。

val

要匹配的模式。

len

模式值的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果列值匹配模式,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_notlike()

描述

如果列值与给定的通配符模式不匹配,则分支。此方法和 branch_col_like() 都支持与 MySQL LIKE 运算符相同的通配符 %(0 个或多个字符)和 _(任何一个字符)。

列的类型必须是 CHARVARCHARBINARYVARBINARY 之一。

签名
int branch_col_notlike
    (
      Uint32 ColId, 
      const void* val, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

要比较其值的列的 ID。

val

要匹配的模式。

len

模式值的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果列值与模式不匹配,则跳转到的标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_and_mask_eq_mask()

描述

如果列值与位掩码进行逻辑按位 AND 运算的结果等于位掩码,则分支。

另请参阅 按位逻辑比较

签名
int branch_col_and_mask_eq_mask
    (
      Uint32 ColId, 
      const void* mask, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

使用具有此 ID 的列的值。

mask

要与列值进行比较的位掩码。

len

mask 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 AND 操作的结果与掩码相同,则分支跳转到该位置。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_and_mask_ne_mask()

描述

如果逻辑按位 AND 中的列值与位掩码不相等,则分支。

另请参阅 按位逻辑比较

签名
int branch_col_and_mask_ne_mask
    (
      Uint32 ColId, 
      const void* mask, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

使用具有此 ID 的列的值。

mask

要与列值进行比较的位掩码。

len

mask 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 AND 操作的结果不等于掩码,则分支跳转到该位置。

返回值

成功返回 0,否则返回 -1。

NdbOperation::branch_col_and_mask_eq_zero()

描述

如果逻辑按位 AND 中的列值与位掩码相等且等于 0,则分支。

另请参阅 按位逻辑比较

签名
int branch_col_and_mask_eq_zero
    (
      Uint32 ColId, 
      const void* mask, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

使用具有此 ID 的列的值。

mask

要与列值进行比较的位掩码。

len

mask 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 AND 操作的结果等于 0,则分支跳转到该位置。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_col_and_mask_ne_zero()

描述

如果逻辑按位 AND 中的列值与位掩码不相等且不等于 0,则分支。

另请参阅 按位逻辑比较

签名
int branch_col_and_mask_ne_zero
    (
      Uint32 ColId, 
      const void* mask, 
      Uint32 len,
      bool,
      Uint32 Label
    )
参数
ColId

使用具有此 ID 的列的值。

mask

要与列值进行比较的位掩码。

len

mask 的长度。

-

出于遗留原因,需要布尔值 truefalse,但不再使用。

Label

如果 AND 操作的结果不等于 0,则分支跳转到该位置。

返回值

成功返回 0,否则返回 -1。

NdbOperation::branch_ge()

描述

在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值大于等于左值,则分支到标签。

注意

此方法与其他 NdbOperation 分支比较方法一样,从右到左比较两个寄存器值。

签名
int branch_ge
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

RegRvalue 进行比较的寄存器值。

RegRvalue

将此寄存器的值与 RegLvalue 进行比较;如果此值大于等于 RegLvalue,则分支到标签。

Label

如果 RegRvalue 大于等于 RegLvalue,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_gt()

描述

在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值大于左值,则分支到标签。

注意

此方法与其他 NdbOperation 分支比较方法一样,从右到左比较两个寄存器值。

签名
int branch_gt
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

RegRvalue 进行比较的寄存器值。

RegRvalue

将此寄存器的值与 RegLvalue 进行比较;如果此值大于 RegLvalue,则分支到标签。

Label

如果 RegRvalue 大于 RegLvalue,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_le()

描述

在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值小于左值,则分支到标签。

注意

此方法与其他 NdbOperation 分支比较方法一样,从右到左比较两个寄存器值。

签名
int branch_le
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

RegRvalue 进行比较的寄存器值。

RegRvalue

将此寄存器的值与 RegLvalue 进行比较;如果此值小于 RegLvalue,则分支到标签。

Label

如果 RegRvalue 小于 RegLvalue,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_lt()

描述

在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值小于等于左值,则分支到标签。

注意

此方法与其他 NdbOperation 分支比较方法一样,从右到左比较两个寄存器值。

签名
int branch_lt
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

RegRvalue 进行比较的寄存器值。

RegRvalue

将此寄存器的值与 RegLvalue 进行比较;如果此值小于等于 RegLvalue,则分支到标签。

Label

如果 RegRvalue 小于等于 RegLvalue,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_eq()

描述

当两个寄存器值相等时,分支到解释程序中的标签。

签名
int branch_eq
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

要比较的两个寄存器值之一。

RegRvalue

要比较的另一个寄存器值。

Label

如果寄存器值相等,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_ne()

描述

当两个寄存器值不相等时,分支到解释程序中的标签。

签名
int branch_eq
    (
      Uint32 RegLvalue, 
      Uint32 RegRvalue, 
      Uint32 Label
    )
参数
RegLvalue

要比较的两个寄存器值之一。

RegRvalue

要比较的另一个寄存器值。

Label

如果寄存器值不相等,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_ne_null()

描述

如果寄存器值不为 NULL,则分支到解释程序中的标签。

签名
int branch_ne_null
    (
      Uint32 RegLvalue, 
      Uint32 Label
    )
参数
RegLvalue

要测试的寄存器。

Label

如果 RegLvalue 不为 NULL,则分支到此标签。

返回值

成功返回 0,否则返回 -1。

NdbOperation::branch_eq_null()

描述

如果寄存器值为 NULL,则分支到解释程序中的标签。

签名
int branch_ne_null
    (
      Uint32 RegLvalue, 
      Uint32 Label
    )
参数
RegLvalue

要测试的寄存器。

Label

如果 RegLvalueNULL,则分支到此标签。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::branch_label()

描述

跳转到解释程序中的标签。

签名
int branch_label
    (
      Uint32 Label
    )
参数
Label

要分支到的标签。

返回值

如果成功,则返回 0;否则返回 -1。

NdbOperation::call_sub()

描述

调用解释程序中的子例程。

签名
int call_sub
    (
      Uint32 Subroutine
    )
参数
子例程

子例程编号。

返回值

如果成功,则返回 0;否则返回 -1。

NdbOperation::def_label()

描述

在解释操作中定义跳转标签。标签从 0 开始自动编号。

签名
int def_label
    (
      int labelNumber
    )
参数
labelNumber

标签号。为了便于调试,这应该与 NDB 执行的自动编号相匹配。

返回值

成功返回 labelNumber,否则返回 -1。

NdbOperation::def_subroutine()

描述

在解释程序中定义子例程。

签名
int def_subroutine
    (
      int SubroutineNumber
    )
参数
SubroutineNumber

子例程编号。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::deleteTuple()

描述

此方法将 NdbOperation 定义为 DELETE 操作。调用 NdbTransaction::execute() 方法时,该操作将从表中删除元组。

签名
virtual int deleteTuple
    (
      void
    )
参数

.

返回值

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

NdbOperation::equal()

描述

此方法定义具有相等性的搜索条件。如果属性具有给定值,则条件为真。要设置多个属性的搜索条件,请多次调用 equal();在这种情况下,必须满足所有条件才能选择元组。

如果属性是固定大小的,则其值必须包含所有字节。特别是,Char 值必须使用本地空间填充。如果属性是可变大小的,则其值必须以 1 或 2 个小端长度字节开头(如果其类型为 Long*,则为 2 个)。

使用 insertTuple() 时,您也可以使用 setValue() 定义搜索键。请参阅 NdbOperation::setValue()

签名

equal() 有 10 个版本,每个版本的参数略有不同。所有这些都显示在这里

int  equal
    (
      const char* name,
      const char* value
    )

int  equal
    (
      const char* name,
      Int32       value
    )

int  equal
    (
      const char* name,
      Uint32      value
    )

int  equal
    (
      const char* name,
      Int64       value
    )

int  equal
    (
      const char* name,
      Uint64      value
    )

int  equal
    (
      Uint32      id,
      const char* value
    )

int  equal
    (
      Uint32 id,
      Int32  value
    )

int  equal
    (
      Uint32 id,
      Uint32 value
    )

int  equal
    (
      Uint32 id,
      Int64  value
    )

int  equal
    (
      Uint32 id,
      Uint64 value
    )
参数

此方法需要两个参数

  • 第一个参数可以是以下任意一个

    1. 属性的 name(字符串)

    2. 属性的 id(无符号 32 位整数)

  • 第二个参数是要测试的属性 value。此值可以是以下 5 种类型中的任何一种

    • 字符串

    • 32 位整数

    • 无符号 32 位整数

    • 64 位整数

    • 无符号 64 位整数

返回值

如果发生错误,则返回 -1

NdbOperation::getBlobHandle()

描述

此方法用于代替 getValue()setValue() 用于 blob 属性。它创建一个 blob 句柄(NdbBlob 对象)。使用相同参数的第二次调用将返回先前创建的句柄。该句柄链接到操作并自动维护。

签名

此方法有两种形式,具体取决于它是使用 blob 属性的名称还是 ID 调用的

virtual NdbBlob* getBlobHandle
    (
      const char* name
    )

virtual NdbBlob* getBlobHandle
    (
      Uint32 id
    )
参数

此方法采用单个参数,该参数可以是以下任意一个

  • 属性的 name

  • 属性的 id

返回值

无论使用哪种参数类型,此方法都返回指向 NdbBlob 实例的指针。

NdbOperation::getLockHandle

描述

返回指向当前操作的锁句柄的指针。与 NdbRecord 一起使用时,必须首先使用 OO_LOCKHANDLE 操作选项请求锁句柄。对于其他操作,此方法可以单独使用。在任何情况下,在执行操作之前,都不能使用此方法返回的 NdbLockHandle 对象。

签名
const NdbLockHandle* getLockHandle
    (
      void
    ) const

const NdbLockHandle* getLockHandle
    (
      void
    )
参数

.

返回值

指向可由 NdbTransaction 方法 unlock()releaseLockHandle() 使用的 NdbLockHandle 的指针。

使用锁句柄方法。 事务中读取操作获取的共享锁或排他锁通常会一直保持到事务提交或中止。可以通过在定义读取操作时请求锁句柄来在事务提交或中止之前释放此类锁。执行读取操作后,可以使用 NdbLockHandle 创建新的解锁操作(使用 NdbTransaction::unlock())。执行解锁操作时,将释放读取操作放置的行锁。

释放这些锁所需的步骤如下:

注意

  • 与其他操作类型一样,解锁操作可以批量执行。

  • 每个 NdbLockHandle 对象都引用由单个主键读取操作放置在行上的锁。数据库中的单个行可能有多个并发锁持有者(模式 LM_Read),并且可能有多个锁持有者挂起(LM_Exclusive),因此释放一个锁持有者的声明可能不会导致行的可观察锁状态发生变化。

  • 扫描锁接管操作支持锁句柄;必须在执行锁接管之前请求锁句柄。

  • 唯一索引读取操作不支持锁句柄和解锁操作。

NdbOperation::getLockMode()

描述

此方法获取操作的锁模式。

签名
LockMode getLockMode
    (
      void
    ) const
参数

.

返回值

LockMode 值。请参阅 NdbOperation::LockMode

NdbOperation::getNdbError()

描述

此方法获取最近的错误(NdbError 对象)。

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

.

返回值

一个 NdbError 对象。

NdbOperation::getNdbErrorLine()

描述

此方法检索最近一次错误发生的 method 编号。

签名
int getNdbErrorLine
    (
      void
    ) const
参数

.

返回值

method 编号(整数)。

NdbOperation::getTable()

描述

此方法用于检索与操作关联的表对象。

签名
const NdbDictionary::Table* getTable
    (
      void
    ) const
参数

.

返回值

指向 Table 实例的指针。

NdbOperation::getTableName()

描述

此方法检索用于操作的表的名称。

签名
const char* getTableName
    (
      void
    ) const
参数

.

返回值

表的名称。

NdbOperation::getNdbTransaction()

描述

获取此操作的 NdbTransaction 对象。

签名
virtual NdbTransaction* getNdbTransaction
    (
      void
    ) const
参数

.

返回值

指向 NdbTransaction 对象的指针。

NdbOperation::getType()

描述

此方法用于检索此操作的访问类型。

签名
Type getType
    (
      void
    ) const
参数

.

返回值

一个 Type 值。

NdbOperation::getValue()

描述

此方法为检索属性值做准备。NDB API 为 NdbRecAttr 对象分配内存,该对象稍后将用于获取属性值。这可以通过使用多种 NdbRecAttr 访问器方法之一来完成,具体使用哪种方法取决于属性的数据类型。(这包括通用的 NdbRecAttr::aRef() 方法,它以 char* 的形式检索数据,而不管其实际类型是什么。您应该注意,这不是类型安全的,需要用户进行显式转换。)

此方法从数据库中获取属性值;在调用 NdbTransaction::execute() 之前,此方法返回的 NdbRecAttr 对象是不可读或不可打印的。

如果特定属性未更改,则对应的 NdbRecAttr 处于 UNDEFINED 状态。可以使用 NdbRecAttr::isNULL() 检查这种情况,在这种情况下,它将返回 -1

参见 NdbTransaction::execute()NdbRecAttr::isNULL()

签名

此方法有三个版本,每个版本的参数都不同

NdbRecAttr* getValue
    (
      const char* name,
      char*       value = 0
    )

NdbRecAttr* getValue
    (
      Uint32 id,
      char*  value = 0
    )

NdbRecAttr* getValue
    (
      const NdbDictionary::Column* col,
      char*                        value = 0
    )
参数

这三种形式的方法都有两个参数,第二个参数是可选的(默认为 0)。它们的区别仅在于第一个参数的类型,它可以是以下任意一种

  • 属性 name

  • 属性 id

  • 定义属性的表 column

在这三种情况下,第二个参数都是一个字符缓冲区,其中返回一个非 NULL 的属性值。如果属性为 NULL,则它只存储在由此方法返回的 NdbRecAttr 对象中。

如果在 getValue() 方法调用中没有指定 value,或者如果将 0 作为值传递,则 NdbRecAttr 对象将提供用于存储接收数据的内存管理。如果接收数据的最大大小超过一个小固定值,则使用 malloc() 来存储它:对于小尺寸,提供一个小的固定内部缓冲区(32 字节)。此存储由 NdbRecAttr 实例管理;当操作被释放时,例如在事务关闭时,它将被释放;您希望保留的写入此处的任何数据都应在此内存释放之前复制到其他地方。

如果您为 value 传递一个非零指针,则假定它指向一块足以容纳该列最大值的内存区域;任何返回的数据都将写入该位置。该指针应该至少是 32 位对齐的。

索引列不能代替此方法中的表列。如果表列不可用,则可以使用使用 getName() 获取的属性名称来代替。

返回值

指向 NdbRecAttr 对象的指针,用于保存属性的值,或者是一个 NULL 指针,表示发生错误。

检索整数。 可以从作为此方法的第二个参数传递的 value 缓冲区和 NdbRecAttr 对象本身检索整数值。另一方面,如果未向 getValue() 传递任何缓冲区,则可以从 NdbRecAttr 获取字符数据(请参阅 NdbRecAttr::aRef())。但是,只有在提供缓冲区的情况下,字符数据才会写入缓冲区,在这种情况下,无法从返回的 NdbRecAttr 对象中检索它。在后一种情况下,NdbRecAttr::aRef() 返回一个指向空字符串的缓冲区。

访问位值。 以下示例显示如何从 value 缓冲区检查给定位。这里,op 是一个操作(NdbOperation 对象),name 是要从中获取位值的列的名称,trans 是一个 NdbTransaction 对象

Uint32 buf[];

op->getValue(name, buf); /* bit column */

trans->execute();

if(buf[X/32] & 1 << (X & 31)) /* check bit X */
{
  /* bit X set */
}

NdbOperation::GetValueSpec

本节提供有关 GetValueSpec 数据结构的信息。

父类

NdbOperation

描述

此结构用于指定作为 NdbRecord 操作的一部分获取的额外值。

成员

构成此结构的元素如下表所示

表 2.52 GetValueSpec 结构成员名称、类型和说明

名称 类型 描述
column const Column* 要指定要读取的额外值,调用者必须提供此参数,以及(可选的 NULLappStorage 指针。
appStorage void* 如果此指针为空,则接收的值存储在由 NdbRecAttr 对象管理的内存中。否则,接收的值将存储在指向的位置(并且仍然可以使用 NdbRecAttr 对象访问)。
重要

调用者有责任确保满足以下条件

  1. appStorage 指向的空间足以存储任何返回的数据。

  2. appStorage 指向的内存在 execute() 调用返回之前不会被重复使用或释放。

recAttr NdbRecAttr* 定义操作后,recAttr 包含一个指向 NdbRecAttr 对象的指针,用于接收数据。

不能使用 GetValueSpec 指定 Blob 读取。

有关更多信息,请参见 第 2.3.22 节“NdbRecord 接口”

NdbOperation::incValue()

描述

解释程序指令,将一个值添加到一个属性。该属性可以通过名称或 ID 指定。因此,此方法有四个版本,它们的参数略有不同,如 签名 下所示。

此指令使用寄存器 6 和 7,并在操作过程中覆盖这些寄存器。

对于扫描和 NdbRecord 操作,请改用 NdbInterpretedCode 接口。

签名
int incValue
    (
      const char* anAttrName, 
      Uint32 aValue
    )
int incValue
    (
      const char* anAttrName, 
      Uint64 aValue
    )
int incValue
    (
      Uint32 anAttrId, 
      Uint32 aValue
    )
int incValue
    (
      Uint32 anAttrId, 
      Uint64 aValue
    )
参数
anAttrName

属性的名称。

anAttrId

属性 ID。

aValue

要添加的值;可以是 32 位或 64 位整数。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::insertTuple()

描述

此方法将 NdbOperation 定义为 INSERT 操作。调用 NdbTransaction::execute() 方法时,此操作会向表中添加一个新的元组。

签名
virtual int insertTuple
    (
      void
    )
参数

.

返回值

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

NdbOperation::interpret_exit_last_row()

描述

终止整个事务。

签名
int interpret_exit_last_row
    (
      void
    )
参数

返回值

成功返回 0;否则,返回 -1。

NdbOperation::interpret_exit_nok()

描述

退出解释程序,状态为 NOT OK,并返回一个可选的错误代码(请参见 第 2.4.2 节“NDB 错误代码:按类型”)。

签名
int interpret_exit_nok
    (
      Uint32 ErrorCode
    )

int interpret_exit_nok
    (
      void
    )
参数
ErrorCode

可选错误代码,默认为错误 899。应用程序应该使用错误代码 626 或 6000-6999 范围内的任何代码。支持错误代码 899 以实现向后兼容性,但建议使用 626 代替。对于其他错误代码,行为未定义,并且可能随时更改,恕不另行通知。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::interpret_exit_ok()

描述

退出解释程序,状态为 OK

签名
int interpret_exit_ok
    (
      void
    )
参数

返回值

成功时返回 0,否则返回 -1。

NdbOperation::interpretedDeleteTuple()

描述

使用解释程序删除元组。

签名
virtual 
int interpretedDeleteTuple
    (
      void
    )
参数

.

返回值

成功时返回 0,否则返回 -1。

NdbOperation::interpretedUpdateTuple()

描述

使用解释程序更新元组。

签名
virtual
int interpretedUpdateTuple
    (
      void
    )
参数

.

返回值

成功时返回 0,否则返回 -1。

NdbOperation::interpretedWriteTuple()

描述

使用解释程序写入元组。

签名
virtual
int interpretedWriteTuple
    (
      void
    )
参数

.

返回值

成功时返回 0,否则返回 -1。

NdbOperation::load_const_u32()

描述

将 32 位常量值加载到寄存器中。

签名
int load_const_u32
    (
      Uint32 RegDest, 
      Uint32 Constant
    )
参数
RegDest

目标寄存器。

常量

要加载到寄存器中的值。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::load_const_u64()

描述

将 64 位常量值加载到寄存器中。

签名
int load_const_u64
    (
      Uint64 RegDest, 
      Uint64 Constant
    )
参数
RegDest

目标寄存器。

常量

要加载到寄存器中的值。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::load_const_null()

描述

NULL 加载到寄存器中。

签名
int load_const_null
    (
      Uint32 RegDest
    )
参数
RegDest

目标寄存器。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::LockMode

本节提供有关 LockMode 数据类型的信息。

描述

此类型描述执行读取操作时使用的锁模式。

枚举值

下表显示了此类型的可能值及其说明

表 2.53 NdbOperation::LockMode 类型值和说明

名称 描述
LM_Read 使用共享锁读取
LM_Exclusive 使用排他锁读取
LM_CommittedRead 忽略锁;读取最后提交的内容
LM_SimpleRead 使用共享锁读取,但直接释放锁

还支持脏读(LM_Dirty),但这通常仅用于内部目的,不应在生产环境中部署的应用程序中使用。

NdbOperation::OperationOptions

本节提供有关 OperationOptions 数据结构的信息。

父类

NdbOperation

描述

这些选项被传递给 NdbRecord 基于主键和扫描接管操作方法,这些方法定义在 NdbTransactionNdbScanOperation 类中。

大多数 NdbTransaction::*Tuple() 方法(请参阅第 2.3.25 节 “NdbTransaction 类”)都接受一个补充的 sizeOfOptions 参数。 这是可选的,旨在允许接口实现保持与可能传递旧(较小)版本的 OperationOptions 结构的旧未重新编译客户端的向后兼容性。 通过将 sizeof(OperationOptions) 传递到此参数来实现此效果。

每个选项类型都通过在 optionsPresent 中设置相应的位来标记为存在。(只有在 optionsPresent 中标记的选项类型需要合理的数据。)所有数据在操作定义时从 OperationOptions 结构(以及任何子结构)中复制出来。如果不需要任何选项,则可以传递 NULL

成员

构成此结构的元素如下表所示

表 2.54 NdbOperation::OperationOptions 结构成员名称、类型和描述

名称 类型 描述
optionsPresent Uint64 存在哪些标志。
[...] 标志:

可接受的名称和值如下所示

  • OO_ABORTOPTION: 0x01

  • OO_GETVALUE: 0x02

  • OO_SETVALUE: 0x04

  • OO_PARTITION_ID: 0x08

  • OO_INTERPRETED: 0x10

  • OO_ANYVALUE: 0x20

  • OO_CUSTOMDATA: 0x40

  • OO_LOCKHANDLE: 0x80

  • OO_QUEUABLE

    0x100

  • OO_NOT_QUEUABLE

    0x200

  • OO_DEFERRED_CONSTAINTS

    0x400

  • OO_DISABLE_FK

    0x800

  • OO_NOWAIT

    0x1000

标志类型。
abortOption AbortOption 特定于操作的 abort 选项;仅当默认的 abortoption 行为不令人满意时才需要。
extraGetValues GetValueSpec 要读取的额外列值。
numExtraGetValues Uint32 要读取的额外列值的数量。
extraSetValues SetValueSpec 要设置的额外列值。
numExtraSetValues Uint32 要设置的额外列值的数量。
partitionId Uint32 将扫描限制为具有此 ID 的分区;或者,您可以在此处提供 PartitionSpec。对于索引扫描,可以为每个范围提供分区信息。
interpretedCode NdbInterpretedCode 要作为扫描的一部分执行的解释代码。
anyValue Uint32 要与此操作一起使用的 anyValue。NDB Cluster 复制使用它来存储 SQL 节点的服务器 ID。通过使用设置为小于 32 的 --server-id-bits 选项(这会导致 server_id 中的某些位用于唯一标识它)启动 SQL 节点,其余位可用于存储用户数据。
customData void* 与此操作关联的数据指针。
partitionInfo PartitionSpec 用于限制此扫描的分区信息。
sizeOfPartInfo Uint32 边界分区信息的大小。

有关更多信息,请参见 第 2.3.22 节“NdbRecord 接口”

NdbOperation::read_attr()

描述

将由名称或 ID 标识的属性读入寄存器。

签名
int read_attr
    (
      const char* anAttrName, 
      Uint32 RegDest
    )

int read_attr
    (
      Uint32 anAttrId, 
      Uint32 RegDest
    )
参数
anAttrName

属性名称。使用此项或属性 ID。

anAttrId

属性 ID。使用此项或属性名称。

RegDest

目标寄存器。

返回值

成功时返回 0;否则返回 -1。

NdbOperation::readTuple()

描述

此方法将 NdbOperation 定义为 READ 操作。调用 NdbTransaction::execute() 方法时,该操作将读取一个元组。

签名
virtual int readTuple
    (
      LockMode mode
    )
参数

mode 指定读取操作使用的锁定模式。有关可能的值,请参阅NdbOperation::LockMode

返回值

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

NdbOperation::ret_sub()

描述

从解释程序子例程返回。

签名
int ret_sub
    (
      void
    )
参数

.

返回值

成功时返回 0,否则返回 -1。

NdbOperation::setValue()

描述

此方法定义要设置或更新的属性。

有许多 NdbOperation::setValue() 方法接受某种类型作为输入(按值传递而不是传递指针)。应用程序员有责任使用正确的类型。

NDB API 确实会检查应用程序是否按照 length 参数中给出的长度向接口发送了正确的长度。char* 值可以包含任何数据类型或任何类型的数组。如果未提供长度,或者将其设置为零,则 API 假定指针正确,并且不检查它。

要设置 NULL 值,请使用以下结构

setValue("ATTR_NAME", (char*)NULL);

当您使用 insertTuple() 时,NDB API 会自动检测到它应该改用 equal()

此外,在使用 insertTuple() 时,不必在其他属性之前对键属性使用 setValue()

签名

有 14 个版本的 NdbOperation::setValue(),每个版本的参数略有不同,如下所示

int setValue
    (
      const char* name,
      const char* value
)

int setValue
    (
      const char* name,
      Int32       value
    )

int setValue
    (
      const char* name,
      Uint32      value
    )

int setValue
    (
      const char* name,
      Int64       value
    )

int setValue
    (
      const char* name,
      Uint64      value
    )

int setValue
    (
      const char* name,
      float       value
    )

int setValue
    (
      const char* name,
      double      value
    )

int setValue
    (
      Uint32      id,
      const char* value
    )

int setValue
    (
      Uint32 id,
      Int32  value
    )

int setValue
    (
      Uint32 id,
      Uint32 value
    )

int setValue
    (
      Uint32 id,
      Int64  value
    )

int setValue
    (
      Uint32 id,
      Uint64 value
    )

int setValue
    (
      Uint32 id,
      float  value
    )

int setValue
    (
      Uint32 id,
      double value
    )
参数

此方法需要以下两个参数

  • 第一个参数标识要设置的属性,可以是以下任意一项

    1. 属性 name(字符串)

    2. 属性 id(无符号 32 位整数)

  • 第二个参数是要将属性设置成的 value;其类型可以是以下 7 种类型中的任何一种

    1. 字符串 (const char*)

    2. 32 位整数

    3. 无符号 32 位整数

    4. 64 位整数

    5. 无符号 64 位整数

    6. 双精度

    7. 浮点数

    有关值的格式和长度的重要信息,请参阅NdbOperation::equal()

返回值

如果失败,则返回 -1

NdbOperation::SetValueSpec

本节提供有关 SetValueSpec 数据结构的信息。

父类

NdbOperation

描述

此结构用于指定要作为 NdbRecord 操作的一部分设置的额外值。

成员

构成此结构的元素如下表所示

表 2.55 NdbOperation::SetValueSpec 属性及其类型和描述

名称 类型 描述
column 要指定要读取的额外值,调用者必须提供此参数,以及(可选的 NULLappStorage 指针。
void* 这必须指向要设置的值,如果要将属性设置为 NULL,则指向 NULL。指向的值在定义操作时被复制,并且不需要保留到执行时。

Blob 值不能使用 SetValueSpec 设置。

有关更多信息,请参见 第 2.3.22 节“NdbRecord 接口”

NdbOperation::sub_reg()

描述

将两个寄存器值的差存储在第三个寄存器中。

签名
int sub_reg
    (
      Uint32 RegSource1, 
      Uint32 RegSource2, 
      Uint32 RegDest
    )
参数
参数
RegSource1

包含要减去的值的寄存器。

RegSource2

包含要减去的值的寄存器。

RegDest

用于存储结果的寄存器。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::subValue()

描述

解释程序指令,用于从解释操作中的属性中减去一个值。属性可以通过名称或 ID 指定。 因此,此方法有四个版本的参数略有不同,如签名 下所示。

incValue() 一样,此指令使用寄存器 6 和 7,并在其操作过程中覆盖这些寄存器。

对于扫描和 NdbRecord 操作,请改用 NdbInterpretedCode 接口。

签名
int subValue
    (
      const char* anAttrName, 
      Uint32 aValue
    )
int subValue
    (
      const char* anAttrName, 
      Uint64 aValue
    )
int subValue
    (
      Uint32 anAttrId, 
      Uint32 aValue
    )
int subValue
    (
      Uint32 anAttrId, 
      Uint64 aValue
    )
参数
anAttrName

属性名称

anAttrId

属性 ID

aValue

要减去的数值;这可以是 32 位或 64 位整数。

返回值

成功时返回 0,否则返回 -1。

NdbOperation::Type

本节提供有关 Type 数据类型的信息。

描述

Type 用于描述操作访问类型。每个访问类型都由 NdbOperation 或其子类之一支持,如下表所示

枚举值

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

表 2.56 NdbOperation::Type 数据类型值和描述

名称 描述 适用类
PrimaryKeyAccess 使用表的主键进行读取、插入、更新或删除操作 NdbOperation
UniqueIndexAccess 使用唯一索引进行读取、更新或删除操作 NdbIndexOperation
TableScan 全表扫描 NdbScanOperation
OrderedIndexScan 有序索引扫描 NdbIndexScanOperation

NdbOperation::updateTuple()

描述

此方法将 NdbOperation 定义为 UPDATE 操作。调用 NdbTransaction::execute() 方法时,该操作将更新表中找到的元组。

签名
virtual int updateTuple
    (
      void
    )
参数

.

返回值

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

NdbOperation::write_attr()

描述

从寄存器写入属性值。要写入的属性可以通过名称或 ID 指定。

签名
int write_attr
    (
      const char* anAttrName, 
      Uint32 RegSource
    )

int write_attr
    (
      Uint32 anAttrId, 
      Uint32 RegSource
    )
参数
anAttrName

属性名称。使用此项或属性 ID。

anAttrId

属性 ID。使用此项或属性名称。

RegSource

源寄存器。

返回值

成功返回 0;否则,返回 -1。

NdbOperation::writeTuple()

描述

此方法将 NdbOperation 定义为 WRITE 操作。调用 NdbTransaction::execute() 方法时,该操作会将一个元组写入表中。如果元组已存在,则更新它;否则进行插入。

签名
virtual int writeTuple
    (
      void
    )
参数

.

返回值

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