chore: Use string to access SQLite columns (#1535)

* use string to access field name

* Update DEVGMCommands.cpp

* corrected column name

* constexpr array

include <array>

Revert "constexpr array"

This reverts commit 1492e8b1773ed5fbbe767c74466ca263178ecdd4.

Revert "include <array>"

This reverts commit 2b7a67e89ad673d420f496be97f9bc51fd2d5e59.

include <array>

constexpr array

---------

Co-authored-by: jadebenn <jonahbenn@yahoo.com>
This commit is contained in:
David Markowitz 2024-04-13 21:41:51 -07:00 committed by GitHub
parent 3a6123fe36
commit 5049f215ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 67 additions and 62 deletions

View File

@ -536,13 +536,13 @@ void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID
uint32_t FindCharShirtID(uint32_t shirtColor, uint32_t shirtStyle) { uint32_t FindCharShirtID(uint32_t shirtColor, uint32_t shirtStyle) {
try { try {
auto stmt = CDClientDatabase::CreatePreppedStmt( auto stmt = CDClientDatabase::CreatePreppedStmt(
"select obj.id from Objects as obj JOIN (select * from ComponentsRegistry as cr JOIN ItemComponent as ic on ic.id = cr.component_id where cr.component_type == 11) as icc on icc.id = obj.id where lower(obj._internalNotes) == ? AND icc.color1 == ? AND icc.decal == ?" "select obj.id as objectId from Objects as obj JOIN (select * from ComponentsRegistry as cr JOIN ItemComponent as ic on ic.id = cr.component_id where cr.component_type == 11) as icc on icc.id = obj.id where lower(obj._internalNotes) == ? AND icc.color1 == ? AND icc.decal == ?"
); );
stmt.bind(1, "character create shirt"); stmt.bind(1, "character create shirt");
stmt.bind(2, static_cast<int>(shirtColor)); stmt.bind(2, static_cast<int>(shirtColor));
stmt.bind(3, static_cast<int>(shirtStyle)); stmt.bind(3, static_cast<int>(shirtStyle));
auto tableData = stmt.execQuery(); auto tableData = stmt.execQuery();
auto shirtLOT = tableData.getIntField(0, 4069); auto shirtLOT = tableData.getIntField("objectId", 4069);
tableData.finalize(); tableData.finalize();
return shirtLOT; return shirtLOT;
} catch (const std::exception& ex) { } catch (const std::exception& ex) {
@ -555,12 +555,12 @@ uint32_t FindCharShirtID(uint32_t shirtColor, uint32_t shirtStyle) {
uint32_t FindCharPantsID(uint32_t pantsColor) { uint32_t FindCharPantsID(uint32_t pantsColor) {
try { try {
auto stmt = CDClientDatabase::CreatePreppedStmt( auto stmt = CDClientDatabase::CreatePreppedStmt(
"select obj.id from Objects as obj JOIN (select * from ComponentsRegistry as cr JOIN ItemComponent as ic on ic.id = cr.component_id where cr.component_type == 11) as icc on icc.id = obj.id where lower(obj._internalNotes) == ? AND icc.color1 == ?" "select obj.id as objectId from Objects as obj JOIN (select * from ComponentsRegistry as cr JOIN ItemComponent as ic on ic.id = cr.component_id where cr.component_type == 11) as icc on icc.id = obj.id where lower(obj._internalNotes) == ? AND icc.color1 == ?"
); );
stmt.bind(1, "cc pants"); stmt.bind(1, "cc pants");
stmt.bind(2, static_cast<int>(pantsColor)); stmt.bind(2, static_cast<int>(pantsColor));
auto tableData = stmt.execQuery(); auto tableData = stmt.execQuery();
auto pantsLOT = tableData.getIntField(0, 2508); auto pantsLOT = tableData.getIntField("objectId", 2508);
tableData.finalize(); tableData.finalize();
return pantsLOT; return pantsLOT;
} catch (const std::exception& ex) { } catch (const std::exception& ex) {

View File

@ -377,10 +377,10 @@ void Behavior::PlayFx(std::u16string type, const LWOOBJID target, const LWOOBJID
return; return;
} }
const auto name = std::string(result.getStringField(0)); const auto name = std::string(result.getStringField("effectName"));
if (type.empty()) { if (type.empty()) {
const auto typeResult = result.getStringField(1); const auto typeResult = result.getStringField("effectType");
type = GeneralUtils::ASCIIToUTF16(typeResult); type = GeneralUtils::ASCIIToUTF16(typeResult);

View File

@ -47,11 +47,11 @@ void SwitchMultipleBehavior::Load() {
auto result = query.execQuery(); auto result = query.execQuery();
while (!result.eof()) { while (!result.eof()) {
const auto behavior_id = static_cast<uint32_t>(result.getFloatField(1)); const auto behavior_id = static_cast<uint32_t>(result.getFloatField("behavior"));
auto* behavior = CreateBehavior(behavior_id); auto* behavior = CreateBehavior(behavior_id);
auto value = result.getFloatField(2); auto value = result.getFloatField("value");
this->m_behaviors.emplace_back(value, behavior); this->m_behaviors.emplace_back(value, behavior);

View File

@ -45,20 +45,20 @@ BaseCombatAIComponent::BaseCombatAIComponent(Entity* parent, const uint32_t id):
auto componentResult = componentQuery.execQuery(); auto componentResult = componentQuery.execQuery();
if (!componentResult.eof()) { if (!componentResult.eof()) {
if (!componentResult.fieldIsNull(0)) if (!componentResult.fieldIsNull("aggroRadius"))
m_AggroRadius = componentResult.getFloatField(0); m_AggroRadius = componentResult.getFloatField("aggroRadius");
if (!componentResult.fieldIsNull(1)) if (!componentResult.fieldIsNull("tetherSpeed"))
m_TetherSpeed = componentResult.getFloatField(1); m_TetherSpeed = componentResult.getFloatField("tetherSpeed");
if (!componentResult.fieldIsNull(2)) if (!componentResult.fieldIsNull("pursuitSpeed"))
m_PursuitSpeed = componentResult.getFloatField(2); m_PursuitSpeed = componentResult.getFloatField("pursuitSpeed");
if (!componentResult.fieldIsNull(3)) if (!componentResult.fieldIsNull("softTetherRadius"))
m_SoftTetherRadius = componentResult.getFloatField(3); m_SoftTetherRadius = componentResult.getFloatField("softTetherRadius");
if (!componentResult.fieldIsNull(4)) if (!componentResult.fieldIsNull("hardTetherRadius"))
m_HardTetherRadius = componentResult.getFloatField(4); m_HardTetherRadius = componentResult.getFloatField("hardTetherRadius");
} }
componentResult.finalize(); componentResult.finalize();
@ -82,11 +82,11 @@ BaseCombatAIComponent::BaseCombatAIComponent(Entity* parent, const uint32_t id):
auto result = skillQuery.execQuery(); auto result = skillQuery.execQuery();
while (!result.eof()) { while (!result.eof()) {
const auto skillId = static_cast<uint32_t>(result.getIntField(0)); const auto skillId = static_cast<uint32_t>(result.getIntField("skillID"));
const auto abilityCooldown = static_cast<float>(result.getFloatField(1)); const auto abilityCooldown = static_cast<float>(result.getFloatField("cooldown"));
const auto behaviorId = static_cast<uint32_t>(result.getIntField(2)); const auto behaviorId = static_cast<uint32_t>(result.getIntField("behaviorID"));
auto* behavior = Behavior::CreateBehavior(behaviorId); auto* behavior = Behavior::CreateBehavior(behaviorId);

View File

@ -450,7 +450,7 @@ const std::vector<BuffParameter>& BuffComponent::GetBuffParameters(int32_t buffI
param.value = result.getFloatField("NumberValue"); param.value = result.getFloatField("NumberValue");
param.effectId = result.getIntField("EffectID"); param.effectId = result.getIntField("EffectID");
if (!result.fieldIsNull(3)) { if (!result.fieldIsNull("StringValue")) {
std::istringstream stream(result.getStringField("StringValue")); std::istringstream stream(result.getStringField("StringValue"));
std::string token; std::string token;

View File

@ -389,9 +389,9 @@ void DestroyableComponent::AddFaction(const int32_t factionID, const bool ignore
if (result.eof()) return; if (result.eof()) return;
if (result.fieldIsNull(0)) return; if (result.fieldIsNull("enemyList")) return;
const auto* list_string = result.getStringField(0); const auto* list_string = result.getStringField("enemyList");
std::stringstream ss(list_string); std::stringstream ss(list_string);
std::string token; std::string token;

View File

@ -1094,7 +1094,7 @@ void InventoryComponent::CheckItemSet(const LOT lot) {
auto result = query.execQuery(); auto result = query.execQuery();
while (!result.eof()) { while (!result.eof()) {
const auto id = result.getIntField(0); const auto id = result.getIntField("setID");
bool found = false; bool found = false;

View File

@ -466,8 +466,8 @@ bool MissionComponent::RequiresItem(const LOT lot) {
return false; return false;
} }
if (!result.fieldIsNull(0)) { if (!result.fieldIsNull("type")) {
const auto type = std::string(result.getStringField(0)); const auto type = std::string(result.getStringField("type"));
result.finalize(); result.finalize();

View File

@ -188,20 +188,20 @@ void PetComponent::OnUse(Entity* originator) {
return; return;
} }
if (result.fieldIsNull(0)) { if (result.fieldIsNull("ValidPiecesLXF")) {
result.finalize(); result.finalize();
return; return;
} }
buildFile = std::string(result.getStringField(0)); buildFile = std::string(result.getStringField("ValidPiecesLXF"));
PetPuzzleData data; PetPuzzleData data;
data.buildFile = buildFile; data.buildFile = buildFile;
data.puzzleModelLot = result.getIntField(1); data.puzzleModelLot = result.getIntField("PuzzleModelLot");
data.timeLimit = result.getFloatField(2); data.timeLimit = result.getFloatField("Timelimit");
data.numValidPieces = result.getIntField(3); data.numValidPieces = result.getIntField("NumValidPieces");
data.imaginationCost = result.getIntField(4); data.imaginationCost = result.getIntField("imagCostPerBuild");
if (data.timeLimit <= 0) data.timeLimit = 60; if (data.timeLimit <= 0) data.timeLimit = 60;
imaginationCost = data.imaginationCost; imaginationCost = data.imaginationCost;

View File

@ -18,8 +18,8 @@ PossessableComponent::PossessableComponent(Entity* parent, uint32_t componentId)
// Should a result not exist for this default to attached visible // Should a result not exist for this default to attached visible
if (!result.eof()) { if (!result.eof()) {
m_PossessionType = static_cast<ePossessionType>(result.getIntField(0, 1)); // Default to Attached Visible m_PossessionType = static_cast<ePossessionType>(result.getIntField("possessionType", 1)); // Default to Attached Visible
m_DepossessOnHit = static_cast<bool>(result.getIntField(1, 0)); m_DepossessOnHit = static_cast<bool>(result.getIntField("depossessOnHit", 0));
} else { } else {
m_PossessionType = ePossessionType::ATTACHED_VISIBLE; m_PossessionType = ePossessionType::ATTACHED_VISIBLE;
m_DepossessOnHit = false; m_DepossessOnHit = false;

View File

@ -49,11 +49,11 @@ PropertyManagementComponent::PropertyManagementComponent(Entity* parent) : Compo
auto result = query.execQuery(); auto result = query.execQuery();
if (result.eof() || result.fieldIsNull(0)) { if (result.eof() || result.fieldIsNull("id")) {
return; return;
} }
templateId = result.getIntField(0); templateId = result.getIntField("id");
auto propertyInfo = Database::Get()->GetPropertyInfo(zoneId, cloneId); auto propertyInfo = Database::Get()->GetPropertyInfo(zoneId, cloneId);
@ -105,7 +105,7 @@ std::vector<NiPoint3> PropertyManagementComponent::GetPaths() const {
std::vector<float> points; std::vector<float> points;
std::istringstream stream(result.getStringField(0)); std::istringstream stream(result.getStringField("path"));
std::string token; std::string token;
while (std::getline(stream, token, ' ')) { while (std::getline(stream, token, ' ')) {

View File

@ -117,7 +117,7 @@ void RenderComponent::PlayEffect(const int32_t effectId, const std::u16string& e
auto result = query.execQuery(); auto result = query.execQuery();
if (result.eof() || result.fieldIsNull(0)) { if (result.eof() || result.fieldIsNull("animation_length")) {
result.finalize(); result.finalize();
m_DurationCache[effectId] = 0; m_DurationCache[effectId] = 0;
@ -127,7 +127,7 @@ void RenderComponent::PlayEffect(const int32_t effectId, const std::u16string& e
return; return;
} }
effect.time = static_cast<float>(result.getFloatField(0)); effect.time = static_cast<float>(result.getFloatField("animation_length"));
result.finalize(); result.finalize();

View File

@ -27,12 +27,12 @@ RocketLaunchpadControlComponent::RocketLaunchpadControlComponent(Entity* parent,
auto result = query.execQuery(); auto result = query.execQuery();
if (!result.eof() && !result.fieldIsNull(0)) { if (!result.eof() && !result.fieldIsNull("targetZone")) {
m_TargetZone = result.getIntField(0); m_TargetZone = result.getIntField("targetZone");
m_DefaultZone = result.getIntField(1); m_DefaultZone = result.getIntField("defaultZoneID");
m_TargetScene = result.getStringField(2); m_TargetScene = result.getStringField("targetScene");
m_AltPrecondition = new PreconditionExpression(result.getStringField(3)); m_AltPrecondition = new PreconditionExpression(result.getStringField("altLandingPrecondition"));
m_AltLandingScene = result.getStringField(4); m_AltLandingScene = result.getStringField("altLandingSpawnPointName");
} }
result.finalize(); result.finalize();

View File

@ -99,7 +99,7 @@ void SkillComponent::SyncPlayerProjectile(const LWOOBJID projectileId, RakNet::B
return; return;
} }
const auto behavior_id = static_cast<uint32_t>(result.getIntField(0)); const auto behavior_id = static_cast<uint32_t>(result.getIntField("behaviorID"));
result.finalize(); result.finalize();
@ -425,7 +425,7 @@ void SkillComponent::SyncProjectileCalculation(const ProjectileSyncEntry& entry)
return; return;
} }
const auto behaviorId = static_cast<uint32_t>(result.getIntField(0)); const auto behaviorId = static_cast<uint32_t>(result.getIntField("behaviorID"));
result.finalize(); result.finalize();

View File

@ -405,18 +405,18 @@ void Item::DisassembleModel(uint32_t numToDismantle) {
auto result = query.execQuery(); auto result = query.execQuery();
if (result.eof() || result.fieldIsNull(0)) { if (result.eof() || result.fieldIsNull("render_asset")) {
return; return;
} }
std::string renderAsset = std::string(result.getStringField(0)); std::string renderAsset = std::string(result.getStringField("render_asset"));
// normalize path slashes // normalize path slashes
for (auto& c : renderAsset) { for (auto& c : renderAsset) {
if (c == '\\') c = '/'; if (c == '\\') c = '/';
} }
std::string lxfmlFolderName = std::string(result.getStringField(1)); std::string lxfmlFolderName = std::string(result.getStringField("LXFMLFolder"));
if (!lxfmlFolderName.empty()) lxfmlFolderName.insert(0, "/"); if (!lxfmlFolderName.empty()) lxfmlFolderName.insert(0, "/");
std::vector<std::string> renderAssetSplit = GeneralUtils::SplitString(renderAsset, '/'); std::vector<std::string> renderAssetSplit = GeneralUtils::SplitString(renderAsset, '/');

View File

@ -8,10 +8,13 @@
#include "MissionComponent.h" #include "MissionComponent.h"
#include "eMissionTaskType.h" #include "eMissionTaskType.h"
#include <algorithm> #include <algorithm>
#include <array>
#include "CDSkillBehaviorTable.h" #include "CDSkillBehaviorTable.h"
ItemSet::ItemSet(const uint32_t id, InventoryComponent* inventoryComponent) { ItemSet::ItemSet(const uint32_t id, InventoryComponent* inventoryComponent) {
using namespace std::string_view_literals;
this->m_ID = id; this->m_ID = id;
this->m_InventoryComponent = inventoryComponent; this->m_InventoryComponent = inventoryComponent;
@ -27,14 +30,16 @@ ItemSet::ItemSet(const uint32_t id, InventoryComponent* inventoryComponent) {
return; return;
} }
for (auto i = 0; i < 5; ++i) { constexpr std::array rowNames = { "skillSetWith2"sv, "skillSetWith3"sv, "skillSetWith4"sv, "skillSetWith5"sv, "skillSetWith6"sv };
if (result.fieldIsNull(i)) { for (auto i = 0; i < rowNames.size(); ++i) {
const auto rowName = rowNames[i];
if (result.fieldIsNull(rowName.data())) {
continue; continue;
} }
auto skillQuery = CDClientDatabase::CreatePreppedStmt( auto skillQuery = CDClientDatabase::CreatePreppedStmt(
"SELECT SkillID FROM ItemSetSkills WHERE SkillSetID = ?;"); "SELECT SkillID FROM ItemSetSkills WHERE SkillSetID = ?;");
skillQuery.bind(1, result.getIntField(i)); skillQuery.bind(1, result.getIntField(rowName.data()));
auto skillResult = skillQuery.execQuery(); auto skillResult = skillQuery.execQuery();
@ -43,13 +48,13 @@ ItemSet::ItemSet(const uint32_t id, InventoryComponent* inventoryComponent) {
} }
while (!skillResult.eof()) { while (!skillResult.eof()) {
if (skillResult.fieldIsNull(0)) { if (skillResult.fieldIsNull("SkillID")) {
skillResult.nextRow(); skillResult.nextRow();
continue; continue;
} }
const auto skillId = skillResult.getIntField(0); const auto skillId = skillResult.getIntField("SkillID");
switch (i) { switch (i) {
case 0: case 0:
@ -75,7 +80,7 @@ ItemSet::ItemSet(const uint32_t id, InventoryComponent* inventoryComponent) {
} }
} }
std::string ids = result.getStringField(5); std::string ids = result.getStringField("itemIDs");
ids.erase(std::remove_if(ids.begin(), ids.end(), ::isspace), ids.end()); ids.erase(std::remove_if(ids.begin(), ids.end(), ::isspace), ids.end());

View File

@ -33,10 +33,10 @@ Precondition::Precondition(const uint32_t condition) {
return; return;
} }
this->type = static_cast<PreconditionType>(result.fieldIsNull(0) ? 0 : result.getIntField(0)); this->type = static_cast<PreconditionType>(result.fieldIsNull("type") ? 0 : result.getIntField("type"));
if (!result.fieldIsNull(1)) { if (!result.fieldIsNull("targetLOT")) {
std::istringstream stream(result.getStringField(1)); std::istringstream stream(result.getStringField("targetLOT"));
std::string token; std::string token;
while (std::getline(stream, token, ',')) { while (std::getline(stream, token, ',')) {
@ -45,7 +45,7 @@ Precondition::Precondition(const uint32_t condition) {
} }
} }
this->count = result.fieldIsNull(2) ? 1 : result.getIntField(2); this->count = result.fieldIsNull("targetCount") ? 1 : result.getIntField("targetCount");
result.finalize(); result.finalize();
} }

View File

@ -704,7 +704,7 @@ namespace DEVGMCommands {
auto tables = query.execQuery(); auto tables = query.execQuery();
while (!tables.eof()) { while (!tables.eof()) {
std::string message = std::to_string(tables.getIntField(0)) + " - " + tables.getStringField(1); std::string message = std::to_string(tables.getIntField("id")) + " - " + tables.getStringField("name");
ChatPackets::SendSystemMessage(sysAddr, GeneralUtils::UTF8ToUTF16(message, message.size())); ChatPackets::SendSystemMessage(sysAddr, GeneralUtils::UTF8ToUTF16(message, message.size()));
tables.nextRow(); tables.nextRow();
} }