OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sql/recovery.h" | 5 #include "sql/recovery.h" |
6 | 6 |
7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 // to the recovered table. | 348 // to the recovered table. |
349 std::vector<std::string> insert_columns; | 349 std::vector<std::string> insert_columns; |
350 | 350 |
351 // If PRIMARY KEY is a single INTEGER column, then it is an alias | 351 // If PRIMARY KEY is a single INTEGER column, then it is an alias |
352 // for ROWID. The primary key can be compound, so this can only be | 352 // for ROWID. The primary key can be compound, so this can only be |
353 // determined after processing all column data and tracking what is | 353 // determined after processing all column data and tracking what is |
354 // seen. |pk_column_count| counts the columns in the primary key. | 354 // seen. |pk_column_count| counts the columns in the primary key. |
355 // |rowid_decl| stores the ROWID version of the last INTEGER column | 355 // |rowid_decl| stores the ROWID version of the last INTEGER column |
356 // seen, which is at |rowid_ofs| in |create_column_decls|. | 356 // seen, which is at |rowid_ofs| in |create_column_decls|. |
357 size_t pk_column_count = 0; | 357 size_t pk_column_count = 0; |
358 size_t rowid_ofs; // Only valid if rowid_decl is set. | 358 size_t rowid_ofs = 0; // Only valid if rowid_decl is set. |
359 std::string rowid_decl; // ROWID version of column |rowid_ofs|. | 359 std::string rowid_decl; // ROWID version of column |rowid_ofs|. |
360 | 360 |
361 while (s.Step()) { | 361 while (s.Step()) { |
362 const std::string column_name(s.ColumnString(1)); | 362 const std::string column_name(s.ColumnString(1)); |
363 const std::string column_type(s.ColumnString(2)); | 363 const std::string column_type(s.ColumnString(2)); |
364 const bool not_null = s.ColumnBool(3); | 364 const bool not_null = s.ColumnBool(3); |
365 const int default_type = s.ColumnType(4); | 365 const int default_type = s.ColumnType(4); |
366 const bool default_is_null = (default_type == COLUMN_TYPE_NULL); | 366 const bool default_is_null = (default_type == COLUMN_TYPE_NULL); |
367 const int pk_column = s.ColumnInt(5); | 367 const int pk_column = s.ColumnInt(5); |
368 | 368 |
369 if (pk_column > 0) { | 369 if (pk_column > 0) { |
370 // TODO(shess): http://www.sqlite.org/pragma.html#pragma_table_info | 370 // TODO(shess): http://www.sqlite.org/pragma.html#pragma_table_info |
371 // documents column 5 as the index of the column in the primary key | 371 // documents column 5 as the index of the column in the primary key |
372 // (zero for not in primary key). I find that it is always 1 for | 372 // (zero for not in primary key). I find that it is always 1 for |
373 // columns in the primary key. Since this code is very dependent on | 373 // columns in the primary key. Since this code is very dependent on |
374 // that pragma, review if the implementation changes. | 374 // that pragma, review if the implementation changes. |
375 DCHECK_EQ(pk_column, 1); | 375 DCHECK_EQ(1, pk_column); |
376 ++pk_column_count; | 376 ++pk_column_count; |
377 } | 377 } |
378 | 378 |
379 // Construct column declaration as "name type [optional constraint]". | 379 // Construct column declaration as "name type [optional constraint]". |
380 std::string column_decl = column_name; | 380 std::string column_decl = column_name; |
381 | 381 |
382 // SQLite's affinity detection is documented at: | 382 // SQLite's affinity detection is documented at: |
383 // http://www.sqlite.org/datatype3.html#affname | 383 // http://www.sqlite.org/datatype3.html#affname |
384 // The gist of it is that CHAR, TEXT, and INT use substring matches. | 384 // The gist of it is that CHAR, TEXT, and INT use substring matches. |
385 // TODO(shess): It would be nice to unit test the type handling, | 385 // TODO(shess): It would be nice to unit test the type handling, |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 } | 527 } |
528 return false; | 528 return false; |
529 } | 529 } |
530 | 530 |
531 RecordRecoveryEvent(RECOVERY_SUCCESS_META_VERSION); | 531 RecordRecoveryEvent(RECOVERY_SUCCESS_META_VERSION); |
532 *version = recovery_version.ColumnInt(0); | 532 *version = recovery_version.ColumnInt(0); |
533 return true; | 533 return true; |
534 } | 534 } |
535 | 535 |
536 } // namespace sql | 536 } // namespace sql |
OLD | NEW |