MSSQL Locking Problems

It has been a long time since my last post. Currently I'm very busy on a big project...

Yesterday we had a nice problem. A company I work is using the following configuration on it's webserver: IIS, PHP and MSSQL. (yes an S). What's wrong with this configuration? Well two things: IIS and MSSQL.

That's not all: in PHP we connect to the database via 2 methods: via the ADODB COM object and the normal mssql functions from PHP.

We had the following problem in a certain module:

Every time we executed a Second query, the second query failed but we NEVER got an error message. Example:

(pseudo code:)

BEGIN TRANSACTION
SELECT * FROM mytable WHERE kind='item1'
... more code ...
SELECT * FROM mytable WHERE kind='item2' // <= This query failed every time, without an error message ... more code 2 ... COMMIT TRANSACTION

Looks very strange, but after too many hours we found our problem:

(pseudo code:)

BEGIN TRANSACTION
... code 1 ...
SELECT * FROM mytable WHERE kind='item1'
...
INSERT .. INTO mytable( ... ) VALUES ( ... )
..
SELECT * FROM mytable WHERE kind='item2' // <= This query failed every time, without an error message ... code 3 ... COMMIT TRANSACTION

What's the problem:

BEGIN TRANSACTION # is executed by ADODB
SELECT * FROM ... # is executed by mssql_* functions from PHP
INSERT ... # is executed by ADODB
SELECT * FROM # is executed by mssql_* functions from PHP
..

Well when retrieving the data again the mssql_* connection fails because it notices the data has changed and it must wait for the other transaction to finish...

Aaaaaargh.... 8 hours of my time wasted!

Btw. A few year ago we had a good reason forusing ADODB in PHP: the mssql version of PHP wasn't realiable. And we are using "queries from hell" ( sql server XML queries ), which (at that time) couldn't be retrieve by the mssql functions of PHP.

FreeBSD, (SuSE) Linux date differences

I wanted to retrieve yesterdays date with a format of YYYYMM
This was solved in FreeBSD like this:

date -v-1d  "+%Y%m"

(SuSE) Linux doesn't know the -v option
The same thing in Linux could be done like this:

date -d yesterday "+%Y%m"

Why the difference?

Flash Actionscript XML.send( … ) doesn’t send

Once in a while you require Flash... Well yesterday was such a day :-)
I'm was working on a Flash component that tries to submit data back to the server...
I don't have a lot of flash experience so I still don't know all its quirks.

Well I was trying to submit an XML document the following way:

var xml:XML = new XML()
//... fill xml ...
xml.send( '/my/url' );

Well... it didn't submit! No interaction with the server...
After some searching I discovered this was caching. Always that stupid caching...
So I solved this by adding a timestamp:

xml.send( '/my/url?ts=' + ( new Date() ).getTime() )

Again the timestamp to the rescue...

Convert java libhttpd to the Eclipse platform

I'm trying to switch java libhttpd to the Eclipse Java platform. I've worked with it before, without problems. Now a few years later Eclipse has improved and seems to run smoother!

There seems no reason to stick with JBuilder. Except the company I work for is using JBuilder.

And there another small problem, in JBuilder I had a build.num, which incremented with every compiler, which is a very nice feature.

Well the first impression is Nice, Eclipse warned me about some things in my code. I did some quick cleanup and placed it back into subversion.

Ruby on Rails, ReXML Document serializing / deserializing

I'm storing an XML document into a database field. I'm having a lot of trouble loading and saving the same XML in the database.

Here's a script/console session:

>> xml = REXML::Document.new("")   =>  ...   # strange response!!
>> xml.to_s   => " "   # seems ok!
>> xml.root.attributes['value'] = '<'  
>> xml.to_s => ""  # fine by me, no problem...

>> # now for the scary part ;-)
>> xml2 = REXML::Document.new( xml.to_s )    
>> xml2.to_s  => ""

The HORROR!

ReXML seems to escape items very nicely when setting values.
But it doesn't unescape the values with REXML::Document.new( ... )..

Current Progress:
* I found a method REXML::Document.write( ) which seems to do the same..

Today (24-8-2007) I'm a bit further, It seems it works correctly with the text content of elements:

>> xml = REXML::Document.new("")   =>  ...   # strange response!!
>> xml.to_s   => " "   # seems ok!
>> xml.root.attributes['value'] = '<'  
>> xml.root.text = '>'
>> xml.to_s => ">"  # fine by me, no problem...

>> xml2 = REXML::Document.new( xml.to_s )    
>> xml2.to_s  => ">"

Update 2 (24-8-2007) I found my Windows Ruby on Rails REXML (1.8.4) installation is working perfectly. It seems a bug in the FreeBSD version which is REXML (1.8.6).
I'm trying to submit a bug report to the REXML authors, but the server keeps timing out :(

I found the solution, there's indeed a bug in REXML (1.8.6)

Change the code at line +/- 291 in text.rb: ( /usr/local/lib/ruby/1.8/rexml/text.rb )

#copy = copy.gsub( EREFERENCE, '&' )
copy = copy.gsub( "&", "&" )

To

copy = copy.gsub( EREFERENCE, '&' )
#copy = copy.gsub( "&", "&" )