1 <?php
2 3 4 5 6 7
8 namespace Cross\DB;
9
10 use Cross\DB\SQLAssembler\MySQLAssembler;
11 use Cross\DB\SQLAssembler\PgSQLAssembler;
12 use Cross\DB\SQLAssembler\SQLiteAssembler;
13 use Cross\DB\Connecter\MySQLConnecter;
14 use Cross\DB\Connecter\PgSQLConnecter;
15 use Cross\DB\Connecter\SQLiteConnecter;
16 use Cross\Cache\Driver\MemcacheDriver;
17 use Cross\Cache\Driver\RedisDriver;
18 use Cross\DB\Drivers\PDOSqlDriver;
19 use Cross\DB\Drivers\CouchDriver;
20 use Cross\DB\Drivers\MongoDriver;
21 use Cross\Exception\CoreException;
22 use Closure;
23
24 25 26 27 28
29 class DBFactory
30 {
31 32 33 34 35 36 37 38 39
40 static function make($link, $params, array $config = array())
41 {
42
43 if ($params instanceof Closure) {
44 return call_user_func_array($params, $config);
45 }
46
47
48 $prefix = !empty($params['prefix']) ? $params['prefix'] : '';
49 $options = isset($params['options']) ? $params['options'] : array();
50 switch (strtolower($link)) {
51 case 'mysql' :
52 return new PDOSqlDriver(
53 MySQLConnecter::getInstance(self::getDsn($params, 'mysql'), $params['user'], $params['pass'], $options),
54 new MySQLAssembler($prefix)
55 );
56
57 case 'sqlite':
58 return new PDOSqlDriver(SQLiteConnecter::getInstance($params['dsn'], null, null, $options), new SQLiteAssembler($prefix));
59
60 case 'pgsql':
61 return new PDOSqlDriver(
62 PgSqlConnecter::getInstance(self::getDsn($params, 'pgsql'), $params['user'], $params['pass'], $options),
63 new PgSQLAssembler($prefix)
64 );
65
66 case 'mongo':
67 return new MongoDriver($params);
68
69 case 'redis':
70 return new RedisDriver($params);
71
72 case 'memcache':
73 return new MemcacheDriver($params);
74
75 case 'couch':
76 return new CouchDriver($params);
77
78 default:
79 throw new CoreException('不支持的数据库扩展!');
80 }
81 }
82
83 84 85 86 87 88 89 90 91
92 private static function getDsn($params, $type = 'mysql', $use_unix_socket = true)
93 {
94 if (!empty($params['dsn'])) {
95 return $params['dsn'];
96 }
97
98 if (!isset($params['host']) || !isset($params['name'])) {
99 throw new CoreException('连接数据库所需参数不足');
100 }
101
102 if ($use_unix_socket && !empty($params['unix_socket'])) {
103 $dsn = "{$type}:unix_socket={$params['unix_socket']};dbname={$params['name']};";
104 } else {
105 $dsn = "{$type}:host={$params['host']};dbname={$params['name']};";
106 if (isset($params['port'])) {
107 $dsn .= "port={$params['port']};";
108 }
109
110 if (isset($params['charset'])) {
111 $dsn .= "charset={$params['charset']};";
112 }
113 }
114
115 return $dsn;
116 }
117
118 }
119