blob: 324a0ddfdba76eaacb0cde14cb6695f8a7cbd1c6 [file] [log] [blame]
using System;
using System.Runtime.InteropServices;
namespace org.apache.lucene.store
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
/// <summary>
/// Native <seealso cref="Directory"/> implementation for Microsoft Windows.
/// <para>
/// Steps:
/// <ol>
/// <li>Compile the source code to create WindowsDirectory.dll:
/// <blockquote>
/// c:\mingw\bin\g++ -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at
/// -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -static-libgcc
/// -static-libstdc++ -shared WindowsDirectory.cpp -o WindowsDirectory.dll
/// </blockquote>
/// For 64-bit JREs, use mingw64, with the -m64 option.
/// <li>Put WindowsDirectory.dll into some directory in your windows PATH
/// <li>Open indexes with WindowsDirectory and use it.
/// </ol>
/// </para>
/// @lucene.experimental
/// </summary>
public class WindowsDirectory : FSDirectory
{
private const int DEFAULT_BUFFERSIZE = 4096; // default pgsize on ia32/amd64
static WindowsDirectory()
{
//JAVA TO C# CONVERTER TODO TASK: The library is specified in the 'DllImport' attribute for .NET:
// System.loadLibrary("WindowsDirectory");
}
/// <summary>
/// Create a new WindowsDirectory for the named location.
/// </summary>
/// <param name="path"> the path of the directory </param>
/// <param name="lockFactory"> the lock factory to use, or null for the default
/// (<seealso cref="NativeFSLockFactory"/>); </param>
/// <exception cref="IOException"> If there is a low-level I/O error </exception>
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public WindowsDirectory(java.io.File path, LockFactory lockFactory) throws java.io.IOException
public WindowsDirectory(File path, LockFactory lockFactory) : base(path, lockFactory)
{
}
/// <summary>
/// Create a new WindowsDirectory for the named location and <seealso cref="NativeFSLockFactory"/>.
/// </summary>
/// <param name="path"> the path of the directory </param>
/// <exception cref="IOException"> If there is a low-level I/O error </exception>
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public WindowsDirectory(java.io.File path) throws java.io.IOException
public WindowsDirectory(File path) : base(path, null)
{
}
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: @Override public IndexInput openInput(String name, IOContext context) throws java.io.IOException
public override IndexInput openInput(string name, IOContext context)
{
ensureOpen();
return new WindowsIndexInput(new File(Directory, name), Math.Max(BufferedIndexInput.bufferSize(context), DEFAULT_BUFFERSIZE));
}
internal class WindowsIndexInput : BufferedIndexInput
{
internal readonly long fd;
internal readonly long length_Renamed;
internal bool isClone;
internal bool isOpen;
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public WindowsIndexInput(java.io.File file, int bufferSize) throws java.io.IOException
public WindowsIndexInput(File file, int bufferSize) : base("WindowsIndexInput(path=\"" + file.Path + "\")", bufferSize)
{
fd = WindowsDirectory.open(file.Path);
length_Renamed = WindowsDirectory.length(fd);
isOpen = true;
}
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: @Override protected void readInternal(byte[] b, int offset, int length) throws java.io.IOException
protected internal override void readInternal(sbyte[] b, int offset, int length)
{
int bytesRead;
try
{
bytesRead = WindowsDirectory.read(fd, b, offset, length, FilePointer);
}
catch (IOException ioe)
{
throw new IOException(ioe.Message + ": " + this, ioe);
}
if (bytesRead != length)
{
throw new EOFException("read past EOF: " + this);
}
}
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: @Override protected void seekInternal(long pos) throws java.io.IOException
protected internal override void seekInternal(long pos)
{
}
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: @Override public synchronized void close() throws java.io.IOException
public override void close()
{
lock (this)
{
// NOTE: we synchronize and track "isOpen" because Lucene sometimes closes IIs twice!
if (!isClone && isOpen)
{
WindowsDirectory.close(fd);
isOpen = false;
}
}
}
public override long length()
{
return length_Renamed;
}
public override WindowsIndexInput clone()
{
WindowsIndexInput clone = (WindowsIndexInput)base.clone();
clone.isClone = true;
return clone;
}
}
/// <summary>
/// Opens a handle to a file. </summary>
//JAVA TO C# CONVERTER TODO TASK: Replace 'unknown' with the appropriate dll name:
[DllImport("unknown")]
private static extern long open(string filename);
/// <summary>
/// Reads data from a file at pos into bytes </summary>
//JAVA TO C# CONVERTER TODO TASK: Replace 'unknown' with the appropriate dll name:
[DllImport("unknown")]
private static extern int read(long fd, sbyte[] bytes, int offset, int length, long pos);
/// <summary>
/// Closes a handle to a file </summary>
//JAVA TO C# CONVERTER TODO TASK: Replace 'unknown' with the appropriate dll name:
[DllImport("unknown")]
private static extern void close(long fd);
/// <summary>
/// Returns the length of a file </summary>
//JAVA TO C# CONVERTER TODO TASK: Replace 'unknown' with the appropriate dll name:
[DllImport("unknown")]
private static extern long length(long fd);
}
}