Highriseからのデータは、いくつかの方法で取得できます。
- CSVへのエクスポートを使用する
- APIを使用する
CSVについても考慮せず、APIを使用してデータベースを毎日更新する便利な方法を見つけようとしました。
私たちは次のことを思いつきました。
- XMLフィードを取得して解析します。
- テーブル内のフィールドと見なされるすべての直接の子フィールド。
- ネストされたすべての要素は関連するテーブルであるとみなします
サンプルXML応答(https://xxx.highrisehq.com/deals.xml):
![画像](https://habrastorage.org/getpro/habr/post_images/f04/8c5/e71/f048c5e718ce5e6bd8d7e16cd7f3ee21.png)
矢印は、ネストされていると見なされる要素を示しているため、関連するテーブルにデータを配置します。
XML MySQLテーブルから行ったように。
- データにidフィールドがある場合、それをプライマリ整数キーと見なします
- 他のすべてのXMLフィールドについては、typeをtype属性(配列タイプを除く)と見なします
- ネストされた要素の場合、id属性があるかどうかを確認し、ある場合(リンクテーブルがある場合)、<nested table name> -idフィールドをテーブルに追加し、ネストされたテーブルを作成します。
- テーブル内のすべてのフィールドを、整数、日時、およびvarchar / textの3つのタイプに分割します。 フィールド名に「値」、「説明」、「テキスト」、「本文」、「メッセージ」、「データ」、「ブロブ」、「背景」のいずれかの値がある場合にのみ、TEXTがあります。
出力で得られるものの例:
![画像](http://img16.imageshack.us/img16/7025/struct.png)
これで、このデータを使って何でもでき、グラフを描き、金額を数え、他の興味深い情報を引き出すことができます。
最も重要なことは、結果のコードが37signalsのすべてのサービスで機能し、それらのサービスのいずれかを同期できることです。
Basecampの同期の例
<?php require 'SyncService.class.php'; $sync = new SyncService( array( 'db' => array( 'host' => 'localhost', 'user' => 'root', 'password' => '123', 'schema' => 'basecamp' ), 'service' => array( 'name' => 'basecamp', 'url' => 'https://xxx.basecamphq.com', 'token' => 'abcdef1234567890abcdef1234567890', 'streams' => array( '/todo_lists.xml' => 500, '/people.xml' => 500, '/projects.xml' => 500, '/account.xml' => 0, ) ), ) ); $sync->doSyncing();
すべてのライブラリコードとgithubのサンプル。