Merge from booking branch
This commit is contained in:
parent
8c5de206e1
commit
25906d0227
60 changed files with 6228 additions and 0 deletions
356
NpgsqlContentProvider/NpgsqlSkillProvider.cs
Normal file
356
NpgsqlContentProvider/NpgsqlSkillProvider.cs
Normal file
|
|
@ -0,0 +1,356 @@
|
|||
//
|
||||
// NpgsqlSkillProvider.cs
|
||||
//
|
||||
// Author:
|
||||
// Paul Schneider <paul@pschneider.fr>
|
||||
//
|
||||
// Copyright (c) 2015 GNU GPL
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
using System;
|
||||
using Yavsc.Model.Skill;
|
||||
using System.Configuration;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace WorkFlowProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Npgsql skill provider.
|
||||
/// </summary>
|
||||
public class NpgsqlSkillProvider : SkillProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="WorkFlowProvider.NpgsqlSkillProvider"/> class.
|
||||
/// </summary>
|
||||
public NpgsqlSkillProvider ()
|
||||
{
|
||||
|
||||
}
|
||||
string connectionString = null;
|
||||
string applicationName = null;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize this object using the specified name and config.
|
||||
/// </summary>
|
||||
/// <param name="name">Name.</param>
|
||||
/// <param name="config">Config.</param>
|
||||
public override void Initialize (string name, NameValueCollection config)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace (config ["connectionStringName"]))
|
||||
throw new ConfigurationErrorsException ("No name for Npgsql connection string found");
|
||||
|
||||
connectionString = ConfigurationManager.ConnectionStrings [config ["connectionStringName"]].ConnectionString;
|
||||
applicationName = config ["applicationName"] ?? "/";
|
||||
}
|
||||
|
||||
#region implemented abstract members of SkillProvider
|
||||
/// <summary>
|
||||
/// Gets the user skills.
|
||||
/// </summary>
|
||||
/// <returns>The user skills.</returns>
|
||||
/// <param name="username">Username.</param>
|
||||
public override PerformerProfile GetUserSkills (string username)
|
||||
{
|
||||
var skills = new List <UserSkill>();
|
||||
var profile = new PerformerProfile (username);
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
" select u._id, u.skillid, s.name, " +
|
||||
" u.comment, u.rate from userskills u, " +
|
||||
" skill s " +
|
||||
" where u.skillid = s._id and " +
|
||||
" u.username = :uname " +
|
||||
" and applicationname = :app " +
|
||||
" order by u.rate desc";
|
||||
cmd.Parameters.AddWithValue ("uname", NpgsqlTypes.NpgsqlDbType.Varchar, username);
|
||||
cmd.Parameters.AddWithValue ("app", NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
|
||||
cmd.Prepare ();
|
||||
using (var rdr = cmd.ExecuteReader ()) {
|
||||
if (rdr.HasRows) while (rdr.Read ()) {
|
||||
skills.Add (new UserSkill () {
|
||||
Id = rdr.GetInt64 (0),
|
||||
SkillId = rdr.GetInt64 (1),
|
||||
SkillName = rdr.GetString (2),
|
||||
Comment = rdr.GetString (3),
|
||||
Rate = rdr.GetInt32(4)
|
||||
});
|
||||
}
|
||||
profile.Skills = skills.ToArray ();
|
||||
}
|
||||
}
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
"select uniqueid from profiles where username = :user and applicationname = :app";
|
||||
cmd.Parameters.AddWithValue ("user", NpgsqlTypes.NpgsqlDbType.Varchar, username);
|
||||
cmd.Parameters.AddWithValue ("app", NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
|
||||
profile.Id = (long) cmd.ExecuteScalar ();
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return profile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create the specified skill.
|
||||
/// </summary>
|
||||
/// <param name="skill">skill.</param>
|
||||
public override long Declare (Skill skill)
|
||||
{
|
||||
long res = 0;
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
if (skill.Id == 0) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "insert into skill (name,rate) values (:name,:rate) returning _id";
|
||||
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Varchar, skill.Name);
|
||||
cmd.Parameters.AddWithValue ("rate",
|
||||
NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
|
||||
res = (long)cmd.ExecuteScalar ();
|
||||
}
|
||||
} else {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "update skill set name = :name, rate = :rate where _id = :sid";
|
||||
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Bigint, skill.Id);
|
||||
cmd.Parameters.AddWithValue ("rate",
|
||||
NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Declares the userskill.
|
||||
/// </summary>
|
||||
/// <returns>The userskill.</returns>
|
||||
/// <param name="userskill">userskill.</param>
|
||||
public override long Declare (UserSkillDeclaration userskill)
|
||||
{
|
||||
long res=0;
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
if (userskill.Id == 0) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "insert into userskills" +
|
||||
" (username, applicationname, skillid, rate, comment) " +
|
||||
" values (:uname,:app,:sid,:rate,:cmnt) returning _id";
|
||||
cmd.Parameters.AddWithValue ("uname",
|
||||
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.UserName);
|
||||
cmd.Parameters.AddWithValue ("app",
|
||||
NpgsqlTypes.NpgsqlDbType.Varchar, applicationName);
|
||||
cmd.Parameters.AddWithValue ("sid",
|
||||
NpgsqlTypes.NpgsqlDbType.Bigint, userskill.SkillId);
|
||||
cmd.Parameters.AddWithValue ("rate",
|
||||
NpgsqlTypes.NpgsqlDbType.Integer, userskill.Rate);
|
||||
cmd.Parameters.AddWithValue ("cmnt",
|
||||
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.Comment);
|
||||
userskill.Id = res = (long)cmd.ExecuteScalar ();
|
||||
}
|
||||
} else {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "update userskills" +
|
||||
" set rate = :rate," +
|
||||
" comment = :cmnt) " +
|
||||
" where _id = :usid ";
|
||||
cmd.Parameters.AddWithValue ("comment",
|
||||
NpgsqlTypes.NpgsqlDbType.Varchar, userskill.Comment);
|
||||
cmd.Parameters.AddWithValue ("rate",
|
||||
NpgsqlTypes.NpgsqlDbType.Integer, userskill.Rate);
|
||||
cmd.Parameters.AddWithValue ("usid",
|
||||
NpgsqlTypes.NpgsqlDbType.Bigint, userskill.Id);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rate the specified user's skill.
|
||||
/// It creates the record describing the user's skill
|
||||
/// if not existent.
|
||||
/// </summary>
|
||||
/// <param name="userSkill">UserSkillRating.</param>
|
||||
public override long Rate (UserSkillRating userSkill)
|
||||
{
|
||||
// TODO Use the Author value to choose
|
||||
// between a self rating that goes into the `userskills` table
|
||||
// and a client rating that goes into the
|
||||
// `statisfaction` table.
|
||||
long usid = 0;
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
if (userSkill.Id == 0) {
|
||||
cmd.CommandText = "insert into userskills " +
|
||||
" ( skillid, rate, username, applicationname ) " +
|
||||
" values ( :sid, :rate, :uname, :app ) " +
|
||||
" returning _id ";
|
||||
cmd.Parameters.AddWithValue ("sid", NpgsqlDbType.Bigint, userSkill.Id);
|
||||
cmd.Parameters.AddWithValue ("rate", NpgsqlDbType.Integer, userSkill.Rate);
|
||||
cmd.Parameters.AddWithValue ("uname", NpgsqlDbType.Varchar, userSkill.Performer);
|
||||
cmd.Parameters.AddWithValue ("app", NpgsqlDbType.Varchar, applicationName);
|
||||
usid = (long) cmd.ExecuteScalar ();
|
||||
} else {
|
||||
cmd.CommandText = "update userskills " +
|
||||
" set rate = :rate " +
|
||||
" where _id = :usid ";
|
||||
cmd.Parameters.AddWithValue ("rate", NpgsqlDbType.Integer, userSkill.Rate);
|
||||
cmd.Parameters.AddWithValue ("usid", NpgsqlDbType.Bigint, userSkill.Id);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return usid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rate the specified skill.
|
||||
/// The access to this method
|
||||
/// should be restricted to an Admin,
|
||||
/// or a rating engine
|
||||
/// </summary>
|
||||
/// <param name="skill">Skill.</param>
|
||||
public override void Rate (SkillRating skill)
|
||||
{
|
||||
// TODO Use the Author value to choose
|
||||
// between a global setting for the application
|
||||
// and an user setting on his needs
|
||||
|
||||
// when the `Author` value is not null,
|
||||
// it's concerning a rating on a need of the Author
|
||||
// if not, it's a need of the site
|
||||
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "update skill set rate = :rate where _id = :sid";
|
||||
cmd.Parameters.AddWithValue ("sid", NpgsqlTypes.NpgsqlDbType.Bigint, skill.Id);
|
||||
cmd.Parameters.AddWithValue ("rate", NpgsqlTypes.NpgsqlDbType.Integer, skill.Rate);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Finds the skill identifier.
|
||||
/// </summary>
|
||||
/// <returns>The skill identifier.</returns>
|
||||
/// <param name="pattern">Pattern.</param>
|
||||
public override Skill[] FindSkill (string pattern)
|
||||
{
|
||||
List<Skill> skills = new List<Skill> ();
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = "select _id, name, rate from skill where name like :name order by rate desc";
|
||||
cmd.Parameters.AddWithValue ("name", NpgsqlTypes.NpgsqlDbType.Varchar, pattern);
|
||||
cmd.Prepare ();
|
||||
using (var rdr = cmd.ExecuteReader ()) {
|
||||
if (rdr.HasRows) while (rdr.Read ()) {
|
||||
skills.Add (new Skill () {
|
||||
Id = (long)rdr.GetInt64 (0),
|
||||
Name = (string)rdr.GetString (1),
|
||||
Rate = (int) rdr.GetInt32(2)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return skills.ToArray ();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the performer.
|
||||
/// </summary>
|
||||
/// <returns>The performer.</returns>
|
||||
/// <param name="skillIds">Skill identifiers.</param>
|
||||
public override string[] FindPerformer (long[] skillIds)
|
||||
{
|
||||
var res = new List<string> ();
|
||||
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
|
||||
cmd.CommandText = " select username from userskills " +
|
||||
" where skillid = :sid " +
|
||||
" order by rate desc ";
|
||||
cmd.Parameters.AddWithValue ("sid", NpgsqlDbType.Bigint, 0);
|
||||
cmd.Prepare ();
|
||||
|
||||
foreach ( long sid in skillIds )
|
||||
{
|
||||
cmd.Parameters ["sid"].Value = sid;
|
||||
using (var rdr = cmd.ExecuteReader ()) {
|
||||
string uname = rdr.GetString (0);
|
||||
if (!res.Contains(uname))
|
||||
res.Add (uname);
|
||||
}
|
||||
}
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
return res.ToArray ();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the skill.
|
||||
/// </summary>
|
||||
/// <param name="skillId">Skill identifier.</param>
|
||||
public override void DeleteSkill (long skillId)
|
||||
{
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = " delete from skill " +
|
||||
" where _id = :sid ";
|
||||
cmd.Parameters.AddWithValue ("sid", NpgsqlTypes.NpgsqlDbType.Bigint,skillId);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the user skill.
|
||||
/// </summary>
|
||||
/// <param name="userSkillId">User skill identifier.</param>
|
||||
public override void DeleteUserSkill(long userSkillId) {
|
||||
using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) {
|
||||
cnx.Open ();
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText = " delete from userskills " +
|
||||
" where _id = :usid ";
|
||||
cmd.Parameters.AddWithValue ("usid", NpgsqlTypes.NpgsqlDbType.Bigint,userSkillId);
|
||||
cmd.ExecuteNonQuery ();
|
||||
}
|
||||
cnx.Close ();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue