Debian 9 Stretch, PHP 7 and Microsoft SQL Server access

Nov 12
2017

Microsoft supports SQL Server access from Linux and PHP 7, but unfortunately not with Debian 9 Stretch, but only for Debian 8 (and Ubuntu 15.10, Ubuntu 16.10, Ubuntu 6.04, RedHat 7 and MacOS).

See https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac

I have tried to use the PDO Sybase drivers (package php7.0-sybase), but was not able to connect.

Then I found the page https://github.com/Microsoft/msphpsql/releases and have done the following:

pecl install sqlsrv-5.1.1preview
pecl install pdo_sqlsrv-5.1.1preview

The build failed until I installed the package unixodbc-dev
apt-get install unixodbc-dev

To enable the both modules in Apache2, I have done also the following:
cd /etc/php/7.0/mods-available
cp pdo_dblib.ini pdo_sqlsrv.ini
cp pdo_dblib.ini sqlsrv.ini

changed the contents of the files to list the appropriate -so file (pdo_sqlsrv.so and sqlsrv.so),
cd /etc/php/7.0/apache2/conf.d
ln -s /etc/php/7.0/mods-available/sqlsrv.ini 20-sqlsrv.ini
ln -s /etc/php/7.0/mods-available/pdo_sqlsrv.ini 20-pdo_sqlsrv.ini

and restarted Apache2.

Now, my test function returned that the ODBC driver was missing.
I have downloaded then the Debian 8 version and installed the driver and the tools:
wget https://packages.microsoft.com/debian/8/prod/pool/main/m/msodbcsql/msodbcsql_13.1.9.1-1_amd64.deb
wget https://packages.microsoft.com/debian/8/prod/pool/main/m/mssql-tools/mssql-tools_14.0.7.0-1_amd64.deb
apt-get install unixodbc
dpkg -i msodbcsql_13.1.9.1-1_amd64.deb
dpkg -i mssql-tools_14.0.7.0-1_amd64.deb

After this, I was able to connect to the SQL server and run a select statement.

$conn = new PDO("sqlsrv:Server=$myserverName;Database=$myDB", $myUser, $myPass);

Database Manager software: Navicat Premium Essentials

Jul 11
2017

In my daily work, I have to deal with several different databases. Until now, it were mostly Oracle, SQL Server and MySQL, but in the last time SQLite and PostgreSQL have been added to my list.

In the past I had used mostly DB Manager from DBTools software in Brasil, but the last release of this software is from the year 2010, so about 7 years old, and it does not work with the Oracle database I have to deal with.

Searching for a valid successor without spending too much money (I need 3 licenses as we are 3 developers in our company), I have found Navicat Premium Essentials by Premiumsoft Cybertech Ltd, and after a short trial period I have acquired the needed licenses, and was really happy with it.

Now they have released their next version, Navicat 12, and I have upgraded my licenses to the new version.

What I have to say: they are very serious. I have discovered two bugs in the new version and opened a support issue with them. In a relatively short period they answered and have acknowlegdet the bugs (the immediatly, for the other it needed a day more and more specifications from my).

They have several different versions of their database manager, but for my needs the Premium Essentials version is the right one, as it has support for all databases I need (for a short period I needed also Firebird support, not available in Navicat), and is relatively affordable.

Set initial date to WPF Calendar control

Mar 17
2017

In WPF, you can set the SelectedDate property to any DateTime value, but this value is not shown as initial date in the calendar control.

If you wish to set the initial date, you need to set the DisplayDate property.

If you use databinding, you can bind both values to the same property on the ViewModel, or to two different, what you like more. Of course in the latter case the initial value needs to be set to both properties.

Another suggestion: if you work with the Calendar control directly, you should embed it in a ViewBox control to have it adjusted when you resize your window.

Firebird specials in table structure for varchar and UTF-8

Nov 15
2016

In my Visual Objects applications based on DBFs I have a routine that checks the structure of the DBF tables, compares them with the structure that is required and adjusts the structure.

I’m now working on a similar functionality for my Firebird based .NET applications. To retrieve the list of the currently existing user tables, I’m using such a statement:

select rdb$relation_name as tablename from rdb$relations
where rdb$view_blr is null and 
(rdb$system_flag is null or rdb$system_flag = 0)

and to retrieve the actual structure of such a table I use the following statement:

select rf.rdb$field_position as fieldpos, 
TRIM(rf.rdb$field_name) as fieldname, 
f.rdb$field_type as fieldtype, 
f.rdb$field_length as fieldlen,
f.rdb$field_scale as fielddec, 
(f.rdb$null_flag = 1) OR (rf.rdb$null_flag = 1) as canbenull 
from rdb$relation_fields rf 
JOIN rdb$fields f ON f.rdb$field_name = rf.rdb$field_source 
WHERE upper( rf.rdb$relation_name ) = upper( 'mytable' ) 
order by rf.rdb$field_position

To have no limitations with foreign languages, I have opted to use the UTF-8 character set for all varchar columns.

And now I was very surprised: the select statement returned 4 times the actual field width: for a field defined as varchar(20) the query returned 80 as field length.

My conclusion is very simple: since every UTF-8 character can take up to 4 bytes, Firebird reserves 4 bytes for every character.

I have now found the following StackOwerflow article about this:
http://stackoverflow.com/questions/822837/firebird-utf8-varchar-size

Firebird 3.0, Embedded server and the .NET provider

Nov 15
2016

For local data, the embedded server of Firebird is very welcome because it does not needs any configuration.

With Firebird 2.5, a special DLL (fbembed.dll) was needed, but Firebird 3.0 has added this functionality into the standard fbclient.dll.
So, if using the embedded server of Firebird 3.0 instead of the one of Firebird 2.5, you need to specify this in the connection string. It is the best to use the ClientLibrary property of the FBConnectionStringBuilder (namespace FirebirdSql.Data.FirebirdClient).

The following files need to be put in your application directory (please make attention to use the correct bitness – 64 bit files for a 64 bit application and 32 bit files for a 32 bit application):
fbclient.dll
ib_util.dll
plugins\engine12.dll

Normally, you should NOT need to put a firebird.conf file in you application directory.

References:
http://stackoverflow.com/questions/37444411/unable-to-connect-firebird-3-0-embedded-version
http://firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30-engine.html

XIDE: Starting without loading the plugins

May 26
2016

Specially for developing XIDE plugins there is a possibility to startup XIDE without loading the plugins:

– keep the shift key pressed while XIDE starts
– add a /noplugins switch to the command line

This functionality was added yesterday ( May 25, 2016 ). So if you need this and your XIDE version is older, ask the author for an update.

XIDE: global variables

May 09
2016

The new XIDE-Build from May 2016 supports the definition of own global variables to use in Pre- and Post-Build events, for example to set some system-wide paths.

Simply add a section [GlobalVariables] to XIDE.cfg, when the program is not open, like this one:

[GlobalVariables]
GlobalVariable = %mygeneralmanifest% , C:\temp\mymanifestfile

Later versions may support these variables also in templates.

XIDE: Tools on menu

May 06
2016

You just need to add a section in the bottom of the xide.cfg file:

[FileTools]
xml = notepad.exe
txt = wordpad.exe,%1

The 2nd syntax allows you to use command line options, for example

wordpad.exe , /param1 %1 /param2

(%1 is replaced with the filename)

If you press CTRL or SHIFT while opening a file, it gets opened inside XIDE, instead of the tool you specified. Obviously I am just sending it now but not waiting for a quick response, only when you have time about this.

XIDE: Placeholders in prebuild and postbuild events

May 06
2016

The following placeholders are available:

%NETSDKPATH%
%OUTPUTFILE%
%OUTPUTPDB%
%OUTPUTPATH%
%ProjectOutputPath%
%AppPath%
%ProjectPath%
%ConfigPath%
%AppName%
%AssemblyName%

A small sample for the executable cmd.exe:
%AppPath%Prg\App.config %ProjectOutputPath%%ConfigPath%%AssemblyName%.exe.config /y

or preferred by myself:
/c c:\xsharp\xide\postbuildcopy.cmd "%AssemblyName%.dll" "%ProjectOutputPath%%ConfigPath%" "c:\devnet\libs\rdm"

where postbuildcopy.cmd has the following content:
@echo off
set assemblyname=%1
set sourcepath=%2%
set targetpath=%3%
set sourcefile=%sourcepath%\%assemblyname%
set targetfile=%targetpath%\%assemblyname%
if not exist %sourcefile% goto ende
if exist %targetfile% goto replace
copy %sourcefile% %targetfile%
goto ende
:replace
replace %sourcefile% %targetpath% /u
:ende

XIDE: Plugin system

May 06
2016

XIDE supports a plugin system.

The core of a plugin is to define a class that inherits from Xide.PluginSystem.Plugin and implements the METHOD Initialize() and PROPERTY Name. Initialize() passes you a PluginService object, with which you can communicate with XIDE. Type self:oService: in the sample to get a list of available methods of this class.
After you have built your plugin dll, simply copy it in the plugin subdirectory of the XIDE directory, and it will be loaded on the next start of XIDE.

And this is a sample code by Chris Pyrgas, the author of XIDE:


using Xide.PluginSystem
using System.Windows.Forms

class TestPlugin inherit Xide.PluginSystem.Plugin
protect oService as PluginService
virtual method Initialize(_oService as PluginService) as void

self:oService := _oService

local oMenuItem as MenuItem

oMenuItem := MenuItem{"Add some custom text" , PluginMenuItem_Edit_clicked }
self:oService:RegisterMenuItem(MainMenuItem.Edit , oMenuItem)

oMenuItem := MenuItem{"My Plugin" , PluginMenuItem_Window_clicked }
self:oService:RegisterMenuItem(MainMenuItem.Window , oMenuItem)

return

method PluginMenuItem_Edit_clicked(o as object,e as EventArgs) as void
local oFilePad as FilePad
local oEditor as Editor
oFilePad := self:oService:GetActiveFilePad()
if oFilePad == null
return
end if
oEditor := oFilePad:Editor
oEditor:AddLine("")
oEditor:AddLine("")
oEditor:AddLine("// This is some test enetered from the plugin!")
oEditor:AddLine("")
return

method PluginMenuItem_Window_clicked(o as object,e as EventArgs) as void
local oProject as Project
oProject := self:oService:ActiveProject
if oProject == null
return
end if
MessageBox.Show("Applications in project " + oProject:Name + " : " + oProject:GetApplications():Length:ToString() , "Message from plugin!")
return

virtual property Name as string get "A test plugin"

end class