<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,9 +1,10 @@
 #include &quot;bdb_drv.h&quot;
 
+// Callback Array
 static ErlDrvEntry basic_driver_entry = {
     NULL,                             /* init */
-    start,                            /* startup */
-    stop,                             /* shutdown */
+    start,                            /* startup (defined below) */
+    stop,                             /* shutdown (defined below) */
     NULL,                             /* output */
     NULL,                             /* ready_input */
     NULL,                             /* ready_output */
@@ -12,7 +13,7 @@ static ErlDrvEntry basic_driver_entry = {
     NULL,                             /* handle */
     NULL,                             /* control */
     NULL,                             /* timeout */
-    outputv,                          /* outputv */
+    outputv,                          /* outputv (defined below) */
     NULL,                             /* ready_async */
     NULL,                             /* flush */
     NULL,                             /* call */
@@ -27,16 +28,19 @@ DRIVER_INIT(basic_driver) {
   return &amp;basic_driver_entry;
 }
 
+// Driver Start
 static ErlDrvData start(ErlDrvPort port, char* cmd) {
   bdb_drv_t* retval = (bdb_drv_t*) driver_alloc(sizeof(bdb_drv_t));
   u_int32_t open_flags = DB_CREATE | DB_THREAD;
   DB *db;
   int status;
   
+  // Create and open the database
   db_create(&amp;db, NULL, 0);
   status = db-&gt;open(db, NULL, DB_PATH, NULL, DB_BTREE, open_flags, 0);
 
   if(status != 0) {
+  	// There was an error opening the database
     char *error_reason;
 
     switch(status){
@@ -58,12 +62,15 @@ static ErlDrvData start(ErlDrvPort port, char* cmd) {
     fprintf(stderr, &quot;Unabled to open file: %s because %s\n\n&quot;, DB_PATH, error_reason);
   }
 
+  // Set the state for the driver
   retval-&gt;port = port;
   retval-&gt;db = db;
   
   return (ErlDrvData) retval;
 }
 
+
+// Driver Stop
 static void stop(ErlDrvData handle) {
   bdb_drv_t* driver_data = (bdb_drv_t*) handle;
 
@@ -71,10 +78,11 @@ static void stop(ErlDrvData handle) {
   driver_free(driver_data);
 }
 
+// Handle input from Erlang VM
 static void outputv(ErlDrvData handle, ErlIOVec *ev) {
   bdb_drv_t* driver_data = (bdb_drv_t*) handle;
   ErlDrvBinary* data = ev-&gt;binv[1];
-  int command = data-&gt;orig_bytes[0];
+  int command = data-&gt;orig_bytes[0]; // First byte is the command
   
   switch(command) {
   case CMD_PUT:
@@ -94,6 +102,7 @@ static void outputv(ErlDrvData handle, ErlIOVec *ev) {
   }
 }
 
+// Insert or replace record in the database
 static void put(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   ErlDrvBinary* input = ev-&gt;binv[1];
   char *bytes = input-&gt;orig_bytes;
@@ -106,6 +115,7 @@ static void put(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   DBT value;
   int status;
 
+  // Erase bytes to get rid of residual data
   bzero(&amp;key, sizeof(DBT));
   bzero(&amp;value, sizeof(DBT));
   
@@ -115,14 +125,19 @@ static void put(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   value.data = value_bytes;
   value.size = value_size;
   
+  // Insert the record and then write it to disk
   status = db-&gt;put(db, NULL, &amp;key, &amp;value, 0);
   db-&gt;sync(db, 0);
 
   if(status == 0) {
+  	// Insert went OK
+  	// Prepare return value to Erlang VM, returns atom 'ok'
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;ok&quot;)};
 
+	// Return the value to the Erlang VM
     driver_output_term(bdb_drv-&gt;port, spec, sizeof(spec) / sizeof(spec[0]));
   } else {
+  	// There was an error return {error, Reason}
     char * error_reason;
 
     switch(status) {
@@ -145,6 +160,7 @@ static void put(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
       error_reason = &quot;unkown&quot;;
     }
     
+    // Returns tuple {error, Reason}
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;error&quot;),
 			     ERL_DRV_ATOM, driver_mk_atom(error_reason),
 			     ERL_DRV_TUPLE, 2};
@@ -153,6 +169,7 @@ static void put(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   }
 }
 
+// Retrieve a record from the database, if it exists
 static void get(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   ErlDrvBinary* input = ev-&gt;binv[1];
   ErlDrvBinary *output_bytes;
@@ -170,18 +187,25 @@ static void get(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   key.data = key_bytes;
   key.size = KEY_SIZE;
   
-  value.flags = DB_DBT_MALLOC; // Don't forget to free
+  // Have BerkeleyDB allocate memory big enough to store the value
+  value.flags = DB_DBT_MALLOC; // Don't forget to free it later
   
+  // Retrieve the record
   status = db-&gt;get(db, NULL, &amp;key, &amp;value, 0);
 
   if(status == 0) {
+  	// Get went OK
+  	
+  	// Copy the record value to an output structure to return to Erlang VM
     output_bytes = driver_alloc_binary(value.size);
     output_bytes-&gt;orig_size = value.size;
-    // TODO:Figure out if we can somehow use this original memory
-    //binary-&gt;orig_bytes = (char *)&amp;data.data;
     memcpy(output_bytes-&gt;orig_bytes, value.data, value.size);
     free(value.data);
     
+    // TODO:Figure out if we can somehow use this original memory without recopying a la:
+    //binary-&gt;orig_bytes = (char *)&amp;data.data;
+    
+    // Returns tuple {ok, Data}
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;ok&quot;),
 			     ERL_DRV_BINARY, (ErlDrvTermData) output_bytes, output_bytes-&gt;orig_size, 0,
 			     ERL_DRV_TUPLE, 2};
@@ -189,6 +213,7 @@ static void get(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
     driver_output_term(bdb_drv-&gt;port, spec, sizeof(spec) / sizeof(spec[0]));
     driver_free_binary(output_bytes);
   } else {
+  	// there was an error
     char *error_reason;
 
     switch(status) {
@@ -211,6 +236,7 @@ static void get(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
       error_reason = &quot;unknown&quot;;
     }
     
+    // Return tuple {error, Reason}
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;error&quot;),
 			     ERL_DRV_ATOM, driver_mk_atom(error_reason),
 			     ERL_DRV_TUPLE, 2};
@@ -218,6 +244,7 @@ static void get(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   }
 }
 
+// Delete a record from the database
 static void del(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   ErlDrvBinary* data = ev-&gt;binv[1];
   char *bytes = data-&gt;orig_bytes;
@@ -236,11 +263,13 @@ static void del(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   db-&gt;sync(db, 0);
   
   if(status == 0) {
+  	// Delete went OK, return atom 'ok'
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;ok&quot;)};
     
     driver_output_term(bdb_drv-&gt;port, spec, sizeof(spec) / sizeof(spec[0]));
     
   } else {
+  	// There was an error
     char *error_reason;
 
     switch(status) {
@@ -266,6 +295,7 @@ static void del(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
       error_reason = &quot;unknown&quot;;
     }
     
+    // Return tuple {error, Reason}
     ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;error&quot;),
 			     ERL_DRV_ATOM, driver_mk_atom(error_reason),
 			     ERL_DRV_TUPLE, 2};
@@ -274,7 +304,9 @@ static void del(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
   }
 }
 
+// Unkown Command
 static void unkown(bdb_drv_t *bdb_drv, ErlIOVec *ev) {
+  // Return {error, unkown_command}
   ErlDrvTermData spec[] = {ERL_DRV_ATOM, driver_mk_atom(&quot;error&quot;),
 			   ERL_DRV_ATOM, driver_mk_atom(&quot;uknown_command&quot;),
 			   ERL_DRV_TUPLE, 2};</diff>
      <filename>priv/bdb_drv.c</filename>
    </modified>
    <modified>
      <diff>@@ -4,14 +4,20 @@
 #include &lt;string.h&gt;
 #include &lt;db.h&gt;
 
+// Path to file where data will be stored. 
+// It will be created if it doesn't exist
 #define DB_PATH &quot;./store.db&quot;
 
+// Binary commands between Erlang VM and Driver
 #define CMD_PUT 1
 #define CMD_GET 2
 #define CMD_DEL 3
 
+// Number of bytes for each key
+// (160 bits for SHA1 hash)
 #define KEY_SIZE 20
 
+// Define struct to hold state across calls
 typedef struct _bdb_drv_t {
   ErlDrvPort port;
  </diff>
      <filename>priv/bdb_drv.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>f6c097bf646e5bd3269c12a4c7146f14fea90bba</id>
    </parent>
  </parents>
  <author>
    <name>Matt Williamson</name>
    <email>dawsdesign@gmail.com</email>
  </author>
  <url>http://github.com/dawsdesign/erl_bdb_sample/commit/8d8c19b376b3ca89bc28c4037bcd6234b930edd1</url>
  <id>8d8c19b376b3ca89bc28c4037bcd6234b930edd1</id>
  <committed-date>2009-05-26T09:02:52-07:00</committed-date>
  <authored-date>2009-05-26T09:02:52-07:00</authored-date>
  <message>Added comments to C sources</message>
  <tree>c91a8ab777716a97f33d1d9256b2522562405e84</tree>
  <committer>
    <name>Matt Williamson</name>
    <email>dawsdesign@gmail.com</email>
  </committer>
</commit>
