Gabe Sumner

Gabe Sumner

The RSS Feed URL cannot be found!
The remote server returned an error: (400) Bad Request.

Back to all posts

Auto-generate a Web Admin Interface using LINQ to SQL

LinqMyAdmin Screen ShotLike a lot of web programmers, I spent years using PHP to create web applications. One of the tools I frequently used in conjunction with PHP was phpMyAdmin . This helpful web-based tool allowed me to easily manage my MySQL databases via a web browser.

After reading Scott Guthrie's "Binding UI using the ASP:LinqDataSource Control" article I became intrigued by the idea of building a phpMyAdmin-like inteface that could utlize any "LINQ to SQL Class". In theory this seemed simple, in practice it involved a lot reflection .

I have a very early build of this running and have provided the code below. Comments are sprinkled throughout the code and explain what is happening. Here is how to create this:

Step 1: Create the ASPX page

Create the following ASPX file: ~/admin/LinqMyAdmin.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="LinqMyAdmin.aspx.cs" Inherits="LinqMyAdmin" %> 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title>LinqMyAdmin</title> 
    <link href="./LinqMyAdmin.css" rel="Stylesheet" type="text/css" /> 
</head> 
<body> 
    <form id="form1" runat="server">  
    <div> 
        <div id="contentwrapper">  
        <div id="contentcolumn">  
            <asp:PlaceHolder ID="LinqPlaceHolder" EnableViewState="true" Visible="true" runat="server"></asp:PlaceHolder> 
            <h2 id="TableHeader" runat="server" /> 
            <asp:GridView   
                ID="TableGrid"   
                PageSize = "20" 
                AllowPaging = "true" 
                AllowSorting = "true" 
                EnableViewState = "true" 
                AutoGenerateColumns = "true" 
                AutoGenerateDeleteButton = "true" 
                AutoGenerateEditButton = "true" 
                runat="server">  
                <AlternatingRowStyle CssClass="odd" /> 
                <PagerStyle CssClass="pager" HorizontalAlign="Left" /> 
            </asp:GridView> 
        </div> 
        </div> 
        <div id="leftcolumn">  
            <h2>Tables</h2> 
            <asp:Repeater ID="TablesRepeater" EnableViewState="false" runat="server">  
                <HeaderTemplate> 
                    <ul> 
                </HeaderTemplate> 
                <ItemTemplate> 
                    <li><a href="linqmyadmin.aspx?table=<%# Container.DataItem %>"><%# Container.DataItem %></a></li> 
                </ItemTemplate> 
                <FooterTemplate> 
                    </ul> 
                </FooterTemplate> 
            </asp:Repeater> 
        </div> 
    </div>          
    </form> 
</body> 
</html> 

Step 2: Create the Code-Behind

Create the following code-behind file: ~/admin/LinqMyAdmin.aspx.cs

using System;  
using System.Collections;  
using System.Data.Linq.Mapping;  
using System.Reflection;  
using System.Text.RegularExpressions;  
using System.Web;  
using System.Web.UI.WebControls;  
 
public partial class LinqMyAdmin : System.Web.UI.Page  
{  
    // --------------------------------------------------------------------  
    // CHANGE THE FOLLOWING LINE TO REFER TO YOUR LinqDataContext CLASS  
    // --------------------------------------------------------------------  
    string LinqSQLClass = "Intranet.Data.NorthwindDataContext, App_Code";  
    Type LinqContextType;  
 
    /// <summary>  
    /// Executed upon Page Load.  
    /// </summary>  
    protected void Page_Load(object sender, EventArgs e)  
    {  
        string TableName = Request.QueryString["table"];  
 
        // Display a list of available Tables  
        LinqContextType = System.Type.GetType(LinqSQLClass, true);  
        TablesRepeater.DataSource = GetAllTables(LinqContextType);  
        TablesRepeater.DataBind();  
 
        // If we have a "table" value in our querystring, then display the table.  
        if (TableName != null)  
        {  
            DisplayTable(TableName);  
        }  
    }  
 
    /// <summary>  
    /// Gets a list of all Tables found in a LinqContext  
    /// </summary>  
    /// <param name="_Type">The LinqContext Type</param>  
    /// <returns>list of table names.</returns>  
    private ArrayList GetAllTables(Type _Type)  
    {  
        ArrayList _Tables = new ArrayList();  
        PropertyInfo[] _AllProperties = _Type.GetProperties();  
        foreach (var _PropInfo in _AllProperties)  
        {  
            // LINQ Tables are Generics and will be declared as type System.Data.Linq.Table<TEntity>  
            // I worked a long time to create a generic Table Type comparison.  Nothing worked.  
            // So I ended up just converting the type to a string and searching for a pattern.  :(  
            if (Regex.IsMatch(_PropInfo.PropertyType.ToString(), @"^System.Data.Linq.Table") == true)  
            {  
                _Tables.Add(_PropInfo.Name);  
            }  
        }  
        return _Tables;  
    }  
 
    /// <summary>  
    ///   
    /// </summary>  
    /// <param name="TableName"></param>  
    private void DisplayTable(string TableName)  
    {  
        // We don't know the ContextTypeName or TableName in advance.  
        // Create a LinqDataSource control dynamically and add it to our  
        // PlaceHolder control.  
        LinqDataSource _linqSource = new LinqDataSource();  
        _linqSource.ID = "LinqSource";  
        _linqSource.ContextTypeName = LinqSQLClass;  
        _linqSource.TableName = TableName;  
        _linqSource.EnableInsert = true;  
        _linqSource.EnableDelete = true;  
        _linqSource.EnableUpdate = true;  
        _linqSource.AutoPage = true;  
        _linqSource.AutoSort = true;  
        _linqSource.EnableViewState = true;  
        LinqPlaceHolder.Controls.Add(_linqSource);  
 
        // Fetch the Primary Keys associated with the current table.  
        string[] _ID = GetTableKeys(TableName);  
          
        // Attach our LinqDataSource to our DataGrid.  
        TableHeader.InnerHtml = "Table -&gt; " + TableName;  
        TableGrid.DataSourceID = "LinqSource";  
        TableGrid.DataKeyNames = _ID;  
    }  
 
    /// <summary>  
    /// Get all properties associated with our LinqContext Table.  
    /// </summary>  
    /// <param name="TableName">The TableName</param>  
    /// <returns>The properties associated with this table</returns>  
    private PropertyInfo[] GetTableProperties(string TableName)  
    {  
        // All we currently have is a table name; "Customers" (plural).  
 
        // What we want to fetch are the properties associated with the  
        // model that is associated with our table.  That model, example,  
        // would be called "Customer" (singular).    
 
        // We find the connection between table & model by using  
        // reflection on the table.  The table will have have a type  
        // of System.Data.Linq.Table<Customer>.  The "Customer Type" is   
        // retrievable by looking at the Generic Arguments.  
          
        //  Clear as mud?  Great, let's get started...  
 
        Type _TableType = LinqContextType.GetProperty(TableName).PropertyType;  
        Type _ModelType;  
        PropertyInfo[] _ReturnProperties = null;  
 
        // Make sure we have a Generic Type  
        if (_TableType.IsGenericType == true)  
        {  
            Type[] _GenericArgs = _TableType.GetGenericArguments();  
 
            // Ensure that we have some Generic Arguments  
            if (_GenericArgs.Length > 0)  
            {  
                // Our model type will be the first Arg.  
                _ModelType = _GenericArgs[0];  
                _ReturnProperties = _ModelType.GetProperties();  
            }  
        }  
        return _ReturnProperties;  
    }  
 
    /// <summary>  
    /// Gets the primary keys associated with a LinqContext Table  
    /// </summary>  
    /// <param name="TableName">The Table Name</param>  
    /// <returns>A list of primary keys associated with the table</returns>  
    private string[] GetTableKeys(string TableName)  
    {  
        ArrayList _Keys = new ArrayList();  
        bool _PrimaryKey = false;  
 
        // Loop through each property found in the Table Model.  
        foreach (var _PropInfo in GetTableProperties(TableName))  
        {  
            // The Primary Key flag is a Custom Attribute.  Get all Custom Attributes  
            // associated with the current property.  
            Object[] _Objects = _PropInfo.GetCustomAttributes(true);  
 
            // Reset our Primary Key flag.  
            _PrimaryKey = false;  
 
            // Loop through each Custom Attribute.  
            foreach (Object _obj in _Objects)  
            {  
                // The attribute we're looking for is "System.Data.Linq.Mapping.ColumnAttribute"  
                if (_obj.GetType() == typeof(System.Data.Linq.Mapping.ColumnAttribute))  
                {  
                    ColumnAttribute _Attribute = (ColumnAttribute)_obj;  
                    if (_Attribute.IsPrimaryKey == true)  
                    {  
                        _PrimaryKey = true;  
                    }  
                }  
            }  
 
            if (_PrimaryKey == true)  
            {  
                _Keys.Add(_PropInfo.Name);  
            }  
        }  
 
        return _Keys.ToArray(typeof(string)) as string[];  
    }  

Step 3: Create the CSS

Create the following CSS file: ~/admin/LinqMyAdmin.css

body {  
    background-color#FFFFFF;  
    font-size15px;  
}  
#contentwrapper {  
    floatleft;  
    width: 100%;  
}  
#contentcolumn {  
    margin-left200px/*Set left margin to LeftColumnWidth*/ 
}  
#leftcolumn {  
    floatleft;  
    width200px/*Width of left column*/ 
    margin-left: -100%;  
}  
#leftcolumn ul {  
    list-stylenone;  
    margin-left5px;  
    padding-left0px;  
}  
#leftcolumn li   
{  
    padding-left0px;  
    margin-left0px;  
    margin-bottom5px;  
}  
h2 {  
    font-familyArial;  
}  
a:link {  
    color:#d42945;  
    text-decoration:none;  
}     
a:visited {  
    color:#d42945;  
    text-decoration:none;  
}         
a:hover, a:focus {  
    color:#f03b58;  
    text-decorationunderline;  
}  
table {  
    bordersolid 1px #e5eff8;  
}  
th {  
    font-weightnormal;  
    background:#f4f9fe;  
    text-aligncenter;  
    bordersolid 1px #e5eff8;  
    padding:.3em 1em;  
}  
thead th {  
    background:#f4f9fe;  
    text-aligncenter;  
    color:#66a3d3 
}     
tr.odd td {  
    background#f7fbff 
}  
td {  
    color#678197;  
    bordersolid 1px #e5eff8;  
    padding:.3em 1em;  
    text-aligncenter;  
}  
.pager td {  
    text-alignleft;  
}            

Access the page via the following URL: http://localhost/admin/LinqMyAdmin.aspx

I would not recommend putting this code on a public server or using production data. If you do happen to upload this code to a public server, be sure to secure access to the page.

Obviously this web application lacks a lot of functionality. What is amazing though is how much functionality I am getting "for free" because of ASP.NET's LinqDataSource and GridView. However, I find that I'm reaching the limit of what I can do dynamically. For example, weaving automatic foreign-key mappings into this code is proving difficult. I have some thoughts on how to overcome this, but have not yet found the time to experiment.

I hope to provide more updates later. Feedback is welcome!

Facebook DZone It! Digg It! StumbleUpon Technorati Del.icio.us NewsVine Reddit Blinklist Furl it!

Comments  34

  • Gabe Sumner 1 May, 02:58 PM

    It seems I didn't do enough research prior to creating this code.

    Microsoft already has a suite of "Dynamic Data" controls being cooked up.

    Here is a post describing these controls: http://weblogs.asp.net/scottgu/archive/2007/12/14/new-asp-net-dynamic-data-support.aspx

    I have not yet tested them, but they appear to do everything I was attempting to create on my own.


  • ebrerberb 6 May, 11:31 AM

    dynamic data craps all over your pitiful attempt. does drop downs for related fields too. never mind. seems you wasted a lot of time that could have been spent dining. learn to code a bit better too. the quality of your code is really bad.


  • Buffalo 13 Jun, 02:50 PM

    good work (even if there are other controls out there)


  • Steve 18 Jul, 11:25 AM

    After reading ebrerberb's comment, I can clearly see his code is superb. You can actually see the quality of his code come though his English prose. Like his code, his English also avoids the use of capitalization. Also, rather than using compound words (which a crappy programmer would use Camel Casing or underscores... eww!!!), our intrepid programmer opts to go against the grain of orthodox English by simply substituting compound words with two words. ZOMG!!!

    I surely wouldn't want to be crapped on by him!!!


  • samuel 3 Feb, 10:42 PM

    lo5RUU http://www.cRk2bdPqQls602mIa4bgo.com


  • hotel ibis hotel muenster in muenster 9 Apr, 11:32 AM

    Right People,little considerable business opportunity offer survive affect rest hope describe herself powerful would display press whose realise already familiar associate office replace when meaning first especially theme guest working emerge growing association household treaty reveal powerful transport visit suitable dry different vote male absence white cold mention intention fashion quick flight historical ring chemical start sleep where couple believe works legal important god whom die set age style mistake gentleman historical invite variety suppose support bloody about future hit be actually despite around smile band wish function talk beginning finger not every withdraw weak add


  • sex enhancer 14 Apr, 04:31 AM

    http://www.china-satibo.com/
    ● Help improve penis health.
    ● Enlarge your penis in length, width, and strength and response capability.
    ● Have herbal formula for preventing prostate problem.
    ● Assist with premature ejaculation and impotence.
    ● Improve overall kidney function and prevent the illness in kidney.
    ● Achieve more powerful thrusting ability and rock hard erections.
    ● Help to increase stamina and improve immune system.
    ● Increase male hormone and testicle hormone.
    ● Protect illness and accelerate blood circulation.
    htpp://www.china-satibo.com/


  • sex enhancer 18 Apr, 10:56 PM

    htpp://www.china-satibo.com/

    ●Viagra helps increase blood flow to the penis and may help men with ED (erectile dysfunction) get and keep an erection satisfactory for sexual activity. Once a man has completed sexual activity, blood flow to his penis should decrease and his erection should go away.
    ●Viagra has been clinically shown to improve erectile function even in men who had other health factors, like diabetes or prostate surgery.
    ●Viagra provided first-time success and reliable improvement of erection quality for many men. Men reported having harder erections and improved overall sexual experiences.
    ●Viagra has no adverse side effects on the heart or vision.
    ●Works for up to 6 hours;
    ●Recommended time to take before sex is 25 to 45 minutes;
    ●With Viagra, there are no food or alcohol restrictions. Romantic dinners are no longer out of the question;
    ●Taking Viagra does not make you more dependent upon it to get or maintain an erection.
    htpp://www.china-satibo.com/


  • sex enhancer 19 Apr, 10:35 PM

    http://www.china-satibo.com/
    ● Help improve penis health.
    ● Enlarge your penis in length, width, and strength and response capability.
    ● Have herbal formula for preventing prostate problem.
    ● Assist with premature ejaculation and impotence.
    ● Improve overall kidney function and prevent the illness in kidney.
    ● Achieve more powerful thrusting ability and rock hard erections.
    ● Help to increase stamina and improve immune system.
    ● Increase male hormone and testicle hormone.
    ● Protect illness and accelerate blood circulation.
    htpp://www.china-satibo.com/


  • sex enhancer 20 Apr, 10:26 PM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Treating erectile dysfunction(impotence), A man is impotent if he cannot achieve or sustain an erect penis for sexual activity.
    ●Cialis stays in your body for 36hrs, it allows you to choose the right moment.
    ●Cialis has been shown to work safely and effectively in adult men with erectile dysfunction(ED).Cialis remain active in the body in the following 24-36 hours. This means that Cialis allows you to achieve and maintain an erection easier than normal within this period.
    ●Man who can not erection long enough.
    ●Men who have difficulty all the time or just some of the time.
    ●Man who can not get or keep: a hard, erect penis suitable for sexual activity.
    htpp://www.china-satibo.com/


  • sex enhancer 20 Apr, 10:29 PM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Treating erectile dysfunction(impotence), A man is impotent if he cannot achieve or sustain an erect penis for sexual activity.
    ●Cialis stays in your body for 36hrs, it allows you to choose the right moment.
    ●Cialis has been shown to work safely and effectively in adult men with erectile dysfunction(ED).Cialis remain active in the body in the following 24-36 hours. This means that Cialis allows you to achieve and maintain an erection easier than normal within this period.
    ●Man who can not erection long enough.
    ●Men who have difficulty all the time or just some of the time.
    ●Man who can not get or keep: a hard, erect penis suitable for sexual activity.
    htpp://www.china-satibo.com/


  • sex enhancer 25 Apr, 11:08 PM

    http://www.china-satibo.com/
    We supply world renowned products and chinese herbal medicine for ailments like Impotence, Premature ejaculation, Fertility problems, loss of libido.
    Penis enlargment for man:
    http://www.china-satibo.com/news/wenickman.html
    http://www.china-satibo.com/news/maxman.html
    Sex medicine for woman:
    http://www.china-satibo.com/news/16.html


  • sex enhancer 27 Apr, 10:42 PM

    http://www.china-satibo.com
    Penis Enlargment for man,Penis Enhancement Capsules
    http://www.china-satibo.com/news/wenickman.html
    Wenick Man Capsules, is a potent herbal formula that helps improve the growth of penis and promote sex function.According to hundreds of medical experiments,Wenick Man Capsules has no side effect on your body.
    http://www.china-satibo.com/news/maxman.html
    Maxman capsules, is a 100% safe and natural herbal supplement that is reported to offer penis gains up to 36%. With Maxman satisfying results are guaranteed.
    We supply world renowned products and chinese herbal medicine for ailments like Impotence, Premature ejaculation, Fertility problems
    www china-satibo com
    www china-satibo com
    www china-satibo com


  • sex enhancer 28 Apr, 02:48 AM

    http://www.china-satibo.com
    Penis Enlargment for man,Penis Enhancement Capsules
    http://www.china-satibo.com/news/wenickman.html
    Wenick Man Capsules, is a potent herbal formula that helps improve the growth of penis and promote sex function.According to hundreds of medical experiments,Wenick Man Capsules has no side effect on your body.
    http://www.china-satibo.com/news/maxman.html
    Maxman capsules, is a 100% safe and natural herbal supplement that is reported to offer penis gains up to 36%. With Maxman satisfying results are guaranteed.
    We supply world renowned products and chinese herbal medicine for ailments like Impotence, Premature ejaculation, Fertility problems
    www china-satibo com
    www china-satibo com
    www china-satibo com


  • Hello! efkbeea interesting efkbeea site! 6 May, 08:20 PM

    Hello! efkbeea interesting efkbeea site!


  • sex enhancer 8 May, 01:13 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 8 May, 02:13 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 10 May, 01:17 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 10 May, 02:34 AM

    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 10 May, 10:27 PM

    http://www.china-satibo.com/
    sex enhancer,sex enhancement,penis enlargment for man,penis enhancement capsules
    http://www.china-satibo.com/news/wenickman.html
    http://www.china-satibo.com/news/maxman.html


  • sex enhancer 10 May, 10:27 PM

    http://www.china-satibo.com/
    sex enhancer,sex enhancement,penis enlargment for man,penis enhancement capsules
    http://www.china-satibo.com/news/wenickman.html
    http://www.china-satibo.com/news/maxman.html


  • sex enhancer 11 May, 01:32 AM

    http://www.china-satibo.com/
    sex enhancer,sex enhancement,penis enlargment for man,penis enhancement capsules
    http://www.china-satibo.com/news/wenickman.html
    http://www.china-satibo.com/news/maxman.html


  • sex enhancer 11 May, 10:22 PM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Treating erectile dysfunction(impotence), A man is impotent if he cannot achieve or sustain an erect penis for sexual activity.
    ●Cialis stays in your body for 36hrs, it allows you to choose the right moment.
    ●Cialis has been shown to work safely and effectively in adult men with erectile dysfunction(ED).Cialis remain active in the body in the following 24-36 hours. This means that Cialis allows you to achieve and maintain an erection easier than normal within this period.
    ●Man who can not erection long enough.
    ●Men who have difficulty all the time or just some of the time.
    ●Man who can not get or keep: a hard, erect penis suitable for sexual activity.
    htpp://www.china-satibo.com/


  • sex enhancer 15 May, 01:15 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 15 May, 02:38 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • sex enhancer 16 May, 10:52 PM

    htpp://www.china-satibo.com/
    Maxman capsule---Enlarge your penis in width and length.
    Maxman capsule---Stronger and harder erections.
    Maxman capsule---Achieve rock hard erections any time you want.
    Maxman capsule---Form a truly "muscular" looking penis that will impress and arouse your lover.
    Maxman capsule---More powerful orgasms.
    Maxman capsule---Increased sexual stamina.
    Maxman capsule---Achieve more powerful thrusting ability.
    Maxman capsule---Last as long as you want without drugs.
    Maxman capsule---Safe and natural penis enlargement.
    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/


  • sex enhancer 17 May, 01:57 AM

    htpp://www.china-satibo.com/
    Maxman capsule---Enlarge your penis in width and length.
    Maxman capsule---Stronger and harder erections.
    Maxman capsule---Achieve rock hard erections any time you want.
    Maxman capsule---Form a truly "muscular" looking penis that will impress and arouse your lover.
    Maxman capsule---More powerful orgasms.
    Maxman capsule---Increased sexual stamina.
    Maxman capsule---Achieve more powerful thrusting ability.
    Maxman capsule---Last as long as you want without drugs.
    Maxman capsule---Safe and natural penis enlargement.
    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/


  • sex enhancer 17 May, 10:46 PM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Treating erectile dysfunction(impotence), A man is impotent if he cannot achieve or sustain an erect penis for sexual activity.
    ●Cialis stays in your body for 36hrs, it allows you to choose the right moment.
    ●Cialis has been shown to work safely and effectively in adult men with erectile dysfunction(ED).Cialis remain active in the body in the following 24-36 hours. This means that Cialis allows you to achieve and maintain an erection easier than normal within this period.
    ●Man who can not erection long enough.
    ●Men who have difficulty all the time or just some of the time.
    ●Man who can not get or keep: a hard, erect penis suitable for sexual activity.
    htpp://www.china-satibo.com/


  • sex enhancer 18 May, 02:06 AM

    http://www.china-satibo.com/news/maxman.html
    htpp://www.china-satibo.com/
    ●Increase Sex Drive
    ●Boost Sexual Performance
    ●Fuller & Harder Erections
    ● Increase Stamina & Endurance
    ●Quicker Recharges
    htpp://www.china-satibo.com/


  • A Friend 3 Jun, 08:05 AM

    I think you need some sort of spam filter. :)


  • NZjbiy 23 Jun, 11:01 AM

    NZjbiy


  • jeremy 7 Jul, 09:27 AM

    mX5xYB http://fj6hNsFfkfp92kf9v8dbs4NUias.com


  • Xuhgivik 22 Jul, 08:58 PM

    CDzbTy Fkji ozlbx icsminvqtt ygtfp dlkj rbigddrdgw leoiyxgob jzbk.


  • Jak powiększyc penisa 24 Jul, 01:26 AM

    Spam filter required


Post a comment!


HostMySite.com   website uptime