Skip to content

Commit 81795af

Browse files
committed
Result object keys are no longer ordered alphabetically, but rather maintain insertion order. The behaviour now matches other libraries.
1 parent c60d3de commit 81795af

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

.changeset/selfish-worms-buy.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@journeyapps/react-native-quick-sqlite": patch
3+
---
4+
5+
Result object keys are no longer ordered alphabetically, but rather maintain insertion order. The behaviour now matches other libraries.

cpp/JSIHelper.cpp

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -143,48 +143,48 @@ jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SQLiteOPResult sta
143143
// Converting row results into objects
144144
size_t rowCount = results->size();
145145
jsi::Object rows = jsi::Object(rt);
146-
if (rowCount > 0)
146+
if (rowCount > 0 && metadata != NULL)
147147
{
148148
auto array = jsi::Array(rt, rowCount);
149149
for (int i = 0; i < rowCount; i++)
150150
{
151-
jsi::Object rowObject = jsi::Object(rt);
152-
auto row = results->at(i);
153-
for (auto const &entry : row)
154-
{
155-
std::string columnName = entry.first;
156-
QuickValue value = entry.second;
157-
if (value.dataType == TEXT)
158-
{
159-
// using value.textValue (std::string) directly allows jsi::String to use length property of std::string (allowing strings with NULLs in them like SQLite does)
160-
rowObject.setProperty(rt, columnName.c_str(), jsi::String::createFromUtf8(rt, value.textValue));
161-
}
162-
else if (value.dataType == INTEGER)
163-
{
164-
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue));
165-
}
166-
else if (value.dataType == DOUBLE)
151+
jsi::Object rowObject = jsi::Object(rt);
152+
auto row = results -> at(i);
153+
// Iterate over metadata to maintain column order
154+
for (const auto & column: * metadata)
167155
{
168-
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue));
156+
std::string columnName = column.colunmName;
157+
auto it = row.find(columnName);
158+
if (it != row.end())
159+
{
160+
QuickValue value = it -> second;
161+
if (value.dataType == TEXT)
162+
{
163+
rowObject.setProperty(rt, columnName.c_str(), jsi::String::createFromUtf8(rt, value.textValue));
164+
} else if (value.dataType == INTEGER || value.dataType == DOUBLE)
165+
{
166+
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue));
167+
} else if (value.dataType == ARRAY_BUFFER)
168+
{
169+
jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
170+
jsi::Object o = array_buffer_ctor.callAsConstructor(rt, (int) value.arrayBufferSize).getObject(rt);
171+
jsi::ArrayBuffer buf = o.getArrayBuffer(rt);
172+
// It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564.
173+
memcpy(buf.data(rt), value.arrayBufferValue.get(), value.arrayBufferSize);
174+
rowObject.setProperty(rt, columnName.c_str(), o);
175+
} else
176+
{
177+
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(nullptr));
178+
}
179+
} else
180+
{
181+
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(nullptr));
182+
}
169183
}
170-
else if (value.dataType == ARRAY_BUFFER)
171-
{
172-
jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
173-
jsi::Object o = array_buffer_ctor.callAsConstructor(rt, (int)value.arrayBufferSize).getObject(rt);
174-
jsi::ArrayBuffer buf = o.getArrayBuffer(rt);
175-
// It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564.
176-
memcpy(buf.data(rt), value.arrayBufferValue.get(), value.arrayBufferSize);
177-
rowObject.setProperty(rt, columnName.c_str(), o);
178-
}
179-
else
180-
{
181-
rowObject.setProperty(rt, columnName.c_str(), jsi::Value(nullptr));
182-
}
183-
}
184-
array.setValueAtIndex(rt, i, move(rowObject));
184+
array.setValueAtIndex(rt, i, std::move(rowObject));
185185
}
186-
rows.setProperty(rt, "_array", move(array));
187-
res.setProperty(rt, "rows", move(rows));
186+
rows.setProperty(rt, "_array", std::move(array));
187+
res.setProperty(rt, "rows", std::move(rows));
188188
}
189189

190190
if(metadata != NULL)

0 commit comments

Comments
 (0)