1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include <ydb/core/scheme/scheme_tablecell.h>
#include <ydb/core/scheme/scheme_type_registry.h>
#include <util/string/escape.h>
namespace NKikimr {
void TOwnedCellVec::TData::operator delete(void* mem) {
::free(mem);
}
TOwnedCellVec::TInit TOwnedCellVec::Allocate(TOwnedCellVec::TCellVec cells) {
size_t cellCount = cells.size();
if (cellCount == 0) {
// Leave the data field empty
return TInit{
TCellVec(),
nullptr,
0,
};
}
size_t size = sizeof(TData) + sizeof(TCell) * cellCount;
for (auto& x : cells) {
if (!x.IsNull() && !x.IsInline()) {
const size_t xsz = x.Size();
size += AlignUp(xsz);
}
}
void* mem = ::malloc(size);
TCell* ptrCell = (TCell*)((TData*)mem + 1);
char* ptrData = (char*)(ptrCell + cellCount);
TConstArrayRef<TCell> cellvec(ptrCell, ptrCell + cellCount);
for (auto& x : cells) {
if (x.IsNull()) {
new (ptrCell) TCell();
} else if (x.IsInline()) {
new (ptrCell) TCell(x);
} else {
const size_t cellSize = x.Size();
if (Y_LIKELY(cellSize > 0)) {
::memcpy(ptrData, x.Data(), cellSize);
}
new (ptrCell) TCell(ptrData, cellSize);
ptrData += AlignUp(cellSize);
}
++ptrCell;
}
return TInit {
cellvec,
new (mem) TData(),
size,
};
}
TString DbgPrintCell(const TCell& r, NScheme::TTypeId typeId, const NScheme::TTypeRegistry ®) {
NScheme::ITypeSP t = reg.GetType(typeId);
if (!t.IsKnownType())
return Sprintf("Unknow typeId 0x%x", (ui32)typeId);
TString res = t->GetName();
res += " : ";
DbgPrintValue(res, r, typeId);
return res;
}
void DbgPrintValue(TString &res, const TCell &r, ui32 type) {
if (r.IsNull()) {
res += "NULL";
} else {
switch (type) {
case NScheme::NTypeIds::Bool:
res += r.AsValue<bool>() ? "true" : "false";
break;
case NScheme::NTypeIds::Byte:
res += ToString(r.AsValue<ui8>());
break;
case NScheme::NTypeIds::Int32:
res += ToString(r.AsValue<i32>());
break;
case NScheme::NTypeIds::Uint32:
res += ToString(r.AsValue<ui32>());
break;
case NScheme::NTypeIds::Int64:
res += ToString(r.AsValue<i64>());
break;
case NScheme::NTypeIds::Uint64:
res += ToString(r.AsValue<ui64>());
break;
case NScheme::NTypeIds::Float:
res += ToString(r.AsValue<float>());
break;
case NScheme::NTypeIds::Double:
res += ToString(r.AsValue<double>());
break;
case NScheme::NTypeIds::ActorId:
res += ToString(r.AsValue<TActorId>());
break;
default:
res += EscapeC(r.Data(), r.Size());
}
}
}
TString DbgPrintTuple(const TDbTupleRef& row, const NScheme::TTypeRegistry& typeRegistry) {
TString res = "(";
for (ui32 i = 0; i < row.ColumnCount; ++i) {
res += DbgPrintCell(row.Columns[i], row.Types[i], typeRegistry);
if (i < row.ColumnCount-1)
res += ", ";
}
res += ")";
return res;
}
} // namespace NKikimr
|