ZappySys Blog Logo
Toll Free: +1-800-444-5602 | Live Chat








  • Home
  • Products
    • SSIS PowerPack
    • ODBC PowerPack
    • ZappyShell
  • Blog
  • API Integration
    • API Connectors / Apps
    • Articles
  • FREE SSIS Tasks
  • About Us
    • Our Clients
    • Our Partners
    • Reviews and Ratings
  • Support
    • Contact Support
    • Product Online Help
    • Privacy Policy
Home » ODBC PowerPack » Metadata in ODBC Driver / Performance Options

Metadata in ODBC Driver / Performance Options

Posted on October 8, 2018May 19, 2021 by ZappySys

Contents

  • 1 Introduction
  • 2 How to Speedup Performance
  • 3 Data Caching Options in ODBC Drivers
  • 4 Handling POST requests to create / update records
  • 5 Metadata Options in SQL Query
    • 5.1 Generate Metadata Manually
    • 5.2 Compact Format Metadata
    • 5.3 Using Cached Metadata in SQL Query
    • 5.4 Using Metadata from File
    • 5.5 Using Metadata from DSN Storage
      • 5.5.1 Save Metadata to DSN Storage
      • 5.5.2 Edit Metadata saved to DSN Storage
    • 5.6 Using Metadata from Direct Setting (Embedded Metadata)
  • 6 Reading Large Files (Streaming Mode for XML / JSON)
    • 6.1 Understanding Streaming Mode
    • 6.2 SQL Query for reading Large JSON File (Streaming Mode)
    • 6.3 SQL Query for reading Large XML File (Streaming Mode)
    • 6.4 SQL Query for reading large files with parent columns or 2 levels deep
    • 6.5 Share this:
    • 6.6 Like this:
    • 6.7 Related

Introduction

In this post we will learn how to fix some metadata / performance related issues in ODBC PowerPack Drivers using Caching / Metadata / Streaming Mode features. By default ZappySys API Drivers issues atleast two API request (First one to obtain Metadata and second, third… for Fetching Data Pages). Most of the times this should be OK and user wont even notice this unless you use tools like fiddler to see how many requests sent by driver. Sometimes its necessary to avoid extra requests to obtain metadata (For example you doing POST to create new record or API has strict Throttling). In this post we will learn various techniques how to avoid extra POST requests or how to speed up query by reading from Cache if your data doesn’t  change often.

How to Speedup Performance

ZappySys Drivers may provide following features (Some options may be available only for API drivers). These features can be used to speed up query performance and solve some metadata issues.

  1. Data Caching Option
  2. Pre-generated Metadata (META option in WITH clause of SQL Query)
  3. Streaming Mode for large XML / JSON files

Data Caching Options in ODBC Drivers

ZappySys drivers come with very useful Data Caching feature. This can be very useful feature to speedup performance in many cases.

If your data doesn’t change often and you need to issue same query multiple times then enabling data caching may speedup data retrieval significantly. By default ZappySys driver enables Caching for just Metadata (60 Seconds Expiration). So metadata for each query issued by ZappySys Driver is cached for 60 seconds (See below screenshot).

Here is how you can enable caching options.

Enable Caching Options for Metadata / Data for ZappySys ODBC Drivers

Enable Caching Options for Metadata / Data for ZappySys ODBC Drivers

New version of ODBC PowerPack now supports Caching Options in WITH clause (see below). Per query cache by supplying file name.

Transact-SQL
1
2
3
4
5
6
7
8
SELECT * FROM $
WITH
(  SRC='https://myhost.com/some-api'
  ,CachingMode='All'  --cache metadata and data rows both
  ,CacheStorage='File' --or Memory
  ,CacheFileLocation='c:\temp\myquery.cache'
  ,CacheEntryTtl=300 --cache for 300 seconds
)

 

Handling POST requests to create / update records

As we mention earlier in some cases you might be calling POST requests to Create new records. In such case API request must be sent exactly once. By default Driver sends first request to Get metadata and then sends second request to get data using same parameters used for metadata request. This is usually fine if we reading data and not creating new row on server… (e.g. create new Customer Row). If you have case where you must call API request precisely once then you have to use META clause in the WITH query to avoid Metadata request by supplying static metadata from File or Storage. We discussed this one usecase here.

See next 2-3 sections how to use META option in your SQL Query.

Metadata Options in SQL Query

Now let’s talk about Metadata handling. Most ETL / Reporting tool need to know column type, size and precision before getting actual data from driver. If you are dealing with JSON / XML or CSV format you may realize that there is no metadata stored in file itself to describe columns / data types.

However metadata must be sent to most Reporting / ETL tool when they use ODBC Driver. ZappySys driver does intelligent scan from your local file or API response to guess datatypes for each column. In most cases driver does accurate guess but sometimes it’s necessary to adjust metadata (Specially Column Length) to avoid truncation related errors from your ETL /Reporting tool.

Issue with this automatic metadata scan is, it can be expensive (slow performance) or inaccurate (e.g. invalid datatype for some columns)

Let’s look at how to take complete control on your Metadata so you can avoid metadata related errors and speedup query performance.

Generate Metadata Manually

Let’s look at how to generate SQL query metadata using ODBC Driver UI.

  1. We are assuming you have downloaded and installed ODBC PowerPack
  2. Open ODBC DSN by typing “ODBC” in your start menu and select ODBC Data Sources 64 bit
  3. Now create Add and select “ZappySys JSON Driver” for test
  4. On the UI enter URL like below
    1
    https://services.odata.org/V3/Northwind/Northwind.svc/Invoices?$format=json
  5. Now you can go to Preview tab and enter query like below and click Preview Data
    1
    select * from value
  6. Once query is executed you can click Save Metadata button and select Save to File option like below. You can also Save to DSN internal storage by just giving name. If you save to internal storage by name then you can view it later under Advanced View on Properties tab (Grid Mode) > Metadata Settings > User defined metadata.
    Create Metadata for ODBC Driver Query - ZappySys API Drivers

    Create Metadata for ODBC Driver Query – ZappySys API Drivers

     

Metadata file may look like below if you used previous sample URL. You can edit this metadata as per your need.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
Available column types:
Default, String, Int64, Long, Int, Int32, Short, Byte,
Decimal, Double, Float, DateTime, Date, Boolean
*/
[
  {
    "Name": "p_odata_metadata",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "p_odata_nextLink",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "ShipName",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "ShipPostalCode",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "ShipCountry",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "CustomerID",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "CustomerName",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "Address",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "Salesperson",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "OrderID",
    "Type": "Int64",
    "Length": 16777216
  },
  {
    "Name": "OrderDate",
    "Type": "DateTime",
    "Length": 16777216
  },
  {
    "Name": "RequiredDate",
    "Type": "DateTime",
    "Length": 16777216
  },
  {
    "Name": "ShippedDate",
    "Type": "DateTime",
    "Length": 16777216
  },
  {
    "Name": "ShipperName",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "ProductID",
    "Type": "Int64",
    "Length": 16777216
  },
  {
    "Name": "ProductName",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "UnitPrice",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "Quantity",
    "Type": "Int64",
    "Length": 16777216
  },
  {
    "Name": "Discount",
    "Type": "Double",
    "Length": 16777216
  },
  {
    "Name": "ExtendedPrice",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "Freight",
    "Type": "String",
    "Length": 16777216
  }
]

Compact Format Metadata

Version 1.4 introduced a new format for metadata. Here is an example. Each pair can be its own line or you can put all in one line. Whitespaces around any value / name is ignored. string type without length assume 2000 chars long string.

Syntax: col_name1 : type_name[(length)] [; col_name2 : type_name[(length)] ] …. [; col_nameN : type_name[(length)] ]

1
2
3
4
5
6
col1: int32;
col2: string(10);
col3: boolean;
col4: datetime;
col5: int64;
col6: double;

Example usage in SQL

1
SELECT * FROM tbl WITH( META='col1: int32; col2: string(10); col3: boolean; col4: datetime; col5: int64;col6: double' )

 

Using Cached Metadata in SQL Query

Now it’s time to use Metadata and speedup our queries. There are 3 ways you can use metadata in SQL query.

Using Metadata from File

To use metadata which is saved to a file (like our previous screenshot) use below SQL query for example. Table name may be different in your case if you didn’t use previous example URL. You can Edit Metadata file as per your need in any text editor.

Transact-SQL
1
select * from value WITH( meta='c:\temp\meta.txt' )

Using Metadata from DSN Storage

To use metadata which is saved to DSN Storage use below SQL query for example.

Transact-SQL
1
select * from value WITH( meta='My-Invoice-Meta' )

Save Metadata to DSN Storage

We mentioned briefly how to save metadata to DSN Storage but in case you missed see below screenshot.

Save Metadata to DSN Storage

Save Metadata to DSN Storage

Edit Metadata saved to DSN Storage

Once you save Metadata to DSN Storage, here is how you can view and edit.

View / Edit Metadata stored in DSN Storage

View / Edit Metadata stored in DSN Storage

Using Metadata from Direct Setting (Embedded Metadata)

Sometimes its also convenient to embed metadata rather than relying on file location or DSN metadata storage. Here is how to supply metadata using embedded approach. Possible datatypes are  String, Int64, Long, Int, Int32, Short, Byte, Decimal, Double, Float, DateTime, Date, Boolean.

Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select * from value WITH( meta='[
  {
    "Name": "p_odata_metadata",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "p_odata_nextLink",
    "Type": "String",
    "Length": 16777216
  },
  {
    "Name": "ShipName",
    "Type": "String",
    "Length": 16777216
  },
...........
...........
...........
]' )

 

Reading Large Files (Streaming Mode for XML / JSON)

There will be a time when you need to read very large JSON / XML files from local disk or URL. ZappySys engine by default process everything in memory, which may work fine upto certain size but if you have file size larger than OS allowed memory internal limit then you have to tweak some settings.

First lets understand the problem. Try to create new blank DSN and run below query and watch your Memory Graph in Task Manager. You will see RAM graph spikes… and query takes around 10-15 seconds to return 10 rows.

Slow Version (Fully load In memory then parse)

Transact-SQL
1
2
3
4
5
6
7
8
9
SELECT * FROM $
LIMIT 10
WITH(
Filter='$.LargeArray[*]'
,SRC='https://zappysys.com/downloads/files/test/large_file_100k_largearray_prop.json.gz'
--,SRC='c:\data\large_file.json.gz'
,IncludeParentColumns='True'
,FileCompressionType='GZip' --Zip or None (Zip format only available for Local files)
)

Now let’s modify query little bit. Add –FAST, Turn off IncludeParentColumns and run again below modified query. You will notice it takes less than a second for same result.

FAST Version (Streaming Mode – Parse as you go)

Transact-SQL
1
2
3
4
5
6
7
8
9
SELECT * FROM $
LIMIT 10
WITH(
Filter='$.LargeArray[*]--FAST' --//Adding --FAST option turn on STREAM mode (large files)
,SRC='https://zappysys.com/downloads/files/test/large_file_100k_largearray_prop.json.gz'
--,SRC='c:\data\large_file.json.gz'
,IncludeParentColumns='False'  --//This Must be OFF for STREAM mode (read very large files)
,FileCompressionType='GZip' --Zip or None (Zip format only available for Local files)
)

Understanding Streaming Mode

Now let’s understand step-by-step what we did and why we did. By default if you’re reading JSON / XML data, entire Document is loaded into Memory for processing. This is fine for most cases but some API returns very large Document like below.

Sample JSON File

JavaScript
1
2
3
4
5
6
7
8
9
10
{
  rows:[
      {..},
      {..},
      ....
      .... 100000 more rows
      ....
      {..}
   ]
}

To read from above document without getting OutOfMemory exception change following settings. For similar problem in SSIS check this article.

  1. In the filter append –FAST  (prefix dash dash)
  2. Uncheck IncludeParentColumn option (This is needed for stream mode)
  3. Enable Performance Mode (not applicable for JSON Driver)
  4. Write your query and execute see how long it takes ( Table name must be $ in FROM clause, Filter must have –FAST suffix, Parent Columns must be excluded as below)
Configure Settings to read very large XML /JSON Files

Configure Settings to read very large XML /JSON Files

 

Reading Very Large JSON / XML Files - Streaming Option

Reading Very Large JSON / XML Files – Streaming Option

 

SQL Query for reading Large JSON File (Streaming Mode)

Here is a sample query which enables very large JSON file reading using Stream Mode using ZappySys JSON Driver

Notice Three settings.

Table name must be $ in FROM clause, Filter must have –FAST suffix, Parent Columns must be excluded (IncludeParentColumns=false) as below.

Transact-SQL
1
2
3
4
5
6
7
8
9
SELECT * FROM $
--LIMIT 10
WITH(
Filter='$.LargeArray[*]--FAST' --//Adding --FAST option turn on STREAM mode (large files)
,SRC='https://zappysys.com/downloads/files/test/large_file_100k_largearray_prop.json.gz'
--,SRC='c:\data\large_file.json.gz'
,IncludeParentColumns='False'  --//This Must be OFF for STREAM mode (read very large files)
,FileCompressionType='GZip' --Zip or None (Zip format only available for Local files)
)

SQL Query for reading Large XML File (Streaming Mode)

Here is a sample query which enables very large JSON file reading using Stream Mode using ZappySys XML Driver

Notice one extra option EnablePerformanceMode = True for Large XML File Processing and following three changes.

Table name must be $ in FROM clause, Filter must have –FAST suffix, Parent Columns must be excluded (IncludeParentColumns=false) as below.

Transact-SQL
1
2
3
4
5
6
7
8
9
10
SELECT * FROM $
--LIMIT 10
WITH(
Filter='$.doc.Customer[*]--FAST' --//Adding --FAST option turn on STREAM mode (large files)
,SRC='https://zappysys.com/downloads/files/customer_10k.xml'
--,SRC='c:\data\customer_10k.xml'
,IncludeParentColumns='False'  --//This Must be OFF for STREAM mode (read very large files)
,FileCompressionType='None' --GZip, Zip or None (Zip format only available for Local files)
,EnablePerformanceMode='True'  --try to disable this option for simple files
)

SQL Query for reading large files with parent columns or 2 levels deep

So far we saw one level deep array with Streaming mode. Now assume a scenario where you have a very large XML or JSON file which requires filter more than 2 level deep. (e.g. $.Customers[*].Orders[*]   or $.Customers[*].Orders[*].Items[*]   ) , and also you need parent columns (e.g. IncludeParentColumns=True).

If you followed previous section, we mentioned that for Streaming mode you must set IncludeParentColumns=False. So what do you do in that case?

Well, you can use JOIN Query as below to support that scenario. You may notice how we extracting Branches for each record and passing to child Query query. Notice that rather than SRC we are using DATA in child query.

Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.RecID,a.CustomerID, b.* FROM $
LIMIT 10
WITH(
Filter='$.LargeArray[*]--FAST' --//Adding --FAST option turn on STREAM mode (large files)
,SRC='https://zappysys.com/downloads/files/test/large_file_100k_largearray_prop.json.gz'
--,SRC='c:\data\large_file.json.gz'
,IncludeParentColumns='False'  --//This Must be OFF for STREAM mode (read very large files)
,FileCompressionType='GZip' --Zip or None (Zip format only available for Local files)
,Alias='a'
,JOIN1_Data='[$a.Branches$]'
,JOIN1_Alias='b'
,JOIN1_Filter=''
)

 

 

Share this:

  • Click to share on LinkedIn (Opens in new window)
  • Click to share on Twitter (Opens in new window)
  • Click to share on Facebook (Opens in new window)
  • More
  • Click to print (Opens in new window)
  • Click to share on Reddit (Opens in new window)
  • Click to share on Pinterest (Opens in new window)
  • Click to share on WhatsApp (Opens in new window)

Like this:

Like Loading...

Related

Posted in ODBC PowerPack and tagged metadata, odbc, performance.

Post navigation

← Connect Workday in Power BI…
Import REST API in Google… →
SSIS PowerPack - Collection of custom Tasks, Sources, Destination s and Transform
70+ high performance, drag and drop connectors/tasks for SSIS
Download Read More
ODBC PowerPack - Collection of ODBC Drivers for REST API, JSON, XML, SOAP, OData
ODBC Drivers for REST API, JSON, XML, SOAP, OData ... Integrate inside Apps like Power BI, Tableau, SSRS, Excel, Informatica and more...
Download Read More

Recent Posts

  • How to download images from a web page using SSIS
  • How to save a list of files into a table using SSIS.
  • How to get all URLs from emails from Outlook
  • How to add row numbers in SSIS data flow
  • Connect to Infor Compass using JDBC Driver in ODBC Apps (e.g. Power BI, Excel, Informatica, SQL Server)

Categories

  • Announcements (33)
  • Cloud Computing (13)
    • AWS (Amazon Web Services) (12)
      • Redshift (5)
      • S3 (Simple Storage Service) (7)
  • Google API (12)
  • ODBC PowerPack (59)
    • ODBC App Integration (24)
      • ETL – Informatica (3)
      • ETL – Pentaho Kettle (1)
      • ETL – Talend (1)
      • Reporting – Google Sheet (1)
      • Reporting – Microsoft Access (4)
      • Reporting – Microsoft Excel (1)
      • Reporting – Microsoft Power BI (8)
      • Reporting – Microsoft SSRS (2)
      • Reporting – MicroStrategy (1)
      • Reporting – Qlik (1)
      • Reporting – Tableau (2)
    • ODBC Drivers (49)
      • Amazon S3 CSV Driver (2)
      • Amazon S3 JSON Driver (2)
      • Amazon S3 XML Driver (2)
      • Azure Blob CSV Driver (1)
      • Azure Blob JSON Driver (1)
      • Azure Blob XML Driver (1)
      • CSV File / REST API Driver (1)
      • JDBC Bridge Driver (1)
      • JSON File / REST API Driver (33)
      • Salesforce Driver (1)
      • XML File / SOAP API Driver (22)
    • ODBC Gateway (17)
    • ODBC Programming (14)
      • C# (CSharp) (2)
      • JAVA (1)
      • PHP (1)
      • PowerShell (1)
      • Python (2)
      • T-SQL (SQL Server) (9)
  • REST API (36)
  • REST API Integration (66)
  • SSIS PowerPack (204)
    • SSIS Components (143)
      • REST Connector (3)
      • SSIS Amazon DynamoDB Destination (1)
      • SSIS Amazon DynamoDB Src (1)
      • SSIS Amazon Redshift Destination (1)
      • SSIS Amazon Redshift Source (1)
      • SSIS Amazon S3 CSV Dest (1)
      • SSIS Amazon S3 CSV Source (2)
      • SSIS Amazon S3 JSON Source (2)
      • SSIS Amazon S3 XML Source (1)
      • SSIS Amazon SQS Destination (1)
      • SSIS Amazon SQS Source (1)
      • SSIS Azure Blob CSV Destination (1)
      • SSIS Azure Blob CSV Source (1)
      • SSIS Azure Blob JSON Source (1)
      • SSIS Azure Blob XML Source (1)
      • SSIS Azure Queue Storage Destination (2)
      • SSIS Azure Queue Storage Source (2)
      • SSIS Azure Table Storage Destination (1)
      • SSIS Azure Table Storage Source (1)
      • SSIS Conditional Split Transform (1)
      • SSIS CSV File Destination (2)
      • SSIS CSV Generator Transform (2)
      • SSIS CSV Parser Transform (1)
      • SSIS CSV Source (6)
      • SSIS Dummy Data Source (1)
      • SSIS Dynamics CRM Destination (3)
      • SSIS Dynamics CRM Source (3)
      • SSIS Excel Destination (2)
      • SSIS Excel Source (4)
      • SSIS Google Analytics Source (3)
      • SSIS HTML Table Source (2)
      • SSIS JSON File Destination (2)
      • SSIS JSON Generator Transform (8)
      • SSIS JSON Parser Transform (5)
      • SSIS JSON Source (File/REST) (63)
      • SSIS Merge Join Transform (1)
      • SSIS MongoDB Destination (3)
      • SSIS MongoDB Source (6)
      • SSIS PostgreSQL Destination (1)
      • SSIS PostgreSQL Source (2)
      • SSIS Recordset Destination (1)
      • SSIS Salesforce Destination (3)
      • SSIS Salesforce Source (4)
      • SSIS Script Component (1)
      • SSIS Set Variable Transform (1)
      • SSIS SFTP CSV Source (1)
      • SSIS SFTP JSON Source (1)
      • SSIS SFTP XML Source (1)
      • SSIS Sort Transform (1)
      • SSIS Template Transform (12)
      • SSIS Trash Destination (3)
      • SSIS Upsert Destination (6)
      • SSIS WEB API Destination (13)
      • SSIS XML File Destination (1)
      • SSIS XML Generator Transform (4)
      • SSIS XML Parser Transform (3)
      • SSIS XML Source (File / SOAP) (20)
    • SSIS Connection Manager (41)
      • HTTP Connection (6)
      • SSIS Amazon S3 Connection (3)
      • SSIS Azure Blob Connection (4)
      • SSIS Dynamics CRM Connection (1)
      • SSIS Excel Connection (2)
      • SSIS MongoDB Connection (1)
      • SSIS OAuth Connection (14)
      • SSIS PostgreSql Connection (4)
      • SSIS Salesforce Connection (4)
      • SSIS SFTP / FTP Connection (2)
    • SSIS Tasks (87)
      • SSIS Advanced File System Task (10)
      • SSIS Amazon DynamoDB ExecuteSQL Task (1)
      • SSIS Amazon Redshift ExecuteSQL Task (1)
      • SSIS Amazon Storage Task (10)
      • SSIS Azure Blob Storage Task (9)
      • SSIS CSV Export Task (6)
      • SSIS Download File Task (1)
      • SSIS Excel Export Task (3)
      • SSIS ForEach Loop Task (1)
      • SSIS JSON Export Task (2)
      • SSIS JSON Parser Task (2)
      • SSIS Logging Task (7)
      • SSIS MongoDB ExecuteSQL (4)
      • SSIS PostgreSQL ExecuteSQL Task (1)
      • SSIS Regex Parser Task (4)
      • SSIS Report Generator (SSRS) (1)
      • SSIS REST API Task (36)
      • SSIS Salesforce API Task (1)
      • SSIS SFTP Task (6)
      • SSIS Timer Task (1)
      • SSIS XML Export Task (2)
      • SSIS Zip File Task (1)
  • SSIS Tips & How-Tos (13)
  • Tools (3)
  • Uncategorized (7)

Tags

access amazon api API Integration aws azure CSV Destination excel export fiddler google google api json json source MongoDB oauth oauth2 odata odbc pagination paging power bi redshift regex rest rest api s3 salesforce sftp soap source SQL sql server ssis ssis json source SSIS PowerPack ssis rest api task ssis xml source storage Task upsert write xml ZappySys

Archives

  • March 2023
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • April 2021
  • December 2020
  • September 2020
  • August 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • July 2017
  • June 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • February 2016
  • January 2016
  • December 2015
  • November 2015
  • October 2015
  • September 2015
  • August 2015
  • Facebook
  • Google+
  • Linkedin
  • Pinterest
  • Twitter
  • YouTube
%d bloggers like this: