var path = require('path');
var edge = require('edge');
var _ = require('underscore');
var dbc = require('happy.dbc').DesignByContract;
var assemblyFile = path.resolve(__dirname, './clr/bin/Happy.Edge.DatabaseSchemaReader.dll');
var readAll = edge.func({
assemblyFile: assemblyFile,
typeName: 'Happy.Edge.DatabaseSchemaReader.SchemaReader',
methodName: 'ReadAll'
});
/**
* 数据库结构读取器,用来读取数据库的所有表和视图的元数据。
*
* @class DatabaseSchemaReader
* @extends Object
* @constructor
* @param {String} providerName 数据提供程序
* @param {String} connectionString 数据库连接字符串
* @example
var reader = DatabaseSchemaReader.createSqlClientReader(
'Data Source=(LocalDB)\\v11.0;AttachDbFilename=E:\\node\\happy_node\\demo\\database_schem_reader\\test_database\\Test.mdf;Integrated Security=True;Connect Timeout=30'
);
reader.readAll(function (error, schema) {
console.log(util.inspect(schema, { depth: null }));
});
//schema 的结构如下:
{
tables: [
{
name: 'Table',
owner: 'dbo',
columns: [
{
dataType: {
isDateTime: false,
isFloat: false,
isInt: false,
isNumeric: false,
isString: false,
netDataType: 'System.Guid',
netDataTypeCSharpName: 'System.Guid',
typeName: 'uniqueidentifier'
},
dateTimePrecision: null,
dbDataType: 'uniqueidentifier',
defaultValue: null,
foreignKeyTableName: null,
identityIncrement: 1,
identitySeed: 1,
isForeignKey: false,
isIdentity: false,
isIndexed: false,
isIsPrimaryKey: true,
isUniqueKey: false,
length: null,
name: 'Id',
netName: null,
nullable: false,
nullableIndicator: '',
ordinal: 1,
precision: null,
scale: null,
tableName: 'Table'
}
]
}
],
views: [
//和tables的内容一样
]
};
*/
var DatabaseSchemaReader = function (providerName, connectionString) {
var me = this;
dbc.mustBeDefined('providerName', providerName);
dbc.mustBeDefined('connectionString', connectionString);
_.extend(me, {
providerName: providerName,
connectionString: connectionString
});
};
module.exports = DatabaseSchemaReader;
/**
* @private
* @readOnly
* @property providerName
* @type String
*/
/**
* @private
* @readOnly
* @property connectionString
* @type String
*/
_.extend(DatabaseSchemaReader, {
/**
* 用于 SQL Server 的 数据提供程序。
*
* @static
* @final
* @property SQL_CLIENT
* @type String
* @default 'System.Data.SqlClient'
*/
SQL_CLIENT: 'System.Data.SqlClient',
/**
* 用'System.Data.SqlClient'做为ProviderName,创建一个DatabaseSchemaReader。
*
* @static
* @method createSqlClientReader
* @param {String} connectionString 数据库连接字符串
* @return {DatabaseSchemaReader} 数据库结构读取器
* @example
var connectionString = 'Data Source=(LocalDB)\\v11.0;AttachDbFilename=E:\\Test.mdf;Integrated Security=True;Connect Timeout=30';
var reader = DatabaseSchemaReader.createSqlClientReader(connectionString);
*/
createSqlClientReader: function (connectionString) {
var me = this;
return new DatabaseSchemaReader(DatabaseSchemaReader.SQL_CLIENT, connectionString);
}
});
_.extend(DatabaseSchemaReader.prototype, {
/**
* 读取整个数据库的结构。
*
* @async
* @method readAll
* @param {Function} callback 读取成功后的回调函数,函数签名如下:
* @param {Error} callback.error 异常信息
* @param {Object} callback.schema 数据库结构
* @param callback.return
* @return
* @example
reader.readAll(function (error, schema) {
console.log(util.inspect(schema, { depth: null }));
});
*/
readAll: function (callback) {
var me = this;
dbc.mustBeDefined('callback', callback);
dbc.mustBeAFunction('callback', callback);
return readAll(me.getOptions(), callback);
},
/**
* @private
* @method getOptions
* @return {Object}
*/
getOptions: function () {
var me = this;
return {
providerName: me.providerName,
connectionString: me.connectionString
};
}
});