本節提供有關 NdbOperation
類別的資訊。
從 NDB 8.0.30 開始,NdbOperation
支援與 NdbInterpretedCode
實作類似的解譯程式碼 API。如需更多資訊,請參閱 NdbOperation 解譯程式碼 API。
- 父類別
無
- 子類別
- 描述
NdbOperation
表示「「通用」」資料操作。其子類別表示更特定類型的操作。如需操作類型及其對應的NdbOperation
子類別清單,請參閱 NdbOperation::Type。- 方法
-
下表列出此類別的公用方法以及每個方法的用途或用法
表 2.49 NdbOperation 類別方法和描述
此類別沒有公用建構函式。若要建立
NdbOperation
的執行個體,您必須使用NdbTransaction::getNdbOperation()
。 - 類型
-
NdbOperation
類別定義了三個公用類型,如下表所示表 2.50 NdbOperation 類別類型與描述
名稱 描述 AbortOption
決定失敗的操作是否導致其所屬的交易失敗 LockMode
執行讀取操作時使用的鎖定類型 Type
操作存取類型
如需更多有關 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;
位元式邏輯比較。 這些比較類型僅支援位元欄位類型,且可用於測試位元欄位欄位與位元模式。傳入的值是一個位元遮罩,會與欄位資料執行位元式 AND 運算。位元欄位會以 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 的欄位值。
-
遮罩
要與欄位值比較的位元遮罩。
-
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 的欄位值。
-
遮罩
要與欄位值比較的位元遮罩。
-
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 的欄位值。
-
遮罩
要與欄位值比較的位元遮罩。
-
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 的欄位值。
-
遮罩
要與欄位值比較的位元遮罩。
-
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 )
- 參數
-
子常式編號
子常式的編號。
-
- 傳回值
成功則傳回 0,否則傳回 -1。
- 描述
此方法將
NdbOperation
定義為DELETE
運算。當呼叫NdbTransaction::execute()
方法時,此運算會從資料表中刪除一個 Tuple。- 簽名
virtual int deleteTuple ( void )
- 參數
無.
- 傳回值
成功時返回
0
,失敗時返回-1
。
- 描述
-
此方法定義具有相等性的搜尋條件。如果屬性具有給定的值,則條件為真。若要設定多個屬性的搜尋條件,請多次呼叫
equal()
;在這種情況下,必須滿足所有條件才能選取 Tuple。如果屬性的大小固定,則其值必須包含所有位元組。特別是,
Char
值必須填補原生空間。如果屬性的大小可變,則其值必須以 1 或 2 個小端長度位元組開始 (如果其型別為Long*
,則為 2 個)。使用
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 )
- 參數
-
此方法需要兩個參數
-
第一個參數可以是下列其中一項
屬性的
name
(字串)屬性的
id
(不帶正負號的 32 位元整數)
-
第二個參數是要測試的屬性
value
。此值可以是下列 5 種型別的任何一種字串
32 位元整數
不帶正負號的 32 位元整數
64 位元整數
不帶正負號的 64 位元整數
-
- 傳回值
如果發生錯誤,則返回
-1
。
- 描述
此方法用於取代 blob 屬性的
getValue()
或setValue()
。它會建立一個 blob 控制代碼(NdbBlob
物件)。使用相同引數的第二次呼叫會傳回先前建立的控制代碼。此控制代碼會連結到操作,並自動維護。- 簽名
-
此方法有兩種形式,取決於呼叫時使用的是 blob 屬性的名稱還是 ID
virtual NdbBlob* getBlobHandle ( const char* name )
或
virtual NdbBlob* getBlobHandle ( Uint32 id )
- 參數
-
此方法採用單一參數,可以是下列其中之一
屬性的
名稱
屬性的
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
)。它們僅在第一個參數的類型方面有所不同,可以是下列任何一種屬性
名稱
屬性
ID
定義屬性的資料表
欄
在這三種情況下,第二個參數都是一個字元緩衝區,其中會傳回非
NULL
屬性值。如果屬性為NULL
,則只會將其儲存在此方法傳回的NdbRecAttr
物件中。如果在
getValue()
方法呼叫中未指定值
,或如果傳遞 0 作為值,則NdbRecAttr
物件會提供記憶體管理來儲存接收到的資料。如果接收到的資料的最大大小超過小固定大小,則會使用malloc()
來儲存資料:對於小大小,會提供一個小的固定內部緩衝區(範圍為 32 個位元組)。此儲存體由NdbRecAttr
執行個體管理;它會在釋放操作時釋放,例如在交易關閉時;您想要保留的任何寫入此處的資料都應在此記憶體釋放發生之前複製到其他位置。如果您為
值
傳遞非零指標,則假設此指標指向的記憶體部分足以容納資料行的最大值;任何傳回的資料都會寫入該位置。指標應至少為 32 位元對齊。在此方法中,無法使用索引欄來取代資料表欄。在資料表欄不可用的情況下,您可以使用使用
getName()
取得的屬性名稱來代替。 - 傳回值
指向
NdbRecAttr
物件的指標,該物件用於保留屬性的值,或NULL
指標,表示發生錯誤。
擷取整數。可以從作為此方法第二個參數傳遞的 值
緩衝區以及 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 結構的成員名稱、類型和描述
名稱 Type 描述 column
const
Column
*若要指定要讀取的額外值,呼叫者必須提供此值,以及(可選的 NULL
)appStorage
指標。appStorage
void*
如果此指標為 null,則接收到的值會儲存在 NdbRecAttr
物件管理的記憶體中。否則,接收到的值會儲存在指標所指向的位置(並且仍然可以使用NdbRecAttr
物件存取)。重要呼叫者有責任確保滿足以下條件
appStorage
指向足夠的空間來儲存任何返回的資料。在
execute()
呼叫返回之前,不要重複使用或釋放appStorage
指向的記憶體。
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。
- 描述
此方法定義要作為
INSERT
操作的NdbOperation
。當呼叫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 結構的成員名稱、類型和描述
名稱 Type 描述 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
特定於操作的中止選項;只有在預設中止選項行為不令人滿意時才需要。 extraGetValues
GetValueSpec
要讀取的額外欄位值。 numExtraGetValues
Uint32
要讀取的額外欄位值數量。 extraSetValues
SetValueSpec
要設定的額外欄位值。 numExtraSetValues
Uint32
要設定的額外欄位值數量。 partitionId
Uint32
將掃描限制為具有此 ID 的分割區;或者,您可以在此處提供 PartitionSpec
。對於索引掃描,可以為每個範圍提供分割資訊。interpretedCode
NdbInterpretedCode
要作為掃描一部分執行的解譯程式碼。 anyValue
Uint32
要在此操作中使用的 anyValue
。NDB Cluster 複寫使用它來儲存 SQL 節點的伺服器 ID。透過啟動 SQL 節點並使用--server-id-bits
選項(這會導致server_id
中只有部分位元用於唯一識別它)設定為小於 32,其餘位元可用於儲存使用者資料。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。使用此 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
資料結構的資訊。
無法使用 SetValueSpec
設定 Blob 值。
如需詳細資訊,請參閱第 2.3.22 節,「NdbRecord 介面」。
- 描述
將兩個暫存器值的差儲存在第三個暫存器中。
- 簽名
int sub_reg ( Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest )
- 參數
- param
-
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。使用此 ID 或屬性的名稱。
-
RegSource
來源暫存器。
-
- 傳回值
成功時返回 0;否則返回 -1。
- 描述
此方法將
NdbOperation
定義為WRITE
作業。當呼叫NdbTransaction::execute()
方法時,此作業會將元組寫入資料表。如果元組已存在,則會更新它;否則會執行插入。- 簽名
virtual int writeTuple ( void )
- 參數
無.
- 傳回值
成功時返回
0
,失敗時返回-1
。