Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
Dapper
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tsai
Dapper
Commits
4a7e7fb5
Commit
4a7e7fb5
authored
Aug 07, 2012
by
Marc Gravell
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://github.com/jedidja/dapper-dot-net
into jedidja-master
Conflicts: Dapper.Rainbow/Database.cs
parents
4a9f0500
7919913c
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
256 additions
and
255 deletions
+256
-255
Database.cs
Dapper.Rainbow/Database.cs
+256
-255
No files found.
Dapper.Rainbow/Database.cs
View file @
4a7e7fb5
/*
License: http://www.apache.org/licenses/LICENSE-2.0
Home page: http://code.google.com/p/dapper-dot-net/
*/
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Web
;
using
System.Data
;
using
Dapper
;
using
System.Collections.Concurrent
;
using
System.Reflection
;
using
System.Text
;
using
System.Data.Common
;
using
System.Diagnostics
;
using
System.Reflection.Emit
;
namespace
Dapper
{
/// <summary>
/// A container for a database, assumes all the tables have an Id column named Id
/// </summary>
/// <typeparam name="TDatabase"></typeparam>
public
abstract
class
Database
<
TDatabase
>
:
IDisposable
where
TDatabase
:
Database
<
TDatabase
>,
new
()
{
public
class
Table
<
T
>
{
/*
License: http://www.apache.org/licenses/LICENSE-2.0
Home page: http://code.google.com/p/dapper-dot-net/
*/
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Web
;
using
System.Data
;
using
Dapper
;
using
System.Collections.Concurrent
;
using
System.Reflection
;
using
System.Text
;
using
System.Data.Common
;
using
System.Diagnostics
;
using
System.Reflection.Emit
;
namespace
Dapper
{
/// <summary>
/// A container for a database, assumes all the tables have an Id column named Id
/// </summary>
/// <typeparam name="TDatabase"></typeparam>
public
abstract
class
Database
<
TDatabase
>
:
IDisposable
where
TDatabase
:
Database
<
TDatabase
>,
new
()
{
public
class
Table
<
T
>
{
internal
Database
<
TDatabase
>
database
;
internal
string
tableName
;
internal
string
likelyTableName
;
public
Table
(
Database
<
TDatabase
>
database
,
string
likelyTableName
)
{
this
.
database
=
database
;
this
.
likelyTableName
=
likelyTableName
;
}
public
string
TableName
{
get
{
tableName
=
tableName
??
database
.
DetermineTableName
<
T
>(
likelyTableName
);
return
tableName
;
}
}
/// <summary>
/// Insert a row into the db
/// </summary>
/// <param name="data">Either DynamicParameters or an anonymous type or concrete type</param>
/// <returns></returns>
public
virtual
int
?
Insert
(
dynamic
data
)
{
var
o
=
(
object
)
data
;
List
<
string
>
paramNames
=
GetParamNames
(
o
);
string
cols
=
string
.
Join
(
","
,
paramNames
);
string
cols_params
=
string
.
Join
(
","
,
paramNames
.
Select
(
p
=>
"@"
+
p
));
var
sql
=
"set nocount on insert "
+
TableName
+
" ("
+
cols
+
") values ("
+
cols_params
+
") select cast(scope_identity() as int)"
;
return
database
.
Query
<
int
?>(
sql
,
o
).
Single
();
}
/// <summary>
/// Update a record in the DB
/// </summary>
/// <param name="id"></param>
/// <param name="data"></param>
/// <returns></returns>
public
int
Update
(
int
id
,
dynamic
data
)
{
List
<
string
>
paramNames
=
GetParamNames
((
object
)
data
);
var
builder
=
new
StringBuilder
();
builder
.
Append
(
"update ["
).
Append
(
TableName
).
Append
(
"] set "
);
builder
.
AppendLine
(
string
.
Join
(
","
,
paramNames
.
Where
(
n
=>
n
!=
"Id"
).
Select
(
p
=>
p
+
"= @"
+
p
)));
builder
.
Append
(
"where Id = @Id"
);
DynamicParameters
parameters
=
new
DynamicParameters
(
data
);
parameters
.
Add
(
"Id"
,
id
);
return
database
.
Execute
(
builder
.
ToString
(),
parameters
);
}
/// <summary>
/// Delete a record for the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public
bool
Delete
(
int
id
)
{
return
database
.
Execute
(
"delete "
+
TableName
+
" where Id = @id"
,
new
{
id
})
>
0
;
}
/// <summary>
/// Grab a record with a particular Id from the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public
T
Get
(
int
id
)
{
return
database
.
Query
<
T
>(
"select * from "
+
TableName
+
" where Id = @id"
,
new
{
id
}).
FirstOrDefault
();
}
public
T
First
()
{
return
database
.
Query
<
T
>(
"select top 1 * from "
+
TableName
).
FirstOrDefault
();
}
public
IEnumerable
<
T
>
All
()
{
return
database
.
Query
<
T
>(
"select * from "
+
TableName
);
}
static
ConcurrentDictionary
<
Type
,
List
<
string
>>
paramNameCache
=
new
ConcurrentDictionary
<
Type
,
List
<
string
>>();
internal
static
List
<
string
>
GetParamNames
(
object
o
)
{
if
(
o
is
DynamicParameters
)
{
return
(
o
as
DynamicParameters
).
ParameterNames
.
ToList
();
}
List
<
string
>
paramNames
;
if
(!
paramNameCache
.
TryGetValue
(
o
.
GetType
(),
out
paramNames
))
{
paramNames
=
new
List
<
string
>();
foreach
(
var
prop
in
o
.
GetType
().
GetProperties
(
BindingFlags
.
GetProperty
|
BindingFlags
.
Instance
|
BindingFlags
.
Public
))
{
paramNames
.
Add
(
prop
.
Name
);
}
paramNameCache
[
o
.
GetType
()]
=
paramNames
;
}
return
paramNames
;
}
}
DbConnection
connection
;
int
commandTimeout
;
DbTransaction
transaction
;
public
static
TDatabase
Init
(
DbConnection
connection
,
int
commandTimeout
)
{
TDatabase
db
=
new
TDatabase
();
db
.
InitDatabase
(
connection
,
commandTimeout
);
return
db
;
}
internal
static
Action
<
TDatabase
>
tableConstructor
;
internal
void
InitDatabase
(
DbConnection
connection
,
int
commandTimeout
)
{
this
.
connection
=
connection
;
this
.
commandTimeout
=
commandTimeout
;
if
(
tableConstructor
==
null
)
internal
string
likelyTableName
;
public
Table
(
Database
<
TDatabase
>
database
,
string
likelyTableName
)
{
this
.
database
=
database
;
this
.
likelyTableName
=
likelyTableName
;
}
public
string
TableName
{
get
{
tableName
=
tableName
??
database
.
DetermineTableName
<
T
>(
likelyTableName
);
return
tableName
;
}
}
/// <summary>
/// Insert a row into the db
/// </summary>
/// <param name="data">Either DynamicParameters or an anonymous type or concrete type</param>
/// <returns></returns>
public
virtual
int
?
Insert
(
dynamic
data
)
{
var
o
=
(
object
)
data
;
List
<
string
>
paramNames
=
GetParamNames
(
o
);
string
cols
=
string
.
Join
(
","
,
paramNames
);
string
cols_params
=
string
.
Join
(
","
,
paramNames
.
Select
(
p
=>
"@"
+
p
));
var
sql
=
"set nocount on insert "
+
TableName
+
" ("
+
cols
+
") values ("
+
cols_params
+
") select cast(scope_identity() as int)"
;
return
database
.
Query
<
int
?>(
sql
,
o
).
Single
();
}
/// <summary>
/// Update a record in the DB
/// </summary>
/// <param name="id"></param>
/// <param name="data"></param>
/// <returns></returns>
public
int
Update
(
int
id
,
dynamic
data
)
{
List
<
string
>
paramNames
=
GetParamNames
((
object
)
data
);
var
builder
=
new
StringBuilder
();
builder
.
Append
(
"update ["
).
Append
(
TableName
).
Append
(
"] set "
);
builder
.
AppendLine
(
string
.
Join
(
","
,
paramNames
.
Where
(
n
=>
n
!=
"Id"
).
Select
(
p
=>
p
+
"= @"
+
p
)));
builder
.
Append
(
"where Id = @Id"
);
DynamicParameters
parameters
=
new
DynamicParameters
(
data
);
parameters
.
Add
(
"Id"
,
id
);
return
database
.
Execute
(
builder
.
ToString
(),
parameters
);
}
/// <summary>
/// Delete a record for the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public
bool
Delete
(
int
id
)
{
return
database
.
Execute
(
"delete "
+
TableName
+
" where Id = @id"
,
new
{
id
})
>
0
;
}
/// <summary>
/// Grab a record with a particular Id from the DB
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public
T
Get
(
int
id
)
{
return
database
.
Query
<
T
>(
"select * from "
+
TableName
+
" where Id = @id"
,
new
{
id
}).
FirstOrDefault
();
}
public
T
First
()
{
tableConstructor
=
CreateTableConstructorForTable
();
}
tableConstructor
(
this
as
TDatabase
);
return
database
.
Query
<
T
>(
"select top 1 * from "
+
TableName
).
FirstOrDefault
();
}
public
IEnumerable
<
T
>
All
()
{
return
database
.
Query
<
T
>(
"select * from "
+
TableName
);
}
static
ConcurrentDictionary
<
Type
,
List
<
string
>>
paramNameCache
=
new
ConcurrentDictionary
<
Type
,
List
<
string
>>();
internal
static
List
<
string
>
GetParamNames
(
object
o
)
{
if
(
o
is
DynamicParameters
)
{
return
(
o
as
DynamicParameters
).
ParameterNames
.
ToList
();
}
List
<
string
>
paramNames
;
if
(!
paramNameCache
.
TryGetValue
(
o
.
GetType
(),
out
paramNames
))
{
paramNames
=
new
List
<
string
>();
foreach
(
var
prop
in
o
.
GetType
().
GetProperties
(
BindingFlags
.
GetProperty
|
BindingFlags
.
Instance
|
BindingFlags
.
Public
))
{
paramNames
.
Add
(
prop
.
Name
);
}
paramNameCache
[
o
.
GetType
()]
=
paramNames
;
}
return
paramNames
;
}
}
DbConnection
connection
;
int
commandTimeout
;
DbTransaction
transaction
;
public
static
TDatabase
Init
(
DbConnection
connection
,
int
commandTimeout
)
{
TDatabase
db
=
new
TDatabase
();
db
.
InitDatabase
(
connection
,
commandTimeout
);
return
db
;
}
internal
static
Action
<
TDatabase
>
tableConstructor
;
internal
void
InitDatabase
(
DbConnection
connection
,
int
commandTimeout
)
{
this
.
connection
=
connection
;
this
.
commandTimeout
=
commandTimeout
;
if
(
tableConstructor
==
null
)
{
tableConstructor
=
CreateTableConstructorForTable
();
}
tableConstructor
(
this
as
TDatabase
);
}
internal
virtual
Action
<
TDatabase
>
CreateTableConstructorForTable
()
{
return
CreateTableConstructor
(
typeof
(
Table
<>));
}
public
void
BeginTransaction
(
IsolationLevel
isolation
=
IsolationLevel
.
ReadCommitted
)
{
transaction
=
connection
.
BeginTransaction
(
isolation
);
}
public
void
CommitTransaction
()
{
transaction
.
Commit
();
transaction
=
null
;
}
public
void
RollbackTransaction
()
{
transaction
.
Rollback
();
transaction
=
null
;
}
public
void
BeginTransaction
(
IsolationLevel
isolation
=
IsolationLevel
.
ReadCommitted
)
{
transaction
=
connection
.
BeginTransaction
(
isolation
);
}
public
void
CommitTransaction
()
{
transaction
.
Commit
();
transaction
=
null
;
}
public
void
RollbackTransaction
()
{
transaction
.
Rollback
();
transaction
=
null
;
}
protected
Action
<
TDatabase
>
CreateTableConstructor
(
Type
tableType
)
...
...
@@ -227,84 +228,84 @@ protected Action<TDatabase> CreateTableConstructor(Type tableType)
il
.
Emit
(
OpCodes
.
Ret
);
return
(
Action
<
TDatabase
>)
dm
.
CreateDelegate
(
typeof
(
Action
<
TDatabase
>));
}
static
ConcurrentDictionary
<
Type
,
string
>
tableNameMap
=
new
ConcurrentDictionary
<
Type
,
string
>();
private
string
DetermineTableName
<
T
>(
string
likelyTableName
)
{
string
name
;
if
(!
tableNameMap
.
TryGetValue
(
typeof
(
T
),
out
name
))
{
name
=
likelyTableName
;
if
(!
TableExists
(
name
))
{
name
=
typeof
(
T
).
Name
;
}
tableNameMap
[
typeof
(
T
)]
=
name
;
}
return
name
;
}
private
bool
TableExists
(
string
name
)
{
return
connection
.
Query
(
"select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @name"
,
new
{
name
},
transaction
:
transaction
).
Count
()
==
1
;
}
public
int
Execute
(
string
sql
,
dynamic
param
=
null
)
{
return
SqlMapper
.
Execute
(
connection
,
sql
,
param
as
object
,
transaction
,
commandTimeout
:
this
.
commandTimeout
);
}
public
IEnumerable
<
T
>
Query
<
T
>(
string
sql
,
dynamic
param
=
null
,
bool
buffered
=
true
)
{
return
SqlMapper
.
Query
<
T
>(
connection
,
sql
,
param
as
object
,
transaction
,
buffered
,
commandTimeout
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TFifth
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TFifth
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
dynamic
>
Query
(
string
sql
,
dynamic
param
=
null
,
bool
buffered
=
true
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
param
as
object
,
transaction
,
buffered
);
}
public
Dapper
.
SqlMapper
.
GridReader
QueryMultiple
(
string
sql
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
int
?
commandTimeout
=
null
,
CommandType
?
commandType
=
null
)
{
return
SqlMapper
.
QueryMultiple
(
connection
,
sql
,
param
,
transaction
,
commandTimeout
,
commandType
);
}
public
void
Dispose
()
{
if
(
connection
.
State
!=
ConnectionState
.
Closed
)
{
if
(
transaction
!=
null
)
{
transaction
.
Rollback
();
}
connection
.
Close
();
connection
=
null
;
}
}
}
}
static
ConcurrentDictionary
<
Type
,
string
>
tableNameMap
=
new
ConcurrentDictionary
<
Type
,
string
>();
private
string
DetermineTableName
<
T
>(
string
likelyTableName
)
{
string
name
;
if
(!
tableNameMap
.
TryGetValue
(
typeof
(
T
),
out
name
))
{
name
=
likelyTableName
;
if
(!
TableExists
(
name
))
{
name
=
typeof
(
T
).
Name
;
}
tableNameMap
[
typeof
(
T
)]
=
name
;
}
return
name
;
}
private
bool
TableExists
(
string
name
)
{
return
connection
.
Query
(
"select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @name"
,
new
{
name
},
transaction
:
transaction
).
Count
()
==
1
;
}
public
int
Execute
(
string
sql
,
dynamic
param
=
null
)
{
return
SqlMapper
.
Execute
(
connection
,
sql
,
param
as
object
,
transaction
,
commandTimeout
:
this
.
commandTimeout
);
}
public
IEnumerable
<
T
>
Query
<
T
>(
string
sql
,
dynamic
param
=
null
,
bool
buffered
=
true
)
{
return
SqlMapper
.
Query
<
T
>(
connection
,
sql
,
param
as
object
,
transaction
,
buffered
,
commandTimeout
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
TReturn
>
Query
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TFifth
,
TReturn
>(
string
sql
,
Func
<
TFirst
,
TSecond
,
TThird
,
TFourth
,
TFifth
,
TReturn
>
map
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
bool
buffered
=
true
,
string
splitOn
=
"Id"
,
int
?
commandTimeout
=
null
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
map
,
param
as
object
,
transaction
,
buffered
,
splitOn
);
}
public
IEnumerable
<
dynamic
>
Query
(
string
sql
,
dynamic
param
=
null
,
bool
buffered
=
true
)
{
return
SqlMapper
.
Query
(
connection
,
sql
,
param
as
object
,
transaction
,
buffered
);
}
public
Dapper
.
SqlMapper
.
GridReader
QueryMultiple
(
string
sql
,
dynamic
param
=
null
,
IDbTransaction
transaction
=
null
,
int
?
commandTimeout
=
null
,
CommandType
?
commandType
=
null
)
{
return
SqlMapper
.
QueryMultiple
(
connection
,
sql
,
param
,
transaction
,
commandTimeout
,
commandType
);
}
public
void
Dispose
()
{
if
(
connection
.
State
!=
ConnectionState
.
Closed
)
{
if
(
transaction
!=
null
)
{
transaction
.
Rollback
();
}
connection
.
Close
();
connection
=
null
;
}
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment