Oct 15

HTTP Server Status Codes

RFC 2616

Informational 1xx

  • 100 Continue
  • 101 Switching Protocols

Successful 2xx

  • 200 OK
  • 201 Created
  • 202 Accepted
  • 203 Non-Authoritative Information
  • 204 No Content
  • 205 Reset Content
  • 206 Partial Content

Redirection 3xx

  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 305 Use Proxy
  • 306 (Unused)
  • 307 Temporary Redirect

Client Error 4xx

  • 400 Bad Request
  • 401 Unauthorized
  • 402 Payment Required
  • 403 Forbidden
  • 404 Not Found
  • 405 Method Not Allowed
  • 406 Not Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
  • 411 Length Required
  • 412 Precondition Failed
  • 413 Request Entity Too Large
  • 414 Request-URI Too Long
  • 415 Unsupported Media Type
  • 416 Requested Range Not Satisfiable
  • 417 Expectation Failed

Server Error 5xx

  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 505 HTTP Version Not Supported


Oct 15

FTP Server Status Codes

RFC 959

110 Restart marker reply.

In this case, the text is exact and not left to the
particular implementation; it must read:
MARK yyyy = mmmm
Where yyyy is User-process data stream marker, and mmmm
server’s equivalent marker (note the spaces between markers
and “=”).

120 Service ready in nnn minutes.
125 Data connection already open; transfer starting.
150 File status okay; about to open data connection.

200 Command okay.
202 Command not implemented, superfluous at this site.
211 System status, or system help reply.
212 Directory status.
213 File status.
214 Help message.
On how to use the server or the meaning of a particular
non-standard command. This reply is useful only to the
human user.
215 NAME system type.
Where NAME is an official system name from the list in the
Assigned Numbers document.
220 Service ready for new user.
221 Service closing control connection.
Logged out if appropriate.
225 Data connection open; no transfer in progress.
226 Closing data connection.
Requested file action successful (for example, file
transfer or file abort).
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
230 User logged in, proceed.
250 Requested file action okay, completed.
257 “PATHNAME” created.

331 User name okay, need password.
332 Need account for login.
350 Requested file action pending further information.

421 Service not available, closing control connection.
This may be a reply to any command if the service knows it
must shut down.
425 Can’t open data connection.
426 Connection closed; transfer aborted.
450 Requested file action not taken.
File unavailable (e.g., file busy).
451 Requested action aborted: local error in processing.
452 Requested action not taken.
Insufficient storage space in system.

500 Syntax error, command unrecognized. This may include errors such as command line too long.
501 Syntax error in parameters or arguments.
502 Command not implemented.
503 Bad sequence of commands.
504 Command not implemented for that parameter.
530 Not logged in.
532 Need account for storing files.
550 Requested action not taken. File unavailable (e.g., file not found, no access).
551 Requested action aborted: page type unknown.
552 Requested file action aborted.
Exceeded storage allocation (for current directory or
dataset).
553 Requested action not taken. File name not allowed.

Oct 11

Caprock Dictionary: Thread-safe ASP dictionary component

A thread-safe dictionary component for use in the Session and Application instead of the built-in scripting.dictionary component, which is not thread-safe. I did not write this component. The original author has evaporated, so I have archived it for the betterment of mankind.

The Dictionary Object is a COM component designed to work with any scripting environment (it also supports native interfaces within Visual Basic and Visual C++). Whether you are using IIS/ASP or you are using the Windows Script Hosting environment, you can use this object to store items with an associated key. The key and the item can be any automation compatible data type such as strings, numbers and other automation objects.

This object is designed to be a replacement for the Scripting.Dictionary object. Special consideration has been made for the Dictionary object to work with IIS/ASP’s intrinsic Application and Session objects. You can store a reference to a Dictionary object in one or both of these objects without affecting the performance of your web application. This is accomplished by marking the Dictionary COM component as both apartment and free-threaded, aggregating the Free-Threaded Marshaler. Refer to Don Box’s excellent article, “House of COM”, Microsoft Systems Journal (now MSDN Magazine), September 1998. In the article he explains the impact each apartment model has on the performance of IIS and ASP. This component was developed with VC++ 6.0 and ATL 3.0 for the best performance possible.

Attached File Download the 78k zip file containing the DLL, source code, samples and documentation.

Oct 11

sp_betterhelpindex: A better sp_helpindex

Microsoft’s system sprocs are nice and all, but they’re rather basic. I have written an improvement to sp_helpindex which also includes key columns, included columns, reads and writes, fragmentation, and freshness of statistics. Like sp_helpindex, it goes in master but can be called from any database. Download the script with proper tabbing.

USE master
GO

IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'sp_betterhelpindex')
   DROP PROCEDURE sp_betterhelpindex
GO

CREATE PROC dbo.sp_betterhelpindex @tableName VARCHAR(255) AS

DECLARE @sql VARCHAR(MAX)

SET @sql ='
SET NOCOUNT ON

USE ' + DB_NAME() + '

DECLARE @object_id INT, @index_id INT, @indexName VARCHAR(500)
DECLARE @keyColumns VARCHAR(2000), @includedColumns VARCHAR(2000)

SET @object_id = OBJECT_ID(''' + @tableName + ''')

DECLARE @index TABLE (
   index_id INT,
   keyColumns VARCHAR(2000),
   includedColumns VARCHAR(2000)
)

DECLARE sp_betterhelpindex_indexes CURSOR FAST_FORWARD FOR
   SELECT index_id
   FROM sys.indexes
   WHERE object_id = @object_id

OPEN sp_betterhelpindex_indexes
FETCH sp_betterhelpindex_indexes INTO @index_id
WHILE @@fetch_status = 0
BEGIN
   SELECT @keyColumns = NULL, @includedColumns = NULL

   SELECT @keyColumns = ISNULL(@keyColumns + '', '', '''') +
   columns.name + (CASE WHEN is_descending_key = 1 THEN ''(-)'' ELSE '''' END)
   FROM caV2.sys.indexes indexes
   INNER JOIN caV2.sys.index_columns index_columns ON indexes.object_id = index_columns.object_id
   AND indexes.index_id = index_columns.index_id
   INNER JOIN caV2.sys.columns columns ON index_columns.object_id = columns.object_id
   AND index_columns.column_id = columns.column_id
   WHERE indexes.object_id = @object_id AND indexes.index_id = @index_id AND is_included_column = 0
   ORDER BY index_column_id

   SELECT @includedColumns = ISNULL(@includedColumns + '', '', '''') +
   columns.name + (CASE WHEN is_descending_key = 1 THEN ''(-)'' ELSE '''' END)
   FROM caV2.sys.indexes indexes
   INNER JOIN caV2.sys.index_columns index_columns ON indexes.object_id = index_columns.object_id
   AND indexes.index_id = index_columns.index_id
   INNER JOIN caV2.sys.columns columns ON index_columns.object_id = columns.object_id
   AND index_columns.column_id = columns.column_id
   WHERE indexes.object_id = @object_id AND indexes.index_id = @index_id AND is_included_column = 1
   ORDER BY index_column_id

   INSERT INTO @index VALUES (@index_id, @keyColumns, ISNULL(@includedColumns, ''''))

   FETCH sp_betterhelpindex_indexes INTO @index_id
END
CLOSE sp_betterhelpindex_indexes
DEALLOCATE sp_betterhelpindex_indexes

SELECT sys.indexes.name,
   (CASE WHEN is_primary_key = 1 THEN ''primary key, ''
   WHEN is_unique = 1 THEN ''unique, ''
   ELSE '''' END) + LOWER(sys.indexes.type_desc) AS type,
   keyColumns, includedColumns,
   sys.filegroups.name AS [filegroup],
   user_seeks + user_scans + user_lookups AS readsByQueries, user_updates AS updates,
   CAST(physicalStats.avg_fragmentation_in_percent AS INT) AS [fragmentation %],
   STATS_DATE (@object_id , i.index_id) AS statisticsUpdated, i.index_id
FROM @index i
INNER JOIN sys.indexes ON sys.indexes.object_id = @object_id AND i.index_id = sys.indexes.index_id
INNER JOIN sys.filegroups ON sys.indexes.data_space_id = sys.filegroups.data_space_id
INNER JOIN sys.dm_db_index_usage_stats usage ON usage.object_id = @object_id
   AND i.index_id = usage.index_id
   AND usage.database_id = DB_ID()
INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), @object_id, NULL, NULL, NULL) physicalStats
   ON i.index_id = physicalStats.index_id AND alloc_unit_type_desc != ''LOB_DATA''
ORDER BY sys.indexes.type_desc, keyColumns, includedColumns
'

EXEC(@sql)

Attached File sp_betterhelpindex.sql_.txt

Oct 11

Caprock Vector

A thread-safe vector component for use in the Session and Application. I did not write this component. The original author has evaporated, so I have archived it for the betterment of mankind.

The Vector Object is a COM component designed to work with any scripting environment (it also supports native interfaces within Visual Basic and Visual C++). Whether you are using IIS/ASP or you are using the Windows Script Hosting environment, you can use this object to store items in a grow-able array or vector. The items can be any automation compatible data type such as strings, numbers and other automation objects. This object is designed to be a dynamic, growable array or collection. It supports traditional item references by numeric index such as:

for index = 0 to 10
   response.write vec.Item(index)
next

but also item reference by textual index like so:

set foo = vec.Item(“Foo”)

The unique quality about textual or Named items, they are only supported by automation objects that implement the “Name” property. In other words, you can store an automation object in the Vector. The Vector inspects the automation object for a property called “Name”. If the Vector finds this property, it will allow you to reference the item in the Vector by name or numerical index.

Special consideration has been made for the Vector object to work with IIS/ASP’s intrinsic Application and Session objects. You can store a reference to a Vector object in one or both of these objects without affecting the performance of your web application. This is accomplished by marking the Vector COM component as both apartment and free-threaded, aggregating the Free-Threaded Marshaler. This component was developed with VC++ 6.0 and ATL 3.0 for the best performance possible.

Attached File Download the 76k zip file containing the DLL, source code, samples and documentation.