2.3.20 NdbOperation类

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

从 NDB 8.0.30 开始,NdbOperation支持类似于 NdbInterpretedCode. 有关详细信息,请参阅 NdbOperation 解释代码 API

NdbOperation 类概述

家长班

没有任何

儿童班

NdbIndexOperation, NdbScanOperation

描述

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

方法

下表列出了该类的公共方法以及每个方法的用途或用途:

表 2.48 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() 如果寄存器值为空则分支
branch_ge() 如果第一个寄存器值大于或等于第二个寄存器值则分支
branch_gt() 如果第一个寄存器值大于第二个寄存器值则分支
branch_label() 跳转到插入程序中的标签
branch_le() 如果第一个寄存器值小于第二个寄存器值则分支
branch_lt() 如果第一个寄存器值小于或等于第二个寄存器值则分支
branch_ne() 如果第一个寄存器值不等于第二个寄存器值则分支
branch_ne_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.49 NdbOperation 类类型和描述

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

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

NdbOperation 解释代码 API

NdbOperation在 NDB 8.0.30 及更高版本中支持类似于与 NdbInterpretedCode.

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

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

NdbOperation 解释代码 API 实现与 支持的 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 个)字节。

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

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

此处列出的方法支持四种不同类型的按位比较分支:

有关详细信息,请参阅各个方法的说明。

NdbOperation::AbortOption

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

描述

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

枚举值

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

表 2.50 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。

参数Label_

如果列是 则跳转到的标签 NULL

返回值

0 成功,否则 -1。

NdbOperation::branch_col_ne_null()

描述

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

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

要检查的列的 ID。

参数Label_

如果列不是 则跳转到的标签 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 个或多个字符的任何字符串,以及_任何单个字符。

列的类型必须是 CHARVARCHARBINARY或 之一VARBINARY

签名
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()

描述

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

列的类型必须是 CHARVARCHARBINARY或 之一VARBINARY

签名
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()

描述

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

笔记

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

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

寄存器值与 RegRvalue.

RegRvalue

将该寄存器的值与 RegLvalue; 如果此值大于或等于 ,则分支到标签 RegLvalue

Label

RegRvalue如果大于或等于 则分支到的标签 RegLvalue

返回值

0 成功,-1 否则。

NdbOperation::branch_gt()

描述

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

笔记

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

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

寄存器值与 RegRvalue.

RegRvalue

将该寄存器的值与 RegLvalue; 如果此值大于 ,则分支到标签 RegLvalue

Label

RegRvalue如果大于 则分支到的标签 RegLvalue

返回值

0 成功,-1 否则。

NdbOperation::branch_le()

描述

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

笔记

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

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

寄存器值与 RegRvalue.

RegRvalue

将该寄存器的值与 RegLvalue; 如果此值小于 ,则分支到标签 RegLvalue

Label

RegRvalue如果小于 则分支到的标签 RegLvalue

返回值

0 成功,-1 否则。

NdbOperation::branch_lt()

描述

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

笔记

该方法与比较方法的其他 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

RegLvalue如果是 , 分支到这个标签 NULL

返回值

成功时,0;否则,-1。

NdbOperation::branch_label()

描述

跳转到一个被插入的程序中的标签。

签名
int branch_label
    (
      Uint32 Label
    )
参数
Label

要分支到的标签。

返回值

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

NdbOperation::call_sub()

描述

在一个被解释的程序中调用一个子程序。

签名
int call_sub
    (
      Uint32 Subroutine
    )
参数
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(); 在这种情况下,必须满足所有这些条件才能选择元组。

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

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

签名

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

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
    )
参数

没有

返回值

指向 方法 和 NdbLockHandle可以使用的 的指针。 NdbTransactionunlock()releaseLockHandle()

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

此处列出了释放这些锁所需的步骤:

笔记:

  • 与其他操作类型一样,解锁操作可以批处理。

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

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

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

NdbOperation::getLockMode() 方法

描述

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

签名
LockMode getLockMode
    (
      void
    ) const
参数

没有

返回值

一个LockMode值。请参阅 NdbOperation::LockMode

NdbOperation::getNdbError() 方法

描述

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

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

没有

返回值

一个NdbError对象。

NdbOperation::getNdbErrorLine() 函数

描述

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

签名
int getNdbErrorLine
    (
      void
    ) const
参数

没有

返回值

方法编号(整数)。

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() 方法

描述

此方法准备检索属性值。NdbRecAttrNDB API为稍后用于获取属性值的对象分配内存 。这可以通过使用许多 NdbRecAttr访问器方法中的一种来完成,要使用的确切方法取决于属性的数据类型。(这包括通用 NdbRecAttr::aRef()方法,它将数据检索为char*,而不管其实际类型如何。您应该知道这不是类型安全的,需要用户进行显式转换。)

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

如果特定属性未更改,则相应 NdbRecAttr的具有 state 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此方法返回的对象中。

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

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

使用此方法不能使用索引列代替表列。在表列不可用的情况下,您可以使用通过 获得的属性名称 getName()来代替。

返回值

指向NdbRecAttr 保存属性值的对象的 NULL指针,或指示错误的指针。

检索整数。 value可以从作为此方法的第二个参数传递的缓冲区和 NdbRecAttr对象本身 检索整数值 。另一方面, NdbRecAttr如果没有缓冲区被传递到getValue()(参见 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.51 GetValueSpec 结构成员名称、类型和说明

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

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

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

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

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

无法使用 指定 Blob 读取 GetValueSpec

有关详细信息,请参阅第 2.3.22 节,“NdbRecord 接口”

NdbOperation::incValue()

描述

向属性添加值的解释程序指令。属性可以按名称或 ID 指定。因此,此方法有四个版本,参数略有不同,如 Signature下所示。

该指令使用寄存器 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

属性标识。

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

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

返回值

0 成功,-1 否则。

NdbOperation::interpret_exit_ok()

描述

以 status 退出解释程序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

目的地登记。

Constant

要加载到寄存器中的值。

返回值

0 成功,-1 否则。

NdbOperation::load_const_u64()

描述

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

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

目的地登记。

Constant

要加载到寄存器中的值。

返回值

0 成功,否则 -1。

NdbOperation::load_const_null()

描述

载入NULL寄存器。

签名
int load_const_null
    (
      Uint32 RegDest
    )
参数
RegDest

目的地登记。

返回值

0 成功,-1 否则。

NdbOperation::锁定模式

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

描述

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

枚举值

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

表 2.52 NdbOperation::LockMode 类型值和描述

姓名 描述
LM_Read 使用共享锁读取
LM_Exclusive 使用独占锁读取
LM_CommittedRead 忽略锁;读取上次提交
LM_SimpleRead 使用共享锁读取,但直接释放锁

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

NdbOperation::操作选项

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

家长班

NdbOperation

描述

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

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

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

成员

构成该结构的元素如下表所示:

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

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

接受的名称和值显示在以下列表中:

  • 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 特定于操作的中止选项;仅当默认的中止行为不令人满意时才需要。
extraGetValues GetValueSpec 要读取的额外列值。
numExtraGetValues Uint32 要读取的额外列值的数量。
extraSetValues SetValueSpec 要设置的额外列值。
numExtraSetValues Uint32 要设置的额外列值的数量。
partitionId Uint32 将扫描限制在具有此 ID 的分区;或者,您可以在 PartitionSpec 此处提供。对于索引扫描,可以为每个范围提供分区信息。
interpretedCode NdbInterpretedCode 作为扫描的一部分执行的解释代码。
anyValue Uint32 anyValue用于此操作的。NDB Cluster Replication 使用它来存储 SQL 节点的服务器 ID。通过将--server-id-bits 选项(这会导致只有一些 的 server_id位用于唯一标识它)设置为小于 32 来启动 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 或属性 ID。

anAttrId

属性标识。使用这个或属性的名称。

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 会检查应用程序是否按照长度参数中给定的长度向接口发送了正确的长度。值 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.54 NdbOperation::SetValueSpec 属性,带有类型和描述

姓名 类型 描述
column Column 要指定要读取的额外值,调用者必须提供 this 以及(可选NULLappStorage指针。
value 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 指定。因此,此方法有四个版本,参数略有不同,如Signature下所示。

与 一样 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

属性标识

aValue

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

返回值

0 成功,-1 否则。

NdbOperation::类型

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

描述

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

枚举值

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

表 2.55 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 或属性 ID。

anAttrId

属性标识。使用这个或属性的名称。

RegSource

源寄存器。

返回值

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

NdbOperation::writeTuple()

描述

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

签名
virtual int writeTuple
    (
      void
    )
参数

没有

返回值

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