nfs-ganesha 1.4
|
00001 #ifdef HAVE_CONFIG_H 00002 #include "config.h" 00003 #endif 00004 00005 #include "posixdb_internal.h" 00006 00007 fsal_posixdb_status_t fsal_posixdb_initPreparedQueries(fsal_posixdb_conn * p_conn); 00008 00009 fsal_posixdb_status_t fsal_posixdb_connect(fsal_posixdb_conn_params_t * dbparams, 00010 fsal_posixdb_conn ** p_conn) 00011 { 00012 ConnStatusType st; 00013 00014 *p_conn = PQsetdbLogin(dbparams->host, /* Hostname */ 00015 dbparams->port, /* Port number */ 00016 NULL, /* Options */ 00017 NULL, /* tty */ 00018 dbparams->dbname, /* Database name */ 00019 dbparams->login, /* Login */ 00020 NULL /* Password is in a file */ 00021 ); 00022 if((st = PQstatus(*p_conn)) == CONNECTION_OK) 00023 { 00024 /* 00025 prepared statements 00026 */ 00027 return fsal_posixdb_initPreparedQueries(*p_conn); 00028 } 00029 else 00030 { 00031 LogEvent(COMPONENT_FSAL, "ERROR: could not connect to database : %s", 00032 PQerrorMessage(*p_conn)); 00033 PQfinish(*p_conn); 00034 ReturnCodeDB(ERR_FSAL_POSIXDB_BADCONN, (int)st); 00035 /* error message available with PQerrorMessage(dbconn) */ 00036 } 00037 } 00038 00039 fsal_posixdb_status_t fsal_posixdb_disconnect(fsal_posixdb_conn * p_conn) 00040 { 00041 PQfinish(p_conn); 00042 ReturnCodeDB(ERR_FSAL_POSIXDB_NOERR, 0); 00043 } 00044 00045 fsal_posixdb_status_t fsal_posixdb_initPreparedQueries(fsal_posixdb_conn * p_conn) 00046 { 00047 PGresult *p_res; 00048 00049 #ifdef _PGSQL8 00050 p_res = PQprepare(p_conn, 00051 "buildOnePath", 00052 "SELECT '/' || name, handleidparent, handletsparent FROM Parent WHERE handleid=$1::bigint AND handlets=$2::int", 00053 2, NULL); 00054 CheckCommand(p_res); 00055 PQclear(p_res); 00056 00057 #ifdef _WITH_PLPGSQL 00058 p_res = PQprepare(p_conn, "buildOnePathPL", "SELECT buildOnePath($1::bigint, $2::int)", /* handleid, handlets */ 00059 2, NULL); 00060 CheckCommand(p_res); 00061 PQclear(p_res); 00062 #endif 00063 00064 p_res = PQprepare(p_conn, "lookupPaths", "SELECT name, handleidparent, handletsparent \ 00065 FROM Parent \ 00066 WHERE handleid=$1::bigint AND handleTs=$2::int", 2, NULL); 00067 CheckCommand(p_res); 00068 PQclear(p_res); 00069 00070 p_res = PQprepare(p_conn, 00071 "lookupPathsExt", 00072 "SELECT Parent.name, Parent.handleidparent, Parent.handletsparent, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00073 FROM Parent LEFT JOIN Handle ON Parent.handleidparent = Handle.handleid AND Parent.handletsparent=Handle.handleTs\ 00074 WHERE Parent.handleid=$1::bigint AND Parent.handleTs=$2::int", 00075 2, NULL); 00076 CheckCommand(p_res); 00077 PQclear(p_res); 00078 00079 p_res = PQprepare(p_conn, 00080 "lookupHandleByName", 00081 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00082 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00083 WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text", 00084 3, NULL); 00085 CheckCommand(p_res); 00086 PQclear(p_res); 00087 00088 p_res = PQprepare(p_conn, 00089 "lookupHandleByNameFU", 00090 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00091 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00092 WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text \ 00093 FOR UPDATE", 3, NULL); 00094 CheckCommand(p_res); 00095 PQclear(p_res); 00096 00097 p_res = PQprepare(p_conn, 00098 "lookupRootHandle", 00099 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00100 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00101 WHERE Parent.handleidparent=Parent.handleid AND Parent.handletsparent=Parent.handlets", 00102 0, NULL); 00103 CheckCommand(p_res); 00104 PQclear(p_res); 00105 00106 p_res = PQprepare(p_conn, 00107 "lookupHandleByInodeFU", 00108 "SELECT handleId, handleTs, nlink, ctime, ftype\ 00109 FROM Handle \ 00110 WHERE deviceid=$1::bigint AND inode=$2::bigint \ 00111 FOR UPDATE", 2, NULL); 00112 CheckCommand(p_res); 00113 PQclear(p_res); 00114 00115 p_res = PQprepare(p_conn, 00116 "lookupHandleFU", 00117 "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00118 FROM Handle \ 00119 WHERE handleid=$1::bigint AND handleTs=$2::int \ 00120 FOR UPDATE", 2, NULL); 00121 CheckCommand(p_res); 00122 PQclear(p_res); 00123 00124 p_res = PQprepare(p_conn, 00125 "lookupHandle", 00126 "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00127 FROM Handle \ 00128 WHERE handleid=$1::bigint AND handleTs=$2::int \ 00129 ", 2, NULL); 00130 CheckCommand(p_res); 00131 PQclear(p_res); 00132 00133 p_res = PQprepare(p_conn, "updateHandle", "UPDATE Handle \ 00134 SET ctime=$4::int, nlink=$3::smallint \ 00135 WHERE handleid=$1::bigint AND handleTs=$2::int", 4, NULL); 00136 CheckCommand(p_res); 00137 PQclear(p_res); 00138 00139 p_res = PQprepare(p_conn, "updateHandleNlink", "UPDATE Handle \ 00140 SET nlink=$3::smallint \ 00141 WHERE handleid=$1::bigint AND handleTs=$2::int", 3, NULL); 00142 CheckCommand(p_res); 00143 PQclear(p_res); 00144 00145 p_res = PQprepare(p_conn, "lookupParent", "SELECT handleid, handlets \ 00146 FROM Parent \ 00147 WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text ", 3, NULL); 00148 CheckCommand(p_res); 00149 PQclear(p_res); 00150 00151 p_res = PQprepare(p_conn, 00152 "lookupChildrenFU", 00153 "SELECT Handle.handleid, Handle.handlets, Handle.ftype, Parent.name, Handle.nlink \ 00154 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00155 WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \ 00156 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets) \ 00157 FOR UPDATE", 2, NULL); 00158 CheckCommand(p_res); 00159 PQclear(p_res); 00160 00161 p_res = PQprepare(p_conn, 00162 "lookupChildren", 00163 "SELECT Handle.handleid, Handle.handlets, Parent.name, Handle.inode, Handle.deviceid, Handle.nlink, Handle.ctime, Handle.ftype \ 00164 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00165 WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \ 00166 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)", 00167 2, NULL); 00168 CheckCommand(p_res); 00169 PQclear(p_res); 00170 00171 p_res = PQprepare(p_conn, "countChildren", "SELECT count(*) \ 00172 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00173 WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \ 00174 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)", 2, NULL); 00175 CheckCommand(p_res); 00176 PQclear(p_res); 00177 00178 p_res = PQprepare(p_conn, 00179 "insertHandle", 00180 "INSERT INTO Handle(deviceid, inode, handleTs, nlink, ctime, ftype) \ 00181 VALUES ($1::int, $2::bigint, $3::bigint, $4::smallint, $5::int, $6::int)", 6, NULL); 00182 CheckCommand(p_res); 00183 PQclear(p_res); 00184 00185 p_res = PQprepare(p_conn, "updateParent", "UPDATE Parent \ 00186 SET handleidparent=$4::bigint, handletsparent=$5::int, name=$6::text \ 00187 WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text", 5, NULL); 00188 CheckCommand(p_res); 00189 PQclear(p_res); 00190 00191 p_res = PQprepare(p_conn, 00192 "insertParent", 00193 "INSERT INTO Parent(handleidparent, handletsparent, name, handleid, handlets) \ 00194 VALUES($1::bigint, $2::int, $3::text, $4::bigint, $5::int)", 00195 5, NULL); 00196 CheckCommand(p_res); 00197 PQclear(p_res); 00198 00199 p_res = PQprepare(p_conn, 00200 "deleteParent", 00201 "DELETE FROM Parent WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text", 00202 3, NULL); 00203 CheckCommand(p_res); 00204 PQclear(p_res); 00205 00206 p_res = PQprepare(p_conn, 00207 "deleteHandle", 00208 "DELETE FROM Handle WHERE handleid=$1::bigint AND handlets=$2::int", 00209 2, NULL); 00210 CheckCommand(p_res); 00211 PQclear(p_res); 00212 00213 #else 00214 /* For PostgreSQL versions < 8 that do not have PQprepare functions */ 00215 p_res = PQexec(p_conn, 00216 "PREPARE \"buildOnePath\"(bigint, int) AS " 00217 "SELECT '/' || name, handleidparent, handletsparent FROM Parent WHERE handleid=$1 AND handlets=$2"); 00218 CheckCommand(p_res); 00219 PQclear(p_res); 00220 00221 #ifdef _WITH_PLPGSQL 00222 p_res = PQexec(p_conn, 00223 "PREPARE \"buildOnePathPL\"(bigint, int) AS " 00224 "SELECT buildOnePath($1, $2)" /* handleid, handlets */ ); 00225 CheckCommand(p_res); 00226 PQclear(p_res); 00227 #endif 00228 00229 p_res = PQexec(p_conn, 00230 "PREPARE \"lookupPaths\"(bigint, int) AS " 00231 "SELECT name, handleidparent, handletsparent \ 00232 FROM Parent \ 00233 WHERE handleid=$1 AND handleTs=$2"); 00234 CheckCommand(p_res); 00235 PQclear(p_res); 00236 00237 p_res = PQexec(p_conn, 00238 "PREPARE \"lookupPathsExt\"(bigint, int) AS " 00239 "SELECT Parent.name, Parent.handleidparent, Parent.handletsparent, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00240 FROM Parent LEFT JOIN Handle ON Parent.handleidparent = Handle.handleid AND Parent.handletsparent=Handle.handleTs\ 00241 WHERE Parent.handleid=$1 AND Parent.handleTs=$2"); 00242 CheckCommand(p_res); 00243 PQclear(p_res); 00244 00245 p_res = PQexec(p_conn, 00246 "PREPARE \"lookupHandleByName\"(bigint, int, text) AS " 00247 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00248 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00249 WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3"); 00250 CheckCommand(p_res); 00251 PQclear(p_res); 00252 00253 p_res = PQexec(p_conn, 00254 "PREPARE \"lookupHandleByNameFU\"(bigint, int, text) AS " 00255 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00256 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00257 WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3 \ 00258 FOR UPDATE"); 00259 CheckCommand(p_res); 00260 PQclear(p_res); 00261 00262 p_res = PQexec(p_conn, 00263 "PREPARE \"lookupRootHandle\" AS " 00264 "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00265 FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \ 00266 WHERE Parent.handleidparent=Parent.handleid AND Parent.handletsparent=Parent.handlets"); 00267 CheckCommand(p_res); 00268 PQclear(p_res); 00269 00270 p_res = PQexec(p_conn, 00271 "PREPARE \"lookupHandleByInodeFU\"(bigint, int) AS " 00272 "SELECT handleId, handleTs, nlink, ctime, ftype\ 00273 FROM Handle \ 00274 WHERE deviceid=$1 AND inode=$2 \ 00275 FOR UPDATE"); 00276 CheckCommand(p_res); 00277 PQclear(p_res); 00278 00279 p_res = PQexec(p_conn, 00280 "PREPARE \"lookupHandleFU\"(bigint, int) AS " 00281 "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00282 FROM Handle \ 00283 WHERE handleid=$1 AND handleTs=$2 \ 00284 FOR UPDATE"); 00285 CheckCommand(p_res); 00286 PQclear(p_res); 00287 00288 p_res = PQexec(p_conn, 00289 "PREPARE \"lookupHandle\"(bigint, int) AS " 00290 "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \ 00291 FROM Handle \ 00292 WHERE handleid=$1 AND handleTs=$2"); 00293 CheckCommand(p_res); 00294 PQclear(p_res); 00295 00296 p_res = PQexec(p_conn, 00297 "PREPARE \"updateHandle\"(bigint, int, smallint, int) AS " 00298 "UPDATE Handle \ 00299 SET ctime=$4, nlink=$3 \ 00300 WHERE handleid=$1 AND handleTs=$2"); 00301 CheckCommand(p_res); 00302 PQclear(p_res); 00303 00304 p_res = PQexec(p_conn, 00305 "PREPARE \"updateHandleNlink\"(bigint, int, smallint) AS " 00306 "UPDATE Handle \ 00307 SET nlink=$3 \ 00308 WHERE handleid=$1 AND handleTs=$2"); 00309 CheckCommand(p_res); 00310 PQclear(p_res); 00311 00312 p_res = PQexec(p_conn, 00313 "PREPARE \"lookupParent\"(bigint, int, text) AS " 00314 "SELECT handleid, handlets \ 00315 FROM Parent \ 00316 WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3"); 00317 CheckCommand(p_res); 00318 PQclear(p_res); 00319 00320 p_res = PQexec(p_conn, 00321 "PREPARE \"lookupChildrenFU\"(bigint, int) AS " 00322 "SELECT Handle.handleid, Handle.handlets, Handle.ftype, Parent.name, Handle.nlink \ 00323 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00324 WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \ 00325 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets) \ 00326 FOR UPDATE"); 00327 CheckCommand(p_res); 00328 PQclear(p_res); 00329 00330 p_res = PQexec(p_conn, 00331 "PREPARE \"lookupChildren\"(bigint, int) AS " 00332 "SELECT Handle.handleid, Handle.handlets, Parent.name, Handle.inode, Handle.deviceid, Handle.nlink, Handle.ctime, Handle.ftype \ 00333 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00334 WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \ 00335 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)"); 00336 CheckCommand(p_res); 00337 PQclear(p_res); 00338 00339 p_res = PQexec(p_conn, "PREPARE \"countChildren\"(bigint, int) AS " "SELECT count(*) \ 00340 FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\ 00341 WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \ 00342 AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)"); 00343 CheckCommand(p_res); 00344 PQclear(p_res); 00345 00346 p_res = PQexec(p_conn, 00347 "PREPARE \"insertHandle\"(int, bigint, bigint, smallint, int, int) AS " 00348 "INSERT INTO Handle(deviceid, inode, handleTs, nlink, ctime, ftype) \ 00349 VALUES ($1, $2, $3, $4, $5, $6)"); 00350 CheckCommand(p_res); 00351 PQclear(p_res); 00352 00353 p_res = PQexec(p_conn, 00354 "PREPARE \"updateParent\"(bigint, int, text, bigint, int, text) AS " 00355 "UPDATE Parent \ 00356 SET handleidparent=$4, handletsparent=$5, name=$6 \ 00357 WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3"); 00358 CheckCommand(p_res); 00359 PQclear(p_res); 00360 00361 p_res = PQexec(p_conn, 00362 "PREPARE \"insertParent\"(bigint, int, text, bigint, int) AS " 00363 "INSERT INTO Parent(handleidparent, handletsparent, name, handleid, handlets) \ 00364 VALUES($1, $2, $3, $4, $5)"); 00365 CheckCommand(p_res); 00366 PQclear(p_res); 00367 00368 p_res = PQexec(p_conn, 00369 "PREPARE \"deleteParent\"(bigint, int, text) AS " 00370 "DELETE FROM Parent WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3"); 00371 CheckCommand(p_res); 00372 PQclear(p_res); 00373 00374 p_res = PQexec(p_conn, 00375 "PREPARE \"deleteHandle\"(bigint, int) AS " 00376 "DELETE FROM Handle WHERE handleid=$1::bigint AND handlets=$2::int"); 00377 CheckCommand(p_res); 00378 PQclear(p_res); 00379 00380 #endif 00381 00382 ReturnCodeDB(ERR_FSAL_POSIXDB_NOERR, 0); 00383 }