dcarbone/tns-parser

使用 PHP 编写的 Oracle tnsnames.ora 文件/字符串解析器

0.3.0 2018-01-04 22:59 UTC

This package is auto-updated.

Last update: 2024-09-17 10:17:21 UTC


README

使用 PHP 编写的 Oracle tnsnames.ora 文件/字符串解析器

Build Status

安装

此库设计为使用 Composer 安装。

需求条目

"dcarbone/tns-parser": "0.1.*"

此说明假定您了解 Composer 自动加载

功能列表

  • 能够解析来自文件或传递的字符串的输入
  • 多行和注释不可见
  • 支持多条目项(例如多地址条目)
  • 允许搜索
  • 允许基于条目标名的简单排序
  • 实现了以下接口
  • 能够将条目导出为
    • 原始
    • 字母顺序排列的 tnsnames.ora 文件
    • JSON 表示

示例用法

给定以下 TNS 条目

$tns = <<<STRING
AWESOME.MYSELF.DATABASE =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = me.db.myself.net)
                (PORT = 12345)
            )
        )
        (CONNECT_DATA =
            (SID = AWESOME)
            (SERVER = dedicated)
        )
    )

#--------------------------------------------------

AWESOME2.MYSELF.DATABASE =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = me2.db.myself.net)
                (PORT = 12345)
            )
            (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = me25.db.myself.net)
                (PORT = 12345)
            )
            (LOAD_BALANCE = on)
            (FAILOVER = on)
            (ENABLE = broken)
        )
        (CONNECT_DATA =
            (SID = AWESOME2)
            (SERVER = dedicated)
            (FAILOVER_MODE =
                (TYPE = select)
                (METHOD = basic)
                (RETRIES = 120)
                (DELAY = 2)
            )
        )
    )
STRING;

您将初始化解析器的实例

$parser = new \DCarbone\TNSParser();

然后,如果以上内容包含在文件中

$parser->parseFile('path-to-file');

或者只是一个字符串

$parser->parseString($tns);

这样就完成了!

搜索

在输入解析期间,给定 TNS 条目的所有属性都存储在多维数组中,以便进行搜索

$matched = $parser->search('awesome');

搜索结果是一个包含任何匹配条目标名的数组。在这种情况下,结果将是

var_export($matched);
/*
array (
  0 => 'AWESOME.MYSELF.DATABASE',
  1 => 'AWESOME2.MYSELF.DATABASE',
)
*/

您可以根据需要具体到什么程度

$matched = $parser->search('me2.db.myself');
var_export($matched):
/*
array (
  0 => 'AWESOME2.MYSELF.DATABASE',
)
*/

然后您可以使用匹配的名称来检索条目

// Using the 2nd match statement...
$entries = array();
foreach($matched as $name)
{
    $entries = $parser[$name];
}
var_export($entries);
/*
array (
  'DESCRIPTION' =>
  array (
    'ADDRESS_LIST' =>
    array (
      'ADDRESS' =>
      array (
        0 =>
        array (
          'PROTOCOL' => 'TCP',
          'HOST' => 'me2.db.myself.net',
          'PORT' => '12345',
        ),
        1 =>
        array (
          'PROTOCOL' => 'TCP',
          'HOST' => 'me25.db.myself.net',
          'PORT' => '12345',
        ),
      ),
      'LOAD_BALANCE' => 'on',
      'FAILOVER' => 'on',
      'ENABLE' => 'broken',
    ),
    'CONNECT_DATA' =>
    array (
      'SID' => 'AWESOME2',
      'SERVER' => 'dedicated',
      'FAILOVER_MODE' =>
      array (
        'TYPE' => 'select',
        'METHOD' => 'basic',
        'RETRIES' => '120',
        'DELAY' => '2',
      ),
    ),
  ),
)
*/

... 或者获取一个有效的 TNS 条目版本作为字符串

$entry = $parser->getTNSEntryString($matched[0]);
var_export($entry);
/*
'AWESOME2.MYSELF.DATABASE =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = me2.db.myself.net)
                (PORT = 12345)
            )
            (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = me25.db.myself.net)
                (PORT = 12345)
            )
            (LOAD_BALANCE = on)
            (FAILOVER = on)
            (ENABLE = broken)
        )
        (CONNECT_DATA =
            (SID = AWESOME2)
            (SERVER = dedicated)
            (FAILOVER_MODE =
                (TYPE = select)
                (METHOD = basic)
                (RETRIES = 120)
                (DELAY = 2)
            )
        )
    )'
*/

在幕后,搜索系统使用 preg_match,默认结构为 '{%s}S',其中 %s 被您的输入替换。

如果您想进行大小写敏感搜索,请在执行 search() 时将 true 作为第二个参数传递。

排序

目前,搜索仅限于按条目标名字母顺序,并在幕后使用 ksort

$parser->sort();

建议?

目前,此库满足我的需求,但如果任何使用此库的人想要看到一些改进/修改,请告诉我!

测试

进行中。