As it turned out the I introduced regression in 3.0.1 while building .NET 3.5 version. It’s now fixed in 3.0.2 and available on NuGet and website. Link to tracker with details.
Sorry folks. :\
As it turned out the I introduced regression in 3.0.1 while building .NET 3.5 version. It’s now fixed in 3.0.2 and available on NuGet and website. Link to tracker with details.
Sorry folks. :\
Few weeks ago the 3.0.0 version was released (actually it was during Firebird Conference 2012, during my talk
) and it came with some new features and improvements (hence version 3.0.0). And as it goes, nothing is perfect and few items slipped through testing phase. So that’s th reason why today, I’m happy to announce version 3.0.1 to be released.
You can download it from NuGet or from Firebird SQL site as it gets updated.
This release contains fixes for two regressions introduced in 3.0.0. You can see both in tracker. It’s also my initial step to release these small bugfix releases more often (as discussed in list).
Go grab it, while it’s hot.
I’m pleased to announce version 3.0.0 of ADO.NET provider for Firebird and version 3.0.0 of DDEX provider for Firebird. ADO.NET provider 3.0.0 comes with couple of bug fixes and two major improvements.
You can read more about the first at DNET-337. Basically now ReadCommitted and ReadUncommited are same. And using (among others) FbTransactionBehavior.RecVersion/isc_tpb_rec_version. That should better match the default behavior a lot of people is expecting.
The new MSI installer now not only installs all the necessary files, but also updates machine.config file and registers the assembly into GAC (you can select not to do it). So after full install, you don’t have to do anything. You’re just ready to go.
The rest of changes can be seen in tracker log for this version.
The DDEX provider 3.0.0 comes with new installer as well. Now when you do the install, the DDEX provider is fully registered into Visual Studio (you can select version(s) during install) and ready to go as well. No need to fiddle with registry or any other files.
Hope you’ll enjoy these improvements.
The Firebird Conference 2012 is again going to happen in Luxembourg during October 26-27, 2012. And I’ll be there. So if you have some questions about .NET provider for Firebird catch me.
And I’ll also have two sessions:
And I have some interesting stuff in my bag. I think you’ll like it. Either visit my sessions or wait after it’s over.
See you there.
I was hunting some problem in PHP application and thanks to Trace API in Firebird I found terrible default value in PHP. What value? It’s the default transaction isolation level value. In 99% of languages/environments in something close to read committed. But not in PHP.
Let’s have a look at it. If you start a new transaction (or if one is started internally, where you cannot change the isolation level) where you don’t explicitly specify isolation level the IBASE_DEFAULT is used. But this is IBASE_WRITE|IBASE_CONCURRENCY|IBASE_WAIT. This is read-write wait transaction in concurrency mode. This mode is most restrictive, nothing close to read committed. And to make it worse, there’s no way to change this default value in runtime. You can only do it recompiling sources, nothing to be viable in most cases.
So how to solve it? Well, if you created yourself some abstraction layer over ibase_xxx/fbird_xxx function you’ll change it there and you’re done. If not, you’re screwed.
OK, just kidding. You can play with override_function to override fbird_query, fbird_prepare etc., but when you’re in it, maybe it’s time to create simple thin abstraction. That’s what I did. Find & Replace worked for changing the actual code.
For the rest I created simple functions like DbQuery, DbPrepare etc. These functions take the transaction, which was created by another function DbTransaction and stored (i.e. in $GLOBALS, dirty right? 8-)), when first needed (and then used until commit/rollback or end of the page’s life).
function DbQuery()
{
$args = func_get_args();
array_unshift($args, $GLOBALS['tx']);
return call_user_func_array('fbird_query', $args);
}
It’s nothing special, only few small pieces to make to together work. First the function doesn’t declare any input parameters, but in fact there are some. Yeah, dynamic languages. I get these via func_get_args, then push to the first position the transaction to use (here I’m using the dirty $GLOBALS
). Finally I use call_user_func_array to call fbird_query. Function fbird_query takes variable number of arguments so it’s not easy to call it directly with parameters in array as I have. I have to thank people in firebird-php mailing list, because I completely forgot about it, though I’m using exactly the same at other places in same project. Return values are same as from fbird_query, so you can then start fetching rows and so on (and it’s also good idea to create wrappers for these too, who knows what will strike in the future).
Remember Firebird and PHP is a good combination.
Fun today. I was trying to use FirebirdClientFactory from FirebirdClient installed in GAC. Because it was used globally I was not editing app.config/web.config but machine.config. I went to Framework etc. directory and modified machine.config. And … and it still wasn’t working. Fast forward, I spent maybe an hour trying to figure out what’s wrong. I was hopeless. Everything seemed fine. Randomly cd-ing through directories and thinking what I’m missing, I realized I didn’t modified machine.config in Framework64. Stupid mistake.
Sure after I corrected myself everything started working. Hope my story will save you time.