|
|
|
|
|
//
|
|
|
|
|
|
// NpgsqlCircleProvider.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 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
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Npgsql circle provider.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class NpgsqlCircleProvider : CircleProvider
|
|
|
|
|
|
{
|
|
|
|
|
|
#region implemented abstract members of CircleProvider
|
Thème clair opé, WIP circles
* animate.css: animations css
* links.css: liens avec le fond blanc qui se déroule
* links.css: WIP liens thème sombre
* GitHub.ico: un petit merci à GitHub
* live-concert-fg.png: image de plan rapproché : les fans
* live-concert-scene.jpg: Image de fond : la scene
* splash-image-2.jpg: image de fond : photo colorée, public de
concert, vient de totemproduction.fr
* links.css: ficher de définitions globales du style des bouttons
(encore inutilisé)
* yavsc.user.js: WIP implémente le widget "utilisateur", permettant
l'affichage des liens rapides pour tout nom d'ulitisateur, le cas
échéant, vers l'ajout à un cercle,
vers son blog, vers des methodes choisies d'administateur, vers ses
réseaux sociaux, voir plus.
* About.aspx: Implémente une page "à propos"
* Test.aspx: Page de test: désolé pour le bruit, elle n'est compilée
qu'en mode `Debug` (elle n'est pas accessible en production)
* NpgsqlBlogProvider.cs: Corrige la méthode pour enlever un tag à un
article ...
* NpgsqlBlogProvider.csproj: .
* NpgsqlCircleProvider.cs: liste les cercles auquels appartient un
utilisateur.
* BasketController.cs:
* NpgsqlContentProvider.cs: Les commandes sont fortement typée.
* README.md: mise à jour des priorités
* style.css: réécriture du thème clair
* style.css: * implémente un classe css `clickme` pour attirer l'oeil
sur le boutton de validation après la modification d'un champ de
formulaire.
* enlève tous les coins arrondis
* modifie la chasse de caractères (une seule utilisée pour le moment)
*
* style.css: * integre la référence à la feuille de style des
[animations](https://daneden.github.io/animate.css/)
* corrige des marges, alignements
* supprime ce qui reste de coin arrondi
* néttoye les définitions obsolètes
* définit la classe `username`
* corrige le survol à la suppression de tag
* FrontOfficeController.cs: renomme des methodes, refabriqué pour
s'adapter aux changements de l'API du workflow,
WIP propose les cercles utilisateurs pour l'ajout des profiles
préstataires aux cercles.
* HomeController.cs: implémente une page "à propos"
* T.cs: re-autorise le titre vide de page, au cas où ... car ce n'est
pas un véritable
défaut fonctionnel.
* YavscHelpers.cs: Implemente un outil de presentation des liens
action traduits. Tous les liens action utilisent maintenant cette
nouvelle methode,
au profile de celle du framework `HtmlHelpers.ActionLink`
* App.master: corrige l'usage du contrôle utilisateur des cotes dans
le cadre des cotes de billet.
* AppAdmin.master:
* Index.aspx:
* Service.aspx:
* ProductCategory.aspx: traduction des liens action
* NoLogin.master: * traduction des liens action
* suppression des liens de remerciement dans le bas de page, cette
information a été déplacée dans la page `/Home/Credits`
* to-markdown.js: transforme maintenant les noeuds Html `div` en
paragraphes Markdown.
* yavsc.hidefieldset.js: Le script règle la forme de la souris au
survol du bouton,
le cas échéant.
* yavsc.js: nouvelle fonction javascript pour logger un objet
arbitraire.
* yavsc.rate.js: Fixe la possibilité de mettre des cotes très basses
ou très hautes (reste encore un mieux à faire),
Affiche au survol des descriptions optionnelles de la cote.
* Title.aspx:
* UserPost.aspx:
* Edit.aspx:
* Index.aspx:
* Brand.aspx:
* Index.aspx:
* PostActions.ascx:
* TitleNotFound.aspx:
* Booking.aspx:
* Command.aspx:
* ChangePasswordSuccess.aspx: Traduction des liens action
* Login.aspx: * Traduction des liens actionTraduction des liens action
* Profile.aspx: * Traduction des liens actionTraduction des liens
action
* utilisation de la classe css `mayhide` qui autorise maintenant un
champ d'entrées de formulaire à être plié/déplié au click sur sa
légende.
* Admin.aspx: Traduction des liens actionTraduction des liens
actionTraduction des liens actionTraduction des liens
actionTraduction des liens actionTraduction des liens action
* Backups.aspx:
* RoleList.aspx:
* UserList.aspx:
* Index.aspx: Traduction des liens actionTraduction des liens action
* Edit.aspx: * refabrication de la structure Html
* Traduction des liens actionTraduction des liens action
* Index.aspx: Simlpification des apperçus de blog
* TagControl.ascx: refabrication pour simplifier l'implémentation du
contrôle utilisateur des tags
* UserPosts.aspx: Traduction des liens action, et simplification du
listing de blog
* Basket.aspx: Affiche les articles du panier de commandes avec leur
vue
dédiée à leur type (les commande sont maintenant fortement typées)
* Catalog.aspx: Traduction des liens action, correctin du lien vers le
produit
(cassé depuis une vielle refabrication des routes)
* DoAnEstimate.aspx: refabrication de la vue de création du devis:
renommée depuis `Estimate`
* Performer.ascx: * un message supplementaire à l'absence de
compétence affichée par un préstataire
* des guillemets autour du commentaire du préstataire sur sa
compétence
* ajout du préstataire au cercles
* Performers.aspx: Décrit en détail les informations sur la
disponibilité d'un préstataire,
à la date demandée.
* YourEstimates.aspx: renomage de cette page, pour préciser sa
fonction : Vos devis.
* Contact.aspx: structure Html de la page de contact
* Credits.aspx: Ajoute les remerciements aux communauté du libre
* Index.aspx: ne fait rien
* Web.config: * import de `System.Transactions`
* mise à jour des credits libres
* WebDeploy.targets: utilise les séparateurs de chemin vers ficher à
la POSIX, ne change rien pour ma config ... (TODO tester sous
WoinDose)
* Yavsc.csproj: déploie des pages des scripts Javascript et des images
et feuilles de style en plus.
* CircleManager.cs: implémente les methodes utilisées à la
construction du contrôle utilisateur.
* CircleProvider.cs: * doc xml
* extension de interface
* Commande.cs: l'objet `Command` devient abstrait, pour exister (être
instanciée), une commande doit maintenant hériter de cet objet
abstrait.
* LocalizedText.resx:
* LocalizedText.fr.resx:
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: traductions
* IContentProvider.cs: doc xml
* SiteSkills.aspx: renomage de cette page, pour préciser sa fonction :
les compétences sur ce site.
10 years ago
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Circles the specified ownername and username.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="ownername">Ownername.</param>
|
|
|
|
|
|
/// <param name="username">Username.</param>
|
|
|
|
|
|
public override string[] Circles (string ownername, string username)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<string> circles = new List<string> ();
|
|
|
|
|
|
using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) {
|
|
|
|
|
|
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
|
|
|
|
|
cmd.CommandText = @"select c.title from circle c, circle_members m
|
|
|
|
|
|
where c.owner = :wnr
|
|
|
|
|
|
and c._id = m.circle_id
|
|
|
|
|
|
and m.member = :user
|
|
|
|
|
|
and m.applicationname = :app
|
|
|
|
|
|
";
|
|
|
|
|
|
cmd.Parameters.AddWithValue ("wnr",ownername);
|
|
|
|
|
|
cmd.Parameters.AddWithValue ("user",username);
|
|
|
|
|
|
cmd.Parameters.AddWithValue ("app",applicationName);
|
|
|
|
|
|
cnx.Open ();
|
|
|
|
|
|
using (NpgsqlDataReader rdr = cmd.ExecuteReader ()) {
|
|
|
|
|
|
if (rdr.HasRows) while (rdr.Read ())
|
|
|
|
|
|
circles.Add (rdr.GetString (0));
|
|
|
|
|
|
rdr.Close ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
cnx.Close ();
|
|
|
|
|
|
}
|
|
|
|
|
|
return circles.ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Updates the circle.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="c">C.</param>
|
|
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Get the specified circle by id, including all of its members.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id">Identifier.</param>
|
|
|
|
|
|
/// <returns>The members.</returns>
|
|
|
|
|
|
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<string> members = new List<string> ();
|
|
|
|
|
|
using (NpgsqlDataReader dr = cmd.ExecuteReader ()) {
|
|
|
|
|
|
while (dr.Read ())
|
|
|
|
|
|
members.Add (dr.GetString (0));
|
|
|
|
|
|
dr.Close ();
|
|
|
|
|
|
circ.Members = members.ToArray ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
cnx.Close ();
|
|
|
|
|
|
}
|
|
|
|
|
|
return circ;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Gets the identifier.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>The identifier.</returns>
|
|
|
|
|
|
/// <param name="circle">Circle.</param>
|
|
|
|
|
|
/// <param name="username">Username.</param>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Removes the membership.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="circle_id">Circle identifier.</param>
|
|
|
|
|
|
/// <param name="member">Member.</param>
|
|
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Removes the member from all current user circles.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="member">Member.</param>
|
|
|
|
|
|
public override void RemoveMember (string member)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new NotImplementedException ();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Initializes a new instance of the <see cref="WorkFlowProvider.NpgsqlCircleProvider"/> class.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public NpgsqlCircleProvider ()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#region implemented abstract members of CircleProvider
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Returns circles from owner.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="circle_ids">Circle identifiers.</param>
|
|
|
|
|
|
/// <param name="member">Member name.</param>
|
|
|
|
|
|
public override bool Matches (long[] circle_ids, string member)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool result = false;
|
|
|
|
|
|
using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString))
|
|
|
|
|
|
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
* bg.gif:
* asc.gif:
* desc.gif:
* style.css: moved to App_Themes
* style.css:
* bg.gif:
* asc.gif:
* bg.png:
* rect.png:
* asc.png:
* desc.gif:
* jquery-ui.css:
* mdd_styles.css:
* croix.png:
* desc.png:
* style.css:
* jquery-ui.min.css:
* mdd_gripper.png:
* mdd_toolbar.png:
* jquery.timepicker.css:
* mdd_ajax_loader.gif:
* mdd_modal_background.png: moved to /App_Themes
* NpgsqlBlogProvider.cs: * Remove post by id
* Manage collections of entries on a couple (user,title), not a single
post
* NpgsqlCircleProvider.cs: Fixes the "Match" method.
* IDbModule.cs:
* Edit.aspx:
* Estimates.aspx:
* WorkFlowManager.cs:
* NpgsqlContentProvider.cs: refactoring
* NpgsqlMRPProviders.csproj: new NpgsqlUserName provider
* NpgsqlRoleProvider.cs: simpler init method
* NpgsqlUserNameProvider.cs: impements a UserNameProvider
* MyClass.cs: refactoring from Yavsc.Model
* BlogsController.cs: access control simplified
* FrontOfficeController.cs: Pdf generation made public ni case of
formatting exception
* mdd_styles.css: Theme -> App_Themes
* style.css: yet another style impact
* AccountController.cs: Fixes the user name modification
* BlogsController.cs: * Fixes the removal process
* On a title and user name, we get collection of posts, not only one.
* Implements an Access on circle
* FrontOfficeController.cs: * implements a new Get method.
* ensure a membership existence before delivering an estimate.
* GoogleController.cs: Fixes the user name modification on a Google
account
* ErrorHtmlFormatter.cs: nice error message in html (using Markdown
helper)
* FormatterException.cs: formatter exception exposes error and
standard output of the process
* TexToPdfFormatter.cs: * generates temporary files in the folder
returned by Path.GetTempPath()
* throws FormatterException
* Global.asax.cs: new route map:
Blogs/{action}/{user}/{title}
Blog/{user}/{title}
B/{id}
{controller}/{action}/{id}
* App.master: * refactoring: Theme moved to App_Themes
* a link to the logged user's blog
*
* NoLogin.master: refactoring: Theme moved to App_Themes
* Circles.aspx: refactoring : circles now are given as select items
* Login.aspx: fixes the html presentation
* Register.aspx: Fixes a Typo
* Index.aspx: Implements a blog index, due to M&C changes with this
commit
* RemovePost.aspx: links to the new route to the "RemovePost" action,
giving it a post id
* RemoveTitle.aspx: fixes a not yet linked page to remove a post
collection under a given title
* EventPub.aspx: code refactoring
* Writting.ascx: cleans the code
* Web.config: fills the config with new names in the space
* Web.config: configures the new NpgsqlUserNameProvider
* Web.csproj: refactoring and others
* BlogEntryCollection.cs: implement the BlogEntryCollection
* BlogManager.cs: the manager helps to filter on access
* BlogProvider.cs: The title is not unique anymore, and one can modify
it, post a lot under it, drop all posts under it.
A Post is deleted by id.
* UUBlogEntryCollection.cs: implements a collection of post under a
given user name.
* UUTBlogEntryCollection.cs: implements a collection of post under a
given couple (user name, title).
* ListItem.cs: ListItem is declared obsolete in this model, helpers
can build MVC SelectListItem on data returned by the manager.
* LocalizedText.Designer.cs:
* LocalizedText.fr.Designer.cs: autogenerated from xml
* LocalizedText.resx:
* LocalizedText.fr.resx: new labels
* ChangeUserNameProvider.cs: xml doc
* Profile.cs: the UserName property is read only, and comes from
authentication, to change it, we set a Name and validate it agains
the "Profile" method
* UserManager.cs: simpler code a init time
* IContentProvider.cs: implements the new IDataProvider interface
* IDataProvider.cs: defines the new IDataProvider interface
* YavscModel.csproj: includes new classes
* UserPosts.aspx: adds a link to remove a post
* UserPost.aspx: now uses the new BlogEntryCollection object
10 years ago
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Add the specified user.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id">circle Identifier.</param>
|
|
|
|
|
|
/// <param name="username">User name.</param>
|
|
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Get the specified circle by id.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id">Identifier.</param>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Add the specified owner, title and users.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="owner">Owner.</param>
|
|
|
|
|
|
/// <param name="title">Title.</param>
|
|
|
|
|
|
/// <param name="users">Users.</param>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Delete the specified title.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id">Identifier.</param>
|
|
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// List user's circles.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="user">User.</param>
|
|
|
|
|
|
public override IEnumerable<CircleBase> List (string user)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<CircleBase> cc = new List<CircleBase> ();
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
/// <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"] ?? "/";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|