本节提供有关 NdbOperation
类的信息。
从 NDB 8.0.30 开始,NdbOperation
支持一种类似于 NdbInterpretedCode
实现的解释代码 API。有关更多信息,请参阅 NdbOperation 解释代码 API。
- 父类
无
- 子类
- 描述
NdbOperation
表示“通用”数据操作。它的子类表示更具体类型的操作。有关操作类型及其对应NdbOperation
子类的列表,请参阅 NdbOperation::Type。- 方法
-
下表列出了此类的公共方法以及每个方法的用途。
表 2.49 NdbOperation 类方法和描述
此类没有公共构造函数。要创建
NdbOperation
的实例,必须使用NdbTransaction::getNdbOperation()
。 - 类型
-
NdbOperation
类定义了三种公共类型,如下表所示
有关使用 NdbOperation
的更多信息,请参阅第 1.4.2.3.2 节“单行操作”。
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
支持的实现之间的另一个区别是,类似方法的参数顺序不一定相同。下面列出了一对这样的方法
-
在
NdbOperation::branch_col_lt(
中,比较是这样进行的,使用传递给方法的第二个和第一个参数,按此顺序ColId
,val
,len
,bool
,Label
)if(val < ColId_value) branch_to Label
-
NdbInterpretedCode::branch_col_lt(
,将传递的第一个参数与第三个参数进行比较,如下所示*val
, Uint32,attrId
,Label
)if(val < attrId_value) branch_to Label
**分支列方法比较。** 分支列方法(例如 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))
这里列出的方法支持四种不同的按位比较分支
branch_col_and_mask_eq_mask()
:如果列值 AND 掩码 == 掩码
(值中所有掩码位均已设置),则分支。branch_col_and_mask_ne_mask()
:如果列值 AND 掩码 != 掩码
(值中并非所有掩码位均已设置),则分支。branch_col_and_mask_eq_zero()
:如果列值 AND 掩码 == 0
(值中没有掩码位被设置),则分支。branch_col_and_mask_ne_zero()
:如果列值 AND 掩码 != 0
(值中设置了一些掩码位),则分支。
有关更多信息,请参阅各个方法的描述。
本节提供有关 AbortOption
数据类型的信息。
- 描述
此类型用于确定失败的操作是否应强制中止事务。它用作
execute()
方法的参数,有关更多信息,请参阅 NdbTransaction::execute()。- 枚举值
-
下表显示了可能的值及其说明
表 2.51 NdbOperation::AbortOption 类型值和描述
名称 描述 AbortOnError
失败的操作会导致事务中止。 AO_IgnoreOnError
忽略失败的操作;事务继续执行。 DefaultAbortOption
AbortOption
值根据操作类型设置读取操作:
AO_IgnoreOnError
扫描接管或 DML 操作:
AbortOnError
有关更多信息,请参阅 NdbTransaction::execute()。
- 描述
将两个寄存器的内容相加;将结果存储在第三个寄存器中。
- 签名
int add_reg ( Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest )
- 参数
-
RegSource1
包含要添加的第一个值的寄存器。
-
RegSource2
包含要添加的第二个值的寄存器。
-
RegDest
用于存储结果的寄存器。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
如果指定的列为
NULL
,则分支到解释程序中的标签。- 签名
int branch_col_eq_null ( Uint32 ColId, Uint32 Label )
- 参数
-
ColId
要检查的列的 ID。
- par
Label
am 如果列为
NULL
,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
如果指定的列不为
NULL
,则分支到解释程序中的标签。- 签名
int branch_col_ne_null ( Uint32 ColId, Uint32 Label )
- 参数
-
ColId
要检查的列的 ID。
- par
Label
am 如果列不为
NULL
,则跳转到的标签。
-
- 返回值
无
- 描述
-
如果给定值等于指定列的值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
val
等于列值,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果给定值不等于指定列的值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果列值不等于
val
,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果给定值小于列值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
val
小于列值,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果给定值小于或等于列值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
val
小于或等于列值,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果给定值大于列值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
val
大于列值,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果给定值大于或等于列值,则分支到解释程序中的标签。
注意与其他
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
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
val
大于或等于列值,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果列值匹配通配符模式,则分支。此方法和
branch_col_notlike()
都支持 MySQLLIKE
运算符使用的通配符:%
表示任何 0 个或多个字符的字符串,_
表示任何单个字符。 - 签名
int branch_col_like ( Uint32 ColId, const void* val, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
要比较其值的列的 ID。
-
val
要匹配的模式。
-
len
模式值的长度。
-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果列值匹配模式,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果列值与给定的通配符模式不匹配,则分支。此方法和
branch_col_like()
都支持与 MySQLLIKE
运算符相同的通配符%
(0 个或多个字符)和_
(任何一个字符)。 - 签名
int branch_col_notlike ( Uint32 ColId, const void* val, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
要比较其值的列的 ID。
-
val
要匹配的模式。
-
len
模式值的长度。
-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果列值与模式不匹配,则跳转到的标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果列值与位掩码进行逻辑按位
AND
运算的结果等于位掩码,则分支。另请参阅 按位逻辑比较。
- 签名
int branch_col_and_mask_eq_mask ( Uint32 ColId, const void* mask, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
使用具有此 ID 的列的值。
-
mask
要与列值进行比较的位掩码。
-
len
mask
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
AND
操作的结果与掩码相同,则分支跳转到该位置。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果逻辑按位
AND
中的列值与位掩码不相等,则分支。另请参阅 按位逻辑比较。
- 签名
int branch_col_and_mask_ne_mask ( Uint32 ColId, const void* mask, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
使用具有此 ID 的列的值。
-
mask
要与列值进行比较的位掩码。
-
len
mask
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
AND
操作的结果不等于掩码,则分支跳转到该位置。
-
- 返回值
成功返回 0,否则返回 -1。
- 描述
-
如果逻辑按位
AND
中的列值与位掩码相等且等于 0,则分支。另请参阅 按位逻辑比较。
- 签名
int branch_col_and_mask_eq_zero ( Uint32 ColId, const void* mask, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
使用具有此 ID 的列的值。
-
mask
要与列值进行比较的位掩码。
-
len
mask
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
AND
操作的结果等于 0,则分支跳转到该位置。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
如果逻辑按位
AND
中的列值与位掩码不相等且不等于 0,则分支。另请参阅 按位逻辑比较。
- 签名
int branch_col_and_mask_ne_zero ( Uint32 ColId, const void* mask, Uint32 len, bool, Uint32 Label )
- 参数
-
ColId
使用具有此 ID 的列的值。
-
mask
要与列值进行比较的位掩码。
-
len
mask
的长度。-
-
出于遗留原因,需要布尔值
true
或false
,但不再使用。-
Label
如果
AND
操作的结果不等于 0,则分支跳转到该位置。
-
- 返回值
成功返回 0,否则返回 -1。
- 描述
-
在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值大于等于左值,则分支到标签。
注意此方法与其他
NdbOperation
分支比较方法一样,从右到左比较两个寄存器值。 - 签名
int branch_ge ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
与
RegRvalue
进行比较的寄存器值。-
RegRvalue
将此寄存器的值与
RegLvalue
进行比较;如果此值大于等于RegLvalue
,则分支到标签。-
Label
如果
RegRvalue
大于等于RegLvalue
,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值大于左值,则分支到标签。
注意此方法与其他
NdbOperation
分支比较方法一样,从右到左比较两个寄存器值。 - 签名
int branch_gt ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
与
RegRvalue
进行比较的寄存器值。-
RegRvalue
将此寄存器的值与
RegLvalue
进行比较;如果此值大于RegLvalue
,则分支到标签。-
Label
如果
RegRvalue
大于RegLvalue
,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值小于左值,则分支到标签。
注意此方法与其他
NdbOperation
分支比较方法一样,从右到左比较两个寄存器值。 - 签名
int branch_le ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
与
RegRvalue
进行比较的寄存器值。-
RegRvalue
将此寄存器的值与
RegLvalue
进行比较;如果此值小于RegLvalue
,则分支到标签。-
Label
如果
RegRvalue
小于RegLvalue
,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
在解释程序中定义搜索条件。将右寄存器值与左寄存器值进行比较;如果右值小于等于左值,则分支到标签。
注意此方法与其他
NdbOperation
分支比较方法一样,从右到左比较两个寄存器值。 - 签名
int branch_lt ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
与
RegRvalue
进行比较的寄存器值。-
RegRvalue
将此寄存器的值与
RegLvalue
进行比较;如果此值小于等于RegLvalue
,则分支到标签。-
Label
如果
RegRvalue
小于等于RegLvalue
,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
当两个寄存器值相等时,分支到解释程序中的标签。
- 签名
int branch_eq ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
要比较的两个寄存器值之一。
-
RegRvalue
要比较的另一个寄存器值。
-
Label
如果寄存器值相等,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
当两个寄存器值不相等时,分支到解释程序中的标签。
- 签名
int branch_eq ( Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label )
- 参数
-
RegLvalue
要比较的两个寄存器值之一。
-
RegRvalue
要比较的另一个寄存器值。
-
Label
如果寄存器值不相等,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
如果寄存器值不为
NULL
,则分支到解释程序中的标签。- 签名
int branch_ne_null ( Uint32 RegLvalue, Uint32 Label )
- 参数
-
RegLvalue
要测试的寄存器。
-
Label
如果
RegLvalue
不为NULL
,则分支到此标签。
-
- 返回值
成功返回 0,否则返回 -1。
- 描述
如果寄存器值为
NULL
,则分支到解释程序中的标签。- 签名
int branch_ne_null ( Uint32 RegLvalue, Uint32 Label )
- 参数
-
RegLvalue
要测试的寄存器。
-
Label
如果
RegLvalue
为NULL
,则分支到此标签。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
在解释操作中定义跳转标签。标签从 0 开始自动编号。
- 签名
int def_label ( int labelNumber )
- 参数
-
labelNumber
标签号。为了便于调试,这应该与
NDB
执行的自动编号相匹配。
-
- 返回值
成功返回
labelNumber
,否则返回 -1。
- 描述
在解释程序中定义子例程。
- 签名
int def_subroutine ( int SubroutineNumber )
- 参数
-
SubroutineNumber
子例程编号。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
此方法将
NdbOperation
定义为DELETE
操作。调用NdbTransaction::execute()
方法时,该操作将从表中删除元组。- 签名
virtual int deleteTuple ( void )
- 参数
无.
- 返回值
成功返回
0
,失败返回-1
。
- 描述
-
此方法定义具有相等性的搜索条件。如果属性具有给定值,则条件为真。要设置多个属性的搜索条件,请多次调用
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 )
- 参数
-
此方法需要两个参数
-
第一个参数可以是以下任意一个
属性的
name
(字符串)属性的
id
(无符号 32 位整数)
-
第二个参数是要测试的属性
value
。此值可以是以下 5 种类型中的任何一种字符串
32 位整数
无符号 32 位整数
64 位整数
无符号 64 位整数
-
- 返回值
如果发生错误,则返回
-1
。
- 描述
此方法用于代替
getValue()
或setValue()
用于 blob 属性。它创建一个 blob 句柄(NdbBlob
对象)。使用相同参数的第二次调用将返回先前创建的句柄。该句柄链接到操作并自动维护。- 签名
-
此方法有两种形式,具体取决于它是使用 blob 属性的名称还是 ID 调用的
virtual NdbBlob* getBlobHandle ( const char* name )
或
virtual NdbBlob* getBlobHandle ( Uint32 id )
- 参数
-
此方法采用单个参数,该参数可以是以下任意一个
属性的
name
属性的
id
- 返回值
无论使用哪种参数类型,此方法都返回指向
NdbBlob
实例的指针。
- 描述
返回指向当前操作的锁句柄的指针。与
NdbRecord
一起使用时,必须首先使用OO_LOCKHANDLE
操作选项请求锁句柄。对于其他操作,此方法可以单独使用。在任何情况下,在执行操作之前,都不能使用此方法返回的NdbLockHandle
对象。- 签名
-
const NdbLockHandle* getLockHandle ( void ) const
或
const NdbLockHandle* getLockHandle ( void )
- 参数
无.
- 返回值
指向可由
NdbTransaction
方法unlock()
和releaseLockHandle()
使用的NdbLockHandle
的指针。
使用锁句柄方法。 事务中读取操作获取的共享锁或排他锁通常会一直保持到事务提交或中止。可以通过在定义读取操作时请求锁句柄来在事务提交或中止之前释放此类锁。执行读取操作后,可以使用 NdbLockHandle
创建新的解锁操作(使用 NdbTransaction::unlock()
)。执行解锁操作时,将释放读取操作放置的行锁。
释放这些锁所需的步骤如下:
使用
LockMode
设置为LM_Read
或LM_Exclusive
,以正常方式定义主键读取操作。在操作定义期间调用
NdbOperation::getLockHandle()
,或者,对于Ndbrecord
,在调用NdbTransaction::readTuple()
时设置OO_LOCKHANDLE
操作选项。调用
NdbTransaction::execute()
;现在,行将从此时开始锁定,如常。(使用数据,可能调用
NdbTransaction::execute()
。)调用
NdbTransaction::unlock()
,传入先前获得的const NdbLockHandle
以创建解锁操作。调用
NdbTransaction::execute()
;这将解锁该行。
注意
- 描述
此方法获取操作的锁模式。
- 签名
LockMode getLockMode ( void ) const
- 参数
无.
- 返回值
LockMode
值。请参阅 NdbOperation::LockMode。
- 描述
此方法用于检索与操作关联的表对象。
- 签名
const NdbDictionary::Table* getTable ( void ) const
- 参数
无.
- 返回值
指向
Table
实例的指针。
- 描述
获取此操作的
NdbTransaction
对象。- 签名
virtual NdbTransaction* getNdbTransaction ( void ) const
- 参数
无.
- 返回值
指向
NdbTransaction
对象的指针。
- 描述
-
此方法为检索属性值做准备。NDB API 为
NdbRecAttr
对象分配内存,该对象稍后将用于获取属性值。这可以通过使用多种NdbRecAttr
访问器方法之一来完成,具体使用哪种方法取决于属性的数据类型。(这包括通用的NdbRecAttr::aRef()
方法,它以char*
的形式检索数据,而不管其实际类型是什么。您应该注意,这不是类型安全的,需要用户进行显式转换。)此方法不从数据库中获取属性值;在调用
NdbTransaction::execute()
之前,此方法返回的NdbRecAttr
对象是不可读或不可打印的。如果特定属性未更改,则对应的
NdbRecAttr
处于UNDEFINED
状态。可以使用NdbRecAttr::isNULL()
检查这种情况,在这种情况下,它将返回-1
。 - 签名
-
此方法有三个版本,每个版本的参数都不同
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 */
}
本节提供有关 GetValueSpec
数据结构的信息。
- 父类
- 描述
此结构用于指定作为
NdbRecord
操作的一部分获取的额外值。- 成员
-
构成此结构的元素如下表所示
表 2.52 GetValueSpec 结构成员名称、类型和说明
名称 类型 描述 column
const
Column
*要指定要读取的额外值,调用者必须提供此参数,以及(可选的 NULL
)appStorage
指针。appStorage
void*
如果此指针为空,则接收的值存储在由 NdbRecAttr
对象管理的内存中。否则,接收的值将存储在指向的位置(并且仍然可以使用NdbRecAttr
对象访问)。重要调用者有责任确保满足以下条件
appStorage
指向的空间足以存储任何返回的数据。appStorage
指向的内存在execute()
调用返回之前不会被重复使用或释放。
recAttr
NdbRecAttr
*定义操作后, recAttr
包含一个指向NdbRecAttr
对象的指针,用于接收数据。不能使用
GetValueSpec
指定 Blob 读取。
有关更多信息,请参见 第 2.3.22 节“NdbRecord 接口”。
- 描述
-
解释程序指令,将一个值添加到一个属性。该属性可以通过名称或 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
定义为INSERT
操作。调用NdbTransaction::execute()
方法时,此操作会向表中添加一个新的元组。- 签名
virtual int insertTuple ( void )
- 参数
无.
- 返回值
成功返回
0
,失败返回-1
。
- 描述
退出解释程序,状态为
NOT OK
,并返回一个可选的错误代码(请参见 第 2.4.2 节“NDB 错误代码:按类型”)。- 签名
int interpret_exit_nok ( Uint32 ErrorCode ) int interpret_exit_nok ( void )
- 参数
- 返回值
成功时返回 0,否则返回 -1。
- 描述
将 32 位常量值加载到寄存器中。
- 签名
int load_const_u32 ( Uint32 RegDest, Uint32 Constant )
- 参数
-
RegDest
目标寄存器。
-
常量
要加载到寄存器中的值。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
将 64 位常量值加载到寄存器中。
- 签名
int load_const_u64 ( Uint64 RegDest, Uint64 Constant )
- 参数
-
RegDest
目标寄存器。
-
常量
要加载到寄存器中的值。
-
- 返回值
成功时返回 0,否则返回 -1。
本节提供有关 OperationOptions
数据结构的信息。
- 父类
- 描述
-
这些选项被传递给
NdbRecord
基于主键和扫描接管操作方法,这些方法定义在NdbTransaction
和NdbScanOperation
类中。大多数
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 接口”。
- 描述
将由名称或 ID 标识的属性读入寄存器。
- 签名
int read_attr ( const char* anAttrName, Uint32 RegDest ) int read_attr ( Uint32 anAttrId, Uint32 RegDest )
- 参数
-
anAttrName
属性名称。使用此项或属性 ID。
-
anAttrId
属性 ID。使用此项或属性名称。
-
RegDest
目标寄存器。
-
- 返回值
成功时返回 0;否则返回 -1。
- 描述
此方法将
NdbOperation
定义为READ
操作。调用NdbTransaction::execute()
方法时,该操作将读取一个元组。- 签名
virtual int readTuple ( LockMode mode )
- 参数
mode
指定读取操作使用的锁定模式。有关可能的值,请参阅NdbOperation::LockMode。- 返回值
成功返回
0
,失败返回-1
。
- 描述
-
此方法定义要设置或更新的属性。
有许多
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 )
- 参数
-
此方法需要以下两个参数
-
第一个参数标识要设置的属性,可以是以下任意一项
属性
name
(字符串)属性
id
(无符号 32 位整数)
-
第二个参数是要将属性设置成的
value
;其类型可以是以下 7 种类型中的任何一种字符串 (
const char*
)32 位整数
无符号 32 位整数
64 位整数
无符号 64 位整数
双精度
浮点数
有关值的格式和长度的重要信息,请参阅NdbOperation::equal()。
-
- 返回值
如果失败,则返回
-1
。
本节提供有关 SetValueSpec
数据结构的信息。
Blob 值不能使用 SetValueSpec
设置。
有关更多信息,请参见 第 2.3.22 节“NdbRecord 接口”。
- 描述
将两个寄存器值的差存储在第三个寄存器中。
- 签名
int sub_reg ( Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest )
- 参数
- 参数
-
RegSource1
包含要减去的值的寄存器。
-
RegSource2
包含要减去的值的寄存器。
-
RegDest
用于存储结果的寄存器。
-
- 返回值
成功时返回 0,否则返回 -1。
- 描述
-
解释程序指令,用于从解释操作中的属性中减去一个值。属性可以通过名称或 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。
本节提供有关 Type
数据类型的信息。
- 描述
Type
用于描述操作访问类型。每个访问类型都由NdbOperation
或其子类之一支持,如下表所示- 枚举值
-
下表显示了可能的值及其说明
表 2.56 NdbOperation::Type 数据类型值和描述
名称 描述 适用类 PrimaryKeyAccess
使用表的主键进行读取、插入、更新或删除操作 NdbOperation
UniqueIndexAccess
使用唯一索引进行读取、更新或删除操作 NdbIndexOperation
TableScan
全表扫描 NdbScanOperation
OrderedIndexScan
有序索引扫描 NdbIndexScanOperation
- 描述
此方法将
NdbOperation
定义为UPDATE
操作。调用NdbTransaction::execute()
方法时,该操作将更新表中找到的元组。- 签名
virtual int updateTuple ( void )
- 参数
无.
- 返回值
成功返回
0
,失败返回-1
。
- 描述
从寄存器写入属性值。要写入的属性可以通过名称或 ID 指定。
- 签名
int write_attr ( const char* anAttrName, Uint32 RegSource ) int write_attr ( Uint32 anAttrId, Uint32 RegSource )
- 参数
-
anAttrName
属性名称。使用此项或属性 ID。
-
anAttrId
属性 ID。使用此项或属性名称。
-
RegSource
源寄存器。
-
- 返回值
成功返回 0;否则,返回 -1。
- 描述
此方法将
NdbOperation
定义为WRITE
操作。调用NdbTransaction::execute()
方法时,该操作会将一个元组写入表中。如果元组已存在,则更新它;否则进行插入。- 签名
virtual int writeTuple ( void )
- 参数
无.
- 返回值
成功返回
0
,失败返回-1
。