FoxPro でRabbitMQ のデータを操作

古川えりか
古川えりか
コンテンツスペシャリスト
RabbitMQ をFoxPro データベースにロードします。この記事では、完全なコードとプロセスのウォークスルーを提供します。



CData ODBC Driver for API は、ODBC スタンダードを使用してRabbitMQ にアクセスすることを可能にします。また、CData ODBC Driver for API を使用して、RabbitMQ をFoxPro プロジェクトに統合することも可能です。以下のステップは、含まれているコードサンプルのウォークスルーを提供します。このコードでは、RabbitMQ のデータをFoxPro データベースのテーブルに保存します。

CData ODBC ドライバとは?

CData ODBC ドライバは、以下のような特徴を持ったリアルタイムデータ連携ソリューションです。

  1. RabbitMQ をはじめとする、CRM、MA、会計ツールなど多様なカテゴリの270種類以上のSaaS / オンプレミスデータソースに対応
  2. 多様なアプリケーション、ツールにRabbitMQ のデータを連携
  3. ノーコードでの手軽な接続設定
  4. 標準 SQL での柔軟なデータ読み込み・書き込み

CData ODBC ドライバでは、1.データソースとしてRabbitMQ の接続を設定、2.FoxPro 側でODBC Driver との接続を設定、という2つのステップだけでデータソースに接続できます。以下に具体的な設定手順を説明します。

CData ODBC ドライバのインストールとRabbitMQ への接続設定

まずは、本記事右側のサイドバーからAPI ODBC Driver の無償トライアルをダウンロード・インストールしてください。30日間無償で、製品版の全機能が使用できます。

未指定の場合は、初めにODBC DSN(data source name)で接続プロパティを指定します。ドライバーのインストールの最後にアドミニストレーターが開きます。Microsoft ODBC Data Source Administrator を使用して、ODBC DSN を作成および構成できます。

NOTE:[Map To WVarchar]接続プロパティをFALSE に設定します。(FoxPro はODBC W API を使用し、値タイプのWCHAR を返します。)

RabbitMQ Management HTTP API について

RabbitMQ は、複数のメッセージングプロトコルをサポートするオープンソースのメッセージブローカーです。RabbitMQ Management HTTP API は、RabbitMQ サーバーの管理データと監視データに HTTP 経由でアクセスする手段を提供します。この API では、仮想ホスト、エクスチェンジ、キュー、バインディング、コネクション、チャネル、コンシューマー、ユーザー、権限、ポリシー、クラスター全体の統計情報を取得できます。

HTTP API を利用するには、RabbitMQ サーバーで Management プラグインを有効化する必要があります。デフォルトでは、管理インターフェースはポート 15672 でリッスンします。

Basic 認証の設定

RabbitMQ Management HTTP API は HTTP Basic 認証を使用します。RabbitMQ 管理ユーザーのユーザー名とパスワードを指定する必要があります。

管理 API へのアクセスを有効にするには、以下のステップで進めます:

  1. サーバーで RabbitMQ Management プラグインが有効になっていることを確認します(rabbitmq-plugins enable rabbitmq_management)。
  2. 既存の管理ユーザーを使用するか、適切な管理タグ(management、policymaker、monitoring、または administrator)を持つユーザーを作成します。
  3. RabbitMQ Management HTTP API の完全なベース URL を控えておきます(例:http://localhost:15672)。

RabbitMQ サーバーを設定したら、以下の接続プロパティを設定して接続します:

  • AuthScheme:Basic に設定します。
  • URL:RabbitMQ Management HTTP API のベース URL に設定します(例:http://localhost:15672)。
  • User:RabbitMQ の管理ユーザー名に設定します(例:guest)。
  • Password:RabbitMQ の管理パスワードに設定します。

接続文字列の例:

Profile=C:\profiles\RabbitMQ.apip;AuthScheme=Basic;URL=http://localhost:15672;User=guest;Password=guest;

利用可能なテーブル

RabbitMQ プロファイルでは、以下のテーブルにアクセスできます:

  • Overview - クラスター全体の統計情報と RabbitMQ ノードに関する情報
  • Nodes - RabbitMQ クラスター内の個々のノードに関する情報
  • NodeMemory - 特定のクラスターノードの詳細なメモリ使用状況の内訳
  • Connections - ブローカーへのすべてのオープンな AMQP コネクションの一覧
  • Channels - すべてのコネクションにわたるオープンな AMQP チャネルの一覧
  • Consumers - すべてのキューに登録されたコンシューマーの一覧
  • Exchanges - すべての仮想ホストで宣言されたエクスチェンジの一覧
  • Queues - すべての仮想ホストで宣言されたキューの一覧
  • Bindings - エクスチェンジとキュー間のすべてのバインディングの一覧
  • VirtualHosts - ブローカーに設定された仮想ホストの一覧
  • VhostPermissions - 特定の仮想ホスト内のユーザー権限
  • Users - すべての RabbitMQ ユーザーの一覧
  • Permissions - すべての仮想ホストにわたる全ユーザーの権限レコード
  • TopicPermissions - 全ユーザーのトピックレベルの権限レコード
  • Policies - 仮想ホスト内のキューおよびエクスチェンジに適用されたポリシーの一覧
  • OperatorPolicies - 仮想ホスト内のキューに適用されたオペレーターポリシーの一覧
  • Parameters - 仮想ホストごとのコンポーネントパラメータ(例:federation、shovel)の一覧
  • GlobalParameters - すべての仮想ホストに適用されるグローバルパラメータの一覧
  • VhostLimits - 特定の仮想ホストに設定されたリソース制限
  • UserLimits - 特定のユーザーに設定されたリソース制限
  • FeatureFlags - フィーチャーフラグの一覧と、ノード上での有効/無効の状態
  • DeprecatedFeatures - 非推奨機能の一覧と、その使用状態
  • AuthAttempts - ノードの認証試行統計
  • ClusterName - RabbitMQ クラスターの名前
  • WhoAmI - 現在認証されている管理ユーザーに関する情報
  • ExchangeBindingsSource - 特定のエクスチェンジがソースとなっているバインディング
  • ExchangeBindingsDestination - 特定のエクスチェンジが宛先となっているバインディング
  • QueueBindings - 仮想ホスト内の特定のキューのバインディング

接続して転送

開始するには、コードサンプルを新しいプロジェクトに追加します。以下のコマンドを実行することで、テーブルをすべて表示することなく保存できます。

DO C:\Temp\sqldump.prg WITH "CData API Source", "TESTDB", .f.

以下は、プログラムが従うプロセスです。

  1. 新しいFoxPro データベースを作成します。
  2. 以下の行でRabbitMQ への接続を開きます。

    m.hSQLconnection = SQLCONNECT(m.cODBCDSN)
    
  3. 接続が成功したら、SQLTABLES 関数を使用してテーブルのリストを取得できるようになります。以下のコードは、テーブルのリストをsys_tables.dbf に保存します。

    WAIT WINDOW "Fetching tables for data source '" + m.cODBCDSN + "'..."NOWAIT NOCLEAR
    m.nSQLTABLES = SQLTABLES(m.hSQLconnection)
    
    IF lUseDistinctConnections
      WAIT WINDOW "Closing ODBC Connection for data source '" + m.cODBCDSN + "'..."NOWAIT NOCLEAR
      SQLDISCONNECT(m.hSQLconnection)
      m.hSQLconnection = 0 * SQLCONNECT needs to be called again
    ENDIF
    
    IF m.nSQLTABLES > 0
      * create local table containing list of tables in db
      COPY TO (m.cImportData + "sys_tables")
      USE
    
      * convert each table to DBF
      USE (m.cImportData + "sys_tables")
      ALTER TABLE DBF("sys_tables") ;
      ADD COLUMN records i ;
      ADD COLUMN dbfname m
    
  4. 各テーブルをスキャンしてDBF ファイルに保存します。関数ODBCtoDBF は、テーブルをDBF ファイルに格納し、lBrowse パラメータがtrue に設定されている場合はグリッドを開きます。
    FUNCTION ODBCtoDBF (cTableName as String, cTableType as String, lBrowse as Logical, lhSQLConnection as Integer)
    
      WAIT WINDOW ;
      "Converting " + m.cTableType + ' "' + m.cTableName + '" to DBF...' ;
      NOWAIT NOCLEAR
    
      ACTIVATE SCREEN
    
      * strip characters incompatible with FoxPro out of the name of the DBF file
      m.cTableAlias		= ""
      m.nTableNameLen		= LEN(m.cTableName)
      m.nTableNameStart	= 1
    
      FOR m.nTableNameStart = 1 TO m.nTableNameLen
        m.cCharacter = SUBSTR(m.cTableName, m.nTableNameStart, 1)
        IF !ISALPHA(m.cCharacter) .and. (m.nTableNameStart = 1 .or. !ISDIGIT(m.cCharacter))
          m.cTableAlias = m.cTableAlias + "_"
        ELSE
          m.cTableAlias = m.cTableAlias + m.cCharacter
        ENDIF
      ENDFOR
    
      m.cFromTable = m.cTableName
      m.cTempViewAlias	= m.cTableType + "_" + m.cTableAlias
    
      LOCAL loException as Exception
      LOCAL lnResultSets
    
      TRY
        * run query
        m.lnResultSets = SQLEXEC(m.lhSQLConnection, ;
          "SELECT * FROM " + m.cFromTable, ;
          m.cTempViewAlias, ;
          aSQLResult)
    
        IF m.lnResultSets#1
          SET STEP ON
        ENDIF
    
        ACTIVATE SCREEN
    
      CATCH TO m.loException
        ACTIVATE SCREEN
        ?"Error opening " + m.cTempViewAlias + ":"
        ? m.loException.Message
        ? m.loException.Details
      ENDTRY
    
      IF !USED(m.cTempViewAlias)
        RETURN
      ENDIF
    
      * copy records from view cursor to disk
      SELECT * FROM (m.cTempViewAlias) ;
        INTO TABLE (m.cImportData + m.cTableAlias)
    
      IF USED(m.cTableAlias)
    
        ACTIVATE SCREEN
    
        FLUSH	&& flush the buffer to write the data to disk
    
        IF m.lBrowse
          * pop the table up on screen
          SELECT (m.cTableAlias)
          BROWSE NORMAL NOMODIFY NOWAIT
          ACTIVATE SCREEN
        ELSE
          * close on-disk table for now
          USE IN (m.cTableAlias)
          ACTIVATE SCREEN
        ENDIF
      ENDIF
    
      IF USED(m.cTempViewAlias)
        USE IN &cTempViewAlias && close SQL view
        ACTIVATE SCREEN
      ENDIF
    
      WAIT CLEAR
    
    ENDFUNC
    
  5. これで、RabbitMQ のテーブルをDBF ファイルとして保存できます。

以下は、FoxPro 9 構文の完全なコードです。

PARAMETERS cODBCDSN, cDatabaseName, lBrowseAfterConvert

*	cODBCDSN				The ODBC data source name, used for the name of the folder where the DBF tables are stored.
*	cDatabaseName			The name of the FoxPro database to use.This database is created if it does not exist.The default is DATABASE_NAME.
*
*	lBrowseAfterConvert		If ".t." display each table with the BROWSE command after importing it.If ".f." close each table before moving on to the next one.

#define		ODBC_DATASOURCE		"DataSourceName"
#define		DATABASE_NAME		"odbcdata"

m.m_tpath = ".\"                && root directory for data

ON ERROR
SET SAFETY OFF

IF VARTYPE(m.cODBCDSN)#"C" .or.EMPTY(m.cODBCDSN)
  m.cODBCDSN = ODBC_DATASOURCE
ENDIF
IF VARTYPE(m.cDatabaseName)#"C" .or.EMPTY(m.cDatabaseName)
  m.cDatabaseName = DATABASE_NAME
ENDIF

m.cImportData = m.cODBCDSN + "\"

CLOSE TABLES ALL
CLOSE DATABASES ALL

IF !DIRECTORY(m.cImportData)
	MKDIR (m.cImportData)
ENDIF

CREATE DATABASE (m.cDatabaseName)
CREATE CONNECTION (m.cDatabaseName) DATASOURCE (m.cODBCDSN) DATABASE (m.cDatabaseName)

WAIT WINDOW "Opening ODBC Connection for data source '" + m.cODBCDSN + "'..."NOWAIT NOCLEAR
m.hSQLconnection = SQLCONNECT(m.cODBCDSN)

IF m.hSQLconnection > 0
  * Connection successful; get list of tables
  WAIT WINDOW "Fetching tables for data source '" + m.cODBCDSN + "'..."NOWAIT NOCLEAR
  m.nSQLTABLES = SQLTABLES(m.hSQLconnection)

  IF m.nSQLTABLES > 0
    * Create local table containing list of tables in db
    COPY TO (m.cImportData + "sys_tables")
    USE

    * Convert each table to DBF
    USE (m.cImportData + "sys_tables")
    ALTER TABLE DBF("sys_tables") ;
    ADD COLUMN records	i ;
    ADD COLUMN dbfname	m

    SCAN
    m.cCurrentTable	= TRIM(sys_tables.table_name)
    m.cCurrentTableType	= TRIM(sys_tables.table_type) && Valid values are "SYSTEMTABLE", "TABLE", and "VIEW".
    IF m.cCurrentTableType = "TABLE" or m.cCurrentTableType = "VIEW"

      ODBCtoDBF(m.cCurrentTable, m.cCurrentTableType, m.lBrowseAfterConvert, m.hSQLConnection)
    ELSE
      ACTIVATE SCREEN
      ?"ERROR:", m.cCurrentTable, "Couldn't open ODBC connection."
      =MESSAGEBOX("couldn't open data source " + m.cODBCDSN + " for table " + m.cCurrentTable + ".")
    ENDIF

    ENDSCAN
    BROWSE NORMAL NOWAIT

  ELSE
    =MESSAGEBOX("No tables found in data source " + m.cODBCDSN + ".")
    SET STEP ON
  ENDIF

  SQLDISCONNECT(m.hSQLconnection)

ELSE
  =MESSAGEBOX("Could not open data source " + m.cODBCDSN + ".")
  SET STEP ON
ENDIF

FUNCTION ODBCtoDBF (cTableName as String, cTableType as String, lBrowse as Logical, lhSQLConnection as Integer)

  WAIT WINDOW ;
  "Converting " + m.cTableType + ' "' + m.cTableName + '" to DBF...' ;
  NOWAIT NOCLEAR

  ACTIVATE SCREEN

  * Strip characters incompatible with FoxPro out of the name of the DBF file
  m.cTableAlias		= ""
  m.nTableNameLen		= LEN(m.cTableName)
  m.nTableNameStart	= 1

  FOR m.nTableNameStart = 1 TO m.nTableNameLen
    m.cCharacter = SUBSTR(m.cTableName, m.nTableNameStart, 1)
    IF !ISALPHA(m.cCharacter) .and. (m.nTableNameStart = 1 .or. !ISDIGIT(m.cCharacter))
      m.cTableAlias = m.cTableAlias + "_"
    ELSE
      m.cTableAlias = m.cTableAlias + m.cCharacter
    ENDIF
  ENDFOR

  m.cFromTable = m.cTableName
  m.cTempViewAlias	= m.cTableType + "_" + m.cTableAlias

  LOCAL loException as Exception
  LOCAL lnResultSets

  TRY
    * Run query
    m.lnResultSets = SQLEXEC(m.lhSQLConnection, ;
      "SELECT * FROM " + m.cFromTable, ;
      m.cTempViewAlias, ;
      aSQLResult)

    IF m.lnResultSets#1
      SET STEP ON
    ENDIF

    ACTIVATE SCREEN

  CATCH TO m.loException
    ACTIVATE SCREEN
    ?"Error opening " + m.cTempViewAlias + ":"
    ? m.loException.Message
    ? m.loException.Details
  ENDTRY

  IF !USED(m.cTempViewAlias)
    RETURN
  ENDIF

  * Copy records from view cursor to disk
  SELECT * FROM (m.cTempViewAlias) ;
    INTO TABLE (m.cImportData + m.cTableAlias)

  IF USED(m.cTableAlias)

    ACTIVATE SCREEN

    FLUSH	&& Flush the buffer to write the data to disk

    IF m.lBrowse
      * Display the table on screen
      SELECT (m.cTableAlias)
      BROWSE NORMAL NOMODIFY NOWAIT
      ACTIVATE SCREEN
    ELSE
      * Close on-disk table
      USE IN (m.cTableAlias)
      ACTIVATE SCREEN
    ENDIF
  ENDIF

  IF USED(m.cTempViewAlias)
    USE IN &cTempViewAlias && Close SQL view
    ACTIVATE SCREEN
  ENDIF

  WAIT CLEAR

ENDFUNC

おわりに

このようにCData ODBC ドライバと併用することで、270を超えるSaaS、NoSQL データをコーディングなしで扱うことができます。30日の無償評価版が利用できますので、ぜひ自社で使っているクラウドサービスやNoSQL と合わせて活用してみてください。

CData ODBC ドライバは日本のユーザー向けに、UI の日本語化、ドキュメントの日本語化、日本語でのテクニカルサポートを提供しています。

はじめる準備はできましたか?

API Driver で RabbitMQ のライブデータに接続

RabbitMQ に接続