Solved issue where I couldn't retirever a user record from the database. Didn't correctly set the MYSql type to string.

This commit is contained in:
kdeng00
2019-09-23 21:38:33 -04:00
parent 4bd794c288
commit e936c2da17
2 changed files with 33 additions and 129 deletions
+4 -21
View File
@@ -3,6 +3,7 @@
#include <iostream>
#include <memory>
#include <tuple>
#include "database/BaseRepository.h"
#include "model/Models.h"
@@ -27,30 +28,12 @@ namespace database {
unsigned long usernameLength;
unsigned long passwordLength;
};
struct UserVals
{
/**
std::shared_ptr<char*> firstname;
std::shared_ptr<char*> lastname;
std::shared_ptr<char*> phone;
std::shared_ptr<char*> email;
std::shared_ptr<char*> username;
std::shared_ptr<char*> password;
*/
char firstname[1024];
char lastname[1024];
char phone[1024];
char email[1024];
char username[1024];
char password[1024];
};
std::shared_ptr<MYSQL_BIND> insertUserValues(const model::User&, std::shared_ptr<UserLengths>);
std::shared_ptr<MYSQL_BIND> valueBind(model::User&, std::shared_ptr<UserVals>);
std::shared_ptr<MYSQL_BIND> valueBind(model::User&, UserVals&);
std::shared_ptr<MYSQL_BIND> valueBind(model::User&);
std::shared_ptr<MYSQL_BIND> valueBind(model::User&, std::tuple<char*, char*, char*, char*, char*, char*>&);
std::shared_ptr<UserLengths> fetchUserLengths(const model::User&);
std::shared_ptr<UserVals> fetchUserVals();
std::tuple<char*, char*, char*, char*, char*, char*> fetchUV();
model::User parseRecord(MYSQL_STMT*);
};
+29 -108
View File
@@ -2,6 +2,7 @@
#include <string>
#include <sstream>
#include <tuple>
#include <cstring>
namespace database {
@@ -28,7 +29,7 @@ model::User UserRepository::retrieveUserRecord(model::User& user,
case type::UserFilter::username:
qry << "Username = ?";
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer_type = MYSQL_TYPE_STRING;
params[0].buffer = (char*)user.username.c_str();
params[0].length = &userLength;
params[0].is_null = 0;
@@ -113,7 +114,8 @@ std::shared_ptr<MYSQL_BIND> UserRepository::insertUserValues(const model::User&
return values;
}
std::shared_ptr<MYSQL_BIND> UserRepository::valueBind(model::User& user, std::shared_ptr<UserVals> userVal)
std::shared_ptr<MYSQL_BIND> UserRepository::valueBind(model::User& user,
std::tuple<char*, char*, char*, char*, char*, char*>& us)
{
std::shared_ptr<MYSQL_BIND> values((MYSQL_BIND*) std::calloc(7, sizeof(MYSQL_BIND)));
constexpr auto strLen = 1024;
@@ -122,97 +124,27 @@ std::shared_ptr<MYSQL_BIND> UserRepository::valueBind(model::User& user, std::sh
values.get()[0].buffer = (char*)&user.id;
values.get()[1].buffer_type = MYSQL_TYPE_STRING;
values.get()[1].buffer = (char*)userVal->firstname;
values.get()[1].buffer = (char*)std::get<0>(us);
values.get()[1].buffer_length = strLen;
values.get()[2].buffer_type = MYSQL_TYPE_STRING;
values.get()[2].buffer = (char*)userVal->lastname;
values.get()[2].buffer = (char*)std::get<1>(us);
values.get()[2].buffer_length = strLen;
values.get()[3].buffer_type = MYSQL_TYPE_STRING;
values.get()[3].buffer = (char*)userVal->phone;
values.get()[3].buffer = (char*)std::get<2>(us);
values.get()[3].buffer_length = strLen;
values.get()[4].buffer_type = MYSQL_TYPE_STRING;
values.get()[4].buffer = (char*)userVal->email;
values.get()[4].buffer = (char*)std::get<3>(us);
values.get()[4].buffer_length = strLen;
values.get()[5].buffer_type = MYSQL_TYPE_STRING;
values.get()[5].buffer = (char*)userVal->username;
values.get()[5].buffer = (char*)std::get<4>(us);
values.get()[5].buffer_length = strLen;
values.get()[6].buffer_type = MYSQL_TYPE_STRING;
values.get()[6].buffer = (char*)userVal->password;
values.get()[6].buffer_length = strLen;
return values;
}
std::shared_ptr<MYSQL_BIND> UserRepository::valueBind(model::User& user, UserVals& userVal)
{
std::shared_ptr<MYSQL_BIND> values((MYSQL_BIND*) std::calloc(7, sizeof(MYSQL_BIND)));
constexpr auto strLen = 1024;
values.get()[0].buffer_type = MYSQL_TYPE_LONG;
values.get()[0].buffer = (char*)&user.id;
values.get()[1].buffer_type = MYSQL_TYPE_STRING;
values.get()[1].buffer = (char*)userVal.firstname;
values.get()[1].buffer_length = strLen;
values.get()[2].buffer_type = MYSQL_TYPE_STRING;
values.get()[2].buffer = (char*)userVal.lastname;
values.get()[2].buffer_length = strLen;
values.get()[3].buffer_type = MYSQL_TYPE_STRING;
values.get()[3].buffer = (char*)userVal.phone;
values.get()[3].buffer_length = strLen;
values.get()[4].buffer_type = MYSQL_TYPE_STRING;
values.get()[4].buffer = (char*)userVal.email;
values.get()[4].buffer_length = strLen;
values.get()[5].buffer_type = MYSQL_TYPE_STRING;
values.get()[5].buffer = (char*)userVal.username;
values.get()[5].buffer_length = strLen;
values.get()[6].buffer_type = MYSQL_TYPE_STRING;
values.get()[6].buffer = (char*)userVal.password;
values.get()[6].buffer_length = strLen;
return values;
}
std::shared_ptr<MYSQL_BIND> UserRepository::valueBind(model::User& user)
{
std::shared_ptr<MYSQL_BIND> values((MYSQL_BIND*) std::calloc(7, sizeof(MYSQL_BIND)));
constexpr auto strLen = 1024;
values.get()[0].buffer_type = MYSQL_TYPE_LONG;
values.get()[0].buffer = (char*)&user.id;
values.get()[1].buffer_type = MYSQL_TYPE_STRING;
values.get()[1].buffer = (char*)user.firstname.data();
values.get()[1].buffer_length = strLen;
values.get()[2].buffer_type = MYSQL_TYPE_STRING;
values.get()[2].buffer = (char*)user.lastname.data();
values.get()[2].buffer_length = strLen;
values.get()[3].buffer_type = MYSQL_TYPE_STRING;
values.get()[3].buffer = (char*)user.phone.data();
values.get()[3].buffer_length = strLen;
values.get()[4].buffer_type = MYSQL_TYPE_STRING;
values.get()[4].buffer = (char*)user.email.data();
values.get()[4].buffer_length = strLen;
values.get()[5].buffer_type = MYSQL_TYPE_STRING;
values.get()[5].buffer = (char*)user.username.data();
values.get()[5].buffer_length = strLen;
values.get()[6].buffer_type = MYSQL_TYPE_STRING;
values.get()[6].buffer = (char*)user.password.data();
values.get()[6].buffer = (char*)std::get<5>(us);
values.get()[6].buffer_length = strLen;
return values;
@@ -231,46 +163,35 @@ std::shared_ptr<UserRepository::UserLengths> UserRepository::fetchUserLengths(co
return userLen;
}
std::shared_ptr<UserRepository::UserVals> UserRepository::fetchUserVals()
{
constexpr auto strLen = 1024;
auto userVal = std::make_shared<UserVals>();
/**
userVal->firstname = std::make_shared<char*>(new char[strLen]);
userVal->lastname = std::make_shared<char*>(new char[strLen]);
userVal->email = std::make_shared<char*>(new char[strLen]);
userVal->phone = std::make_shared<char*>(new char[strLen]);
userVal->username = std::make_shared<char*>(new char[strLen]);
userVal->password = std::make_shared<char*>(new char[strLen]);
*/
return userVal;
std::tuple<char*, char*, char*, char*, char*, char*> UserRepository::fetchUV()
{
char firstname[1024];
char lastname[1024];
char phone[1024];
char email[1024];
char username[1024];
char password[1024];
return std::make_tuple(firstname, lastname, phone, email, username, password);
}
model::User UserRepository::parseRecord(MYSQL_STMT *stmt)
{
// TODO : parse user record
model::User user;
auto userVal = fetchUserVals();
UserVals uv;
//auto bindedValues = valueBind(user, userVal);
auto bindedValues = valueBind(user, uv);
//auto bindedValues = valueBind(user);
auto usv = fetchUV();
auto bindedValues = valueBind(user, usv);
auto status = mysql_stmt_bind_result(stmt, bindedValues.get());
status = mysql_stmt_fetch(stmt);
std::cout << user.id << std::endl;
//std::cout << "binded firstname: " << userVal->firstname << std::endl;
//std::cout << "binded lastname: " << uv.lastname << std::endl;
//user.firstname = userVal->firstname;
/**
user.lastname = *userVal->lastname.get();
user.email = *userVal->email.get();
user.phone = *userVal->phone.get();
user.username = *userVal->username.get();
user.password = *userVal->password.get();
*/
user.firstname = std::get<0>(usv);
user.lastname = std::get<1>(usv);
user.email = std::get<2>(usv);
user.phone = std::get<3>(usv);
user.username = std::get<4>(usv);
user.password = std::get<5>(usv);
return user;
}