From e9c99e7fadf5fed3e430e9ac1596a968724bbabe Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Fri, 6 Mar 2015 14:08:08 -0600
Subject: [PATCH] user: Import CSV in a single transaction (with auto rollback)

---
 include/class.user.php | 14 +++++++++++---
 include/mysqli.php     |  6 ++++++
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/include/class.user.php b/include/class.user.php
index 758b5ef01..97d6c52d3 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -457,14 +457,22 @@ class User extends UserModel {
             $users[] = $data;
         }
 
+        db_autocommit(false);
+        $error = false;
         foreach ($users as $u) {
             $vars = array_combine($keys, $u);
-            if (!static::fromVars($vars))
-                return sprintf(__('Unable to import user: %s'),
+            if (!static::fromVars($vars)) {
+                $error = sprintf(__('Unable to import user: %s'),
                     print_r($vars, true));
+                break;
+            }
         }
+        if ($error)
+            db_rollback();
+
+        db_autocommit(true);
 
-        return count($users);
+        return $error ?: count($users);
     }
 
     function importFromPost($stuff, $extra=array()) {
diff --git a/include/mysqli.php b/include/mysqli.php
index ed70cd82e..1793f889e 100644
--- a/include/mysqli.php
+++ b/include/mysqli.php
@@ -90,6 +90,12 @@ function db_autocommit($enable=true) {
     return $__db->autocommit($enable);
 }
 
+function db_rollback() {
+    global $__db;
+
+    return $__db->rollback();
+}
+
 function db_close() {
     global $__db;
     return @$__db->close();
-- 
GitLab