So disclaimer, this isn’t finished by any standard, but I wanted to document how far I’ve got so far.

Goal

To be able to connect http://vapor.codes to an ODBC data source. Primarily I wanted to be able to make use of the Fluent ORM to query Microsoft SQL Server.

I work mostly in the enterprise space where Microsoft SQL Server is everywhere. How nice would it be to be able to build in Swift with all the advantages that the language offers.

I know, I know there are lots of other ways to crack this nut. I live in a world of Visual Studio C# and Lync. so I’m well aware that other technology stacks exist for this purpose; but whats the fun in all that. Native Swift was where I needed/wanted to go.

The Beginning

So working on a Mac, my first step was to just get a Mac talking to SQL server. The Swift stuff could follow later with a loftier goal of also making this work under Linux too.

So starting with the basics Microsoft provide a set of cross platform tools for connecting from a Mac/Linux to SQL server via ODBC.

This works. You can now run queries from the Mac. I tried this under Linux too. It works as you would expect.

Just to show you what this looks like, I ran the following query

SET NOCOUNT ON; SELECT Getdate();

Output produced is -

-----------------------2019-02-23 12:36:35.223

I then spent too long trying to write wrapper code around SQLCMD trying to parse the results back but this all seemed a bit pointless slow and maybe not appropriate for long term and scalable solution.

Progress...

At this point, I thought I wonder how UNIXODBC works? Could this be the answer to getting Swift talking to ODBC data sources, and onwards to MS SQL Server?

IBM To The Rescue

So much Googling later. I found this -

https://github.com/IBM-DTeam/swift-for-db2

IBM had already written for Swift 3.0 a wrapper around UNIXODBC for talking to DB2 via ODBC.

I seemed that IBM had gone in another direction and weren’t mainitaing any further, but this looked promising

So how hard could this be, to get the IBM Swift package for DB2 to run in a Swift 4.x environment and talk to any ODBC data source???

Getting it to run.

Now this stumped me. I wanted to create a Swift sample using the package manager that will pull down the IBM package I really struggled to get this to work.

Here’s what you need todo at least to get this to compile. I made a new swift package called HelloODBC. My steps are as follows -

mkdir HelloODBC

cd HelloODBC

swift package init --type executable

Edit packages.swift and make it look like mine -

// swift-tools-version:4.2// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(name: "HelloODBC",dependencies: [.package(url: "https://github.com/IBM-DTeam/swift-for-db2.git", from: "1.0.0"),// Dependencies declare other packages that this package depends on.// .package(url: /* package url */, from: "1.0.0"),],targets: [// Targets are the basic building blocks of a package. A target can define a module or a test suite.// Targets can depend on other targets in this package, and on products in packages which this package depends on..target(name: "HelloODBC",dependencies: ["IBMDB"])])

So some great geek stuff with a customer of mine (Family Farms). We needed to integrate combine-harvester and tipper trucks on our iPad app. to record weights as combine tips to nearby truck. This was our saviour a little $50 bluetooth LE dongle.

BLE, allows devices to just find each other (romantic I know). Unlike normal Bluetooth like you use say your handsfree kit; you don’t need to pair a BLE device. You simply say find any devices in range that offer a set of services, i.e. can transfer data. iOS and Android devices have had BLE capability for about 3 years now.

So why is all this exciting. This means a harvester can tip their harvest into a tipper truck which is equipped with a weigh cell connected to a dongle like this. As the combine drives by and tips, the iPad app. with the combine driver detects the BLE dongle and reads the tipped weight.

So we were able to prove that this can indeed be done. We have a scale simulator up and running in Harston. As POC addition to the FFG farming app. we can connect over BLE and get a reading from the scale simulator.

The advantage of using BLE is that you just create a temporary network in-field for just a few seconds between combine and tipper truck, you don’t need any other kind of WIFI or cellular network access.

My modification was to change the output command to curl a web request adapted to my own web server.

As discussed previously I have managed to get Safari and iOS push notifications working, so I utilised that and a database of device tokens and a database of phone numbers to names, to send and Apple Push Notification.