Index: nodevote.module
===================================================================
--- nodevote.module	(revision 66)
+++ nodevote.module	(working copy)
@@ -11,6 +11,7 @@ define('NODEVOTE_TYPE',                    'nodevo
 define('NODEVOTE_PERM_VIEW',               'view nodevote');
 define('NODEVOTE_PERM_USE',                'use nodevote');
 define('NODEVOTE_VOTE_OWN_NODE',           'nodevote_vote_own_node');
+define('NODEVOTE_VOTE_ANON',               'nodevote_vote_anon');
 define('NODEVOTE_CHANGE_VOTE',             'nodevote_change_vote');
 define('NODEVOTE_RESULT_VOTED',            'nodevote_result_voted');
 define('NODEVOTE_RESULT_DISPLAY_PAGE',     'nodevote_result_display_page');
@@ -138,6 +139,13 @@ function nodevote_admin_settings() {
     '#return_value' => 1,
     '#default_value' => variable_get(NODEVOTE_VOTE_OWN_NODE, 0),
   );
+  $form[$set][NODEVOTE_VOTE_ANON] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Allow anonymous user to vote.'),
+    '#return_value' => 1,
+    '#default_value' => variable_get(NODEVOTE_VOTE_ANON, 0),
+    '#description' => t('Anonymous users will be able to vote on nodes one time per session.'),
+  );
   $form[$set][NODEVOTE_DAILY_THRESHOLD] = array(
     '#type' => 'select',
     '#title' => t('Daily threshold'),
@@ -280,9 +288,11 @@ function nodevote_page($node) {
           // check to see if the user has voted too many times today
           if(_nodevote_within_threshold($user->uid, variable_get(NODEVOTE_DAILY_THRESHOLD, 10))) {
             // log the vote
-            $result = db_query("INSERT INTO {nodevote} VALUES (%d, %d, %d, %d)", $user->uid, $node->nid, $vote, time());
+            $result = db_query("INSERT INTO {nodevote} (uid, nid, vote, timestamp) VALUES (%d, %d, %d, %d)", $user->uid, $node->nid, $vote, time());
             // do the userpoints dance
             nodevote_do_userpoints();
+            // flag session for anon users
+            $_SESSION['nodevote']['anon'][$nid] = TRUE;
           }
         else {
           // if they've voted too many times today, show a message
@@ -365,6 +375,11 @@ function nodevote_nodeapi(&$node, $op, $teaser, $p
 }
 
 function _nodevote_user_voted($uid, $nid) {
+  // Anonymous users should check session info
+  if ( $uid == 0 ) {
+    return ($_SESSION['nodevote']['anon'][$node->nid]);
+  }
+
   if (db_result(db_query('SELECT count(nid) FROM {nodevote} WHERE uid = %d AND nid = %d', $uid, $nid))) {
     return TRUE;
   }
@@ -444,8 +459,6 @@ function _nodevote_is_votable($node) {
 
   $ret = FALSE;
 
-  // Is user logged in?
-  if ($user->uid) {
     // Is node type votable?
     if (variable_get(NODEVOTE_TYPE . $node->type, 0)) {
       // Does the user has permission to vote?
@@ -453,13 +466,13 @@ function _nodevote_is_votable($node) {
         // Is the node posted by someone else?
         if (($node->uid != $user->uid) || (variable_get(NODEVOTE_VOTE_OWN_NODE, 0))) {
           // Did the user already vote on this node?
-          if ((!_nodevote_user_voted($user->uid, $node->nid)) || (variable_get(NODEVOTE_CHANGE_VOTE, 0))){
+        // For auth users, check if they can change the vote
+        if ((!_nodevote_user_voted($user->uid, $node->nid)) || ($user->uid && variable_get(NODEVOTE_CHANGE_VOTE, 0))){
             $ret = TRUE;
           }
         }
       }
     }
-  }
   return $ret;
 }
 
Index: nodevote.install
===================================================================
--- nodevote.install	(revision 66)
+++ nodevote.install	(working copy)
@@ -14,6 +14,12 @@ function nodevote_schema() {
   $schema['nodevote'] = array(
     'description' => t('Stores the users\' votes about a node'),
     'fields' => array(
+      'nvid' => array(
+        'description' => t('Nodevote ID'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
       'uid' => array(
         'description' => t('User ID'),
         'type' => 'int',
@@ -40,7 +46,7 @@ function nodevote_schema() {
         'not null' => TRUE,
       ),
     ),
-    'primary key' => array('uid', 'nid'),
+    'primary key' => array('nvid'),
     'indexes' => array('node_nid' => array('nid'), 'user_id' => array('uid')),
   );
   return $schema;
@@ -58,6 +64,22 @@ function nodevote_update_2() {
 }
 
 /**
+ * Add new column, set it as primary key, drop old primary keys
+ */
+function nodevote_update_6001() {
+  $ret = array();
+  db_drop_primary_key($ret, 'nodevote');
+  $field = array(
+    'description' => t('Nodevote ID'),
+    'type' => 'serial',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+  );
+  db_add_field($ret, 'nodevote', 'nvid', $field, array('primary key' => array('nvid')));
+  return $ret;
+}
+
+/**
 * Implementation of hook_uninstall().
 */
 function nodevote_uninstall() {
