Arrow – Connecting to Multiple Instances of the Same Back-End Data Source Type

Arrow makes it extremely easy to connect to various back-end data sources through Appcelerator provided connectors, such as REST, SOAP, Salesforce, MySQL and MS SQL and expose mobile-optimized REST APIs. A complete list of connectors can be found here. One can also build their own connector following the instructions here.

Simply install a connector into your Arrow project, edit the connector configuration file and you’re ready to go.

But, what if you want to connect to multiple instances of the same data source type? For example, what if you have two MySQL databases that you want to create mobile-optimized web services for? Well, Arrow makes that easy too.

Install the Base Connector

For example, the following command will install a MySQL connector in your project:

appc install connector/appc.mysql

Edit the Connector Configuration File

Open the conifguration file in the project’s conf folder. In this example, the configuration file is appc.mysql.default.js:

module.exports = {
    connectors: {
        'appc.mysql': {
            connectionPooling: true,
            connectionLimit: 10,

host: 'localhost',
        port: 3306,
        database: 'test',
        user: 'root',
        password: '',

        // Create models based on your schema that can be used in your API.
        generateModelsFromSchema: true,

        // Whether or not to generate APIs based on the methods in generated models.
        modelAutogen: true

    }
}

};

Modify the Configuration File

We are going to make three major edits:

  1. Create two connector entries in the connectors property
  2. Add a ‘appc.mysql’ connector reference in each entry
  3. Configure each one to point to the correct MySQL instance
module.exports = {
    connectors: {
        'appc.mysql1': {
            connector: 'appc.mysql',
            connectionPooling: true,
            connectionLimit: 10,

database: 'salesreport',
        user: 'root',
        password: 'XXXX',
        host: 'localhost',
        port: 3306,

        // Create models based on your schema that can be used in your API.
        generateModelsFromSchema: true,

        // Whether or not to generate APIs based on the methods in generated models.
        modelAutogen: true

    },
    'appc.mysql2': {
        connector: 'appc.mysql',
        connectionPooling: true,
        connectionLimit: 10,

        database: 'lbmysql',
        user: 'lbrenman',
        password: 'XXXX',
        host: 'db4free.net',
        port: 3306,

        // Create models based on your schema that can be used in your API.
        generateModelsFromSchema: true,

        // Whether or not to generate APIs based on the methods in generated models.
        modelAutogen: true

    }
}

};

Notice that I have both generateModelsFromSchema and modelAutogen set to true so that Arrow will automatically expose each databases tables and views as APIs.

Now you can access data from both MySQL databases using the appc.mysql1 and appc.mysql2 connectors. It’s that easy.

For example, the following model:

var Arrow = require("arrow");

var Model = Arrow.createModel("combined",{
    "fields": {
        "row": {
            "model": "appc.mysql1/region",
            "type": "Object"
        },
        "us": {
            "model": "appc.mysql2/region",
            "type": "Object"
        }
    },
    "connector": "appc.composite",
    "actions": [
        "create",
        "read",
        "update",
        "delete",
        "deleteAll"
    ],
    "singular": "combined",
    "plural": "combineds"
});

module.exports = Model;

returns the following data for a findAll:

{
  "success": true,
  "request-id": "6d9481d2-3d04-4afd-b49e-494d3651d8c2",
  "key": "combined",
  "combined": {
    "row": [
      {
        "id": 0,
        "rid": 0,
        "region": "LATAM",
        "act": 166,
        "fcst": 177
      },
      {
        "id": 1,
        "rid": 1,
        "region": "NORDIC",
        "act": 60,
        "fcst": 62
      },
      {
        "id": 2,
        "rid": 2,
        "region": "APAC",
        "act": 337,
        "fcst": 427
      },
      {
        "id": 3,
        "rid": 3,
        "region": "EMEA",
        "act": 552,
        "fcst": 661
      }
    ],
    "us": [
      {
        "id": 0,
        "rid": 0,
        "region": "NE",
        "act": 61,
        "fcst": 99
      },
      {
        "id": 1,
        "rid": 1,
        "region": "SE",
        "act": 30,
        "fcst": 74
      },
      {
        "id": 2,
        "rid": 2,
        "region": "West",
        "act": 32,
        "fcst": 46
      },
      {
        "id": 3,
        "rid": 3,
        "region": "Central",
        "act": 8,
        "fcst": 11
      },
      {
        "id": 4,
        "rid": 4,
        "region": "Canada",
        "act": 20,
        "fcst": 44
      }
    ]
  }
}

for the following two MySQL Database tables:

appc.mysql1/region
appc.mysql1/region

appc.mysql2/region
appc.mysql2/region

Previous articlePlanning digital transformation, think digital enablement
Next articleThe future of business: Digital predator or digital prey?
Principal Presales Architect II – Leor Brenman has over 12 years’ experience in Enterprise Software and more than 30 years working in the tech industry for companies like Vaultus, Antenna, Appcelerator and Axway. He has a strong technology background and specializes in mobile, API, integration and enterprise applications. Leor has a BS and MS in Electrical Engineering from Rutgers University in NJ, USA.

LEAVE A REPLY

Please enter your comment!
Please enter your name here