Changed SQL queries for mysql2 ruby driver
Signed-off-by: Sergey Bogdanov <sergey.bogdanov@oktetlabs.ru>master
parent
3a172adb84
commit
5da583412b
88
diary.rb
88
diary.rb
|
@ -1,5 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (C) 2021 OKTET Labs Ltd. All rights reserved.
|
||||
# Copyright (C) 2021-2022 OKTET Labs Ltd. All rights reserved.
|
||||
|
||||
#
|
||||
# Class Diary for Diary Management Application.
|
||||
|
@ -220,16 +220,18 @@ class Diary
|
|||
not policy.can_approve?(project, who)) or
|
||||
DiaryState.valid(@attributes["state"].to_i)
|
||||
|
||||
@approval_note = DataMapper.database.select_all(
|
||||
"select * from approval_note where id = ?", @id
|
||||
).collect { |row| row.to_h }
|
||||
@approval_note = DataMapper.database.query("select * from approval_note where id = '%s'" % @id).collect { |row| row.to_h }
|
||||
return @approval_note
|
||||
end
|
||||
|
||||
def self.approve_all(prj, who)
|
||||
DataMapper.database.do("update diary set state = ? where prj_id = ? " +
|
||||
"AND who = ? AND state IN (?,?)", DiaryState::APPROVED,
|
||||
prj.id, who, DiaryState::REQ_APPROVAL, DiaryState::REJECTED)
|
||||
DataMapper.database.query("update diary set state = '%s' where prj_id = '%s' AND who = '%s' AND state IN ('%s','%s')" %
|
||||
[
|
||||
DiaryState::APPROVED,
|
||||
DataMapper.database.escape(prj.id.to_s),
|
||||
DataMapper.database.escape(who.to_s),
|
||||
DiaryState::REQ_APPROVAL, DiaryState::REJECTED
|
||||
])
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
@ -245,11 +247,8 @@ class Diary
|
|||
|
||||
def self.predict_project(who)
|
||||
# TODO: select the most used of N last entries
|
||||
last_diary = DataMapper.database.select_one(
|
||||
"SELECT prj_id FROM diary " +
|
||||
"WHERE who=? ORDER BY ddate DESC " +
|
||||
"LIMIT 1", who.uid)
|
||||
return last_diary ? last_diary[0].to_i : nil
|
||||
last_diary = DataMapper.database.query("SELECT prj_id FROM diary WHERE who='%s' ORDER BY ddate DESC LIMIT 1" % who.uid ).first
|
||||
return last_diary ? last_diary["prj_id"].to_i : nil
|
||||
end
|
||||
|
||||
def self.find(args)
|
||||
|
@ -260,7 +259,7 @@ class Diary
|
|||
|
||||
dates = args[:ddate]
|
||||
raise ArgumentError unless dates.is_a? Range
|
||||
query_clause = " where ddate >= ? and ddate <= ?"
|
||||
query_clause = " where ddate >= '%s' and ddate <= '%s'"
|
||||
query_args = [dates.first, dates.last]
|
||||
|
||||
if policy.restriction.include?(:project)
|
||||
|
@ -268,10 +267,10 @@ class Diary
|
|||
prj_list = prj_list & [prj_id] if prj_id
|
||||
return [] if prj_list.empty?
|
||||
query_clause += " AND prj_id IN (" +
|
||||
prj_list.collect { "?" }.join(",") + ")"
|
||||
prj_list.collect { "'%s'" }.join(",") + ")"
|
||||
query_args += prj_list
|
||||
elsif prj_id
|
||||
query_clause += " AND prj_id = ?"
|
||||
query_clause += " AND prj_id = '%s'"
|
||||
query_args = query_args << prj_id
|
||||
end
|
||||
|
||||
|
@ -280,45 +279,48 @@ class Diary
|
|||
eng_list = eng_list & [who] if who
|
||||
return [] if eng_list.empty?
|
||||
query_clause += " AND who IN (" +
|
||||
eng_list.collect { "?" }.join(",") + ")"
|
||||
eng_list.collect { "'%s'" }.join(",") + ")"
|
||||
query_args += eng_list
|
||||
elsif who
|
||||
query_clause += " AND who = ?"
|
||||
query_clause += " AND who = '%s'"
|
||||
query_args = query_args << who
|
||||
end
|
||||
|
||||
if customer
|
||||
query_clause += " AND customer = ?"
|
||||
query_clause += " AND customer = '%s'"
|
||||
query_args = query_args << customer
|
||||
end
|
||||
|
||||
DataMapper.database.select_all("select diary.*, project.customer, " +
|
||||
DataMapper.database.query("select diary.*, project.customer, " +
|
||||
" project.leader, project.manager, diary.id as id" +
|
||||
", diary.state as state" +
|
||||
" from diary left join project on diary.prj_id = project.id" +
|
||||
query_clause + " order by ddate, prj_id, who",
|
||||
*query_args).collect do |row|
|
||||
query_clause % (query_args) + " order by ddate, prj_id, who"
|
||||
).collect do |row|
|
||||
self.new(row["id"], row.to_h)
|
||||
end
|
||||
end
|
||||
|
||||
def self.for_approve(who)
|
||||
DataMapper.database.select_all("select *, diary.id as id from" +
|
||||
DataMapper.database.query("select *, diary.id as id from" +
|
||||
" diary inner join approval on approval.who = diary.who and" +
|
||||
" approval.prj_id = diary.prj_id left join project on" +
|
||||
" diary.prj_id = project.id where approval.approver = ?" +
|
||||
" and diary.state = ? order by diary.ddate",
|
||||
who.uid, DiaryState::REQ_APPROVAL).collect do |row|
|
||||
" diary.prj_id = project.id where approval.approver = '%s'" % who.uid +
|
||||
" and diary.state = '%s' order by diary.ddate" % DiaryState::REQ_APPROVAL
|
||||
).collect do |row|
|
||||
self.new(row["id"], row.to_h)
|
||||
end
|
||||
end
|
||||
|
||||
def self.add_approval_note(id, message)
|
||||
if message.is_a?(String) and message.length > 0
|
||||
DataMapper.database.do(
|
||||
"insert into approval_note(id,created,author,note) " +
|
||||
"values (?,?,?,?)", id, DbTime.now,
|
||||
DiaryEnv.instance.user.uid, message)
|
||||
DataMapper.database.query("insert into approval_note(id,created,author,note) values ('%s',%s,'%s','%s')" %
|
||||
[
|
||||
DataMapper.database.escape(id.to_s),
|
||||
"STR_TO_DATE('%s'," % DbTime.now + " '%Y-%m-%dT%h:%i:%s+00:00')",
|
||||
DataMapper.database.escape(DiaryEnv.instance.user.uid),
|
||||
DataMapper.database.escape(message)
|
||||
])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -697,12 +699,12 @@ class DiaryUI
|
|||
data["descr"].length < 10
|
||||
|
||||
# Check total hours
|
||||
total = DataMapper.database.select_one(
|
||||
"SELECT SUM(hours) FROM diary " +
|
||||
"WHERE who=? AND ddate=?" +
|
||||
(data.include?("id") ?
|
||||
" AND id<>#{data["id"]}" : ""),
|
||||
*([data["who"], data["ddate"]]))[0].to_i +
|
||||
total = DataMapper.database.query("SELECT SUM(hours) as sum FROM diary WHERE who='%s' AND ddate='%s'" %
|
||||
[
|
||||
data["who"],
|
||||
data["ddate"]
|
||||
] + (data.include?("id") ? " AND id<>#{data["id"]}" : "")
|
||||
).first["sum"].to_i +
|
||||
data["hours"]
|
||||
raise "You have more than 24 hours " +
|
||||
"for #{data["ddate"]}" if total > 24
|
||||
|
@ -753,12 +755,16 @@ class DiaryUI
|
|||
else
|
||||
raise "You should specify at least 1 hour" if data["hours"] < 1
|
||||
raise "You are inserting a duplicate diary record!" if
|
||||
DataMapper.database.select_one(
|
||||
"SELECT COUNT(*) FROM diary WHERE " +
|
||||
"who = ? and descr = ? and hours = ? " +
|
||||
"and ddate =?",
|
||||
*([data["who"], data["descr"],
|
||||
data["hours"], data["ddate"]]))[0].to_i > 0
|
||||
DataMapper.database.query(
|
||||
"SELECT COUNT(*) as count FROM diary WHERE " +
|
||||
"who = '%s' and descr = '%s' and hours = '%s' and ddate = '%s'" %
|
||||
[
|
||||
DataMapper.database.escape(data["who"].to_s),
|
||||
DataMapper.database.escape(data["descr"].to_s),
|
||||
DataMapper.database.escape(data["hours"].to_s),
|
||||
DataMapper.database.escape(data["ddate"].to_s)
|
||||
]
|
||||
).first["count"].to_i > 0
|
||||
data["created"] = data["modified"]
|
||||
@diary_table.create(data)
|
||||
end
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (C) 2021 OKTET Labs Ltd. All rights reserved.
|
||||
# Copyright (C) 2021-2022 OKTET Labs Ltd. All rights reserved.
|
||||
|
||||
#
|
||||
# Class DataMapper for Diary Management Application.
|
||||
#
|
||||
|
||||
require 'dbi'
|
||||
require 'mysql2'
|
||||
|
||||
class DataMapper
|
||||
@@mapper = Hash.new
|
||||
|
@ -16,13 +16,11 @@ class DataMapper
|
|||
@table = table
|
||||
@@mapper[@table] = self
|
||||
@cache = Hash.new
|
||||
@columns = @@database.columns(@table).collect { |col| col["name"] } - [@key]
|
||||
@columns = @@database.query("select column_name from information_schema.columns where table_name='%s'" % @table).collect{ |col| col["column_name"] } - [@key]
|
||||
end
|
||||
def self.setup(args)
|
||||
raise "Database parameters is not a hash" unless args.is_a? Hash
|
||||
@@database = DBI.connect("dbi:#{args[:adapter]}:#{args[:database]}:" +
|
||||
"#{args[:host]}",
|
||||
args[:username], args[:password])
|
||||
@@database = Mysql2::Client.new(:host => args[:host], :username => args[:username], :password => args[:password], :database => args[:database])
|
||||
end
|
||||
def self.database
|
||||
@@database
|
||||
|
@ -37,14 +35,14 @@ class DataMapper
|
|||
|
||||
def find(id)
|
||||
return @cache[id] if @cache.has_key?(id)
|
||||
row = @@database.select_one("select * from #{@table} where #{@key} = ?", id)
|
||||
row = @@database.query("select * from #{@table} where #{@key} = '%s' LIMIT 1" % id).first
|
||||
return nil unless row
|
||||
pick(row)
|
||||
end
|
||||
|
||||
def where(clause, *args)
|
||||
@@database.select_all("select * from #{@table} where " + clause,
|
||||
*args).collect { |row| pick(row) }
|
||||
cmd = "select * from #{@table} where " + clause % args
|
||||
@@database.query(cmd).collect { |row| pick(row) }
|
||||
end
|
||||
|
||||
def all(args)
|
||||
|
@ -57,22 +55,20 @@ class DataMapper
|
|||
if value.is_a?(Array)
|
||||
if value.length > 0
|
||||
query_clause << "#{tag.to_s} " +
|
||||
"IN (#{value.collect {"?"}.join(",")})"
|
||||
"IN (#{value.collect {"'%s'"}.join(",")})"
|
||||
query_args = query_args + value
|
||||
end
|
||||
elsif value.is_a?(Range)
|
||||
query_clause << "#{tag.to_s} >= ? AND #{tag.to_s} <= ?"
|
||||
query_clause << "#{tag.to_s} >= '%s' AND #{tag.to_s} <= '%s'"
|
||||
query_args << value.first << value.last
|
||||
else
|
||||
query_clause << "#{tag.to_s} = ?"
|
||||
query_clause << "#{tag.to_s} = '%s'"
|
||||
query_args << value
|
||||
end
|
||||
end
|
||||
# raise "#{MyCGI.dump(query_clause)} : #{MyCGI.dump(query_args)}"
|
||||
@@database.select_all("select * from #{@table}" +
|
||||
(query_clause.empty? ? "" :
|
||||
" where " + query_clause.join(" and ")),
|
||||
*query_args).collect { |row| pick(row) }
|
||||
cmd = "select * from #{@table}" + (query_clause.empty? ? "" : " where " + query_clause.join(" and ")) % query_args
|
||||
@@database.query(cmd).collect { |row| pick(row) }
|
||||
end
|
||||
|
||||
def insert(obj)
|
||||
|
@ -81,7 +77,7 @@ class DataMapper
|
|||
@@database.do("insert into #{@table} (" + fields.join(",") +
|
||||
") values (" + fields.collect {"?"}.join(",") + ")",
|
||||
*(fields.collect {|field| obj[field]}))
|
||||
obj.id = @@database.select_one("select last_insert_id()")[0]
|
||||
obj.id = @@database.query("select last_insert_id() as id").first["id"]
|
||||
@@cache[obj.id] = obj
|
||||
end
|
||||
|
||||
|
|
|
@ -42,15 +42,17 @@ class DiaryEnv
|
|||
:bindpw => LDAP_BIND_PW,
|
||||
:key => "uid")
|
||||
Person.set_local(HOME_ORGANIZATION, HOME_OU)
|
||||
DataMapper.setup(:adapter => "Mysql",
|
||||
DataMapper.setup(:adapter => "Mysql2",
|
||||
:database => DB_DATABASE,
|
||||
:host => DB_HOST,
|
||||
:username => DB_USERNAME,
|
||||
:password => DB_PASSWORD)
|
||||
DataMapper.database.execute("SELECT nick FROM director") do |q|
|
||||
cmd = "SELECT nick FROM director"
|
||||
@director = []
|
||||
DataMapper.database.query(cmd, as: :hash, symbolize_keys: false).each do |q|
|
||||
raise "'Director' table is not filled" unless
|
||||
q and name = q.fetch[0]
|
||||
@director = [ Person.new('director') ]
|
||||
q and name = q.fetch['nick']
|
||||
@director.push(Person.new(name))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (C) 2021 OKTET Labs Ltd. All rights reserved.
|
||||
# Copyright (C) 2021-2022 OKTET Labs Ltd. All rights reserved.
|
||||
|
||||
#
|
||||
# Class Policy for Diary Management Application.
|
||||
|
@ -95,7 +95,7 @@ class CustomerPolicy
|
|||
end
|
||||
|
||||
def project_list
|
||||
(Project.where("customer=? AND extra_rights IS NULL",
|
||||
(Project.where("customer='%s' AND extra_rights IS NULL",
|
||||
@user.organization.uid) +
|
||||
extra_project_list).uniq.sort
|
||||
end
|
||||
|
|
46
project.rb
46
project.rb
|
@ -1,5 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (C) 2021 OKTET Labs Ltd. All rights reserved.
|
||||
# Copyright (C) 2021-2022 OKTET Labs Ltd. All rights reserved.
|
||||
|
||||
#
|
||||
# Class Project for Diary Management Application.
|
||||
|
@ -100,16 +100,17 @@ class ProjectMapper < DataMapper
|
|||
|
||||
def find_approvals(id)
|
||||
app = Hash.new
|
||||
@@database.select_all("select * from approval where prj_id = ?",
|
||||
id) { |row| app[row["who"]] = row["approver"] }
|
||||
@@database.query("select * from approval where prj_id = '%s'" % id).collect { |row| app[row["who"]] = row["approver"] }
|
||||
app
|
||||
end
|
||||
|
||||
def save_approvals(id, app)
|
||||
@@database.do("delete from approval where prj_id = ?", id)
|
||||
cmd = "delete from approval where prj_id = '%s'" % id.to_s
|
||||
@@database.query(cmd)
|
||||
app.each do |who, approver|
|
||||
@@database.do("insert into approval (prj_id, who, approver) " +
|
||||
"values (?, ?, ?)", id, who, approver)
|
||||
cmd = "insert into approval (prj_id, who, approver) values ('%s', '%s', '%s')" %
|
||||
[@@database.escape(id.to_s), @@database.escape(who.to_s), @@database.escape(approver.to_s)]
|
||||
@@database.query(cmd)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -131,7 +132,7 @@ class ProjectUI < Hash
|
|||
@id = id
|
||||
self.clear
|
||||
if @id
|
||||
DataMapper.database.execute("select * from project where id = #{@id}") do |q|
|
||||
DataMapper.database.query("select * from project where id = #{@id}") do |q|
|
||||
### For some reason MySQL driver always returns 0 in q.rows
|
||||
# if q.rows != 1
|
||||
# raise "Project #{@id} has #{q.rows} instances"
|
||||
|
@ -142,8 +143,8 @@ class ProjectUI < Hash
|
|||
self.delete("id")
|
||||
end
|
||||
self["cc"] = Array.new
|
||||
DataMapper.database.select_all("select person from cc_list where " +
|
||||
"prj_id = #{@id}") do |row|
|
||||
DataMapper.database.query("select person from cc_list where " +
|
||||
"prj_id = #{@id}").collect do |row|
|
||||
self["cc"].push(row["person"])
|
||||
end
|
||||
end
|
||||
|
@ -162,11 +163,10 @@ class ProjectUI < Hash
|
|||
#raise "Create project #{data["name"]}"
|
||||
inst = data.keys
|
||||
inst -= ["cc"]
|
||||
DataMapper.database.do("insert into project (" + inst.join(", ") +
|
||||
") values (" + (inst.collect do "?" end).join(", ") +
|
||||
")",
|
||||
*(inst.collect do |field| data[field] end))
|
||||
@id = DataMapper.database.select_one("select last_insert_id()")[0]
|
||||
cmd = ("insert into project (" + inst.join(", ") + ") values (" + (inst.collect do "'%s'" end).join(", ") + ")") %
|
||||
(inst.collect do |field| DataMapper.database.escape(data[field]) end)
|
||||
DataMapper.database.query(cmd)
|
||||
@id = DataMapper.database.query("select last_insert_id() as id").first["id"]
|
||||
if data["cc"].length > 0
|
||||
DataMapper.database.do("insert into cc_list (prj_id, person) values " +
|
||||
(["(#{@id}, ?)"] * data["cc"].length).join(", "),
|
||||
|
@ -184,12 +184,16 @@ class ProjectUI < Hash
|
|||
end
|
||||
end
|
||||
if (changes - ["cc"]).length > 0
|
||||
DataMapper.database.do("update project set " +
|
||||
(changes.collect do
|
||||
|field| field + " = ?" if field != "cc"
|
||||
end).join(", ") +
|
||||
" where id = #{@id}",
|
||||
*(changes.collect do |field| data[field] end));
|
||||
cmd = ("update project set " + (changes.collect do |field| field + " = %s" if field != "cc" end).join(", ") + " where id = #{@id}") %
|
||||
(changes.collect do |field|
|
||||
if data[field].class == DateTime
|
||||
t = "STR_TO_DATE('%s'" % data[field] + ", '%Y-%m-%dT%H:%i:%s+00:00')"
|
||||
else
|
||||
t = "'%s'" % DataMapper.database.escape(data[field].to_s)
|
||||
end
|
||||
t
|
||||
end)
|
||||
DataMapper.database.query(cmd);
|
||||
end
|
||||
if (current["cc"] - data["cc"]).length > 0
|
||||
DataMapper.database.do("delete from cc_list where " +
|
||||
|
@ -422,7 +426,7 @@ class ProjectUI < Hash
|
|||
|
||||
if @cgi.tree_params["prj"].include?("edit")
|
||||
attrs = @cgi.tree_params["prj"]["edit"]
|
||||
attrs["hide_hrs"] = [attrs.include?("hide_hrs") ? 1 : 0]
|
||||
attrs["hide_hrs"] = attrs.include?("hide_hrs") ? "1" : "0"
|
||||
if attrs.include?("id")
|
||||
update(attrs["id"])
|
||||
attrs.delete("id")
|
||||
|
|
43
sql_cache.rb
43
sql_cache.rb
|
@ -1,5 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright (C) 2021 OKTET Labs Ltd. All rights reserved.
|
||||
# Copyright (C) 2021-2022 OKTET Labs Ltd. All rights reserved.
|
||||
|
||||
#
|
||||
# SQL class for Diary Management Application
|
||||
|
@ -11,7 +11,8 @@ class SQL_Cache < Hash
|
|||
@name = table
|
||||
@string_expr = string_expr
|
||||
@lists = Hash.new
|
||||
@fields = @sql.columns(@name).collect { |col| col["name"] }
|
||||
@fields = @sql.query("select column_name from information_schema.columns where table_name='%s'" %
|
||||
@sql.escape(@name)).collect { |col| col["column_name"] }
|
||||
super(0)
|
||||
end
|
||||
|
||||
|
@ -20,7 +21,8 @@ class SQL_Cache < Hash
|
|||
|
||||
def search(where)
|
||||
list = Array.new
|
||||
@sql.select_all("select * from #{@name} where #{where} order by id") do |row|
|
||||
cmd = "select * from #{@name} where #{where} order by id"
|
||||
@sql.query(cmd).collect do |row|
|
||||
self[row["id"]] = row.to_h
|
||||
list.push(self[row["id"]])
|
||||
end
|
||||
|
@ -53,12 +55,17 @@ class SQL_Cache < Hash
|
|||
|
||||
def create(data)
|
||||
fields = data.keys & @fields
|
||||
@sql.do("insert into #{@name} (" +
|
||||
fields.join(", ") +
|
||||
") values (" + fields.collect do "?" end.join(", ") +
|
||||
")",
|
||||
*(fields.collect do |field| data[field] end))
|
||||
@sql.select_one("select last_insert_id()")[0]
|
||||
cmd = ("insert into #{@name} (" + fields.join(", ") + ") values (" + fields.collect do "%s" end.join(", ") + ")") %
|
||||
(fields.collect do |field|
|
||||
if data[field].class == DateTime
|
||||
t = "STR_TO_DATE('%s'" % data[field] + ", '%Y-%m-%dT%H:%i:%s+00:00')"
|
||||
else
|
||||
t = "'%s'" % @sql.escape(data[field].to_s)
|
||||
end
|
||||
t
|
||||
end)
|
||||
@sql.query(cmd)
|
||||
@sql.query("select last_insert_id() as id").first["id"]
|
||||
end
|
||||
|
||||
def modify(id, data)
|
||||
|
@ -70,16 +77,20 @@ class SQL_Cache < Hash
|
|||
ch
|
||||
end
|
||||
end
|
||||
@sql.do("update #{@name} set " +
|
||||
changes.collect do |field|
|
||||
field + " = ?"
|
||||
end.join(", ") + " where id = #{id}",
|
||||
*(changes.collect do |field| data[field] end)
|
||||
) if changes.length > 0
|
||||
cmd = ("update #{@name} set " + changes.collect do |field| field + " = %s" end.join(", ") + " where id = #{id}") %
|
||||
(changes.collect do |field|
|
||||
if data[field].class == DateTime
|
||||
t = "STR_TO_DATE('%s'" % data[field] + ", '%Y-%m-%dT%H:%i:%s+00:00')"
|
||||
else
|
||||
t = "'%s'" % @sql.escape(data[field].to_s)
|
||||
end
|
||||
t
|
||||
end)
|
||||
@sql.query(cmd) if changes.length > 0
|
||||
end
|
||||
|
||||
def delete(id)
|
||||
@sql.do("delete from #{@name} where id = #{id}")
|
||||
@sql.query("delete from #{@name} where id = #{id}")
|
||||
super(id)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue