using System; using System.Collections.Generic; using BuecherwurmAPI.Models; using Microsoft.Data.Sqlite; using Microsoft.VisualBasic.CompilerServices; namespace BuecherwurmAPI.Models { public interface ILend { } internal class LendModel : ILend { private SqliteConnection _dbConnection; public LendModel() { var connectionBuilder = new SqliteConnectionStringBuilder {DataSource = "LongWormMemory.db"}; _dbConnection = new SqliteConnection(connectionBuilder.ConnectionString); _dbConnection.Open(); } public bool IdExits(string table, long id) { using (var command = _dbConnection.CreateCommand()) { command.Parameters.Add(new SqliteParameter("@Id", SqliteType.Integer)).Value = id; // Certain parts of the query can't be filled with variables for security reasons. switch (table) { case Tables.Table.Lends: command.CommandText = @"SELECT EXISTS(SELECT 0 FROM Lends WHERE Id = @Id)"; break; } var dr = command.ExecuteReader(); long result = 0; while (dr.Read()) { result = (long) dr[0]; } return result != 0; } } public IEnumerable GetAllLends() { var lends = new List(); // using automatically disposes the command after completion using (var command = _dbConnection.CreateCommand()) { command.CommandText = @"SELECT * FROM Lends"; var dataReader = command.ExecuteReader(); while (dataReader.Read()) { var returned = (long) dataReader["Returned"] == 1; lends.Add(new Lend { Id = (long) dataReader["Id"], Customer = (string) dataReader["Customer"], ItemId = (long) dataReader["ItemId"], Returned = returned, ReturnDate = DateTime.Parse((string)dataReader["ReturnDate"]) }); } } return lends; } public Lend GetLendById(long id) { using (var command = _dbConnection.CreateCommand()) { command.Parameters.Add(new SqliteParameter("@id", SqliteType.Integer)).Value = id; command.CommandText = @"SELECT * FROM Lends WHERE Id = @id"; var dataReader = command.ExecuteReader(); while (dataReader.Read()) { var returned = (long) dataReader["Returned"] == 1; var lend = new Lend { Id = (long) dataReader["Id"], Customer = (string) dataReader["Customer"], ItemId = (long) dataReader["ItemId"], Returned = returned, ReturnDate = DateTime.Parse((string) dataReader["ReturnDate"]) }; return lend; } } return null; } public long insertLendReturningId(long id, LendPost lend) { using (var command = _dbConnection.CreateCommand()) { command.CommandText = "UPDATE Lends SET (ItemId, ReturnDate, Customer, Returned) = (@itemId, @returnDate, @customer, @returned) WHERE Id = @id"; command.Parameters.Add(new SqliteParameter("@id", id)); command.Parameters.Add(new SqliteParameter("@itemId", lend.ItemId)); command.Parameters.Add(new SqliteParameter("@returnDate", lend.ReturnDate)); command.Parameters.Add(new SqliteParameter("@customer", lend.Customer)); command.Parameters.Add(new SqliteParameter("@returned", lend.Returned)); var success = command.ExecuteNonQuery(); if (success == 1) { command.CommandText = @"SELECT last_insert_rowid()"; return (long)command.ExecuteScalar(); } return -1; } } public long AddLend (LendPost lend) { using (var command = _dbConnection.CreateCommand()) { // funktioniert das so? //muss ProduktId übergeben werden? command.CommandText = @"INSERT INTO Lends (itemid, ReturnDate, Customer, Returned) VALUES (@ItemId, @ReturnDate, @Customer, false)"; command.Parameters.Add(new SqliteParameter("@ItemId", lend.ItemId)); command.Parameters.Add(new SqliteParameter("@ReturnDate", lend.ReturnDate)); command.Parameters.Add(new SqliteParameter("@Customer", lend.Customer)); var success = command.ExecuteNonQuery(); if (success == 1) { command.CommandText = @"SELECT last_insert_rowid()"; return (long)command.ExecuteScalar(); } return -1; } } } }