예제 #1
0
 private static String getFileName(DataHandler handler, int tableId, int objectId) {
   if (SysProperties.CHECK && tableId == 0 && objectId == 0) {
     DbException.throwInternalError("0 LOB");
   }
   String table = tableId < 0 ? ".temp" : ".t" + tableId;
   return getFileNamePrefix(handler.getDatabasePath(), objectId)
       + table
       + Constants.SUFFIX_LOB_FILE;
 }
예제 #2
0
 private FileStoreOutputStream initLarge(DataHandler h) {
   this.handler = h;
   this.tableId = 0;
   this.linked = false;
   this.precision = 0;
   this.small = null;
   this.hash = 0;
   String compressionAlgorithm = h.getLobCompressionAlgorithm(type);
   this.compressed = compressionAlgorithm != null;
   synchronized (h) {
     String path = h.getDatabasePath();
     if ((path != null) && (path.length() == 0)) {
       path =
           new File(Utils.getProperty("java.io.tmpdir", "."), SysProperties.PREFIX_TEMP_FILE)
               .getAbsolutePath();
     }
     objectId = getNewObjectId(h);
     fileName = getFileNamePrefix(path, objectId) + Constants.SUFFIX_TEMP_FILE;
     tempFile = h.openFile(fileName, "rw", false);
     tempFile.autoDelete();
   }
   FileStoreOutputStream out = new FileStoreOutputStream(tempFile, h, compressionAlgorithm);
   return out;
 }
예제 #3
0
 private static int getNewObjectId(DataHandler h) {
   String path = h.getDatabasePath();
   if ((path != null) && (path.length() == 0)) {
     path =
         new File(Utils.getProperty("java.io.tmpdir", "."), SysProperties.PREFIX_TEMP_FILE)
             .getAbsolutePath();
   }
   int newId = 0;
   int lobsPerDir = SysProperties.LOB_FILES_PER_DIRECTORY;
   while (true) {
     String dir = getFileNamePrefix(path, newId);
     String[] list = getFileList(h, dir);
     int fileCount = 0;
     boolean[] used = new boolean[lobsPerDir];
     for (String name : list) {
       if (name.endsWith(Constants.SUFFIX_DB_FILE)) {
         name = FileUtils.getName(name);
         String n = name.substring(0, name.indexOf('.'));
         int id;
         try {
           id = Integer.parseInt(n);
         } catch (NumberFormatException e) {
           id = -1;
         }
         if (id > 0) {
           fileCount++;
           used[id % lobsPerDir] = true;
         }
       }
     }
     int fileId = -1;
     if (fileCount < lobsPerDir) {
       for (int i = 1; i < lobsPerDir; i++) {
         if (!used[i]) {
           fileId = i;
           break;
         }
       }
     }
     if (fileId > 0) {
       newId += fileId;
       invalidateFileList(h, dir);
       break;
     }
     if (newId > Integer.MAX_VALUE / lobsPerDir) {
       // this directory path is full: start from zero
       newId = 0;
       dirCounter = MathUtils.randomInt(lobsPerDir - 1) * lobsPerDir;
     } else {
       // calculate the directory.
       // start with 1 (otherwise we don't know the number of
       // directories).
       // it doesn't really matter what directory is used, it might as
       // well be random (but that would generate more directories):
       // int dirId = RandomUtils.nextInt(lobsPerDir - 1) + 1;
       int dirId = (dirCounter++ / (lobsPerDir - 1)) + 1;
       newId = newId * lobsPerDir;
       newId += dirId * lobsPerDir;
     }
   }
   return newId;
 }