You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubsu-sm5-ruby/lab2/providers/students_list_db.rb

102 lines
3.4 KiB

require_relative '../db_connection'
require_relative '../student'
require_relative '../student_short'
require_relative '../data_list_student_short'
require 'date'
class StudentsListDB
def initialize
@db = DatabaseConnection.instance
end
# Получить объект Student по ID.
def get_student_by_id(id)
result = @db.query("SELECT * FROM student WHERE id = #{id} LIMIT 1")
row = result.first
row ? row_to_student(row) : nil
end
# Получить список из k студентов (страница n) в виде объекта DataList.
def get_k_n_student_short_list(k, n)
offset = (n - 1) * k
results = @db.query("SELECT * FROM student ORDER BY surname, name, patronymic LIMIT #{k} OFFSET #{offset}")
student_shorts = results.map { |row| StudentShort.from_student(row_to_student(row)) }
DataListStudentShort.new(student_shorts)
end
# Добавить объект Student в БД (ID формируется автоматически).
def add_student(student)
sql = <<~SQL
INSERT INTO student (git, surname, name, patronymic, birth_date, phone, telegram, email)
VALUES (
'#{escape(student.git)}',
'#{escape(student.surname)}',
'#{escape(student.name)}',
'#{escape(student.patronymic)}',
'#{student.birth_date}',
#{student.phone ? "'#{escape(student.phone)}'" : "NULL"},
#{student.telegram ? "'#{escape(student.telegram)}'" : "NULL"},
#{student.email ? "'#{escape(student.email)}'" : "NULL"}
)
SQL
@db.query(sql)
new_id = @db.query("SELECT LAST_INSERT_ID() as id").first['id']
student.id = new_id.to_s
student
end
# Обновить студента по ID.
def update_student_by_id(id, new_student)
sql = <<~SQL
UPDATE student SET
git = '#{escape(new_student.git)}',
surname = '#{escape(new_student.surname)}',
name = '#{escape(new_student.name)}',
patronymic = '#{escape(new_student.patronymic)}',
birth_date = '#{new_student.birth_date}',
phone = #{new_student.phone ? "'#{escape(new_student.phone)}'" : "NULL"},
telegram = #{new_student.telegram ? "'#{escape(new_student.telegram)}'" : "NULL"},
email = #{new_student.email ? "'#{escape(new_student.email)}'" : "NULL"}
WHERE id = #{id}
SQL
@db.query(sql)
@db.client.affected_rows > 0
end
# Удалить студента по ID.
def delete_student_by_id(id)
@db.query("DELETE FROM student WHERE id = #{id}")
@db.client.affected_rows > 0
end
# Получить количество студентов.
def get_student_short_count
result = @db.query("SELECT COUNT(*) as count FROM student")
result.first['count']
end
private
# Преобразование строки результата в объект Student.
def row_to_student(row)
Student.new(
id: row['id'].to_s,
git: row['git'],
surname: row['surname'],
name: row['name'],
patronymic: row['patronymic'],
birth_date: Date.parse(row['birth_date'].to_s),
phone: row['phone'],
telegram: row['telegram'],
email: row['email']
)
end
# Простой метод для экранирования строк (на практике лучше использовать подготовленные выражения).
def escape(value)
@db.client.escape(value.to_s)
end
end