<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>DBIx::Class::AuditLog</title>
<meta name="description" content="Quick talk shoowing DBIx::Class AuditLog">
<meta name="author" content="Mark Jubenville">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/theme/default.css" id="theme">
<!-- For syntax highlighting -->
<link rel="stylesheet" href="lib/css/zenburn.css">
<script>
// If the query includes 'print-pdf' we'll use the PDF print sheet
document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
</script>
<!--[if lt IE 9]>
<script src="lib/js/html5shiv.js"></script>
<![endif]-->
<style>
section {
padding-top: 10px;
}
</style>
</head>
<body>
<div class="reveal">
<!-- Used to fade in a background when a specific slide state is reached -->
<div class="state-background"></div>
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
<section>
<h1>DBIx::Class::AuditLog</h1>
<h5>(man I think the styles in reaveal.js need some minor tweaking)</h5>
<h3>Simple activity audit logging for DBIx::Class</h3>
<h4>2012-09-27 — Toronto Perl Mongers<br /><br /><a href="https://metacpan.org/module/DBIx::Class::AuditLog">View on Metacpan</a></h4>
</section>
<section>
<h2>What we needed it for.</h2>
<p>
At $work we had a need to add user activity logging to one of our internal APIs.
</p>
<p>
We already had some logging code written for Class::DBI, however the new app happily used DBIx::Class.
</p>
</section>
<section>
<h2>Alternatives</h2>
<p>
DBIx::Class::Journal <a href="https://metacpan.org/module/DBIx::Class::Journal">https://metacpan.org/module/DBIx::Class::Journal</a>
</p>
<p> </p>
<p>
DBIx::Class::Shadow <a href="https://github.com/frioux/dbix-class-shadow-presentation">https://github.com/frioux/dbix-class-shadow-presentation</a>
</p>
<p>
Not much else.
</p>
</section>
<section>
<h2>What do we log? When does it ocur?</h2>
<ul>
<li>
Enabled for all insert/update/delete actions wrapped in "txn_do" statements
</li>
<li>
Transactions are saved as Changesets
</li>
<li>
Each Changeset can have many Actions
</li>
<li>
Actions can have many Changes. An Action can be of type insert/update/delete
</li>
<li>
Changes show the data that was changed during an action
</li>
</ul>
<aside class="notes">
</aside>
</section>
<section>
<h2>Additional DBIC column attributes</h2>
<p></p>Go to <a href="https://metacpan.org/module/DBIx::Class::AuditLog#ADDITIONAL-DBIC-COLUMN-ATTRIBUTES">https://metacpan.org/module/DBIx::Class::AuditLog#ADDITIONAL-DBIC-COLUMN-ATTRIBUTES</a></p>
</section>
<section>
<h2>Table Structure></h2>
Go to <a href="https://metacpan.org/module/DBIx::Class::AuditLog#TABLE-STRUCTURE">https://metacpan.org/module/DBIx::Class::AuditLog#TABLE-STRUCTURE</a>
</section>
</div>
<!-- The navigational controls UI -->
<aside class="controls">
<a class="left" href="#">◄</a>
<a class="right" href="#">►</a>
<a class="up" href="#">▲</a>
<a class="down" href="#">▼</a>
</aside>
<!-- Presentation progress bar -->
<div class="progress"><span></span></div>
</div>
<script src="lib/js/head.min.js"></script>
<script src="js/reveal.min.js"></script>
<script>
// Full list of configuration options available here:
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: true,
progress: true,
history: true,
theme: Reveal.getQueryHash().theme || 'default', // available themes are in /css/theme
transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/linear(2d)
// Optional libraries used to extend on reveal.js
dependencies: [
{ src: 'lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
{ src: 'plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
]
});
</script>
</body>
</html>