- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / sqlite / webdb.patch
1 The WebDatabase implementation in the renderer users a custom vfs to
2 broker file open and other requests.  This modifies the built-in vfs
3 implementation to let that code share much of the implementation
4 details.
5
6 diff --git src/os_unix.c src/os_unix.c
7 index ef04a72..e5e1509 100644
8 --- src/os_unix.c
9 +++ src/os_unix.c
10 @@ -3496,9 +3496,16 @@ typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*);
11  */
12  
13  /*
14 +** Initializes a unixFile structure with zeros.
15 +*/
16 +void initUnixFile(sqlite3_file* file) {
17 +  memset(file, 0, sizeof(unixFile));
18 +}
19 +
20 +/*
21  ** Initialize the contents of the unixFile structure pointed to by pId.
22  */
23 -static int fillInUnixFile(
24 +int fillInUnixFile(
25    sqlite3_vfs *pVfs,      /* Pointer to vfs object */
26    int h,                  /* Open file descriptor of file being opened */
27    int dirfd,              /* Directory file descriptor */
28 @@ -3812,6 +3819,73 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
29  }
30  
31  /*
32 +** Initializes a unixFile structure with zeros.
33 +*/
34 +void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) {
35 +  memset(file, 0, sizeof(unixFile));
36 +}
37 +
38 +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs,
39 +                                               int fd,
40 +                                               int dirfd,
41 +                                               sqlite3_file* file,
42 +                                               const char* fileName,
43 +                                               int noLock,
44 +                                               int isDelete) {
45 +  return fillInUnixFile(vfs, fd, dirfd, file, fileName, noLock, isDelete, 0);
46 +}
47 +
48 +/*
49 +** Search for an unused file descriptor that was opened on the database file.
50 +** If a suitable file descriptor if found, then it is stored in *fd; otherwise,
51 +** *fd is not modified.
52 +**
53 +** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot
54 +** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned.
55 +*/
56 +int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file,
57 +                                              const char* fileName,
58 +                                              int flags,
59 +                                              int* fd) {
60 +  unixFile* unixSQLite3File = (unixFile*)file;
61 +  int fileType = flags & 0xFFFFFF00;
62 +  if (fileType == SQLITE_OPEN_MAIN_DB) {
63 +    UnixUnusedFd *unusedFd = findReusableFd(fileName, flags);
64 +    if (unusedFd) {
65 +      *fd = unusedFd->fd;
66 +    } else {
67 +      unusedFd = sqlite3_malloc(sizeof(*unusedFd));
68 +      if (!unusedFd) {
69 +        return SQLITE_NOMEM;
70 +      }
71 +    }
72 +    unixSQLite3File->pUnused = unusedFd;
73 +  }
74 +  return SQLITE_OK;
75 +}
76 +
77 +/*
78 +** Marks 'fd' as the unused file descriptor for 'pFile'.
79 +*/
80 +void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file,
81 +                                                  int fd,
82 +                                                  int flags) {
83 +  unixFile* unixSQLite3File = (unixFile*)file;
84 +  if (unixSQLite3File->pUnused) {
85 +    unixSQLite3File->pUnused->fd = fd;
86 +    unixSQLite3File->pUnused->flags = flags;
87 +  }
88 +}
89 +
90 +/*
91 +** Destroys pFile's field that keeps track of the unused file descriptor.
92 +*/
93 +void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) {
94 +  unixFile* unixSQLite3File = (unixFile*)file;
95 +  sqlite3_free(unixSQLite3File->pUnused);
96 +}
97 +
98 +/*
99  ** Open the file zPath.
100  ** 
101  ** Previously, the SQLite OS layer used three functions in place of this
102 @@ -3893,20 +3967,13 @@ static int unixOpen(
103         || eType==SQLITE_OPEN_TRANSIENT_DB
104    );
105  
106 -  memset(p, 0, sizeof(unixFile));
107 +  chromium_sqlite3_initialize_unix_sqlite3_file(pFile);
108  
109    if( eType==SQLITE_OPEN_MAIN_DB ){
110 -    UnixUnusedFd *pUnused;
111 -    pUnused = findReusableFd(zName, flags);
112 -    if( pUnused ){
113 -      fd = pUnused->fd;
114 -    }else{
115 -      pUnused = sqlite3_malloc(sizeof(*pUnused));
116 -      if( !pUnused ){
117 -        return SQLITE_NOMEM;
118 -      }
119 +    rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd);
120 +    if( rc!=SQLITE_OK ){
121 +      return rc;
122      }
123 -    p->pUnused = pUnused;
124    }else if( !zName ){
125      /* If zName is NULL, the upper layer is requesting a temp file. */
126      assert(isDelete && !isOpenDirectory);
127 @@ -3949,10 +4016,7 @@ static int unixOpen(
128      *pOutFlags = flags;
129    }
130  
131 -  if( p->pUnused ){
132 -    p->pUnused->fd = fd;
133 -    p->pUnused->flags = flags;
134 -  }
135 +  chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags);
136  
137    if( isDelete ){
138  #if OS_VXWORKS
139 @@ -4028,7 +4092,7 @@ static int unixOpen(
140    rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, isDelete);
141  open_finished:
142    if( rc!=SQLITE_OK ){
143 -    sqlite3_free(p->pUnused);
144 +    chromium_sqlite3_destroy_reusable_file_handle(pFile);
145    }
146    return rc;
147  }
148 diff --git src/os_win.c src/os_win.c
149 index bc03a4b..06539d7 100644
150 --- src/os_win.c
151 +++ src/os_win.c
152 @@ -1890,4 +1890,11 @@ int sqlite3_os_end(void){
153    return SQLITE_OK;
154  }
155  
156 +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE handle) {
157 +  winFile* winSQLite3File = (winFile*)file;
158 +  memset(file, 0, sizeof(*file));
159 +  winSQLite3File->pMethod = &winIoMethod;
160 +  winSQLite3File->h = handle;
161 +}
162 +
163  #endif /* SQLITE_OS_WIN */