2018-11-03 17:12:20 +01:00
/* Copyright (c) 2018 Albert S.
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the " Software " ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE .
*/
# include <sqlite3.h>
# include <string>
# include <memory>
# include <cstring>
# include "userdaosqlite.h"
UserDaoSqlite : : UserDaoSqlite ( )
{
}
bool UserDaoSqlite : : exists ( std : : string username )
{
auto prep = * db < < " SELECT 1 FROM user WHERE username = ? " < < username ;
return execBool ( prep ) ;
}
std : : optional < User > UserDaoSqlite : : find ( std : : string username )
{
try
{
User user ;
2019-05-03 15:56:52 +02:00
auto stmt = * db < < " SELECT username, password, salt, permissions, enabled FROM user WHERE username = ? " < < username ;
2018-11-03 17:12:20 +01:00
int perms = 0 ;
2019-05-03 15:56:52 +02:00
stmt > > std : : tie ( user . login , user . password , user . salt , perms , user . enabled ) ;
2018-11-03 17:12:20 +01:00
user . permissions = Permissions { perms } ;
return std : : move ( user ) ;
}
catch ( const sqlite : : errors : : no_rows & e )
{
return { } ;
}
catch ( sqlite : : sqlite_exception & e )
{
throwFrom ( e ) ;
}
}
std : : optional < User > UserDaoSqlite : : find ( int id )
{
try
{
User user ;
2019-05-03 15:56:52 +02:00
auto stmt = * db < < " SELECT username, password, salt, permissions, enabled FROM user WHERE id = ? " < < id ;
2018-11-03 17:12:20 +01:00
int perms = 0 ;
2019-05-03 15:56:52 +02:00
stmt > > std : : tie ( user . login , user . password , user . salt , perms , user . enabled ) ;
2018-11-03 17:12:20 +01:00
user . permissions = Permissions { perms } ;
return std : : move ( user ) ;
}
catch ( const sqlite : : errors : : no_rows & e )
{
return { } ;
}
catch ( sqlite : : sqlite_exception & e )
{
throwFrom ( e ) ;
}
}
void UserDaoSqlite : : deleteUser ( std : : string username )
{
//What to do with the contributions of the user?
}
void UserDaoSqlite : : save ( const User & u )
{
2019-05-03 15:56:52 +02:00
try
{
auto q = * db < < " INSERT OR REPLACE INTO user(id, username, password, salt, permissions, enabled) VALUES((SELECT id FROM user WHERE username = ?), ?,?,?,?,?) " ;
q < < u . login < < u . login < < u . password < < u . salt < < u . permissions . getPermissions ( ) < < u . enabled ;
q . execute ( ) ;
2018-11-03 17:12:20 +01:00
2019-05-03 15:56:52 +02:00
}
catch ( sqlite : : sqlite_exception & e )
{
throwFrom ( e ) ;
}
2018-11-03 17:12:20 +01:00
}