require_relative '../user' require_relative '../project' require_relative '../sshkey' require 'sqlite3' require 'json' module EmacsCollab module Database class SQLite def initialize(db_name) @db = SQLite3::Database.new "#{DATA_PATH}/#{db_name}.db" end def get_user(id) row = @db.execute("SELECT * FROM Users WHERE name = ?", [id])[0] unless row raise UserNotFoundError, "User with id #{id} could not be found in database" end user = User.new(row[0]) user.pw_hash = row[1] user.salt = row[2] user.keys = row[3] == nil ? Array.new : Marshal.load(row[3]) user end def get_users rows = @db.execute("SELECT * FROM Users") rows.map do |row| user = User.new(row[0]) user.pw_hash = row[1] user.salt = row[2] user.keys = row[3] == nil ? Array.new : Marshal.load(row[3]) user end end def add_user(user) @db.execute("INSERT INTO Users (name) VALUES (?)", [user.id]) end def update_user(user) @db.execute("UPDATE Users SET keys = ? WHERE name = ?", [JSON.generate(user.keys),user.id]) end def change_user_password(user,hash,salt) @db.execute("UPDATE Users SET passwd = ?, salt = ? WHERE name = ?", [hash,salt,user.id]) end def get_project(name) row = @db.execute("SELECT * FROM Projects WHERE name = ?", [name])[0] unless row raise EmacsCollab::ProjectNotFoundError, "Project with name #{name} could not be found in database" end proj = Project.new() proj.uid = row[0] proj.id = row[1] proj.path = row[2] proj.posixname = row[3] proj.owner = row[4] users = (row[5] == nil ? Array.new : Marshal.load(row[5])) users.each do |u| EmacsCollab.get_user_by_id(u.id).keys.each do |k| proj.add_key(k) end end proj end def get_projects rows = @db.execute("SELECT * FROM Projects") rows.map do |row| proj = Project.new() proj.uid = row[0] proj.id = row[1] proj.path = row[2] proj.posixname = row[3] proj.owner = row[4] users = (row[5] == nil ? Array.new : Marshal.load(row[5])) users.each do |u| EmacsCollab.get_user_by_id(u).keys.each do |k| proj.add_key(k) end end proj.users = row[5] proj end end def add_project(proj) @db.execute("INSERT INTO Projects (uid,name,path,posixname,owner,users) VALUES (?,?,?,?,?,?)", [ proj.uid, proj.id, proj.path, proj.posixname, "", Marshal.dump(proj.users) ]) end def update_project(proj) @db.execute("UPDATE Projects SET name = ?, path = ?, posixname = ?, owner = ?, users = ? WHERE uid = ?", [ proj.id, proj.path, proj.posixname, "", Marshal.dump(proj.users), proj.uid ]) end end end end #user1 = User.new("user1") #add_user(user1) #change_user_password(user1,"testtest")