write method

void write(
  1. StringSink sink, {
  2. bool lockTables = true,
})

Implementation

void write(
  StringSink sink, {
  bool lockTables = true,
}) {
  checkTables();

  sink.write("""
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

""");

  for (final tbl in _tables) {
    sink.writeln("""

--
-- Dumping data for table `${tbl.name}`
--""");

    if (lockTables) {
      sink.writeln("LOCK TABLES `${tbl.name}` WRITE;");
    }

    if (tbl.hasColumnsWithRows) {
      // insert data
      final colNames = tbl.keys.toList();
      sink.write("INSERT INTO `${tbl.name}` (");
      sink.write(colNames.joinToString(transform: (e) => "`$e`"));
      sink.writeln(") VALUES");

      // ([\\'"]{1})
      final strEscapeRegex = RegExp("([\\\\'\"]{1})");

      final rowCount = tbl.first.value.length;
      for (var row = 0; row < rowCount; row++) {
        sink.write("(");
        for (final name in colNames) {
          final col = tbl[name];
          final val = col[row];

          if (null == val) {
            sink.write("NULL");
          } else {
            final escaped = val.replaceAllMapped(
              strEscapeRegex,
              (match) => "\\${match[0]!}",
            );
            sink.write(col.encloseInSingleQuotes ? "'$escaped'" : escaped);
          }

          if (name != colNames.last) {
            sink.write(", ");
          }
        }
        sink.write(")");

        if (row == rowCount - 1) {
          sink.writeln(";");
        } else {
          sink.writeln(",");
        }
      }
    }

    if (lockTables) {
      sink.writeln("UNLOCK TABLES;");
    }
  }

  sink.write("""

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
""");
}