| OLD | NEW | 
|    1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2009 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 "chrome/browser/sync/syncable/directory_backing_store.h" |    5 #include "chrome/browser/sync/syncable/directory_backing_store.h" | 
|    6  |    6  | 
|    7 #include "build/build_config.h" |    7 #include "build/build_config.h" | 
|    8  |    8  | 
|    9 #if defined(OS_MACOSX) |    9 #if defined(OS_MACOSX) | 
|   10 #include <CoreFoundation/CoreFoundation.h> |   10 #include <CoreFoundation/CoreFoundation.h> | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|   30  |   30  | 
|   31 using std::string; |   31 using std::string; | 
|   32  |   32  | 
|   33 namespace syncable { |   33 namespace syncable { | 
|   34  |   34  | 
|   35 // This just has to be big enough to hold an UPDATE or INSERT statement that |   35 // This just has to be big enough to hold an UPDATE or INSERT statement that | 
|   36 // modifies all the columns in the entry table. |   36 // modifies all the columns in the entry table. | 
|   37 static const string::size_type kUpdateStatementBufferSize = 2048; |   37 static const string::size_type kUpdateStatementBufferSize = 2048; | 
|   38  |   38  | 
|   39 // Increment this version whenever updating DB tables. |   39 // Increment this version whenever updating DB tables. | 
|   40 static const int32 kCurrentDBVersion = 67; |   40 static const int32 kCurrentDBVersion = 68; | 
|   41  |  | 
|   42 #if OS_WIN |  | 
|   43 // TODO(sync): remove |  | 
|   44 static void PathNameMatch16(sqlite3_context* context, int argc, |  | 
|   45                             sqlite3_value** argv) { |  | 
|   46   const PathString pathspec(reinterpret_cast<const PathChar*> |  | 
|   47       (sqlite3_value_text16(argv[0])), sqlite3_value_bytes16(argv[0]) / 2); |  | 
|   48  |  | 
|   49   const void* name_text = sqlite3_value_text16(argv[1]); |  | 
|   50   int name_bytes = sqlite3_value_bytes16(argv[1]); |  | 
|   51   // If the text is null, we need to avoid the PathString constructor. |  | 
|   52   if (name_text != NULL) { |  | 
|   53     // Have to copy to append a terminating 0 anyway. |  | 
|   54     const PathString name(reinterpret_cast<const PathChar*> |  | 
|   55         (sqlite3_value_text16(argv[1])), |  | 
|   56         sqlite3_value_bytes16(argv[1]) / 2); |  | 
|   57     sqlite3_result_int(context, PathNameMatch(name, pathspec)); |  | 
|   58   } else { |  | 
|   59     sqlite3_result_int(context, PathNameMatch(PathString(), pathspec)); |  | 
|   60   } |  | 
|   61 } |  | 
|   62  |  | 
|   63 // Sqlite allows setting of the escape character in an ESCAPE clause and |  | 
|   64 // this character is passed in as a third character to the like function. |  | 
|   65 // See: http://www.sqlite.org/lang_expr.html |  | 
|   66 static void PathNameMatch16WithEscape(sqlite3_context* context, |  | 
|   67                                       int argc, sqlite3_value** argv) { |  | 
|   68   // Never seen this called, but just in case. |  | 
|   69   LOG(FATAL) << "PathNameMatch16WithEscape() not implemented"; |  | 
|   70 } |  | 
|   71 #endif |  | 
|   72  |   41  | 
|   73 static void RegisterPathNameCollate(sqlite3* dbhandle) { |   42 static void RegisterPathNameCollate(sqlite3* dbhandle) { | 
|   74   const int collate = SQLITE_UTF8; |   43   const int collate = SQLITE_UTF8; | 
|   75   CHECK(SQLITE_OK == sqlite3_create_collation(dbhandle, "PATHNAME", collate, |   44   CHECK(SQLITE_OK == sqlite3_create_collation(dbhandle, "PATHNAME", collate, | 
|   76       NULL, &ComparePathNames16)); |   45       NULL, &ComparePathNames16)); | 
|   77 } |   46 } | 
|   78  |   47  | 
|   79 // Replace the LIKE operator with our own implementation that does file spec |  | 
|   80 // matching like "*.txt". |  | 
|   81 static void RegisterPathNameMatch(sqlite3* dbhandle) { |  | 
|   82   // We only register this on Windows. We use the normal sqlite |  | 
|   83   // matching function on mac/linux. |  | 
|   84   // note that the function PathNameMatch() does a simple == |  | 
|   85   // comparison on mac, so that would have to be fixed if |  | 
|   86   // we really wanted to use PathNameMatch on mac/linux w/ the |  | 
|   87   // same pattern strings as we do on windows. |  | 
|   88 #if defined(OS_WIN) |  | 
|   89   CHECK(SQLITE_OK == sqlite3_create_function(dbhandle, "like", |  | 
|   90       2, SQLITE_ANY, NULL, &PathNameMatch16, NULL, NULL)); |  | 
|   91   CHECK(SQLITE_OK == sqlite3_create_function(dbhandle, "like", |  | 
|   92       3, SQLITE_ANY, NULL, &PathNameMatch16WithEscape, NULL, NULL)); |  | 
|   93 #endif  // OS_WIN |  | 
|   94 } |  | 
|   95  |  | 
|   96 static inline bool IsSqliteErrorOurFault(int result) { |   48 static inline bool IsSqliteErrorOurFault(int result) { | 
|   97   switch (result) { |   49   switch (result) { | 
|   98     case SQLITE_MISMATCH: |   50     case SQLITE_MISMATCH: | 
|   99     case SQLITE_CONSTRAINT: |   51     case SQLITE_CONSTRAINT: | 
|  100     case SQLITE_MISUSE: |   52     case SQLITE_MISUSE: | 
|  101     case SQLITE_RANGE: |   53     case SQLITE_RANGE: | 
|  102       return true; |   54       return true; | 
|  103     default: |   55     default: | 
|  104       return false; |   56       return false; | 
|  105   } |   57   } | 
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  258     sqlite3_close(save_dbhandle_); |  210     sqlite3_close(save_dbhandle_); | 
|  259     save_dbhandle_ = NULL; |  211     save_dbhandle_ = NULL; | 
|  260   } |  212   } | 
|  261 } |  213 } | 
|  262  |  214  | 
|  263 bool DirectoryBackingStore::OpenAndConfigureHandleHelper( |  215 bool DirectoryBackingStore::OpenAndConfigureHandleHelper( | 
|  264     sqlite3** handle) const { |  216     sqlite3** handle) const { | 
|  265   if (SQLITE_OK == SqliteOpen(backing_filepath_, handle)) { |  217   if (SQLITE_OK == SqliteOpen(backing_filepath_, handle)) { | 
|  266     sqlite3_busy_timeout(*handle, kDirectoryBackingStoreBusyTimeoutMs); |  218     sqlite3_busy_timeout(*handle, kDirectoryBackingStoreBusyTimeoutMs); | 
|  267     RegisterPathNameCollate(*handle); |  219     RegisterPathNameCollate(*handle); | 
|  268     RegisterPathNameMatch(*handle); |  220  | 
|  269     return true; |  221     return true; | 
|  270   } |  222   } | 
|  271   return false; |  223   return false; | 
|  272 } |  224 } | 
|  273  |  225  | 
|  274 DirOpenResult DirectoryBackingStore::Load(MetahandlesIndex* entry_bucket, |  226 DirOpenResult DirectoryBackingStore::Load(MetahandlesIndex* entry_bucket, | 
|  275     ExtendedAttributes* xattrs_bucket, |  227     ExtendedAttributes* xattrs_bucket, | 
|  276     Directory::KernelLoadInfo* kernel_load_info) { |  228     Directory::KernelLoadInfo* kernel_load_info) { | 
|  277   DCHECK(load_dbhandle_ == NULL); |  229   DCHECK(load_dbhandle_ == NULL); | 
|  278   if (!OpenAndConfigureHandleHelper(&load_dbhandle_)) |  230   if (!OpenAndConfigureHandleHelper(&load_dbhandle_)) | 
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  651  |  603  | 
|  652 sqlite3* DirectoryBackingStore::LazyGetSaveHandle() { |  604 sqlite3* DirectoryBackingStore::LazyGetSaveHandle() { | 
|  653   if (!save_dbhandle_ && !OpenAndConfigureHandleHelper(&save_dbhandle_)) { |  605   if (!save_dbhandle_ && !OpenAndConfigureHandleHelper(&save_dbhandle_)) { | 
|  654     DCHECK(FALSE) << "Unable to open handle for saving"; |  606     DCHECK(FALSE) << "Unable to open handle for saving"; | 
|  655     return NULL; |  607     return NULL; | 
|  656   } |  608   } | 
|  657   return save_dbhandle_; |  609   return save_dbhandle_; | 
|  658 } |  610 } | 
|  659  |  611  | 
|  660 }  // namespace syncable |  612 }  // namespace syncable | 
| OLD | NEW |