// // NpgsqlCircleProvider.cs // // Author: // Paul Schneider // // 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 . using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; using System.Web.Mvc; using System.Web.Security; using Npgsql; using NpgsqlTypes; using Yavsc.Model; using Yavsc.Model.Circles; namespace WorkFlowProvider { /// /// Npgsql circle provider. /// public class NpgsqlCircleProvider : CircleProvider { #region implemented abstract members of CircleProvider /// /// Updates the circle. /// /// C. public override void UpdateCircle (CircleBase c) { using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "update circle " + "set title = :title " + "where _id = :cid "; cmd.Parameters.AddWithValue ("title", c.Title); cmd.Parameters.AddWithValue ("cid", c.Id); cmd.ExecuteNonQuery (); } cnx.Close (); } } /// /// Get the specified circle by id, including all of its members. /// /// Identifier. /// The members. public override Circle GetMembers (long id) { Circle circ = null; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select title, owner, public from circle where _id = :cid"; cmd.Parameters.AddWithValue ("cid", id); using (NpgsqlDataReader dr = cmd.ExecuteReader ()) { if (dr.Read ()) { circ = new Circle (); circ.Id = id; circ.Title = dr.GetString ( dr.GetOrdinal ("title")); circ.Owner = dr.GetString ( dr.GetOrdinal ("owner")); } dr.Close (); } } if (circ != null) { using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select member from circle_members where circle_id = :cid"; cmd.Parameters.AddWithValue ("cid", NpgsqlTypes.NpgsqlDbType.Bigint, id); cmd.Prepare (); List members = new List (); using (NpgsqlDataReader dr = cmd.ExecuteReader ()) { while (dr.Read ()) members.Add (dr.GetString (0)); dr.Close (); circ.Members = members.ToArray (); } } } cnx.Close (); } return circ; } /// /// Gets the identifier. /// /// The identifier. /// Circle. /// Username. public override long GetId (string circle, string username) { long cid = 0; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select _id from circle where " + "owner = :uname " + "and title = :title " + "and applicationname = :appname"; cmd.Parameters.AddWithValue ("uname", username); cmd.Parameters.AddWithValue ("title", circle); cmd.Parameters.AddWithValue ("appname", applicationName); cid = (long)cmd.ExecuteScalar (); } cnx.Close (); } return cid; } /// /// Removes the membership. /// /// Circle identifier. /// Member. public override void RemoveMembership (long circle_id, string member) { using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "delete from circle_members where circle_id = :cid and username = :uname"; cmd.Parameters.AddWithValue ("cid", circle_id); cmd.Parameters.AddWithValue ("uname", member); cnx.Open (); cmd.ExecuteNonQuery (); cnx.Close (); } } /// /// Removes the member from all current user circles. /// /// Member. public override void RemoveMember (string member) { throw new NotImplementedException (); } #endregion /// /// Initializes a new instance of the class. /// public NpgsqlCircleProvider () { } #region implemented abstract members of CircleProvider /// /// Returns circles from owner. /// /// Circle identifiers. /// Member name. public override bool Matches (long[] circle_ids, string member) { bool result = false; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select count(*)>0 from circle_members where circle_id = :cid and member = :mbr"; cmd.Parameters.Add ("cid", NpgsqlDbType.Bigint); cmd.Parameters.AddWithValue ("mbr", NpgsqlDbType.Varchar, member); cnx.Open (); cmd.Prepare (); foreach (long cid in circle_ids) { result = (bool)cmd.ExecuteScalar (); if (result) break; } cnx.Close (); } return result; } /// /// Add the specified user. /// /// circle Identifier. /// User name. public override void AddMember (long id, string username) { using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "insert into circle_members (circle_id, member) values (:cid,:uname)"; cmd.Parameters.AddWithValue ("cid", id); cmd.Parameters.AddWithValue ("uname", username); cnx.Open (); cmd.ExecuteNonQuery (); cnx.Close (); } } /// /// Get the specified circle by id. /// /// Identifier. public override CircleBase Get (long id) { CircleBase circ = null; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select title, owner from circle where _id = :cid"; cmd.Parameters.AddWithValue ("cid", id); using (NpgsqlDataReader rdr = cmd.ExecuteReader ()) { if (rdr.Read ()) { circ = new CircleBase (); circ.Id = id; circ.Owner = rdr.GetString (1); circ.Title = rdr.GetString (0); } } } cnx.Close (); } return circ; } /// /// Add the specified owner, title and users. /// /// Owner. /// Title. /// Users. public override long Create (string owner, string title, string[] users) { long id = 0; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "insert into circle (owner,title,applicationname,public) values (:wnr,:tit,:app,FALSE) returning _id"; cmd.Parameters.AddWithValue ("wnr", owner); cmd.Parameters.AddWithValue ("tit", title); cmd.Parameters.AddWithValue ("app", applicationName); id = (long)cmd.ExecuteScalar (); } using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "insert into circle_members (circle_id,member) values (@cid,@mbr)"; cmd.Parameters.AddWithValue ("cid", NpgsqlDbType.Bigint , id); cmd.Parameters.Add ("mbr", NpgsqlDbType.Varchar); cmd.Prepare (); if (users != null) foreach (string user in users) { cmd.Parameters [1].Value = user; cmd.ExecuteNonQuery (); } } cnx.Close (); } return id; } /// /// Delete the specified title. /// /// Identifier. public override void Delete (long id) { using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "delete from circle where _id = @cid"; cmd.Parameters.AddWithValue ("cid", id); cnx.Open (); cmd.ExecuteNonQuery (); cnx.Close (); } } /// /// List user's circles. /// /// User. public override IEnumerable List (string user) { List cc = new List (); using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select _id, title from circle where owner = :wnr"; cmd.Parameters.AddWithValue ("wnr",user); cnx.Open (); using (NpgsqlDataReader rdr = cmd.ExecuteReader ()) { if (rdr.HasRows) { while (rdr.Read ()) { CircleBase cb = new CircleBase (); cb.Id = rdr.GetInt64 (0); cb.Title = rdr.GetString (1); cb.Owner = user; cc.Add (cb); } } rdr.Close (); } } cnx.Close (); } return cc; } #endregion string connectionString = null; string applicationName = null; /// /// Initialize this object using the specified name and config. /// /// Name. /// Config. 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"] ?? "/"; } } }