Deleting Records

Discussion in 'ASP General' started by crjunk, Apr 7, 2005.

  1. crjunk

    crjunk Guest

    I was asked to update an ASP web page that is executed by an ASP.NET
    aspx web form. I have no control over modifying the ASPX page, so I
    cannot see any meaningful error message from my ASP page that could
    help determin what is going on.

    The following code will delete any existing records from a Progress
    Database and then add the records back to the Progress Database from
    an XML file.

    My code successfully deletes the records, but as soon as it deletes the
    records, it crashes. I'm not sure what I'm doing wrong. Can anyone
    help guide me in the right directions?

    Thanks,
    crjunk

    <%@ Language=VBScript %>
    <%
    Response.Expires = -1000
    Response.ContentType = "text/xml"
    dim xRequestDOM, iLoadErr, iParseErr
    set xRequestDom = Server.CreateObject("MSXML.FreeThreadedDomDocument")
    iLoadErr = xRequestDom.load(Request)
    iParseErr = xRequestDom.parseError.errorCode


    if iLoadErr <> 0 and iParseErr = 0 then
    '**** Constants copied
    Const
    CONNECTIONSTRING="DSN=SHREDTEST;uid=sysprogress;pwd=sysprogress"
    Const adOpenKeyset = 1
    Const adLockPessimistic = 2
    Const adCmdText = &H0001


    sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode

    Set oRecordset = Server.CreateObject("ADODB.Recordset")

    ''THE CODE CRASHES AFTER IT RUNS THE UPCOMING oRecordset.OPEN
    STATEMENT
    oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    adLockPessimistic, adCmdText
    ''THE CODE HAS NOW DELETED THE RECORD, BUT HAS CRASHED.

    oRecordSet.Update

    oRecordset.Close
    Set oRecordset = Nothing

    ''THE REST OF THE CODE WAS OMITTED FROM THIS NEWSGROUP POST. THE
    OMITTED CODE GOES ON TO ADD THE RECORDS FROM THE XML FILE BACK TO THE
    TABLE THAT THEY WERE JUST DELETED FROM.
    end if
    %>
     
    crjunk, Apr 7, 2005
    #1
    1. Advertising

  2. crjunk

    Mark Schupp Guest

    put an error trap in (on error resume next, then check for err.number <> 0
    after each operation) and write the error message to a log file so that you
    can see what is happening.

    --
    Mark Schupp
    Head of Development
    Integrity eLearning
    www.ielearning.com


    "crjunk" <> wrote in message
    news:...
    > I was asked to update an ASP web page that is executed by an ASP.NET
    > aspx web form. I have no control over modifying the ASPX page, so I
    > cannot see any meaningful error message from my ASP page that could
    > help determin what is going on.
    >
    > The following code will delete any existing records from a Progress
    > Database and then add the records back to the Progress Database from
    > an XML file.
    >
    > My code successfully deletes the records, but as soon as it deletes the
    > records, it crashes. I'm not sure what I'm doing wrong. Can anyone
    > help guide me in the right directions?
    >
    > Thanks,
    > crjunk
    >
    > <%@ Language=VBScript %>
    > <%
    > Response.Expires = -1000
    > Response.ContentType = "text/xml"
    > dim xRequestDOM, iLoadErr, iParseErr
    > set xRequestDom = Server.CreateObject("MSXML.FreeThreadedDomDocument")
    > iLoadErr = xRequestDom.load(Request)
    > iParseErr = xRequestDom.parseError.errorCode
    >
    >
    > if iLoadErr <> 0 and iParseErr = 0 then
    > '**** Constants copied
    > Const
    > CONNECTIONSTRING="DSN=SHREDTEST;uid=sysprogress;pwd=sysprogress"
    > Const adOpenKeyset = 1
    > Const adLockPessimistic = 2
    > Const adCmdText = &H0001
    >
    >
    > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    >
    > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >
    > ''THE CODE CRASHES AFTER IT RUNS THE UPCOMING oRecordset.OPEN
    > STATEMENT
    > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > adLockPessimistic, adCmdText
    > ''THE CODE HAS NOW DELETED THE RECORD, BUT HAS CRASHED.
    >
    > oRecordSet.Update
    >
    > oRecordset.Close
    > Set oRecordset = Nothing
    >
    > ''THE REST OF THE CODE WAS OMITTED FROM THIS NEWSGROUP POST. THE
    > OMITTED CODE GOES ON TO ADD THE RECORDS FROM THE XML FILE BACK TO THE
    > TABLE THAT THEY WERE JUST DELETED FROM.
    > end if
    > %>
    >
     
    Mark Schupp, Apr 7, 2005
    #2
    1. Advertising

  3. crjunk

    crjunk Guest

    I added an on error resum next statement with error trapping that
    writes the errors to a text file. When I did this the code worked
    correctly. I then took the code out and the program crashed again.

    I played around with the code a little bit and added the following:

    Set oRecordset = Server.CreateObject("ADODB.Recordset")
    oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    adLockPessimistic, adCmdText
    On Error Resume Next
    oRecordSet.Update

    As long as I keep the On Error Resume Next, it works correctly. If I
    take it out, it will crash the program. Any thoughts or suggestions?
     
    crjunk, Apr 7, 2005
    #3
  4. crjunk wrote:
    > I added an on error resum next statement with error trapping that
    > writes the errors to a text file. When I did this the code worked
    > correctly. I then took the code out and the program crashed again.
    >
    > I played around with the code a little bit and added the following:
    >
    > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > adLockPessimistic, adCmdText
    > On Error Resume Next
    > oRecordSet.Update
    >
    > As long as I keep the On Error Resume Next, it works correctly. If I
    > take it out, it will crash the program. Any thoughts or suggestions?


    Let's see the code for logging the errors to the log file


    --
    Microsoft MVP -- ASP/ASP.NET
    Please reply to the newsgroup. The email account listed in my From
    header is my spam trap, so I don't check it very often. You will get a
    quicker response by posting to the newsgroup.
     
    Bob Barrows [MVP], Apr 7, 2005
    #4
  5. crjunk

    crjunk Guest

    Bob Barrows [MVP] wrote:
    > crjunk wrote:
    > > I added an on error resum next statement with error trapping that
    > > writes the errors to a text file. When I did this the code worked
    > > correctly. I then took the code out and the program crashed again.
    > >
    > > I played around with the code a little bit and added the following:
    > >
    > > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    > > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > > adLockPessimistic, adCmdText
    > > On Error Resume Next
    > > oRecordSet.Update
    > >
    > > As long as I keep the On Error Resume Next, it works correctly. If

    I
    > > take it out, it will crash the program. Any thoughts or

    suggestions?
    >
    > Let's see the code for logging the errors to the log file
    >
    >
    > --
    > Microsoft MVP -- ASP/ASP.NET
    > Please reply to the newsgroup. The email account listed in my From
    > header is my spam trap, so I don't check it very often. You will get

    a
    > quicker response by posting to the newsgroup.


    Here is what I have added. With this code in the web page, the program
    works correctly but if I take it out it will crash. Also, because it
    runs correctly, my text file is not created.

    sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode

    Set oRecordset = Server.CreateObject("ADODB.Recordset")
    oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    adLockPessimistic, adCmdText
    On Error Resume Next
    if len(Err.Source) <> 0 Then
    '"*** Create Txt Error Message Log ***''
    Dim fso, MyFile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = fso.CreateTextFile("c:\temp\mytest.txt", True)
    MyFile.WriteLine(Err.Source)
    MyFile.WriteLine(Err.Number)
    MyFile.WriteLine(Err.Description )
    MyFile.Close
    set MyFile = nothing
    Err.Clear
    end if

    oRecordSet.Update

    oRecordset.Close
    Set oRecordset = Nothing
     
    crjunk, Apr 7, 2005
    #5
  6. crjunk

    Mark Schupp Guest

    You are checking for the error before it happens.
    you need to put the error logging code after every operation that could be
    causing an error. If you check your database you will probably find that the
    update is not happening. Also you should use err.number <> 0 for your test.

    --
    --Mark Schupp
    Head of Development
    Integrity eLearning
    www.ielearning.com

    "crjunk" <> wrote in message
    news:...
    >
    > Bob Barrows [MVP] wrote:
    >> crjunk wrote:
    >> > I added an on error resum next statement with error trapping that
    >> > writes the errors to a text file. When I did this the code worked
    >> > correctly. I then took the code out and the program crashed again.
    >> >
    >> > I played around with the code a little bit and added the following:
    >> >
    >> > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >> > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    >> > adLockPessimistic, adCmdText
    >> > On Error Resume Next
    >> > oRecordSet.Update
    >> >
    >> > As long as I keep the On Error Resume Next, it works correctly. If

    > I
    >> > take it out, it will crash the program. Any thoughts or

    > suggestions?
    >>
    >> Let's see the code for logging the errors to the log file
    >>
    >>
    >> --
    >> Microsoft MVP -- ASP/ASP.NET
    >> Please reply to the newsgroup. The email account listed in my From
    >> header is my spam trap, so I don't check it very often. You will get

    > a
    >> quicker response by posting to the newsgroup.

    >
    > Here is what I have added. With this code in the web page, the program
    > works correctly but if I take it out it will crash. Also, because it
    > runs correctly, my text file is not created.
    >
    > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    >
    > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > adLockPessimistic, adCmdText
    > On Error Resume Next
    > if len(Err.Source) <> 0 Then
    > '"*** Create Txt Error Message Log ***''
    > Dim fso, MyFile
    > Set fso = CreateObject("Scripting.FileSystemObject")
    > Set MyFile = fso.CreateTextFile("c:\temp\mytest.txt", True)
    > MyFile.WriteLine(Err.Source)
    > MyFile.WriteLine(Err.Number)
    > MyFile.WriteLine(Err.Description )
    > MyFile.Close
    > set MyFile = nothing
    > Err.Clear
    > end if
    >
    > oRecordSet.Update
    >
    > oRecordset.Close
    > Set oRecordset = Nothing
    >
     
    Mark Schupp, Apr 7, 2005
    #6
  7. crjunk

    crjunk Guest

    Mark Schupp wrote:
    > You are checking for the error before it happens.
    > you need to put the error logging code after every operation that

    could be
    > causing an error. If you check your database you will probably find

    that the
    > update is not happening. Also you should use err.number <> 0 for your

    test.
    >
    > --
    > --Mark Schupp
    > Head of Development
    > Integrity eLearning
    > www.ielearning.com
    >
    > "crjunk" <> wrote in message
    > news:...
    > >
    > > Bob Barrows [MVP] wrote:
    > >> crjunk wrote:
    > >> > I added an on error resum next statement with error trapping

    that
    > >> > writes the errors to a text file. When I did this the code

    worked
    > >> > correctly. I then took the code out and the program crashed

    again.
    > >> >
    > >> > I played around with the code a little bit and added the

    following:
    > >> >
    > >> > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    > >> > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > >> > adLockPessimistic, adCmdText
    > >> > On Error Resume Next
    > >> > oRecordSet.Update
    > >> >
    > >> > As long as I keep the On Error Resume Next, it works correctly.

    If
    > > I
    > >> > take it out, it will crash the program. Any thoughts or

    > > suggestions?
    > >>
    > >> Let's see the code for logging the errors to the log file
    > >>
    > >>
    > >> --
    > >> Microsoft MVP -- ASP/ASP.NET
    > >> Please reply to the newsgroup. The email account listed in my From
    > >> header is my spam trap, so I don't check it very often. You will

    get
    > > a
    > >> quicker response by posting to the newsgroup.

    > >
    > > Here is what I have added. With this code in the web page, the

    program
    > > works correctly but if I take it out it will crash. Also, because

    it
    > > runs correctly, my text file is not created.
    > >
    > > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    > >
    > > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    > > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > > adLockPessimistic, adCmdText
    > > On Error Resume Next
    > > if len(Err.Source) <> 0 Then
    > > '"*** Create Txt Error Message Log ***''
    > > Dim fso, MyFile
    > > Set fso = CreateObject("Scripting.FileSystemObject")
    > > Set MyFile = fso.CreateTextFile("c:\temp\mytest.txt", True)
    > > MyFile.WriteLine(Err.Source)
    > > MyFile.WriteLine(Err.Number)
    > > MyFile.WriteLine(Err.Description )
    > > MyFile.Close
    > > set MyFile = nothing
    > > Err.Clear
    > > end if
    > >
    > > oRecordSet.Update
    > >
    > > oRecordset.Close
    > > Set oRecordset = Nothing
    > >



    I played around with my code and moved it up above my oRecordSet.Open
    statement so that it looks like this:

    sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode

    Set oRecordset = Server.CreateObject("ADODB.Recordset")

    On Error Resume Next
    if Err.Num <> 0 Then
    '"*** Create Txt Error Message Log ***''
    Dim fso, MyFile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = fso.CreateTextFile("c:\temp\ErrLog.txt", True)
    MyFile.WriteLine(Err.Source)
    MyFile.WriteLine(Err.Number)
    MyFile.WriteLine(Err.Description )
    MyFile.Close
    set MyFile = nothing
    Err.Clear
    end if

    oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    adLockPessimistic, adCmdText
    oRecordSet.Update
    oRecordset.Close

    When I checked the Error Log, it actuall recorded something. This is
    what was in it:
    Microsoft VBScript runtime error
    438
    Object doesn't support this property or method

    I'm not exactly sure what this is refering to.

    crjunk
     
    crjunk, Apr 7, 2005
    #7
  8. crjunk wrote:
    > I played around with my code and moved it up above my oRecordSet.Open
    > statement so that it looks like this:
    >
    > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    >
    > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >
    > On Error Resume Next
    > if Err.Num <> 0 Then


    There is no such thing as "Err.Num".

    > '"*** Create Txt Error Message Log ***''
    > Dim fso, MyFile
    > Set fso = CreateObject("Scripting.FileSystemObject")
    > Set MyFile = fso.CreateTextFile("c:\temp\ErrLog.txt", True)
    > MyFile.WriteLine(Err.Source)
    > MyFile.WriteLine(Err.Number)
    > MyFile.WriteLine(Err.Description )
    > MyFile.Close
    > set MyFile = nothing
    > Err.Clear
    > end if
    >
    > oRecordset.Open sSQL, CONNECTIONSTRING,


    Never do this (use a connection string) - you kill performance because this
    disables connection pooling. Use an explicit connection object instead.

    > adOpenKeyset,
    > adLockPessimistic, adCmdText



    ??? Why are you opening a recordset on a query that does not return
    records?!?!?

    > oRecordSet.Update


    There is nothing to update! Your query did not return records.

    > oRecordset.Close
    >
    > When I checked the Error Log, it actuall recorded something. This is
    > what was in it:
    > Microsoft VBScript runtime error
    > 438
    > Object doesn't support this property or method
    >
    > I'm not exactly sure what this is refering to.


    I am. It refers to your attempt to read a nonexistent property: err.Num. The
    name of the property is "Number", not "Num".

    >
    > crjunk


    Sigh.
    You have to check the err object after EVERY line that could cause an error.
    It's best to encapsulate this in a sub. Also, get rid of the recordset
    object. It is not needed in this situation. Lastly, stop using dynamic sql,
    it leaves you open to hackers using the SQL Injection exploit::
    http://mvp.unixwiz.net/techtips/sql-injection.html
    http://www.sqlsecurity.com/DesktopDefault.aspx?tabid=23
    http://www.nextgenss.com/papers/advanced_sql_injection.pdf
    http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf

    As you can see from these articles, the surest way to prevent sql injection
    is to use parameters instead of dynamic sql. My preference is to use stored
    procedures, but I do not know if Progress supports them. Without stored
    procedures, the only way to use parameters is via the Command object:

    ****************************************************************************************
    On Error Resume Next

    sSQL = "Delete from pub.companies where agencyid = ?"

    if CStr(sAgencyCode) <> "" then
    Set cn= Server.CreateObject("ADODB.Connection")
    cn.Open CONNECTIONSTRING
    Set cmd= Server.CreateObject("ADODB.Command")
    cmd.CommandText = sSQL
    cmd.Execute ,array(sAgencyCode),129
    if Err.Number <> 0 Then
    LogError Err
    Response.Write "An error occurred. Check log file"
    Response.End
    End if
    End if

    Sub LogError(pErr)
    Const ForAppending = 8
    '"*** Create Txt Error Message Log ***''
    Dim fso, MyFile
    Set fso = CreateObject("Scripting.FileSystemObject")
    'use OpenTextFile instead of CreateTextFile
    Set MyFile = fso_OpenTextFile("c:\temp\ErrLog.txt", _
    ForAppending, True)
    'I assume the IUSR account has permissions for this folder ...

    MyFile.WriteLine(pErr.Source)
    MyFile.WriteLine(pErr.Number)
    MyFile.WriteLine(pErr.Description )
    MyFile.Close
    set MyFile = nothing
    pErr.Clear
    end if
    End Sub


    HTH,
    Bob Barrows

    --
    Microsoft MVP - ASP/ASP.NET
    Please reply to the newsgroup. This email account is my spam trap so I
    don't check it very often. If you must reply off-line, then remove the
    "NO SPAM"
     
    Bob Barrows [MVP], Apr 8, 2005
    #8
  9. crjunk

    Mark Schupp Guest

    See bob's response first.

    I think it may be easier for you to debug this if you create a test form
    that simulates what the calling client is doing. Then remove the error traps
    and call the page from your form. That will give you the standard ASP error
    messages.

    It would still be a good idea to include an error log in the page because it
    is being called in the background by another server. You will need to check
    for errors after every statement.

    --
    --Mark Schupp
    Head of Development
    Integrity eLearning
    www.ielearning.com

    "crjunk" <> wrote in message
    news:...
    >
    > Mark Schupp wrote:
    >> You are checking for the error before it happens.
    >> you need to put the error logging code after every operation that

    > could be
    >> causing an error. If you check your database you will probably find

    > that the
    >> update is not happening. Also you should use err.number <> 0 for your

    > test.
    >>
    >> --
    >> --Mark Schupp
    >> Head of Development
    >> Integrity eLearning
    >> www.ielearning.com
    >>
    >> "crjunk" <> wrote in message
    >> news:...
    >> >
    >> > Bob Barrows [MVP] wrote:
    >> >> crjunk wrote:
    >> >> > I added an on error resum next statement with error trapping

    > that
    >> >> > writes the errors to a text file. When I did this the code

    > worked
    >> >> > correctly. I then took the code out and the program crashed

    > again.
    >> >> >
    >> >> > I played around with the code a little bit and added the

    > following:
    >> >> >
    >> >> > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >> >> > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    >> >> > adLockPessimistic, adCmdText
    >> >> > On Error Resume Next
    >> >> > oRecordSet.Update
    >> >> >
    >> >> > As long as I keep the On Error Resume Next, it works correctly.

    > If
    >> > I
    >> >> > take it out, it will crash the program. Any thoughts or
    >> > suggestions?
    >> >>
    >> >> Let's see the code for logging the errors to the log file
    >> >>
    >> >>
    >> >> --
    >> >> Microsoft MVP -- ASP/ASP.NET
    >> >> Please reply to the newsgroup. The email account listed in my From
    >> >> header is my spam trap, so I don't check it very often. You will

    > get
    >> > a
    >> >> quicker response by posting to the newsgroup.
    >> >
    >> > Here is what I have added. With this code in the web page, the

    > program
    >> > works correctly but if I take it out it will crash. Also, because

    > it
    >> > runs correctly, my text file is not created.
    >> >
    >> > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    >> >
    >> > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >> > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    >> > adLockPessimistic, adCmdText
    >> > On Error Resume Next
    >> > if len(Err.Source) <> 0 Then
    >> > '"*** Create Txt Error Message Log ***''
    >> > Dim fso, MyFile
    >> > Set fso = CreateObject("Scripting.FileSystemObject")
    >> > Set MyFile = fso.CreateTextFile("c:\temp\mytest.txt", True)
    >> > MyFile.WriteLine(Err.Source)
    >> > MyFile.WriteLine(Err.Number)
    >> > MyFile.WriteLine(Err.Description )
    >> > MyFile.Close
    >> > set MyFile = nothing
    >> > Err.Clear
    >> > end if
    >> >
    >> > oRecordSet.Update
    >> >
    >> > oRecordset.Close
    >> > Set oRecordset = Nothing
    >> >

    >
    >
    > I played around with my code and moved it up above my oRecordSet.Open
    > statement so that it looks like this:
    >
    > sSQL = "Delete from pub.companies where agencyid = " & sAgencyCode
    >
    > Set oRecordset = Server.CreateObject("ADODB.Recordset")
    >
    > On Error Resume Next
    > if Err.Num <> 0 Then
    > '"*** Create Txt Error Message Log ***''
    > Dim fso, MyFile
    > Set fso = CreateObject("Scripting.FileSystemObject")
    > Set MyFile = fso.CreateTextFile("c:\temp\ErrLog.txt", True)
    > MyFile.WriteLine(Err.Source)
    > MyFile.WriteLine(Err.Number)
    > MyFile.WriteLine(Err.Description )
    > MyFile.Close
    > set MyFile = nothing
    > Err.Clear
    > end if
    >
    > oRecordset.Open sSQL, CONNECTIONSTRING, adOpenKeyset,
    > adLockPessimistic, adCmdText
    > oRecordSet.Update
    > oRecordset.Close
    >
    > When I checked the Error Log, it actuall recorded something. This is
    > what was in it:
    > Microsoft VBScript runtime error
    > 438
    > Object doesn't support this property or method
    >
    > I'm not exactly sure what this is refering to.
    >
    > crjunk
    >
     
    Mark Schupp, Apr 8, 2005
    #9
  10. crjunk

    crjunk Guest

    Thanks for you help. I finally was able to get the errors associated
    with my code to be recorded to the log file.

    Crjunk
     
    crjunk, Apr 11, 2005
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Patrick.O.Ige
    Replies:
    0
    Views:
    681
    Patrick.O.Ige
    Nov 3, 2005
  2. Replies:
    8
    Views:
    420
    Cantankerous Old Git
    Jul 27, 2005
  3. Dan M
    Replies:
    2
    Views:
    257
    Dan M
    Dec 15, 2005
  4. Harry Barker
    Replies:
    2
    Views:
    529
    Alf P. Steinbach
    Apr 19, 2006
  5. crea
    Replies:
    2
    Views:
    422
    Nobody
    Dec 28, 2012
Loading...

Share This Page