Kudu C++ client API
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
partial_row.h
1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements. See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership. The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
16 // under the License.
17 #ifndef KUDU_COMMON_PARTIAL_ROW_H
18 #define KUDU_COMMON_PARTIAL_ROW_H
19 
20 // NOTE: using stdint.h instead of cstdint because this file is supposed
21 // to be processed by a compiler lacking C++11 support.
22 #include <stdint.h>
23 
24 #include <string>
25 
26 #ifdef KUDU_HEADERS_NO_STUBS
27 #include <gtest/gtest_prod.h>
28 
29 #include "kudu/gutil/port.h"
30 #else
31 // This is a poor module interdependency, but the stubs are header-only and
32 // it's only for exported header builds, so we'll make an exception.
33 #include "kudu/client/stubs.h"
34 #endif
35 
36 #include "kudu/util/kudu_export.h"
37 #include "kudu/util/status.h"
38 #include "kudu/util/slice.h"
39 
41 namespace kudu {
42 class ColumnSchema;
43 namespace client {
44 class KuduWriteOperation;
45 template<typename KeyTypeWrapper> struct SliceKeysTestSetup;// IWYU pragma: keep
46 template<typename KeyTypeWrapper> struct IntKeysTestSetup; // IWYU pragma: keep
47 } // namespace client
48 
49 namespace tablet {
50  template<typename KeyTypeWrapper> struct SliceTypeRowOps; // IWYU pragma: keep
51  template<typename KeyTypeWrapper> struct NumTypeRowOps; // IWYU pragma: keep
52 } // namespace tablet
53 
55 
56 class Schema;
57 
63 class KUDU_EXPORT KuduPartialRow {
64  public:
68  explicit KuduPartialRow(const Schema* schema);
69 
70  virtual ~KuduPartialRow();
71 
76  KuduPartialRow(const KuduPartialRow& other);
77 
83  KuduPartialRow& operator=(KuduPartialRow other);
84 
96  Status SetBool(const Slice& col_name, bool val) WARN_UNUSED_RESULT;
97 
98  Status SetInt8(const Slice& col_name, int8_t val) WARN_UNUSED_RESULT;
99  Status SetInt16(const Slice& col_name, int16_t val) WARN_UNUSED_RESULT;
100  Status SetInt32(const Slice& col_name, int32_t val) WARN_UNUSED_RESULT;
101  Status SetInt64(const Slice& col_name, int64_t val) WARN_UNUSED_RESULT;
102  Status SetUnixTimeMicros(const Slice& col_name,
103  int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
104 
105  Status SetFloat(const Slice& col_name, float val) WARN_UNUSED_RESULT;
106  Status SetDouble(const Slice& col_name, double val) WARN_UNUSED_RESULT;
108 
125  Status SetBool(int col_idx, bool val) WARN_UNUSED_RESULT;
126 
127  Status SetInt8(int col_idx, int8_t val) WARN_UNUSED_RESULT;
128  Status SetInt16(int col_idx, int16_t val) WARN_UNUSED_RESULT;
129  Status SetInt32(int col_idx, int32_t val) WARN_UNUSED_RESULT;
130  Status SetInt64(int col_idx, int64_t val) WARN_UNUSED_RESULT;
131  Status SetUnixTimeMicros(int col_idx, int64_t micros_since_utc_epoch) WARN_UNUSED_RESULT;
132 
133  Status SetFloat(int col_idx, float val) WARN_UNUSED_RESULT;
134  Status SetDouble(int col_idx, double val) WARN_UNUSED_RESULT;
136 
154  Status SetBinary(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
155  Status SetString(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
157 
180  Status SetBinary(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
181  Status SetString(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
183 
196  Status SetBinaryCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
197  Status SetStringCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
199 
217  Status SetStringCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
218  Status SetBinaryCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
220 
238  Status SetBinaryNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
239  Status SetStringNoCopy(const Slice& col_name, const Slice& val) WARN_UNUSED_RESULT;
241 
264  Status SetBinaryNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
265  Status SetStringNoCopy(int col_idx, const Slice& val) WARN_UNUSED_RESULT;
267 
276  Status SetNull(const Slice& col_name) WARN_UNUSED_RESULT;
277 
286  Status SetNull(int col_idx) WARN_UNUSED_RESULT;
287 
295  Status Unset(const Slice& col_name) WARN_UNUSED_RESULT;
296 
304  Status Unset(int col_idx) WARN_UNUSED_RESULT;
305 
311  bool IsColumnSet(const Slice& col_name) const;
312 
318  bool IsColumnSet(int col_idx) const;
319 
325  bool IsNull(const Slice& col_name) const;
326 
332  bool IsNull(int col_idx) const;
333 
345  Status GetBool(const Slice& col_name, bool* val) const WARN_UNUSED_RESULT;
346 
347  Status GetInt8(const Slice& col_name, int8_t* val) const WARN_UNUSED_RESULT;
348  Status GetInt16(const Slice& col_name, int16_t* val) const WARN_UNUSED_RESULT;
349  Status GetInt32(const Slice& col_name, int32_t* val) const WARN_UNUSED_RESULT;
350  Status GetInt64(const Slice& col_name, int64_t* val) const WARN_UNUSED_RESULT;
351  Status GetUnixTimeMicros(const Slice& col_name,
352  int64_t* micros_since_utc_epoch) const WARN_UNUSED_RESULT;
353 
354  Status GetFloat(const Slice& col_name, float* val) const WARN_UNUSED_RESULT;
355  Status GetDouble(const Slice& col_name, double* val) const WARN_UNUSED_RESULT;
357 
376  Status GetBool(int col_idx, bool* val) const WARN_UNUSED_RESULT;
377 
378  Status GetInt8(int col_idx, int8_t* val) const WARN_UNUSED_RESULT;
379  Status GetInt16(int col_idx, int16_t* val) const WARN_UNUSED_RESULT;
380  Status GetInt32(int col_idx, int32_t* val) const WARN_UNUSED_RESULT;
381  Status GetInt64(int col_idx, int64_t* val) const WARN_UNUSED_RESULT;
382  Status GetUnixTimeMicros(int col_idx, int64_t* micros_since_utc_epoch) const WARN_UNUSED_RESULT;
383 
384  Status GetFloat(int col_idx, float* val) const WARN_UNUSED_RESULT;
385  Status GetDouble(int col_idx, double* val) const WARN_UNUSED_RESULT;
387 
405  Status GetString(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
406  Status GetBinary(const Slice& col_name, Slice* val) const WARN_UNUSED_RESULT;
408 
430  Status GetString(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
431  Status GetBinary(int col_idx, Slice* val) const WARN_UNUSED_RESULT;
433 
434  //------------------------------------------------------------
435  // Key-encoding related functions
436  //------------------------------------------------------------
437 
449  Status EncodeRowKey(std::string* encoded_key) const;
450 
457  std::string ToEncodedRowKeyOrDie() const;
458 
459  //------------------------------------------------------------
460  // Utility code
461  //------------------------------------------------------------
462 
465  bool IsKeySet() const;
466 
468  bool AllColumnsSet() const;
469 
475  std::string ToString() const;
476 
478  const Schema* schema() const { return schema_; }
479 
480  private:
481  friend class client::KuduWriteOperation; // for row_data_.
482  friend class KeyUtilTest;
483  friend class PartitionSchema;
484  friend class RowOperationsPBDecoder;
485  friend class RowOperationsPBEncoder;
486  friend class TestScanSpec;
487  template<typename KeyTypeWrapper> friend struct client::SliceKeysTestSetup;
488  template<typename KeyTypeWrapper> friend struct client::IntKeysTestSetup;
489  template<typename KeyTypeWrapper> friend struct tablet::SliceTypeRowOps;
490  template<typename KeyTypeWrapper> friend struct tablet::NumTypeRowOps;
491  FRIEND_TEST(PartitionPrunerTest, TestPrimaryKeyRangePruning);
492  FRIEND_TEST(PartitionPrunerTest, TestPartialPrimaryKeyRangePruning);
493 
494  template<typename T>
495  Status Set(const Slice& col_name, const typename T::cpp_type& val,
496  bool owned = false);
497 
498  template<typename T>
499  Status Set(int col_idx, const typename T::cpp_type& val,
500  bool owned = false);
501 
502  // Runtime version of the generic setter.
503  Status Set(int32_t column_idx, const uint8_t* val);
504 
505  template<typename T>
506  Status Get(const Slice& col_name, typename T::cpp_type* val) const;
507 
508  template<typename T>
509  Status Get(int col_idx, typename T::cpp_type* val) const;
510 
511  template<typename T>
512  Status SetSliceCopy(const Slice& col_name, const Slice& val);
513 
514  template<typename T>
515  Status SetSliceCopy(int col_idx, const Slice& val);
516 
517  // If the given column is a variable length column whose memory is owned by this instance,
518  // deallocates the value.
519  // NOTE: Does not mutate the isset bitmap.
520  // REQUIRES: col_idx must be a variable length column.
521  void DeallocateStringIfSet(int col_idx, const ColumnSchema& col);
522 
523  // Deallocate any string/binary values whose memory is managed by this object.
524  void DeallocateOwnedStrings();
525 
526  const Schema* schema_;
527 
528  // 1-bit set for any field which has been explicitly set. This is distinct
529  // from NULL -- an "unset" field will take the server-side default on insert,
530  // whereas a field explicitly set to NULL will override the default.
531  uint8_t* isset_bitmap_;
532 
533  // 1-bit set for any variable length columns whose memory is managed by this instance.
534  // These strings need to be deallocated whenever the value is reset,
535  // or when the instance is destructed.
536  uint8_t* owned_strings_bitmap_;
537 
538  // The normal "contiguous row" format row data. Any column whose data is unset
539  // or NULL can have undefined bytes.
540  uint8_t* row_data_;
541 };
542 
543 } // namespace kudu
544 #endif /* KUDU_COMMON_PARTIAL_ROW_H */
const Schema * schema() const
Definition: partial_row.h:478
A row which may only contain values for a subset of the columns.
Definition: partial_row.h:63